
DSPy optimizer은 정확도 등 사용자가 지정한 메트릭을 최대화하기 위해 DSPy 프로그램의 매개변수(예: 프롬프트 및/또는 LM 가중치)를 조정할 수 있는 알고리즘입니다.
DSPy에는 매우 다양한 전략을 적용하는 많은 기본 제공 optimizer 도구가 있습니다. 일반적인 DSPy optimizer 도구는 세 가지를 사용합니다:
- DSPy 프로그램. 이는 단일 모듈(예: dspy.Predict)일 수도 있고 복잡한 다중 모듈 프로그램일 수도 있습니다.
- 메트릭. 프로그램의 출력을 평가하고 점수를 할당하는 함수입니다(점수가 높을수록 좋음).
- 몇 가지 훈련 입력. 매우 작거나(예: 5개 또는 10개만) 불완전할 수 있습니다(레이블 없이 프로그램에 대한 입력만).
많은 데이터를 보유하고 있다면 DSPy를 활용할 수 있습니다. 하지만 소규모로 시작하여 강력한 결과를 얻을 수 있습니다.
참고: 이전에는 DSPy Teleprompters라고 불렸습니다. 공식 명칭을 업데이트 중이며, 라이브러리와 문서 전반에 반영될 예정입니다.
DSPy 옵티마이저는 무엇을 조정하나요? 어떻게 튜닝하나요?
기존의 심층 신경망(DNN)은 손실 함수와 일부 학습 데이터가 주어지면 경사 하강을 통해 최적화할 수 있습니다.
DSPy 프로그램은 LM에 대한 여러 호출로 구성되며, [DSPy 모듈]로 함께 쌓입니다. 각 DSPy 모듈에는 (1) LM 가중치, (2) 명령어, (3) 입력/출력 동작의 데모 등 세 가지 종류의 내부 파라미터가 있습니다.
메트릭이 주어지면 DSPy는 다단계 최적화 알고리즘을 통해 이 세 가지를 모두 최적화할 수 있습니다. 예를 들어, 명령어 작성/업데이트 및 데모 생성/검증에 대해 기울기 하강(LM 가중치)과 개별 LM 기반 최적화를 결합할 수 있습니다. DSPy 데모는 몇 가지 예제와 비슷하지만 훨씬 더 강력합니다. 프로그램이 주어지면 처음부터 만들 수 있으며, 여러 가지 효과적인 방법으로 생성 및 선택을 최적화할 수 있습니다.
많은 경우 컴파일을 하면 사람이 직접 작성하는 것보다 더 나은 프롬프트를 얻을 수 있다는 사실을 발견했습니다. DSPy 최적화 도구가 사람보다 더 창의적이기 때문이 아니라 더 많은 것을 훨씬 더 체계적으로 시도하고 메트릭을 직접 조정할 수 있기 때문입니다.
현재 어떤 DSPy 옵티마이저를 사용할 수 있나요?
이 모든 기능은 from dspy.teleprompt import * 를 통해 액세스할 수 있습니다.
Automatic Few-Shot Learning
이러한 옵티마이저는 모델에 전송된 프롬프트 내에 최적화된 예제를 자동으로 생성하고 포함함으로써 시그니처를 확장하여 few-shot 학습을 구현합니다.
- LabeledFewShot: 제공된 레이블이 지정된 입력 및 출력 데이터 포인트에서 few-shot 예제(데모)를 간단히 구성합니다. k(프롬프트의 예제 수)와 무작위로 k개의 예제를 선택할 trainset이 필요합니다.
BootstrapFewShot
: 트레이닝 세트의 레이블이 지정된 예제와 함께 프로그램의 모든 단계에 대한 완전한 데모를 생성하기 위해teacher
모듈(프로그램에 기본값으로 제공됨)을 사용합니다. 매개변수에는 max_labeled_demos(트레이닝 세트에서 무작위로 선택된 데모 수)와 max_bootstrapped_demos(teacher가 생성한 추가 예제 수)가 포함됩니다. 부트스트랩 프로세스는 이 메트릭을 사용하여 “컴파일됨” 프롬프트에서 메트릭을 통과한 데모만 포함하여 데모의 유효성을 검사합니다. 고급: 더 어려운 작업을 위해 호환되는 구조를 가진 다른 DSPy 프로그램인 teacher프로그램 사용을 지원합니다.- BootstrapFewShotWithRandomSearch: 생성된 데모에 무작위 검색을 통해 BootstrapFewShot을 여러 번 적용하고 최적화를 통해 가장 적합한 프로그램을 선택합니다. 매개 변수는 BootstrapFewShot의 매개 변수와 유사하지만, 컴파일되지 않은 프로그램의 후보, LabeledFewShot 최적화 프로그램, 셔플되지 않은 예제가 있는 BootstrapFewShot 컴파일 프로그램 및 무작위 예제 세트가 있는 BootstrapFewShot 컴파일 프로그램의 num_candidate_programs를 포함하여 최적화를 통해 평가되는 임의 프로그램의 수를 지정하는 num_candidate_프로그램이 추가되어 있습니다.
BootstrapFewShotWithOptuna
: 데모 세트 전체에 Optuna 최적화가 포함된 BootstrapFewShot을 적용하여 평가 지표를 극대화하고 최상의 데모를 선택하기 위해 테스트를 실행합니다.- KNNFewShot. 가장 가까운 k-Nearest 알고리즘을 통해 데모를 선택하여 여러 클러스터에서 다양한 예제 세트를 선택합니다. 예제를 벡터화한 다음 부트스트랩/선택 프로세스를 위해 부트스트랩FewShot이 포함된 클러스터 센터를 사용하여 클러스터링합니다. 무작위 공간에 데이터가 많을 때 유용합니다. KNN을 사용하면 BootstrapFewShot을 위한
trainset
을 최적화하는 데 도움이 됩니다. 예시는 이 노트북을 참조하세요.
Automatic Instruction Optimization
이러한 optimizers 도구는 프롬프트에 대한 최적의 지침을 생성하며, MIPRO의 경우 few-shot 으로 구성된 데모 세트도 최적화합니다.
- COPRO: 각 단계에 대한 새로운 지침을 생성 및 개선하고, 좌표 상승(미터법 함수와 기차 세트를 사용한 언덕 오르기)을 통해 최적화합니다. 매개변수에는 옵티마이저가 실행하는 즉각적인 개선의 반복 횟수인
depth
가 포함됩니다. - MIPRO: 각 단계에서 명령어와few-shot 예제를 생성합니다. 명령어 생성은 데이터 인식 및 데모 인식입니다. 베이지안 최적화를 사용하여 모듈 전체에서 생성 명령어/데모 공간을 효과적으로 검색합니다.
Automatic Finetuning
이 옵티마이저는 기본 LLM을 미세 조정하는 데 사용됩니다.
BootstrapFinetune
: 프롬프트 기반 DSPy 프로그램을 가중치 업데이트(더 작은 LM의 경우)로 증류합니다. 출력은 단계는 동일하지만 각 단계가 프롬프트 기반 LM 대신 미세 조정된 모델에 의해 수행되는 DSPy 프로그램입니다.
Program Transformations
Ensemble
: DSPy 프로그램 집합을 구성하고 전체 집합을 사용하거나 하위 집합을 무작위로 샘플링하여 단일 프로그램으로 만듭니다.
어떤 optimizer를 사용해야 하나요?
경험상 어디서부터 시작해야 할지 모르겠다면 BootstrapFewShotWithRandomSearch를 사용하세요.
다음은 시작하기 위한 일반적인 지침입니다:
- 데이터가 매우 적은 경우(예: 작업의 예가 10개)에는 BootstrapFewShot을 사용하세요.
- 데이터가 약간 더 많은 경우(예: 작업의 예가 50개), BootstrapFewShotWithRandomSearch를 사용합니다.
- 이보다 많은 데이터(예: 300개 이상)가 있는 경우 MIPRO를 사용합니다.
- 이 중 하나를 큰 LM(예: 7B 매개변수 이상)에서 사용할 수 있고 매우 효율적인 프로그램이 필요한 경우, BootstrapFinetune을 사용하여 작은 LM으로 컴파일하세요.
optimizer는 어떻게 사용하나요?
keyword arguments(hyperparameters)에 약간의 차이가 있을 뿐, 모두 이 일반적인 인터페이스를 공유합니다.
가장 일반적인 BootstrapFewShotWithRandomSearch를 통해 살펴보겠습니다.
from dspy.teleprompt import BootstrapFewShotWithRandomSearch
# 최적화 도구 설정: 프로그램 단계의 8-shot 예제를 'bootstrap'(즉, 자체 생성)하려고 합니다.
# 옵티마이저는 이 과정을 10회(초기 시도도 일부 포함) 반복한 후 개발 세트에서 가장 적합한 시도를 선택합니다.
config = dict(max_bootstrapped_demos=4, max_labeled_demos=4, num_candidate_programs=10, num_threads=4)
teleprompter = BootstrapFewShotWithRandomSearch(metric=YOUR_METRIC_HERE, **config)
optimized_program = teleprompter.compile(YOUR_PROGRAM_HERE, trainset=YOUR_TRAINSET_HERE)
optimizer 출력 Saving 및 loading
optimizer를 통해 프로그램을 실행한 후에는 저장하는 것도 유용합니다. 나중에 파일에서 프로그램을 로드하여 추론에 사용할 수 있습니다. 이를 위해 load
및 save
메서드를 사용할 수 있습니다.
Saving a program
optimized_program.save(YOUR_SAVE_PATH)
결과 파일은 일반 텍스트 JSON 형식입니다. 여기에는 소스 프로그램의 모든 매개변수와 단계가 포함되어 있습니다. 언제든지 이 파일을 읽고 최적화 도구가 생성한 내용을 확인할 수 있습니다.’
Loading a program
파일에서 프로그램을 로드하려면 해당 클래스에서 객체를 인스턴스화한 다음 해당 객체의 로드 메서드를 호출하면 됩니다.
loaded_program = YOUR_PROGRAM_CLASS()
loaded_program.load(path=YOUR_SAVE_PATH)