DSPy
DSPy는 타입이 지정된 시그니처와 모듈로 LLM 파이프라인을 구축한 뒤, 메트릭을 기준으로 프롬프트를 최적화하는 오픈 소스 프레임워크입니다.
DSPy는 직접 작성한 프롬프트 대신 코드로 대규모 언어 모델(LLM) 애플리케이션을 구축하는 오픈 소스 Python 프레임워크입니다. 개발자는 각 단계의 입력과 출력을 선언하고, 이 단계들을 프로그램으로 구성한 다음 DSPy 옵티마이저가 예제 집합의 지표를 최대화하도록 프롬프트 또는 모델의 가중치를 작성하고 조정하게 합니다. 이름은 Declarative Self-improving Python의 약자이며, 프로젝트는 자신을 언어 모델을 프롬프팅하는 대신 프로그래밍하기 위한 프레임워크라고 설명합니다. Stanford의 Omar Khattab과 동료들은 2023년 10월 논문 DSPy: 선언적 언어 모델 호출을 자기 개선 파이프라인으로 컴파일하기에서 DSPy를 소개했습니다. 컴파일 후 몇 분 만에 DSPy 코드 몇 줄로 GPT-3.5와 Llama-2-13B-chat 파이프라인을 구축해 표준 퓨샷 프롬프팅보다 각각 25% 및 65% 이상 높은 성능을 달성했으며, 전문가가 작성한 데모를 사용하는 파이프라인보다 최대 46% 및 40% 높은 성능을 보였습니다.
시그니처, 모듈 및 옵티마이저#
- 시그니처: 단계의 입력과 출력을 유형이 지정된 선언으로 표현합니다.
"question -> answer"처럼 인라인으로 작성하거나 작업을 명시한 독스트링을 포함하는 클래스로 작성할 수 있습니다. 시그니처는 단계가 수행할 작업을 정의하고 프롬프트 문구는 DSPy에 맡깁니다. - 모듈: 시그니처를 실행하는 전략입니다.
dspy.Predict은 모델을 한 번 호출하고,dspy.ChainOfThought은 연쇄 사고 프롬프팅처럼 답변 전에 추론 필드를 추가하며,dspy.ReAct은 ReAct 프롬프팅 방식으로 도구를 사용하는 루프를 실행합니다. 모듈은 PyTorch 레이어처럼 구성해 여러 단계의 프로그램을 만들 수 있습니다. 예를 들어 검색 쿼리를 작성하고 구절을 검색한 다음 해당 구절을 바탕으로 답하는 검색 증강 생성(RAG) 파이프라인을 구성할 수 있습니다. - 어댑터: 시그니처를 모델용 채팅 메시지로 변환하고 모델 답변을 다시 유형이 지정된 필드로 파싱합니다.
- 옵티마이저: 지표를 기준으로 프로그램을 개선하는 알고리즘입니다.
BootstrapFewShot은 학습 예제에서 프로그램을 실행하고 지표를 통과한 추적 결과를 데모로 보존합니다.MIPROv2은 제안된 지침과 데모 세트를 탐색하고,BootstrapFinetune는 미세 조정을 통해 프로그램을 모델 가중치로 증류합니다.
최적화 루프는 프롬프트를 매개변수로 취급한다는 점에서 모델 학습과 유사합니다.
dspy.GEPA로 사용할 수 있는 2025년 GEPA 옵티마이저는 프로그램의 실행 추적과 텍스트 피드백을 읽고, LLM이 문제의 원인을 되짚게 한 다음 지침을 개선합니다. 6개 작업에서 강화 학습 방식인 GRPO보다 평균 6%, 최대 20% 높은 성능을 보였으며, 롤아웃은 최대 35배 적게 사용했습니다. MIPROv2보다도 10% 이상 높은 성능을 달성했습니다.
시그니처에서 프롬프트까지#
DSPy는 시그니처를 바탕으로 프롬프트를 작성하므로 프로그램을 새 모델에 맞게 다시 작성하는 대신 재최적화할 수 있습니다. 여기서는 Ultralytics YOLO26의 탐지 요약을 입력으로 사용합니다. Results.verbose()은 예측 모드의 결과를 클래스별 개수가 포함된 짧은 문자열로 반환하며, 시그니처는 이를 텍스트로 입력받습니다. 이를 통해 옵티마이저가 실제 객체 탐지 결과를 바탕으로 추론 단계를 조정할 수 있습니다. 메시지를 구성하는 데 모델이나 API 키는 필요하지 않습니다.
import dspy
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")
class SceneQA(dspy.Signature):
"""Answer a question about a photo from the objects a detector found in it."""
detections: str = dspy.InputField()
question: str = dspy.InputField()
answer: str = dspy.OutputField()
# The adapter turns the signature and inputs into the chat messages the model will receive
inputs = {"detections": results[0].verbose(), "question": "How many people are in the photo?"}
messages = dspy.ChatAdapter().format(SceneQA, demos=[], inputs=inputs)
for message in messages:
print(f"--- {message['role']} ---\n{message['content']}")시스템 메시지에는 입력 및 출력 필드, DSPy가 답변을 파싱하는 데 사용하는 [[ ## field ## ]] 마커, 목표로 사용할 독스트링이 포함되며, 사용자 메시지에는 탐지기가 산출한 개수가 들어갑니다. 옵티마이저는 목표를 다시 작성하고 메시지에 데모를 추가해 프로그램을 개선하며, Python 코드는 변경하지 않습니다.
DSPy와 관련 용어 비교#
- 프롬프트 엔지니어링: 프롬프트를 직접 작성하고 수정하는 작업입니다. DSPy는 지표와 예제를 사용하는 최적화 문제로 이 작업을 전환합니다.
- LangChain: 개발자가 관리하는 프롬프트를 사용해 LLM 애플리케이션을 구성하는 통합, 도구 및 에이전트 루프 프레임워크입니다.
- 하이퍼파라미터 튜닝: 검증 지표를 기준으로 학습 설정을 탐색하는 방식으로, DSPy가 프롬프트를 탐색하는 방식과 가장 유사합니다.
- 복합 AI 시스템: 여러 모델 호출, 검색기 및 도구로 구성된 애플리케이션입니다. DSPy는 이러한 파이프라인을 엔드투엔드로 최적화하고 각 단계의 프롬프트를 최종 지표에 맞춰 조정하도록 설계되었습니다.










