DSPY 개발 프로세스:
- a) Programming
- b) Evaluation
- c) Optimization:
Programming:
- DSPy 로 언어 모델의 응답을 얻으려면 파이프라인 설계를 해야함:
- 입력과 최종 결과
- 몇가지 단계로 구성할건지, 한번의 언어 모델 호출로 답을 얻을건지
- 외부 도구가 필요한지
- 문제를 해결하기 위한 워크플로가 있는지
- DSPy Signature:
- Signature는 DSPy 모듈의 입력/출력 동작을 선언적으로 명시한 것
- 이를 통해 LM에게 무엇을 해야 하는지 알려줄 수 있으며, 어떻게 해야 하는지를 구체적으로 지시할 필요가 없다. 알아서 잘 작동함.
- 프로그래밍에서 함수 시그니처와 유사
- Inline DSPy Signature:
- Signature는 짧은 문자열로 정의할 수 있으며, 이는 입력/출력의 인자 이름과 선택적인 타입을 포함하여 의미론적 역할을 정의한다.
- 질문 답변 (Question Answering) 시스템이라면 "question -> answer" 이런 식으로 시그니처를 정의할 수 있음.
- 감정 분류 (Sentiment Classification) 시스템에서는 "sentence -> sentiment: bool" 이런 식으로 시그니처를 정의할 수 있다. 이렇게 하는 것
- Class-based DSPy Signatures:
- 더 상세한 작업을 위해서 Signature 가이드는 Python 의 docstring 으로 작업의 성격을 명확하게 표시하면 되고, 입력 필드의 힌트는 dspy.InputField 를 사용하고, 출력 필ㄷ와 제약 조건을 이용하려면 dspy.OutputField 를 사용하면 됨.
- Signature 를 조합해서 큰 DSPy 모듈을 만들어서 추론하는 식으로도 가능하다.
- Modules:
- prompting technique 을 모듈로 추상화 한 것을 말함. 여기서는 대표적으로 Chain-of-Thought 와 ReAct 를 지원한다.
- 가장 기본적으로 추론할 수 있는 모듈은 dspy.Predict 임. 추론 작업이 필요하다면 dspy.ChainOfThought 를 쓰면 된다.
- 이외에도 SC 방법을 위해서 dspy.majority, 코드 작성을 위한 dspy.ProgramOfThought, Chain-of-Thought + SC 조합을 위한 dspy.MultiChainComparison 를 사용할 수 있음.
Evaluation:
- 평가할 수 있는 기준을 세워야지 개선해보던지 할거니까 Programming 이 끝나면 Evaluation 을 위한 준비를 해야함.
- 최소 20개의 input 데이터가 있어야하고, 권장하는건 200개의 데이터임.
- 그 다음 우리가 수행하려는 시스템을 올바르게 평가하기 위한 Metric 을 만들어야함.
- DSPy 는 Pytorch 와 같은 머신러닝 프레임워크에서 영향을 받은 것으로, training sets, development sets, and test sets 이 필요함. training set 으로 이후의 Optimization 을 할거고, test_set 으로 평가를 할 것. 이런 데이터 셋을 표현하기 위해서 dspy.Example 를 쓰면 됨.
Optimizaiton:
- DSPy Optimizer는 DSPy 프로그램의 매개변수(프롬프트나 언어 모델의 가중치 등)를 조정하여, 정확도와 같은 사용자가 지정한 평가 지표를 최대화하는 알고리즘임.
- Training Data Set 은 30개 정도만으로도 유의미한 성능 향상을 이끌어올 수 있지만, 권장하는 건 300개 정도임.
- 이 과정에서 작업 결과가 마음에 들지 않는다면 Programming 단계로 다시 돌아가서 작업 정의가 명확했는지, 더 제공해줘야 맥락이 있는지 등을 고려해야 할 것.
- 다양한 최적화 알고리즘: 각기 다른 방법으로 프로그램의 품질을 향상시키는 여러 최적화기가 존재함:
- dspy.BootstrapRS는 각 모듈에 대한 좋은 few-shot 예제를 생성함.
- dspy.MIPROv2는 각 프롬프트에 대한 더 나은 자연어 지시문을 제안하고 탐색함.
- dspy.BootstrapFinetune은 모듈용 데이터셋을 구축하고 이를 사용하여 시스템 내 언어 모델의 가중치를 미세 조정하낟.
- Optimizer의 접근 방법:
- Optimizer들은 from dspy.teleprompt import * 를 통해 접근할 수 있음.
- 현재 사용 가능한 Optimizer들:
- Automatic Few-Shot Learning:
- 이 Optimizer들은 모델에 전달되는 프롬프트 내에 최적화된 예제를 자동으로 생성하고 포함하여 Few-shot 을 구성하는 것.
- LabeledFewShot:
- 제공된 라벨이 있는 입력 및 출력 데이터 포인트로부터 Few-Shot 예제(데모)를 단순히 구성함. 이게 끝.
- 필요한 파라미터로:
- k: 프롬프트에 포함할 예제의 수.
- trainset: k개의 예제를 무작위로 선택할 훈련 데이터셋
- BootstrapFewShot:
- BootstrapFewShot은 Few-Shot 예제를 프롬프트에 추가하여 모델의 성능을 향상시키는 Optimizer 임.
- Teacher 모듈을 활용해서 추가적인 예제를 새로 생성해서 활용할 수 있으며, trainset의 라벨이 있는 예제들도 함께 사용한다.
- Teacher 모듈은 훈련 데이터의 예시를 이용해서 성능이 잘 나오는 경우가 있다면, 해당 예시를 바탕으로 새로운 예시를 만든다고 알면 됨.
- 파라미터:
- max_labeled_demos: trainset에서 무작위로 선택한 데모의 수.
- max_bootstrapped_demos: Teacher를 통해 추가로 생성된 예제의 수.
- Teacher가 생성한 예제는 Metric 지표로 검증된다.
- BootstrapFewShotWithRandomSearch:
- BootstrapFewShot을 여러 번 적용하면서 생성된 데모에 대해 랜덤 서치를 수행하고, 최적화 과정에서 가장 좋은 프로그램을 선택하는 예시.
- KNNFewShot:
- 주어진 입력 예제에 대해 k-최근접 이웃 알고리즘(k-NN) 을 사용하여 가장 가까운 훈련 예제 데모를 찾음.
- Automatic Instruction Optimization (자동 지시문 최적화):
- 이 Optimizer들은 프롬프트에 대한 최적의 지시문을 생성하며, MIPROv2의 경우 Few-Shot 데모 세트도 최적화할 수 있음.
- COPRO:
- 각 단계에서 새로운 지침을 생성하고 이를 개선하는 식으로 동작하며 좌표상승법 (coordinate ascent) 를 이용해서 최저고하함.
- MIPROv2:
- 각 단계에서 지시문과 Few-shot 예제를 생성한다.
- 지시문과 적합한 데모를 알아서 잘 탐색해서 최적화함. (베이지안 최적화(Bayesian Optimization))
- Automatic Finetuning (자동 파인튜닝):
- 이 Optimizer는 기본적인 LLM(언어 모델)을 파인튜닝하는 데 사용됨
- Program Transformations (프로그램 변환):
- 여러 DSPy 프로그램의 집합을 앙상블하여 전체 세트 또는 무작위로 샘플링된 부분 집합을 단일 프로그램으로 사용할 수도 있음.
- Automatic Few-Shot Learning:
- Which optimizer should I use?:
- DSPy에서 성공적인 결과를 얻기 위해서는 반복적인 과정이 필요하며, 최고의 성능을 얻기 위해서는 여러 번의 탐색과 반복이 필수적
- 10개 이하의 데이터라면 BootstrapFewShot을 사용하여 시작하는 걸 권장
- 소량의 데이터로도 효과적인 Few-Shot 학습을 구현할 수 있음
- 50개 이상의 데이터라면 BootstrapFewShotWithRandomSearch 을 사용하는 걸 권장.
- 랜덤 서치를 통해 다양한 예제를 탐색하고 최적의 프롬프트를 찾는 것
- 지시문 최적화만 선호하는 경우 (프롬프트를 Zero-Shot으로 유지하고 싶은 경우)
- MIPROv2 를 사용하면 됨
- 프롬프트에 예제를 포함하지 않고 지시문의 품질을 향상시킬 수 있음.
- 더 긴 최적화 실행을 수행할 의향이 있고, 충분한 데이터가 있는 경우:
- 충분한 데이터가 있어야하고, 더 긴 최적화를 위해 많은 추론이 필요함.
- Optimizer: MIPROv2 를 사용해서 베이지안 최적화를 활용하여 지시문과 데모를 효과적으로 탐색할 수 있다.
- 큰 언어 모델로 좋은 결과를 얻었고, 매우 효율적인 프로그램이 필요한 경우:
- 작은 언어 모델을 BootstrapFinetune으로 파인튜닝
- 프롬프트 기반의 프로그램을 작은 모델에 맞게 조정할 수 있다.
'Generative AI > Prompt Engineering' 카테고리의 다른 글
Stable Diffusion 3 Prompt Guide (0) | 2025.01.06 |
---|---|
To CoT or Not to CoT? Chain-of-Thought Helps Mainly on Math and Symbolic Reasoning (0) | 2024.11.17 |
Making Large Language Models Better Reasoners with Step-Aware Verifier (0) | 2024.11.16 |
Answering Questions by Meta-Reasoning over Multiple Chains of Thought (0) | 2024.11.16 |
Large Language Models Cannot Self-Correct Reasoning Yet (0) | 2024.11.16 |