
새로운 작업을 해결하기 위해 DSPy를 잘 사용하는 것은 LM으로 좋은 머신 러닝을 하는 것입니다.
이것이 의미하는 바는 반복적인 프로세스라는 것입니다. 최적이 아닌 몇 가지 초기 선택을 한 다음 점진적으로 개선해 나갑니다.
아래에서 설명하는 것처럼 작업과 최대화하려는 메트릭을 정의하고, 일반적으로 레이블이 없는 몇 가지 입력 예시를 준비합니다(또는 메트릭에 레이블이 필요한 경우 최종 출력에 대해서만 레이블이 있는 경우). 그런 다음 사용할 기본 제공 레이어(모듈)를 선택하고, 각 레이어에 서명(입력/출력 사양)을 지정한 다음 Python 코드에서 모듈을 자유롭게 호출하여 파이프라인을 구축합니다. 마지막으로 DSPy 최적화 도구를 사용하여 코드를 고품질 명령어, 자동화된 몇 가지 예제 또는 LM에 대한 업데이트된 LM 가중치로 컴파일합니다.
1) Define your task.
해결하려는 문제를 정의하지 않으면 DSPy를 제대로 사용할 수 없습니다.
예상되는 입력/출력 동작: 데이터로 챗봇을 구축하려고 하나요? 코드 어시스턴트? 논문에서 정보를 추출하는 시스템? 아니면 번역 시스템인가요? 아니면 검색 결과에서 스니펫을 강조 표시하는 시스템인가요? 아니면 주제에 대한 정보를 인용문과 함께 요약하는 시스템인가요?
프로그램의 입력과 출력의 예(예: 질문과 답변, 주제와 요약)를 3~4개만 생각해 두는 것이 유용할 때가 많습니다.
작업에 대해 생각하는 데 도움이 필요하다면 최근 커뮤니티를 위한 Discord 서버를 만들었습니다.
품질 및 비용 사양: 예산이 무한정 있는 것은 아닐 것입니다. 최종 시스템은 운영 비용이 너무 많이 들지 않아야 하며, 사용자들에게 충분히 빠르게 응답할 수 있어야 합니다.
어떤 종류의 언어 모델을 사용할지 생각해 보세요. GPT-3.5는 어떨까요? 아니면 미스트랄-7B나 라마2-13B-chat과 같은 소규모 개방형 모델인가요? 아니면 믹스트랄? 아니면 GPT-4 터보가 정말 필요한가요? 아니면 리소스가 매우 제한적이어서 최종 LM이 T5 기반이 되기를 원하시나요?
2) Define your pipeline.
DSPy 프로그램은 무엇을 해야 할까요? 단순한 생각의 연쇄 단계만 하면 될까요? 아니면 검색을 사용하려면 LM이 필요하나요? 아니면 계산기나 캘린더 API 같은 다른 도구가 필요할까요?
잘 정의된 여러 단계로 문제를 해결하는 일반적인 워크플로우가 있나요? 아니면 작업에 대해 완전히 개방형 LM(또는 상담원과 함께 개방형 툴 사용)을 원하시나요?
이 공간에 대해 생각하되 항상 간단하게 시작하세요. 거의 모든 작업은 단 하나의 dspy.ChainofThought 모듈로 시작한 다음 진행하면서 점진적으로 복잡성을 추가해야 합니다.
그런 다음 (초기) DSPy 프로그램을 작성하세요. 다시 말하지만, 간단하게 시작하고 다음 몇 단계에서 추가할 복잡성을 안내하세요.
3) Explore a few examples.
이쯤 되면 해결하려는 작업의 예가 몇 가지 있을 것입니다.
파이프라인을 통해 실행해 보세요. 이 시점에서 크고 강력한 LM을 사용하거나 몇 가지 다른 LM을 사용해 어떤 것이 가능한지 알아보세요. (DSPy를 사용하면 이러한 LM을 매우 쉽게 교체할 수 있습니다 – LM 가이드).
이 시점에서는 아직 파이프라인을 제로 샷으로 사용하고 있으므로 완벽하지는 않을 것입니다. DSPy는 아래의 지침, 몇 가지 예제, 심지어 LM 호출의 가중치까지 최적화하는 데 도움이 되겠지만 제로 샷 사용에서 문제가 되는 부분을 이해하면 큰 도움이 될 것입니다.
시도한 흥미로운 (쉽고 어려운) 예제를 기록하세요. 레이블이 없더라도 시도한 입력을 추적하는 것만으로도 아래의 DSPy 최적화 도구에 유용합니다.
4) Define your data.
이제 DSPy 평가 및 최적화를 위한 트레이닝 및 검증 데이터를 보다 공식적으로 선언할 차례입니다 – 데이터 가이드.
10개 정도의 예제만으로도 DSPy 최적화 도구를 유용하게 사용할 수 있지만, 50~100개(또는 더 나아가 300~500개)의 예제를 보유하면 큰 도움이 됩니다.
이러한 예제는 어떻게 구할 수 있을까요? 작업이 매우 특이하다면 10개 정도의 예제를 직접 준비하는 데 투자하세요. 아래 메트릭에 따라 레이블이 아닌 입력값만 필요한 경우가 많으므로 그렇게 어렵지 않습니다.
하지만 여러분의 작업이 실제로 그렇게 독특하지 않을 가능성도 있습니다. 예를 들어, HuggingFace 데이터 집합이나 다른 형태의 데이터에서 거의 항상 여기에서 활용할 수 있는 다소 인접한 데이터 집합을 찾을 수 있습니다.
라이선스가 충분히 허용되는 데이터가 있다면 그 데이터를 사용하는 것이 좋습니다. 그렇지 않은 경우, 시스템을 사용/배포/데모하기 시작하여 초기 데이터를 수집하는 방법도 있습니다.
5) Define your metric.
시스템의 결과물을 좋게 또는 나쁘게 만드는 요인은 무엇인가요? 지표를 정의하고 시간이 지남에 따라 점진적으로 개선하는 데 투자하세요. 정의할 수 없는 것을 지속적으로 개선하기란 정말 어렵습니다.
메트릭은 데이터에서 예시를 가져와 시스템의 출력을 가져와서 그 출력이 얼마나 좋은지 정량화한 점수를 반환하는 함수, 즉 메트릭 가이드입니다.
간단한 작업의 경우 “정확도” 또는 “정확히 일치” 또는 “F1 점수”가 될 수 있습니다. 간단한 분류나 짧은 형식의 QA 작업이 이에 해당할 수 있습니다.
그러나 대부분의 애플리케이션의 경우 시스템은 긴 형식의 출력을 출력합니다. 여기서 메트릭은 아마도 출력의 여러 속성을 검사하는 더 작은 DSPy 프로그램일 것입니다(아마도 LM의 AI 피드백을 사용할 수도 있습니다).
첫 번째 시도에서 이 작업을 제대로 수행하기는 어렵겠지만 간단한 것부터 시작하여 반복해야 합니다. (메트릭 자체가 DSPy 프로그램인 경우 반복하는 가장 강력한 방법 중 하나는 메트릭 자체를 컴파일(최적화)하는 것입니다. 메트릭의 출력은 대개 단순한 값(예: 5점 만점)이므로 몇 가지 예를 수집하여 메트릭의 메트릭을 정의하고 최적화하기가 쉽습니다.)
6) Collect preliminary “zero-shot” evaluations.
이제 데이터와 메트릭을 확보했으니 최적화 도구가 실행되기 전에 파이프라인에서 평가를 실행하세요.
출력과 메트릭 점수를 살펴보세요. 이를 통해 주요 문제를 발견할 수 있으며 다음 단계의 기준을 정의할 수 있습니다.
7) Compile with a DSPy optimizer.
이제 몇 가지 데이터와 메트릭이 주어지면 작성한 프로그램을 최적화할 수 있습니다 – 최적화 가이드.
DSPy에는 다양한 작업을 수행하는 많은 최적화 도구가 포함되어 있습니다. 기억하세요: DSPy 최적화 도구는 각 단계의 예제를 만들고, 지침을 작성하고, LM 가중치를 업데이트합니다. 일반적으로 파이프라인 단계에는 레이블이 필요하지 않지만 데이터 예제에는 입력 값과 메트릭에 필요한 레이블이 있어야 합니다(예: 메트릭에 참조가 없는 경우 레이블이 없지만 대부분의 경우 최종 출력 레이블이 있어야 함).
다음은 시작하기 위한 일반적인 지침입니다:
- 데이터가 매우 적은 경우(예: 작업의 예가 10개), BootstrapFewShot을 사용하세요.
- 데이터가 약간 더 많은 경우(예: 작업의 예가 50개), BootstrapFewShotWithRandomSearch를 사용합니다.
- 이보다 더 많은 데이터(예: 300개 이상)가 있는 경우 MIPRO를 사용합니다.
- 이 중 하나를 큰 LM(예: 7B 매개변수 이상)에서 사용할 수 있고 매우 효율적인 프로그램이 필요한 경우, BootstrapFinetune을 사용하여 작은 LM으로 컴파일하세요.
8) Iterate.
이 시점에서 모든 것이 매우 만족스럽거나(DSPy를 처음 사용했을 때 제대로 된 결과를 얻는 경우를 꽤 많이 보았습니다), 많은 진전을 이루었지만 최종 프로그램이나 메트릭에 대해 마음에 들지 않는 부분이 있을 수 있습니다.
이 시점에서 1단계로 돌아가서 주요 질문을 다시 살펴보세요. 작업을 잘 정의했나요? 문제에 대해 더 많은 데이터를 수집(또는 온라인에서 찾아야 하나요?)해야 하나요? 메트릭을 업데이트하고 싶으신가요? 더 정교한 최적화 도구를 사용하고 싶으신가요? DSPy 어설션과 같은 고급 기능을 고려해야 하나요? 아니면 가장 중요한 것은 DSPy 프로그램 자체에 더 많은 복잡성이나 단계를 추가하고 싶으신가요? 한 시퀀스에서 여러 옵티마이저를 사용하고 싶으신가요?
반복 개발이 핵심입니다. DSPy는 데이터, 프로그램 구조, 어설션, 메트릭, 최적화 단계를 반복하여 점진적으로 개발할 수 있는 기능을 제공합니다.
복잡한 LM 프로그램을 최적화하는 것은 이 글을 쓰는 시점에서 DSPy에만 존재하는 완전히 새로운 패러다임이므로, 어떻게 해야 하는지에 대한 규범이 아직 만들어지고 있는 중입니다. 도움이 필요하다면 최근 커뮤니티를 위한 Discord 서버를 만들었습니다.