DSPy
언어모델을 (프롬프팅 대신) 프로그래밍하는 프레임워크
About
- DSPy(Declarative Self-improving Python)는 프로그래밍을 통해 언어 모델(LM)을 제어하도록 설계된 프레임워크
- 간단한 분류기부터 복잡한 RAG 파이프라인, 에이전트 루프까지 모듈화된 AI 시스템을 빠르게 구축할 수 있으며, 프롬프트와 가중치를 최적화하는 알고리듬도 제공
- 기존의 불안정한 프롬프트 대신 합성 가능한 파이썬 코드를 작성하여, 모듈화된 AI 시스템을 빠르게 구축하고 LM이 고품질 출력을 생성하도록 학습시킬 수 있음
Module을 사용하여 AI 동작을 문자열이 아닌 코드로 기술
- 신뢰할 수 있는 AI 시스템을 구축하려면 빠르게 반복해야 함
- 그러나 프롬프트를 유지 관리하면 LM, 메트릭 또는 파이프라인을 변경할 때마다 문자열이나 데이터를 수정해야 하므로 어려움
- DSPy는 LM 시스템 정의를 특정 LM이나 프롬프팅 전략에 대한 복잡한 선택과 분리하기 위해 개발됨
- DSPy의 프로그래밍 방식
- DSPy는 프롬프트 문자열 조정에서 구조화되고 선언적인 자연어 모듈을 사용한 프로그래밍으로 초점을 전환함
- 시스템의 모든 AI 구성 요소에 대해 입출력 동작을 시그니처로 지정하고 모듈을 선택하여 LM 호출 전략을 할당함
- DSPy는 시그니처를 프롬프트로 확장하고 타입이 지정된 출력을 파싱하여 사용하기 쉽고 이식 가능하며 최적화 가능한 AI 시스템을 작성할 수 있음
Optimizer가 AI 모듈의 프롬프트와 가중치를 조정
- DSPy는 자연어 주석이 포함된 고수준 코드를 저수준 연산, 프롬프트 또는 가중치 업데이트로 컴파일하는 도구를 제공함
- 이를 통해 LM을 프로그램의 구조 및 메트릭과 정렬할 수 있음
- 코드나 메트릭을 변경하면 이에 맞게 간단히 다시 컴파일할 수 있음
- DSPy 최적화 프로세스
- 작업의 대표적인 입력 몇 십 개 또는 몇 백 개와 시스템 출력의 품질을 측정할 수 있는 메트릭이 있다면 DSPy Optimizer를 사용할 수 있음
- dspy.BootstrapRS는 모든 모듈에 대해 좋은 few-shot 예제를 합성함
- dspy.MIPROv2는 모든 프롬프트에 대해 더 나은 자연어 명령을 제안하고 지능적으로 탐색함
- dspy.BootstrapFinetune은 모듈용 데이터셋을 구축하고 이를 사용하여 시스템의 LM 가중치를 미세 조정함
- 작업의 대표적인 입력 몇 십 개 또는 몇 백 개와 시스템 출력의 품질을 측정할 수 있는 메트릭이 있다면 DSPy Optimizer를 사용할 수 있음
DSPy 생태계는 오픈소스 AI 연구를 발전시킴
- DSPy의 모듈식 패러다임은 거대 언어 모델과 비교하여 더 많은 연구자들이 LM 프로그램의 구성 아키텍처, 추론 시간 전략, 최적화 도구를 분산된 방식으로 개선할 수 있는 기회를 제공함
- 이는 DSPy 사용자들에게 더 많은 제어권을 부여하고, 반복 작업을 더 빠르게 할 수 있도록 도와주며, 최신 최적화 도구나 모듈을 적용하여 프로그램이 시간이 지날수록 발전할 수 있게 하는 이점이 있음
- DSPy 연구는 2022년 2월 Stanford NLP에서 시작되었으며, ColBERT-QA, Baleen, Hindsight와 같은 초기 복합 LM 시스템 개발에서 얻은 교훈을 바탕으로 구축됨
- 2022년 12월에 DSP로 처음 출시되었고 2023년 10월에 DSPy로 발전하였으며, 250명의 기여자들 덕분에 수만 명의 사람들이 모듈형 LM 프로그램을 구축하고 최적화하는 방법을 배울 수 있게 됨
- DSPy 커뮤니티는 MIPROv2, BetterTogether, LeReT와 같은 최적화 도구와 STORM, IReRa, DSPy Assertions와 같은 프로그램 아키텍처에 대한 많은 연구 성과를 이룩함
- PAPILLON, PATH, WangLab@MEDIQA, UMD의 프롬프팅 사례 연구, Haize의 Red-Teaming 프로그램과 같은 새로운 문제에 대한 성공적인 적용 사례도 다수 보유하고 있음
- 이 외에도 많은 오픈소스 프로젝트, 프로덕션 애플리케이션 및 기타 사용 사례들을 통해 DSPy의 실용성이 입증됨
Install
Usage
You can authenticate by setting the OPENAI_API_KEY
env variable or passing api_key
below.
Try the examples below after configuring your lm above. Adjust the fields to explore what tasks your LM can do well out of the box. Each tab below sets up a DSPy module, like dspy.Predict, dspy.ChainOfThought, or dspy.ReAct, with a task-specific signature. For example, question -> answer: float tells the module to take a question and to produce a float answer.
math = dspy.ChainOfThought("question -> answer: float")
math(question="Two dice are tossed. What is the probability that the sum equals two?")
Output:
Prediction(
reasoning='When two dice are tossed, each die has 6 faces, resulting in a total of 6 x 6 = 36 possible outcomes. The sum of the numbers on the two dice equals two only when both dice show a 1. This is just one specific outcome: (1, 1). Therefore, there is only 1 favorable outcome. The probability of the sum being two is the number of favorable outcomes divided by the total number of possible outcomes, which is 1/36.',
answer=0.0277776
)