Imp is a full port of DSPy to the BEAM
Imp, DSPy를 BEAM으로 완전히 포팅한 Elixir 라이브러리
Imp는 DSPy의 언어 모델 프로그램 구성·평가·최적화 기능을 Elixir와 BEAM에 옮긴 라이브러리입니다. 서명으로 입력과 출력 형식을 선언하고, 예제와 평가 지표를 바탕으로 프로그램 지시문을 최적화하며, 에이전트 실행은 OTP 프로세스로 감독하고 제어합니다.
- 주제
AI 요약
Imp는 언어 모델 호출을 선언형 프로그램으로 구성하고, 예제에 비춰 성능을 측정한 뒤 최적화하는 DSPy를 Elixir용 BEAM 환경에 포팅한 라이브러리입니다. 각 단계의 입력과 출력을 서명(signature)으로 지정하고, 모델이 생각하는 방식이나 사용할 도구를 선택합니다. 프롬프트를 직접 작성하거나 응답 파서를 따로 만들지 않아도 서명에 맞춰 프롬프트를 구성하고 결과를 형식에 맞게 검증합니다.
서명으로 입력과 출력 지정
예를 들어 issue -> kind: enum[bug,feature,question], summary라는 서명으로 GitHub 이슈 분류기를 만듭니다. Imp.predict/2로 모델을 연결한 다음 Imp.call/2를 실행하면, kind에는 지정한 세 값 중 하나가 들어가고 summary에는 요약이 반환됩니다. 응답이 형식에 맞지 않으면 오류가 발생합니다. 추론 단계를 추가하려면 Imp.chain_of_thought/2를, 도구를 사용하는 에이전트를 만들려면 Imp.react/3를 사용합니다. 작업의 서명은 그대로 둔 채 실행 방식을 바꿉니다.
예제로 프로그램 최적화
프로그램을 개선하려면 정답을 붙인 예제와 평가 지표, 세 종류의 데이터셋을 준비합니다. trainset은 학습에, valset은 최적화 과정에서 만들어진 후보를 고르는 데 씁니다. testset은 개선 전후 성능을 비교하는 용도입니다. GEPA는 프로그램을 실행하고 실패 사례를 살펴본 뒤 지시문을 다시 작성합니다. 이때 더 강한 모델을 reflection_lm으로 지정할 수 있으며, 예시 코드에서는 지표 호출 한도를 300회로 설정합니다.
다른 최적화기도 포함합니다. LabeledFewShot과 BootstrapFewShot은 작동하는 예제를 선택하고, MIPROv2는 지시문과 예제 조합을 탐색합니다. SIMBA는 프로그램이 잘한 시도와 실패한 시도에서 규칙과 예제를 학습합니다. 파인튜닝과 GRPO로 모델 가중치를 학습하는 방식도 지원합니다. 최적화 결과는 지시문과 예제를 확인할 수 있는 새 프로그램이며, JSON으로 저장하거나 diff로 검토할 수 있습니다.
도구 호출과 OTP 실행
도구는 Elixir 함수로 정의합니다. 예제에서는 Req로 웹 페이지를 읽는 도구를 만들고 Imp.react/3에 연결해 질문에 답하는 에이전트를 구성합니다. Imp.call/2는 호출한 프로세스 안에서 프로그램을 실행합니다. Imp.start_run/3을 쓰면 별도의 감독 대상 프로세스로 실행하며, 실행을 관찰하고 중단하거나 도구 호출을 승인·거부할 수 있습니다. 예시의 승인 함수는 URL이 raw.githubusercontent.com으로 시작할 때만 요청을 허용합니다.
실행 이벤트에는 시작, 도구 전달, 모델 요청·응답, 도구 호출·결과, 종료가 기록됩니다. OTP 프로세스 기반 실행은 감시와 중단, 실행 시간 제한을 지원합니다. 이미 효과가 발생했을 수 있는 도구 호출은 조용히 재시도하지 않고 결과를 알 수 없는 상태로 보고합니다. 승인한 MCP 서버의 도구를 가져오거나, Imp 프로그램을 ACP 에이전트로 제공하는 기능도 있습니다. 큰 입력을 다루는 RLM, 샌드박스 표현식으로 계산하는 CodeAct와 program of thought도 포함합니다.
요구 사항과 현재 상태
Imp 0.5는 Hex에 처음 공개한 실험적 릴리스이며 API가 바뀔 수 있고, 최적화기의 대규모 벤치마크는 아직 필요하다고 안내합니다. Elixir 1.19 이상과 C·C++ 컴파일러가 필요합니다. 의존성인 jaxon과 erlexec가 네이티브 코드를 사용하며, 최초 컴파일 때 erlexec의 빌드가 rebar3 플러그인을 내려받으므로 네트워크 연결도 필요합니다. 모델 제공자 연결에는 ReqLLM을 사용합니다.
Hacker News 반응
- @dang — 관련 토론입니다. 다른 글도 있나요? DSPy가 그렇게 좋다면 왜 아무도 쓰지 않을까요? (2026년 3월, 댓글 120개) DSPy: 프롬프트 작성이 아니라 언어 모델 프로그래밍하기 (2024년 12월, 댓글 45개) DSPy에 시스템 전체를 걸기 (2024년 8월, 댓글 18개) DSPy: 파운데이션 모델 프로그래밍 프레임워크 (2023년 9월, 댓글 52개)
- @visarga — 우리는 구조화 디코딩에서 도구 호출과 에이전트로 한참 전에 넘어갔습니다. 모델이 문법을 안정적으로 지키기에는 너무 약했던 시절에 더 쓸모 있었습니다.
- @vatsachak — 맞습니다. 수학 박사인 저도 모델보다 세부 사항에 덜 주의를 기울입니다. 이제 모델의 주된 약점은 창의성, 계획, 의사 결정입니다.
- @genxy — DSPy의 기법은 여전히 매우 유용합니다. 당신 댓글은 개루프 제어가 잘 작동하니 피드백은 필요 없다고 말하는 것과 비슷합니다. 필요 없다고 생각하다가 그렇지 않은 순간을 맞게 됩니다. 내 직감은 언제나 옳으니 이론을 깊이 이해할 필요가 없다는 말과도 같고, 그 생각도 그렇지 않은 순간이 오기 전까지 통합니다.
- @jauntywundrkind — TypeScript나 Rust 포트도 있나요? 제발요 :) 수정, 후속 댓글: Rust로 만든 DSRr이 있습니다: https://github.com/krypticmouse/DSRs
- @jt-hill — deepfates 프로그램에 오신 것을 환영합니다.
- @aidiveyt — 도구 호출은 enum을 제한하지 않습니다. 제 경우 스키마에는
hn이라고 적었는데hackernews가 반환됐고, 검증 단계에서야 잡혔습니다.
원문: Hacker News / 번역·요약: Trawling