Optimizatori Automati de Prompturi (Teleprompters) în DSPy în DSPy & Programare Algoritmică LLM

Cum funcționează algoritmii de optimizare automată care sintetizează instrucțiuni de sistem și selectează cele mai bune exemple few-shot.

Sintaxă & invocare
from dspy.teleprompt import BootstrapFewShot, MIPROv2

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.

Ghiduri și noțiuni înrudite