dspy.Example și seturile de date în DSPy & Programare Algoritmică LLM

Evaluare și Testare Nivel: începător

dspy.Example este tipul de date pentru exemplele de antrenare și test; with_inputs marchează câmpurile care intră în program, iar restul rămân etichete pentru metrică.

Sintaxă & invocare
dspy.Example(question="...", answer="...").with_inputs("question")

Un set de date DSPy este o listă de obiecte dspy.Example. Un Example se comportă ca un dicționar cu acces prin punct (ex.question) și poate avea orice câmpuri. dspy.Prediction, rezultatul modulelor, folosește aceeași structură, dar fără împărțirea în intrări și etichete.

with_inputs("question") întoarce o copie în care question este marcat ca intrare; celelalte câmpuri sunt etichete sau metadate. Evaluate și optimizatorii apelează programul cu program(**example.inputs()), iar metrica primește exemplul întreg. Fără with_inputs, inputs() ridică ValueError.

Documentația recomandă construirea listei direct în Python (din JSON, CSV, pandas) și păstrarea a trei părți separate: antrenare, validare și test. La GEPA, trainset dă exemplele pentru reflecție, valset alege programul întors, iar setul de test trebuie să rămână în afara ambelor. Pentru seturi publice, dspy.datasets conține clase precum HotPotQA și DataLoader.

Concepte cheie și caracteristici

Concept / Parametru Descriere practică
dspy.Example(**campuri) Creează un exemplu cu orice chei.
with_inputs(*chei) Copie a exemplului cu cheile date marcate ca intrări.
inputs() / labels() Exemple noi doar cu intrările, respectiv doar cu celelalte câmpuri.
without(*chei) Copie fără cheile date.
toDict() Dicționar Python simplu.
dspy.datasets Seturi incluse (de exemplu HotPotQA) și DataLoader.

Exemple practice și scenarii reale

Exemplul 1: Un exemplu cu intrare și etichetă

import dspy

ex = dspy.Example(question="Cine a scris Luceafărul?", answer="Mihai Eminescu").with_inputs("question")
print(ex.question)
print(ex.inputs())    # doar question
print(ex.labels())    # doar answer

Exemplul 2: Set de date dintr-un fișier JSONL, împărțit în trei

După exemplul din ghidul de metrici: 75% antrenare, 12,5% validare, 12,5% test.

import json
import random
import dspy

exemple = []
with open("intrebari.jsonl", encoding="utf-8") as f:
    for linie in f:
        rand = json.loads(linie)
        exemple.append(
            dspy.Example(question=rand["intrebare"], answer=rand["raspuns"]).with_inputs("question")
        )

random.Random(0).shuffle(exemple)
n = len(exemple)
train = exemple[: int(n * 0.75)]
val = exemple[int(n * 0.75) : int(n * 0.875)]
test = exemple[int(n * 0.875) :]

Exemplul 3: Un set de date public

from dspy.datasets import HotPotQA

dataset = HotPotQA(train_seed=1, train_size=5, eval_seed=2023, dev_size=50, test_size=0)
print(dataset.train[0])

Greșeli frecvente și capcane

  • Uiți with_inputs. Programul nu știe ce câmpuri să primească, iar inputs() ridică ValueError.
  • Marchezi și eticheta ca intrare (with_inputs("question", "answer")). Programul primește răspunsul corect, iar scorul nu mai înseamnă nimic.
  • Evaluezi pe aceleași exemple pe care ai optimizat. Păstrează un set de test pe care optimizatorul nu l-a văzut.

Noțiuni și module înrudite