Inovația centrală din DSPy este conceptul de Optimizator (denumit istoric Teleprompter). În loc să ajustați manual cuvintele dintr-un prompt ore în șir, un optimizator DSPy preia programul dumneavoastră, un set mic de date de antrenare (chiar și 20-50 de exemple) și o funcție de evaluare, găsind automat cea mai performantă configurație.
Cel mai popular optimizator ușor este BootstrapFewShot: acesta rulează programul pe setul de date, identifică execuțiile în care toate etapele intermediare au fost corecte și convertește automat acele rulări de succes în exemple dinamice de tip few-shot care sunt injectate în prompt.
Pentru scenarii de producție de înaltă performanță, optimizatorul MIPROv2 (Multiprompt Instruction Proposal & Optimization) utilizează optimizare bayesiană: generează zeci de variante posibile de instrucțiuni de sistem prin intermediul unui LLM puternic, testează combinațiile pe date și alege matematic setul optim care maximizează metrica dorită.
Sintaxă, opțiuni și concepte cheie
| Opțiune / Concept | Descriere practică |
|---|---|
BootstrapFewShot |
Optimizatorul care adună exemple de execuție reușite pentru a le folosi ca demonstrații few-shot. |
MIPROv2 |
Optimizatorul avansat ce optimizează simultan atât instrucțiunile de sistem cât și exemplele few-shot prin căutare bayesiană. |
max_bootstrapped_demos |
Numărul maxim de exemple sintetizate automat incluse în prompt (uzual 3-5). |
trainset & valset |
Colecțiile de obiecte `dspy.Example` utilizate pentru antrenare și validare. |
Exemple practice și cod
Exemplul 1: Compilarea automată a unui modul RAG folosind BootstrapFewShot
Cum se optimizează automat un lanț de întrebare-răspuns.
from dspy.teleprompt import BootstrapFewShot
import dspy
# Definim o metrică simplă: răspunsul generat trebuie să fie similar cu cel de referință
def metrica_raspuns(exemplu_real, predictie, trace=None):
return exemplu_real.raspuns_corect.strip().lower() in predictie.answer.lower()
# Set scurt de date de antrenament (doar 3 exemple ilustrative):
trainset = [
dspy.Example(question="Care este capitala Franței?", raspuns_corect="Paris").with_inputs("question"),
dspy.Example(question="Cine a scris Luceafărul?", raspuns_corect="Mihai Eminescu").with_inputs("question"),
dspy.Example(question="În ce an a început al doilea război mondial?", raspuns_corect="1939").with_inputs("question")
]
# Inițializăm optimizatorul:
optimizator = BootstrapFewShot(metric=metrica_raspuns, max_bootstrapped_demos=2)
# Compilăm programul (DSPy va genera automat cele mai bune prompturi):
program_neoptimizat = dspy.ChainOfThought("question -> answer")
program_optimizat = optimizator.compile(program_neoptimizat, trainset=trainset)
# Rulăm programul optimizat:
rez = program_optimizat(question="Care este capitala Italiei?")
print(rez.answer) # 'Roma'
Rezultat & Impact
Prompturile sunt sintetizate și calibrate matematic fără intervenție umană.
Greșeli frecvente și bune practici
- Rularea MIPROv2 cu bugete de căutare foarte mari pe API-uri scumpe fără cache activat, generând sute de apeluri către modelul propunător.
- Evaluarea optimizatorului pe același set de date folosit la antrenare, riscând fenomenul de supra-ajustare (overfitting) a prompturilor.