Optimizatori DSPy (fost teleprompters): BootstrapFewShot, MIPROv2, SIMBA în DSPy & Programare Algoritmică LLM

Optimizare și Compilare Nivel: intermediar

Optimizatorii DSPy, numiți teleprompters în versiunile vechi, rulează programul pe exemple și păstrează instrucțiunile, demonstrațiile sau ponderile care obțin cel mai bun scor la o metrică.

Sintaxă & invocare
optimizator = dspy.MIPROv2(metric=metrica, auto="light")
optimizat = optimizator.compile(program, trainset=train, valset=val)

Un optimizator primește programul, o metrică și un set de antrenare și ajustează una sau mai multe dintre: instrucțiunile (docstring-ul semnăturilor), demonstrațiile (exemplele few-shot din predictor.demos) și ponderile modelului. Numele vechi, teleprompter, a rămas în modulul dspy.teleprompt; clasele se folosesc direct din dspy. compile() întoarce o copie nouă, marcată ca deja compilată, și nu modifică programul primit.

dspy.LabeledFewShot pune exemple etichetate ca demonstrații, fără apeluri la model. dspy.BootstrapFewShot rulează programul (sau un teacher) pe exemplele de antrenare, păstrează urmele (trace) acceptate de metrică și le pune ca demonstrații: până la max_bootstrapped_demos (implicit 4) generate, completate până la max_labeled_demos (implicit 16) cu exemple etichetate. BootstrapFewShotWithRandomSearch (alias BootstrapRS) repetă procesul pentru mai mulți candidați și îl alege pe cel mai bun pe valset.

dspy.MIPROv2 optimizează împreună instrucțiunile și demonstrațiile: prompt_model propune instrucțiuni, iar combinația se alege prin optimizare bayesiană; auto="light" (implicit), "medium" sau "heavy" fixează bugetul. dspy.SIMBA lucrează pe mini-loturi: găsește exemplele cu rezultate variabile și adaugă fie o regulă în instrucțiuni, fie o demonstrație; cere pip install "dspy[numpy]". GEPA rescrie instrucțiunile pe baza feedback-ului text al metricii, iar BootstrapFinetune ajustează ponderile unui model care permite fine-tuning. Ghidul oficial recomandă să începi cu un optimizator de prompturi și să treci la fine-tuning doar când acesta nu mai aduce câștig.

Concepte cheie și caracteristici

Concept / Parametru Descriere practică
dspy.LabeledFewShot(k=16) Până la k exemple etichetate ca demonstrații; nu apelează modelul.
dspy.BootstrapFewShot(metric, metric_threshold=None, max_bootstrapped_demos=4, max_labeled_demos=16, max_rounds=1) Demonstrații din urmele acceptate de metrică. Cu metric_threshold, un scor numeric trebuie să atingă pragul.
dspy.BootstrapFewShotWithRandomSearch(metric, num_candidate_programs=16, stop_at_score=None, ...) Alias dspy.BootstrapRS; evaluează candidații pe valset (implicit trainset).
dspy.MIPROv2(metric, prompt_model=None, task_model=None, auto="light", max_bootstrapped_demos=4, max_labeled_demos=4, num_threads=None) Instrucțiuni și demonstrații împreună. Fără prompt_model / task_model folosește modelul din dspy.configure.
dspy.SIMBA(metric, bsize=32, num_candidates=6, max_steps=8, max_demos=4) Optimizare pe mini-loturi; trainset trebuie să aibă cel puțin bsize exemple.
dspy.COPRO(prompt_model=None, metric=None, breadth=10, depth=3) Propune și testează instrucțiuni noi, nivel cu nivel.
dspy.GEPA(metric, auto=..., reflection_lm=...) Optimizare reflexivă a instrucțiunilor; vezi pagina GEPA.
dspy.BootstrapFinetune(metric=None, ...) Fine-tuning pe urmele reușite; cere un model cu API de fine-tuning.
compile(student, trainset=..., valset=...) Pornește optimizarea; valset există la BootstrapRS, MIPROv2 și GEPA, nu și la BootstrapFewShot.

Exemple practice și scenarii reale

Exemplul 1: BootstrapFewShot pe un program de întrebări și răspunsuri

Setul de trei exemple arată doar forma API-ului; pentru o optimizare reală ai nevoie de mai multe date.

import dspy

dspy.configure(lm=dspy.LM("openai/gpt-6-luna"))

def raspuns_corect(example, pred, trace=None):
    return example.answer.strip().lower() in pred.answer.lower()

trainset = [
    dspy.Example(question="Care este capitala Franței?", answer="Paris").with_inputs("question"),
    dspy.Example(question="Cine a scris Luceafărul?", answer="Mihai Eminescu").with_inputs("question"),
    dspy.Example(question="În ce an a început al doilea război mondial?", answer="1939").with_inputs("question"),
]

optimizator = dspy.BootstrapFewShot(metric=raspuns_corect, max_bootstrapped_demos=2, max_labeled_demos=4)
program = dspy.ChainOfThought("question -> answer")
optimizat = optimizator.compile(program, trainset=trainset)

rez = optimizat(question="Care este capitala Italiei?")
print(rez.answer)

Exemplul 2: MIPROv2 cu un model separat pentru propuneri

optimizator = dspy.MIPROv2(
    metric=raspuns_corect,
    prompt_model=dspy.LM("openai/gpt-6-astra"),
    auto="light",
    num_threads=8,
)
optimizat = optimizator.compile(program, trainset=train, valset=val)
optimizat.save("qa_mipro.json")

Exemplul 3: SIMBA

optimizator = dspy.SIMBA(metric=raspuns_corect, bsize=32, max_steps=8)
optimizat = optimizator.compile(program, trainset=train)   # cel puțin 32 de exemple

Greșeli frecvente și capcane

  • Măsori rezultatul pe exemplele folosite la optimizare. Folosește dspy.Evaluate pe un set de test separat.
  • Folosești o metrică nedeterministă (de exemplu un judecător LLM) cu BootstrapFewShot. Documentația avertizează că demonstrațiile alese depind atunci de zgomotul metricii; preferă metrici deterministe sau BootstrapRS cu un valset.
  • Pornești MIPROv2 sau GEPA cu bugetul maxim. Documentația avertizează că o singură rulare poate costa sute de dolari în apeluri; începe cu auto="light" și salvează rezultatul ca să nu repeți compilarea.
  • Copiezi requires_permission_to_run=True din tutoriale vechi. Confirmarea a fost scoasă din MIPROv2, iar argumentul ridică ValueError.

Noțiuni și module înrudite