Iteratieve verfijning met voorbeelden
2-4 invoer-/uitvoervoorbeelden en testgestuurde iteratie
Iteratieve verfijning met voorbeelden is een gratis Claude Architect-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Claude Architect. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Claude Architect bevat in totaal 4 lessen.
Waarom voorbeelden beter werken dan bijvoeglijke naamwoorden
Wanneer een prompt ondermaats presteert, grijpen architecten vaak naar vage oplossingen zoals "wees preciezer" of "doe meer moeite". Die leveren zelden verbetering op. De betrouwbare aanpak is expliciete criteria plus concrete voorbeelden.
Vergelijk: "wees preciezer" met "markeer een opmerking alleen wanneer die de code tegenspreekt". De tweede formulering vertelt het model precies waar de beslisgrens ligt. In deze les leer je een prompt productieklaar te maken met 2-4 gerichte invoer-/uitvoervoorbeelden en een strakke cyclus van testen en herhalen.
Hoe few-shot echt werkt
Few-shot prompting voegt een kleine verzameling uitgewerkte voorbeelden toe aan je instructies. Het belangrijkste inzicht: het model generaliseert vanuit de voorbeelden — het kopieert ze niet simpelweg. Op basis van 3 representatieve gevallen leidt het de onderliggende regel af en past die toe op invoer die het nog niet heeft gezien.
Few-shot werkt het best voor vier taken:
- Consistentie bij veel aanroepen
- Randgevallen die je met alleen woorden moeilijk goed kunt beschrijven
- Uitvoerindeling die het model moet nabootsen
- Het verminderen van hallucinaties door het gedrag te verankeren
Richt je op 2-4 voorbeelden per onduidelijkheid — genoeg om het patroon te definiëren, maar weinig genoeg om de context compact te houden.
Anatomie van een goed voorbeeld
Een effectief few-shot-voorbeeld bestaat uit een gekoppelde invoer en de exacte uitvoer die je terug wilt krijgen. De uitvoer moet overeenkomen met het echte schema of de echte structuur die je in productie gebruikt — dezelfde velden, dezelfde hoofdlettergebruik en dezelfde structuur.
Hieronder toont elk voorbeeld een invoeropmerking plus het precieze oordeel. Het model leert de grens: markeer alleen echte tegenstrijdigheden, niet kleine stijlopmerkingen.
examples = [
{
"input": "# returns the user's age\n def get_name(u): return u.name",
"output": {"flag": True, "reason": "comment says age, code returns name"},
},
{
"input": "# sort ascending\n items.sort()",
"output": {"flag": False, "reason": "comment matches behavior"},
},
]
system = (
"Flag a comment ONLY when it contradicts the code. "
"Style or wording issues are not contradictions.\n\n"
"Examples:\n" + "\n".join(
f"INPUT: {e['input']}\nOUTPUT: {e['output']}" for e in examples
)
)Criteria koppelen aan voorbeelden
Voorbeelden en expliciete criteria vullen elkaar aan; ze zijn geen alternatieven. Criteria formuleren de regel; voorbeelden kalibreren het grijze gebied dat de regel niet volledig in proza kan vatten.
Een veelgemaakte fout van architecten is voorbeelden geven zonder een sturende instructie. Het model past zich dan te sterk aan oppervlakkige kenmerken van de voorbeelden aan. Begin altijd met een scherp criterium — "markeer alleen wanneer X Y tegenspreekt" — en laat 2-4 voorbeelden vervolgens verduidelijken waar X en Y door elkaar gaan lopen.
Vuistregel: als je het criterium niet in één zin kunt formuleren, is je taak nog steeds onvoldoende gespecificeerd en lossen meer voorbeelden dat niet op.
Bouw eerst een testset
Iteratieve verfijning is testgestuurd. Stel voordat je de prompt afstemt een kleine gelabelde verzameling representatieve invoer met bekende, correcte uitvoer samen. Dit is je grondwaarheid — elke wijziging aan de prompt wordt hieraan getoetst, niet aan een onderbuikgevoel.
Houd de testset gescheiden van je few-shot-voorbeelden. Als je afstemt op dezelfde gevallen waarmee je het model onderwijst, is het aan het memoriseren in plaats van aan het generaliseren.
test_cases = [
{"input": "# deletes the record\n def archive(r): r.archived = True",
"expected": {"flag": True}},
{"input": "# cache result for 60s\n cache.set(k, v, ttl=60)",
"expected": {"flag": False}},
{"input": "# returns count\n def total(rows): return sum(r.amt for r in rows)",
"expected": {"flag": True}},
]De iteratielus
De verfijningslus is mechanisch en herhaalbaar:
- Voer uit de prompt op elk testgeval
- Vergelijk de uitvoer met het verwachte label
- Inspecteer de fouten — welke grens heeft het model gemist?
- Voeg één voorbeeld toe of scherp er één aan (of doe hetzelfde met één criterium) dat zich op die fout richt
- Voer de volledige set opnieuw uit en controleer of er niets is verslechterd
Verander één ding per iteratie. Wijzigingen in batches maken het onmogelijk om te weten welke aanpassing heeft geholpen of juist schade heeft veroorzaakt.
De testset scoren
Automatiseer de vergelijking zodat itereren snel gaat. Een kleine testomgeving voert elk geval uit, scoort het en toont de missers. Met gestructureerde uitvoer kun je velden rechtstreeks vergelijken in plaats van proza te parseren.
Let hieronder op tool_choice: door een toolaanroep af te dwingen, zorg je ervoor dat het model elke keer JSON teruggeeft die aan het schema voldoet, zodat je scorer niet struikelt over vrije tekst.
def score(client, system, cases):
misses = []
for c in cases:
resp = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=256,
system=system,
tools=[verdict_tool],
tool_choice={"type": "any"}, # must call a tool -> structured output
messages=[{"role": "user", "content": c["input"]}],
)
out = resp.content[0].input
if out["flag"] != c["expected"]["flag"]:
misses.append((c["input"], out))
return missesRicht je met nieuwe voorbeelden op fouten
Vraag jezelf bij het lezen van een misser af: welke onduidelijkheid heeft dit veroorzaakt? Voeg vervolgens een voorbeeld toe dat precies op die grens ligt — geen willekeurig nieuw geval. Eén scherp voorbeeld per fouttype generaliseert veel beter dan tien algemene voorbeelden.
Stel dat het model ten onrechte een opmerking markeert die de code parafraseert. Dan voeg je een gekoppeld voorbeeld toe dat laat zien: parafrase = geen tegenstrijdigheid. Het model past zijn interne grens aan en de hele klasse van vergelijkbare missers verdwijnt.
Weersta de neiging om steeds meer voorbeelden toe te voegen. Bij meer dan ongeveer 4 per onduidelijkheid maak je de context onnodig groot en loop je het risico op lost-in-the-middle, waarbij het model minder aandacht besteedt aan het midden van een lange prompt.
# Add ONE example aimed at the observed miss:
examples.append({
"input": "# loop over each item\n for x in items: process(x)",
"output": {"flag": False,
"reason": "paraphrase of code, not a contradiction"},
})Opmaakfouten? Opnieuw proberen met feedback
Sommige fouten zijn opmaak- of structurele fouten, geen redeneerfouten — bijvoorbeeld een ongeldig veld, een verkeerd rekenkundig totaal of een ontbrekende haak. Hiervoor is opnieuw proberen met feedback de oplossing: stuur de oorspronkelijke invoer, de verkeerde uitvoer en de exacte validatiefout terug.
Belangrijke beperking: opnieuw proberen helpt wanneer het model het juiste antwoord kan geven, maar een fout heeft gemaakt. Het helpt niet wanneer de benodigde informatie simpelweg ontbreekt in de bron — hoe vaak je het ook opnieuw probeert, je kunt geen gegevens verzinnen die er niet zijn.
def retry_with_feedback(client, system, original, bad_output, error):
return client.messages.create(
model="claude-sonnet-4-5",
max_tokens=512,
system=system,
messages=[
{"role": "user", "content": original},
{"role": "assistant", "content": str(bad_output)},
{"role": "user", "content":
f"That output failed validation: {error}. "
"Return corrected output that satisfies the schema."},
],
)Kwaliteit vastleggen met gestructureerde uitvoer
Zodra voorbeelden het gedrag hebben gevormd, leg je de structuur vast met een JSON Schema via toolgebruik. Dit voorkomt syntaxisfouten en dwingt vereiste velden af. Eén regel is het belangrijkst: markeer een veld alleen als vereist wanneer het altijd aanwezig is.
Maak nooit een veld vereist dat kan ontbreken — het model zal een waarde verzinnen om aan het schema te voldoen. Gebruik voor optionele of open gegevens een enum met een waarde "other" plus een vrij tekstveld voor details. Zo blijft het contract uitbreidbaar zonder hallucinaties af te dwingen.
verdict_tool = {
"name": "record_verdict",
"description": "Record whether a comment contradicts its code.",
"input_schema": {
"type": "object",
"properties": {
"flag": {"type": "boolean"},
"category": {"type": "string",
"enum": ["contradiction", "style", "other"]},
"detail": {"type": "string"},
},
"required": ["flag"], # only the always-present field
},
}Valideer met een nieuwe beoordelaar
Voordat je de verfijnde prompt vertrouwt, valideer je die met een onafhankelijke, nieuwe instantie — niet met dezelfde sessie die de uitvoer heeft geproduceerd. Een zelfbeoordeling binnen dezelfde sessie is bevooroordeeld: de auteur behoudt zijn eigen redeneerlijn en zal zichzelf niet kritisch bevragen.
Vertrouw ook niet alleen op een totaalscore. Een kop als 97% nauwkeurigheid kan verbergen dat een bepaald veld of invoertype ernstig faalt. Gebruik gestratificeerde steekproeven en vertrouwen op veldniveau, gekalibreerd op een gelabelde validatieset, voordat je automatiseert. De verfijning is niet klaar wanneer het gemiddelde er goed uitziet — ze is klaar wanneer elk segment de norm haalt.
Korte controle: een falende prompt repareren
Een classifierprompt haalt 92% op je gelabelde testset, maar labelt opmerkingen die de code parafraseren consequent verkeerd als tegenstrijdigheden. Welke verfijningsstap is het effectiefst?
Samenvatting: verfijn met voorbeelden, bewijs met tests
Belangrijkste punten:
- Voorbeelden zijn beter dan bijvoeglijke naamwoorden. Expliciete criteria plus 2-4 gerichte voorbeelden presteren beter dan vage instructies zoals 'wees preciezer'.
- Het model generaliseert vanuit few-shot-voorbeelden — vooral geschikt voor consistentie, randgevallen, uitvoerindeling en het verminderen van hallucinaties.
- Werk testgestuurd: bouw een gelabelde set, scoor die, voeg per fouttype één grensgeval toe, voer opnieuw uit en verander steeds één ding.
- Opnieuw proberen met feedback verhelpt opmaakfouten (stuur de oorspronkelijke invoer + verkeerde uitvoer + exacte fout) — maar geen gegevens die in de bron ontbreken.
- Leg de structuur vast met een JSON Schema; maak alleen altijd aanwezige velden vereist; gebruik enum + 'other' + details voor uitbreidbaarheid.
- Valideer onafhankelijk: beoordeling door een nieuwe instantie is beter dan zelfbeoordeling in dezelfde sessie, en gestratificeerde controles op veldniveau zijn beter dan alleen een geaggregeerde nauwkeurigheid.
Leer Python met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 26
- Lessen
- 104
Veelgestelde vragen
Is de les “Iteratieve verfijning met voorbeelden” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Claude Architect, waaronder “Iteratieve verfijning met voorbeelden”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Claude Architect bevat in totaal 4 lessen.
Wat leer ik in “Iteratieve verfijning met voorbeelden”?
2-4 invoer-/uitvoervoorbeelden en testgestuurde iteratie Je oefent met Claude Architect door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Claude Architect te beginnen?
Ervaring vooraf is niet nodig. Claude Architect op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Iteratieve verfijning met voorbeelden”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Claude Architect?
Ja. Elke les over Claude Architect bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Aangepaste opdrachten versus skills
- Frontmatter van skills
- Planmodus versus directe uitvoering
- Iteratieve verfijning met voorbeelden