dspy.LocalInterpreter

dspy.LocalInterpreter

생성된 코드를 로컬 CPython 워커 하나에서 실행하는 인터프리터 팩토리예요. 일반 Python 호환성이 필요하면서도 DSPy 프로세스의 메모리·stdout·생명주기와는 분리된 실행 환경이 필요할 때 유용해요.

출처: 문서

본문

LocalInterpreter는 생성된 코드가 실행되는 길게 유지되는(local persistent) CPython 워커 하나를 띄워요. 상태와 import는 shutdown()을 부를 때까지 유지되고, 호스트 도구는 JSON 프로토콜을 거쳐 연결되며, execution_timeout으로 멈춘 워커를 종료시킬 수 있어요.

import dspy

rlm = dspy.RLM(
    "question: str -> answer: int",
    interpreter_factory=dspy.LocalInterpreter,
)

경고: 서브프로세스는 보안 샌드박스가 아니에요 — 생성된 코드는 호스트 사용자의 파일시스템·환경·자격증명·서브프로세스·네트워크 권한을 그대로 가져요. 신뢰할 수 없는 코드에는 기본 PythonInterpreter나 원격 샌드박스를 쓰세요. 서브프로세스 경계는 일반 호스트 메모리와 stdout을 우발적 변경으로부터 보호할 뿐, 악의적인 코드를 막아주지는 않아요.

입력, 호스트 도구의 인자/결과, 구조화된 출력은 모두 JSON과 호환되어야 해요. 워커는 현재 Python 실행 파일을 사용하고, execution_timeout에는 호스트 도구에 소요된 시간도 포함되어 데드라인이 지나면 즉시 워커를 종료해요. Python은 실행 중인 호스트 callable을 강제로 멈출 수 없으므로, 그 callable은 분리된 데몬 스레드에서 끝날 수 있어요. 그 결과는 버려지고 인터프리터 세션은 종료 상태로 남아요.

병렬 게스트 코드는 모든 스레드가 현재 execute() 호출이 반환되기 전에 끝날 때 지원돼요 (예: context로 관리되는 ThreadPoolExecutor). 게스트 스레드를 계속 돌려두면 나중 실행에서 상태를 바꾸거나 출력을 쓰거나 도구를 호출할 수 있으므로 세션이 종료 상태가 돼요. Shutdown과 종료 실패는 워커와 함께 일반 하위 프로세스까지 종료시켜요.

LocalInterpreter.execution_instructions는 안정적인 클래스 메타데이터예요. RLM은 워커를 시작하지 않고 이 값을 액션 프롬프트에 추가해요.

::: dspy.LocalInterpreter
    handler: python
    options:
        members:
            - __call__
            - execute
            - shutdown
            - start
        show_source: true
        show_root_heading: true
        heading_level: 2
        docstring_style: google
        show_root_full_path: true
        show_object_full_path: false
        separate_signature: false
        inherited_members: true

더 알아보기 (Learn more)