- Je bouwt zero-shot- en few-shot-berichten zonder modelgewichten te veranderen.
- Je vergelijkt promptvarianten per geval en houdt de uiteindelijke testset apart.
Een ticket zegt: “Mijn factuur mist.” De opdracht “Doe iets met dit bericht” laat open of je moet samenvatten, antwoorden of classificeren. Een toetsbare prompt benoemt de taak, de toegestane antwoorden en wat er bij twijfel moet gebeuren.
We gebruiken een fictieve helpdesk met labels factuur, storing, vraag en onduidelijk. “Kies precies één van deze labels; kies onduidelijk als de tekst onvoldoende informatie geeft” is een concreter begin. Of deze formulering werkelijk helpt, meten we later op vastgelegde gevallen.
1. Maak rollen onderdeel van de structuur
Zero-shot betekent hier: een instructie en een nieuwe vraag, zonder demonstraties. De instructie komt in een system-bericht en de vraag in een user-bericht. De rol staat buiten de inhoud; het woord system in een gebruikerstekst maakt daarvan geen systeeminstructie.
rule = (
'Kies factuur, storing, vraag of '
'onduidelijk. Bij onvoldoende '
'informatie: kies onduidelijk.')
text = ' Mijn factuur mist. '
messages = build_messages(rule,text)
print([m['role'] for m in messages])
# ['system', 'user']
print(messages[1]['content'] == text)
# True
Maak build_messages met twee nieuwe berichtdictionaries. Beide teksten moeten na strippen niet leeg zijn en mogen maximaal 2000 Python-tekens bevatten. Controleer die voorwaarden, maar bewaar de oorspronkelijke tekst inclusief witruimte.
Een modelspecifieke chattemplate zet deze berichten daarna om in één tokenreeks. Gebruik de template die bij het getrainde model hoort. Een nette rolstructuur helpt de applicatie, maar garandeert niet dat het model ongewenste instructies uit inhoud negeert; rechten blijven een beslissing van programmacode.
012. Doe hetzelfde antwoordpatroon voor
Few-shot voegt enkele invoer/antwoordvoorbeelden aan de context toe. Het model ziet daardoor een patroon tijdens inferentie; er vinden geen updates van modelgewichten plaats. Laat voorbeelden hetzelfde labelcontract volgen als de uiteindelijke vraag.
examples = [
{'input':'Waar is mijn bon?',
'output':'factuur'}]
chat = few_shot_messages(
rule,examples,'Hallo!')
print([m['role'] for m in chat])
# ['system','user','assistant','user']
print(chat[-1]['content']) # Hallo!
Maak few_shot_messages door de voorbeelden als user/assistant-paren vóór de nieuwe vraag te plaatsen. Gebruik hoogstens vier voorbeelden, ieder met exact input en output en niet-lege teksten van maximaal 500 tekens. Het totaal van alle contentvelden mag maximaal 6000 tekens zijn; dat is een eigen tekenlimiet, geen tokenbudget.
Kies demonstraties uit trainings- of ontwikkeldata. Een voorbeeld uit je eindtest verraadt een deel van het antwoord en maakt de eindmeting minder eerlijk. Meer voorbeelden zijn bovendien niet automatisch beter: ze kunnen ook een verkeerd patroon of extra contextkosten toevoegen.
023. Vergelijk dezelfde gevallen per ID
Stel dat vijf afgesproken ja/nee-antwoorden worden vergeleken. A en B hebben één geval allebei goed, één alleen A goed, twee alleen B goed en één allebei fout. A haalt dan 2/5=.4 en B 3/5=.6.
N is het aantal gedeelde gevallen; de twee tellers bevatten uitsluitend de gevallen waarop de prompts verschillen in juistheid. Hier is Δ=(2−1)/5=.2. De gezamenlijke goede en foute antwoorden veranderen dit verschil niet.
expected = {'1':'ja','2':'nee','3':'ja',
'4':'nee','5':'ja'}
a = {'1':'ja','2':'ja','3':'nee',
'4':'nee','5':'nee'}
b = {'1':'ja','2':'nee','3':'ja',
'4':'ja','5':'nee'}
s = paired_prompt_score(expected,a,b)
print(s['only_a'],s['only_b']) # 1 2
print(s['accuracy_a'],s['accuracy_b'])
# 0.4 0.6
print(s['delta_b_minus_a']) # 0.2
Maak paired_prompt_score voor 1–100 gevallen met exact dezelfde IDs. Vergelijk strings letterlijk; een lege voorspelling telt als fout antwoord. De visualisatie gebruikt verzonnen antwoorden en is geen echte modelmeting.
Een synthetische validatieset van acht gevallen. Verander welke antwoorden van B goed zijn; er draait hier geen taalmodel.
| Variant A ↓ / B → | B goed | B fout |
|---|---|---|
| A goed | 3 | 1 |
| A fout | 2 | 2 |
Vergelijk per geval, niet alleen het gemiddelde. Acht verzonnen gevallen bewijzen geen prestatie op nieuwe data.
Leg bij een echt experiment modelrevisie, promptversie en generatie-instellingen vast. Kies prompts op de validatieset en meet de gekozen versie pas daarna op de onaangeroerde eindtest. Eigen varianten kun je proberen in het model-lab, zonder dat kleine model als automatische beoordelaar te behandelen.
Wat neem je mee?
- Rollen geven structuur; voorbeelden geven een patroon zonder trainingsupdate.
- Een uitvoercontract maakt de opdracht toetsbaar.
- Een eerlijke vergelijking gebruikt dezelfde gevallen en een aparte eindtest.
Hierna controleer je of een antwoord ook werkelijk een bruikbaar JSON-ticket is.