Selvkorrektion
Udtræk calculated_total og stated_total for at opdage afvigelser
Selvkorrektion er en gratis Claude Architect-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Claude Architect, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Claude Architect-kurset indeholder 4 lektioner i alt.
Tillidskløften
Når Claude udtrækker data fra en faktura eller rapport, kan outputtet være fuldstændigt gyldigt JSON og stadig være forkert. En linjepost kan være blevet fejllæst, et tal kan være blevet ombyttet, eller en subtotal kan ubemærket være skredet.
Skemavalidering opdager strukturelle problemer: manglende påkrævede felter, forkerte typer og ugyldige enum-værdier. Den opdager ikke et tal, der er korrekt formateret, men ikke stemmer overens med resten af dokumentet.
Denne lektion lærer dig selvkorrektion: en teknik, hvor du udtrækker nok information til, at systemet kan kontrollere sin egen aritmetik og opdage afvigelser, før de når din database.
Sådan ser en afvigelse ud
Forestil dig en faktura med linjeposter og en total nederst. Her indgår to tal:
- stated_total — totalen, der står bogstaveligt på dokumentet
- calculated_total — summen af de enkelte linjeposter
I et fejlfrit dokument er de ens. Men OCR-støj, et fejllæst ciffer eller en opdigtet linjepost får dem til at afvige. Denne afvigelse er en afvigelse.
Den centrale idé i denne lektion er: Hvis du kun registrerer ét af de to tal, kan du aldrig opdage uoverensstemmelsen. Registrér begge, så bliver forskellen synlig og kan kontrolleres af en maskine.
Udtræk begge, ikke kun ét
Mønstret for selvkorrektion begynder i skemaet. I stedet for at bede om en enkelt total beder du Claude om at vise de rå data, der skal bruges til et konsistenstjek.
Tving et struktureret output igennem med et værktøj og et JSON Schema, så du eliminerer syntaksfejl og sikrer, at felterne findes og har de rigtige typer. Brug tool_choice sat til any (eller et tvunget værktøj), så modellen skal returnere værktøjskaldet i stedet for prosa i fri form.
import anthropic
client = anthropic.Anthropic()
extract_tool = {
"name": "extract_invoice",
"description": "Extract invoice line items plus BOTH the summed line-item total and the total printed on the document, so a downstream check can detect drift.",
"input_schema": {
"type": "object",
"properties": {
"line_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"description": {"type": "string"},
"amount": {"type": "number"}
},
"required": ["description", "amount"]
}
},
"calculated_total": {"type": "number"},
"stated_total": {"type": "number"}
},
"required": ["line_items", "calculated_total", "stated_total"]
}
}
resp = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
tools=[extract_tool],
tool_choice={"type": "any"},
messages=[{"role": "user", "content": invoice_text}],
)Påkrævet betyder altid til stede
En vigtig detalje er, at du kun skal markere et felt som required, hvis det altid findes i kilden. Både calculated_total og stated_total opfylder dette her — alle fakturaer har linjeposter, der kan lægges sammen, og en trykt total, der kan aflæses.
Men kræv aldrig et felt, der muligvis mangler. Hvis du tvinger et felt igennem, som ikke findes i dokumentet, vil modellen opfinde en sandsynlig værdi for at opfylde skemaet — og så har du selv skabt netop den afvigelse, du forsøgte at opdage.
For valgfri strukturer skal du lade feltet være ude af required og tillade, at det udelades. For kategorier, der kan udvides, skal du bruge en enum med værdien "other" samt et frit tekstfelt til detaljer.
Valideringstrinnet
Når du har begge tal, er valideringen almindelig kode — deterministisk, hurtig og gratis. Brug en validator i Pydantic-stil, så kontrollen ligger ved siden af skemaet og kører ved hver udtrækning.
Modellen afgør, hvad tallene er; din kode afgør, om de stemmer overens. Behold konsistensreglen i fast kode, ikke i en prompt, fordi overensstemmelse i aritmetik netop er den slags garanti, som deterministisk logik kan levere, mens sandsynlighedsbaserede prompts ikke kan.
from pydantic import BaseModel, model_validator
class Invoice(BaseModel):
line_items: list[dict]
calculated_total: float
stated_total: float
@model_validator(mode="after")
def check_drift(self):
summed = round(sum(li["amount"] for li in self.line_items), 2)
if abs(summed - self.calculated_total) > 0.01:
raise ValueError(
f"calculated_total {self.calculated_total} "
f"does not match line-item sum {summed}"
)
if abs(self.calculated_total - self.stated_total) > 0.01:
raise ValueError(
f"DRIFT: calculated_total {self.calculated_total} "
f"!= stated_total {self.stated_total}"
)
return selfGenforsøg med tilbagemelding
Når validatoren rejser en fejl, skal du ikke bare kassere outputtet og køre igen uden retning. Brug genforsøg med tilbagemelding: Send modellen det oprindelige dokument, dens eget forkerte output og den nøjagtige valideringsfejl.
Det virker netop, fordi fejlen er en aritmetisk eller strukturel fejl — de oplysninger, der skal bruges til at rette den, findes i kilden; modellen skal blot beregne igen. Den specifikke fejl gør et gæt til en målrettet rettelse.
def extract_with_retry(invoice_text, max_attempts=3):
messages = [{"role": "user", "content": invoice_text}]
for _ in range(max_attempts):
resp = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
tools=[extract_tool],
tool_choice={"type": "any"},
messages=messages,
)
data = resp.content[0].input
try:
return Invoice(**data)
except ValueError as err:
messages.append({"role": "assistant", "content": resp.content})
messages.append({"role": "user", "content":
f"That extraction failed validation: {err}. "
f"Re-read the document and correct the numbers."})
raise RuntimeError("extraction did not converge")Når genforsøg ikke hjælper
Genforsøg med tilbagemelding er effektivt, men det er ikke magi. Det retter format-, struktur- og regnefejl — tilfælde, hvor det rigtige svar kan udledes af kilden.
Det hjælper ikke, når oplysningerne ganske enkelt mangler i dokumentet. Hvis en faktura slet ikke har en angivet total, presser gentagne kørsler af modellen den blot til at opfinde en. At genlæse det samme tomme område kan ikke frembringe et faktum, der aldrig stod der.
Del derfor logikken op: uoverensstemmelse mellem to tal, der begge findes → genforsøg. Et felt, der reelt mangler → markér det som fraværende (lad det være ude af required), og eskalér eller markér det; opfind aldrig en værdi.
# stated_total is OPTIONAL in the schema, not required
class Invoice(BaseModel):
line_items: list[dict]
calculated_total: float
stated_total: float | None = None # may be absent on the document
@model_validator(mode="after")
def check_drift(self):
if self.stated_total is None:
# Don't retry an absent fact -- flag for human review
self.flags = ["stated_total_missing"]
return self
if abs(self.calculated_total - self.stated_total) > 0.01:
raise ValueError("DRIFT detected") # recoverable -> retry
return selfBegræns iterationer som sikkerhedsnet
Bemærk max_attempts i genforsøgsløkken. Denne grænse er et sikkerhedsnet, ikke det primære kontrolforløb. Løkkens egentlige afslutning er succes: validatoren godkender, og du returnerer resultatet.
Det afspejler den agentbaserede løkke overalt i Claude-arkitekturen — du afslutter ved en konkret betingelse (her at valideringen godkendes), og du beholder kun en hård grænse for at forhindre, at et problematisk dokument kører i løkke for evigt. Lad aldrig et vilkårligt antal iterationer blive din stoplogik, og analysér aldrig modellens prosa for ord som "rettet" for at afgøre, om du er færdig.
Uafhængig gennemgang slår selv-gennemgang
Deterministiske aritmetiske kontroller opdager numeriske afvigelser. Men når det gælder korrekthed på vurderingsniveau — "fejlklassificerede denne udtrækning leverandøren?" — er en model, der gennemgår sit eget output fra samme session, svag. Forfatteren bevarer sin oprindelige tankegang og har en tendens til ikke at udfordre sig selv.
Når du har brug for en semantisk second opinion, skal du køre en uafhængig gennemgang i en ny instans: en separat anmodning (eller underagent), der kun ser dokumentet og det udtrukne output, ikke den oprindelige tankekæde. Friske øjne opdager det, som selv-gennemgang bortforklarer.
review = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=512,
system=(
"You are an independent auditor. You did NOT produce this "
"extraction. Compare the JSON against the source document and "
"report any field that contradicts the source."
),
messages=[{"role": "user", "content":
f"SOURCE:\n{invoice_text}\n\nEXTRACTION:\n{extracted_json}"}],
)Bevar sagsfakta ordret
Selvkorrektion afhænger af, at tallene forbliver nøjagtige gennem dit behandlingsforløb. Faren er gradvis opsummering: Når konteksten komprimeres, bliver totaler, procenter og datoer upræcise — "omkring 4.000" i stedet for 3,981.50.
Hent transaktionsfakta — calculated_total, stated_total og beløbene for linjeposterne — ind i en separat blok med "sagsfakta", som bevares ordret uden for enhver opsummering. Begræns udførligt værktøjsoutput til de felter, du har brug for, men lad aldrig en opsummering ændre de tal, som din validator skal sammenligne.
Spor oprindelsen for at finde afvigelser
Når de to totaler ikke stemmer overens, vil du hurtigt vide hvorfor. Bevar oprindelsen: Knyt hvert udtrukket tal tilbage til dets kilde — den tekstlinje, det kom fra, og dets placering i dokumentet.
Med oplysninger om oprindelsen bliver en alarm om en afvigelse handlingsanvisende: "calculated_total lagde fem linjeposter sammen, men dokumentet viser seks." Uden disse oplysninger ved du kun, at tallene er forskellige, ikke hvilket du skal stole på. Gengiv også resultater efter indholdstype — økonomiske tal hører hjemme i en tabel, hvor uoverensstemmelser er nemme at skimme, ikke skjult i prosa.
# Annotate each figure with where it came from
"line_items": [
{"description": "Consulting", "amount": 1200.00,
"source": {"page": 1, "text": "Consulting ... 1,200.00"}}
],
"stated_total": {"value": 3981.50,
"source": {"page": 1, "text": "TOTAL DUE 3,981.50"}}
# On drift, the alert can name the exact conflicting source lines.Hurtigt tjek: Design af afvigelseskontrollen
Du udtrækker fakturatotaler og skal pålideligt opdage tilfælde, hvor den trykte total ikke stemmer overens med linjeposterne. Hvilket design implementerer bedst selvkorrektion?
Opsummering: Opdag afvigelser
Vigtige pointer om selvkorrektion i behandlingsforløb til udtrækning:
- Udtræk begge tal. Registrér
calculated_totalogstated_total— du kan ikke opdage en afvigelse ud fra én enkelt værdi. - Validér i kode. Brug deterministiske kontroller i Pydantic-stil; hold aritmetiske garantier ude af prompts.
- Genforsøg med tilbagemelding (oprindeligt dokument + forkert output + nøjagtig fejl) retter format-, struktur- og regnefejl — men IKKE data, der reelt mangler.
- Påkrævet = altid til stede. Kræv aldrig et felt, der måske mangler, ellers opfinder modellen det.
- Iterationsgrænser er et sikkerhedsnet; den egentlige afslutning er, at valideringen godkendes — analysér aldrig prosa for at afgøre, om arbejdet er færdigt.
- Uafhængig gennemgang i en ny instans er bedre end selv-gennemgang i samme session, når det gælder semantisk korrekthed.
- Beskyt tallene: Bevar sagsfakta ordret uden for opsummeringer, og spor oprindelsen, så en alarm om en afvigelse fortæller dig, hvilken værdi du skal stole på.
Lær Python med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 26
- Lektioner
- 104
Ofte stillede spørgsmål
Er lektionen “Selvkorrektion” gratis?
Ja — alle 3 lektioner i læringssporet Claude Architect, inklusive “Selvkorrektion”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Claude Architect-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Selvkorrektion”?
Udtræk calculated_total og stated_total for at opdage afvigelser Du øver dig i Claude Architect med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Claude Architect?
Der kræves ingen tidligere erfaring. Claude Architect på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Selvkorrektion”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Claude Architect-lektion?
Ja. Alle Claude Architect-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Hvornår hjælper genforsøg (og hvornår gør det ikke)
- Prompts til genforsøg med feedback
- Selvkorrektion
- Flere gennemløb og uafhængig review