Exempel på format och specialfall
Lås utdataformen och tydliggör svåra gränsfall.
Exempel på format och specialfall är en gratis lektion i Claude Architect på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Claude Architect, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Claude Architect innehåller totalt 4 lektioner.
Varför formatexempel finns
Instruktioner talar om för Claude vad den ska göra. Exempel visar exakt hur utdatan ska se ut.
Few-shot-promptning innebär att du lägger in 2–4 riktade exempel i prompten. Modellen generaliserar från dem – den kopierar dem inte bara tillbaka. I den här lektionen använder vi exempel för två uppgifter: att fastställa utdatas struktur och förtydliga knepiga kantfall.
Det är i dessa två uppgifter som few-shot verkligen gör nytta: konsekvens, utdataformat och färre hallucinationer vid ovanliga indata.
Problemet: en struktur som varierar
Föreställ dig att du ber Claude extrahera ett datum. Ibland får du 2026-06-10, ibland June 10, 2026 och ibland 10/06/2026. Varje variation gör koden som använder utdatan felaktig.
En instruktion i löptext som ”returnera datumet” är tvetydig. Vag vägledning ger vag konsekvens. Lösningen är att visa exakt vilken struktur du vill ha i stället för att beskriva den.
Fastställ strukturen med exempel
Lägg in ett par par av indata och utdata i systemprompten. Modellen låser sig vid formatet på utdatan och återskapar det för nya indata.
Observera att varje exempel fastställer samma struktur: ISO-datum, status med versaler och ingen extra kommentar.
system = (
"Extract the event into JSON. Match this shape exactly.\n\n"
"Input: Launch is on June 10th, all systems go.\n"
'Output: {"date": "2026-06-10", "status": "GO"}\n\n'
"Input: Demo slipped to the 3rd of July, still pending.\n"
'Output: {"date": "2026-07-03", "status": "PENDING"}'
)
resp = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=256,
system=system,
messages=[{"role": "user", "content": "Input: Kickoff is set for May 1st and confirmed."}],
)Exempel slår adjektiv
Uttryckliga kriterier slår vaga önskemål. ”Var mer konsekvent” eller ”formatera det snyggt” ger modellen inget att utgå ifrån.
Jämför två sätt att be om samma sak:
- Vagt: ”Returnera statusen i ett rent format.”
- Konkret: visa två resultat som båda är
{"status": "GO"}/{"status": "PENDING"}.
Den konkreta versionen eliminerar gissningarna. Modellen ser målet och träffar det.
Formatkritiskt? Kombinera med strukturerad utdata
Exempel gör strukturen sannolik. Ett JSON Schema via tool_use gör den garanterad – det eliminerar syntaxfel och kräver obligatoriska fält.
Om du ställer in tool_choice på "any" tvingar du modellen att anropa något verktyg, vilket garanterar strukturerad utdata i stället för fri text. Använd few-shot-exempel för att förtydliga innehållet och schemat för att låsa strukturen.
tools = [{
"name": "record_event",
"description": "Save the parsed event.",
"input_schema": {
"type": "object",
"properties": {
"date": {"type": "string", "description": "ISO 8601, e.g. 2026-06-10"},
"status": {"type": "string", "enum": ["GO", "PENDING", "OTHER"]},
"status_detail": {"type": "string"}
},
"required": ["date", "status"]
}
}]
resp = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=256,
tools=tools,
tool_choice={"type": "any"}, # must call a tool -> structured output
messages=msgs,
)Fällan med obligatoriska fält
Ett schema är bara säkert om du markerar fälten korrekt. Regeln är: markera ett fält som obligatoriskt ENDAST om det alltid finns.
Om du kräver ett fält som kan saknas i källan kommer modellen att hitta på ett värde för att uppfylla schemat. Det är ett tyst datakvalitetsfel.
I exemplet ovan kan date och status alltid härledas och är därför obligatoriska. status_detail kan saknas och förblir därför valfritt.
Utforma för kantfall
Nu till den andra uppgiften: knepiga gränsfall. Standardutdatan täcker det normala fallet. Exempel på kantfall lär modellen vad den ska göra när indata är ovanliga, ofullständiga eller inte passar in.
Välj 2–4 exempel som riktar in sig på de specifika tvetydigheter som faktiskt uppstår – inte slumpmässiga exempel. Varje exempel ska lösa en gräns som modellen annars skulle behöva gissa sig till.
Visa fallet tomt/ej tillgängligt
Det vanligaste specialfallet: svaret finns helt enkelt inte i indata. Skilj på ett giltigt tomt resultat (inga data finns) och ett åtkomstfel (det gick inte att läsa källan).
Visa ett exempel där fältet saknas och modellen returnerar en sentinel som "OTHER" plus en detalj – aldrig ett påhittat värde.
system = (
"Extract status. If the text states no status, use OTHER and explain.\n\n"
"Input: Meeting moved to Friday.\n"
'Output: {"status": "OTHER", "status_detail": "no status stated"}\n\n'
"Input: Release approved by the board.\n"
'Output: {"status": "GO", "status_detail": "approved"}'
)Enum med en reservutväg för "Other"
Specialfall gör rigida enum-värden problematiska. En indata som inte passar någon av dina kategorier tvingar modellen att antingen hitta på en matchning eller få schemat att krascha.
Det utbyggbara mönstret är: en enum plus värdet "other" och ett fritextfält för detaljer. Då kan modellen klassificera korrekt när det går och hantera oväntad indata på ett smidigt sätt – utan att du behöver distribuera om schemat.
"properties": {
"category": {
"type": "string",
"enum": ["GO", "PENDING", "BLOCKED", "OTHER"]
},
"category_detail": {
"type": "string",
"description": "Required when category is OTHER; free text"
}
}Exempel generaliserar – använd inte för många enum-värden
Ett vanligt misstag är att behandla few-shot som en uppslagstabell – att stoppa in 30 exempel i hopp om att täcka varje indata. Modellen generaliserar från några väl valda par; den behöver ingen uttömmande lista.
Fler exempel kostar också kontext, och långa promptar drabbas av lost-in-the-middle: modellen fäster störst vikt vid början och slutet och minst vid mitten. Ett överlastat exempelblock begraver just de mönster du bryr dig om.
Begränsa dig till 2–4 tydliga exempel som riktar in sig på gränsfall.
När resultatet fortfarande är fel
Även med bra exempel kan du få ett felaktigt resultat. Retry-with-feedback rättar format-, struktur- och räknefel: skicka den ursprungliga indatan, det felaktiga resultatet och det exakta valideringsfelet igen.
Men tänk på begränsningen: retry hjälper inte när informationen helt enkelt saknas i källan. Hur många gånger du än formulerar om prompten kan den inte skapa data som inte finns – det är ett specialfall som dina exempel och ditt schema bör hantera från början med en "OTHER"-/tom väg.
try:
event = validate(tool_input) # Pydantic-style schema check
except ValidationError as err:
retry = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=256,
tools=tools,
tool_choice={"type": "any"},
messages=msgs + [
{"role": "assistant", "content": [tool_use_block]},
{"role": "user", "content": f"Validation failed: {err}. Fix and resubmit."},
],
)Snabbtest: valfritt fält
Du extraherar fakturor till JSON. De flesta fakturor har ett purchase_order-nummer, men ungefär 30 % saknar det. Du lägger till två few-shot-exempel för att låsa resultatets struktur.
Hur bör du hantera fältet purchase_order i ditt JSON Schema?
Sammanfattning: lås strukturen och tämj specialfallen
Viktiga slutsatser:
- Visa i stället för att beskriva: 2–4 par med indata och utdata låser formatet betydligt bättre än adjektiv som "rent" eller "konsekvent".
- Exempel + schema: few-shot gör strukturen sannolik; JSON Schema via tool_use (med
tool_choice: "any") gör den garanterad. - Obligatoriskt endast om det alltid finns: Att kräva ett fält som kanske saknas tvingar fram påhittade värden.
- Använd enum + "other" + detalj för utbyggbarhet, och visa ett exempel med ett frånvarande/tomt fält så att modellen aldrig hittar på data.
- Modellen generaliserar: några tydliga exempel som riktar in sig på gränsfall slår en överlastad lista som begraver mönstret i mitten.
- Retry-with-feedback rättar felaktiga resultat, men inte information som helt enkelt inte finns i källan.
Lär dig Python med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 26
- Lektioner
- 104
Vanliga frågor
Är lektionen ”Exempel på format och specialfall” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Claude Architect, inklusive ”Exempel på format och specialfall”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Claude Architect innehåller totalt 4 lektioner.
Vad lär jag mig i ”Exempel på format och specialfall”?
Lås utdataformen och tydliggör svåra gränsfall. Ni övar på Claude Architect med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Claude Architect?
Du behöver inga förkunskaper. Utbildningen i Claude Architect på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Exempel på format och specialfall”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Claude Architect-lektionen?
Ja. Varje Claude Architect-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Varför 2–4 exempel fungerar
- Exempel på format och specialfall
- Generalisering kontra upprepning
- Few-shot för att minska hallucinationer