언어 모델과 연동한 안전한 Python REPL 활용 기법

동적 코드로부터 정답을 유도하는 실행 환경

대규모 언어 모델 (LLM) 을 활용한 애플리케이션에서 단순 응답 생성보다는 실제 컴퓨팅 능력이 요구되는 경우가 빈번합니다. 복잡한 산술 연산이나 데이터 처리 작업은 모델의 파라미터 내지 시뮬레이션보다는 정확한 프로그래밍 언어 구문을 사용하여 수행하는 것이 효율적입니다. 이러한 목적을 위해 Python REPL(Read-Eval-Print Loop) 기능을 외부 도구로 래핑하여 에이전트에 제공함으로써, 코드를 작성하고 즉시 결과를 검증하는 워크플로우를 구축할 수 있습니다.

실행 엔진 초기화 및 구성

LangChain 생태계에서는 실험적 유틸리티 모듈 내에 인터랙티브 셸 기능을 제공합니다. 이를 인스턴스화하면 외부 입력을 받아서 메모리 상에서 파이썾 스크립트를 해석하고 반환값을 얻는 기초적인 루프가 형성됩니다. 일반적인 설정 예제는 다음과 같습니다.

from langchain_core.tools import Tool
from langchain_experimental.utilities import PythonREPL

# 런타임 환경 객체 생성
execution_engine = PythonREPL()

코드 도구의 래핑 및 에이전트 통합

생성된 실행 엔진은 단독으로 사용되기보다 주로 LLM 에이전트가 호출 가능한 도구 (Tool) 로 변환되어 배포됩니다. 이 과정에서 도구의 이름을 명확히 하고, 사용자가 올바른 문법을 입력하도록 설명을 구체화해야 합니다. 함수 참조는 엔진 내부의 실행 메서드를 가리키게 되어야 합니다.

# 도구 정의 및 등록
code_interpreter_tool = Tool(
    name="exec_python_script",
    description="Arbitrary python code can be executed here. To retrieve values, utilize print() function explicitly.",
    func=execution_engine.run,
)

# 간단한 명령어 테스트
output_data = code_interpreter_tool.run("import math; print(math.sqrt(16))")
print(f"Result: {output_data}")  # 예상 출력: Result: 4.0

복합 논리 처리 시나리오

단순한 식 계산 이상으로 함수 정의와 변수 관리를 필요로 하는 경우에도 동일하게 적용이 가능합니다. 아래 예시는 평균값 계산 로직을 포함하여 동적으로 처리되는 모습을 보여줍니다.

script_block = """
def get_average(nums):
    if not nums:
        return 0
    return sum(nums) / len(nums)

dataset = [10, 20, 30, 40]
final_result = get_average(dataset)
print(final_result)
"""

log_output = execution_engine.run(script_block)
print(log_output)  # 예상 결과: 25.0

임의 코드 실행에 따른 보안 대응 전략

사용자 입력을 그대로 실행 가능하다는 것은 임의 코드 실행 (Arbitrary Code Execution) 취약점의 원인이 될 수 있습니다. 이를 방지하기 위해서는 다음과 같은 격리 정책과 제약 조건을 반드시 고려해야 합니다.

  • 샌드박스 환경 구축: 가상 머신 (VM) 또는 컨테이너 기술 (Docker 등) 을 통해 호스트 운영 체제와 실행 환경을 물리적으로 분리합니다.
  • 허용 리스트 관리: 특정 위험 함수 (예: os.system, subprocess 등) 나 외부 라이브러리 접근을 차단하고, 안전하다고 판단된 모듈만 허용 목록 (Allow-list) 에 추가합니다.
  • 리소스 한도 설정: CPU 사용량, 메모리 할당량, 실행 시간(TTL)에 대한 엄격한 제한을 부과하여 시스템 고갈을 예방합니다.
  • 감사 로그 기록: 모든 실행된 명령어와 그 결과를 타임스탬프와 함께 저장하여 추후 보안 침해 사고 발생 시 원인을 추적할 수 있도록 합니다.

이러한 보호 장치를 병행할 때만 생산 환경에서도 안전한 코드 해석기 구현이 가능해집니다.

태그: LangChain python CodeInterpreter LLM Security

7월 27일 17:06에 게시됨