Claude Architect · leksjon

tool_use for garantert struktur

Fjern syntaksfeil og håndhev obligatoriske felt.

Leksjon 1 av 413 trinn

tool_use for garantert struktur er en gratis leksjon i Claude Architect på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Claude Architect, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Claude Architect inneholder totalt 4 leksjoner.

Hvorfor fritekst mislykkes

De ba Claude om JSON og analyserte svaret med json.loads(). Det fungerte 95 % av gangene. De andre 5 %? Et overflødig markdown-gjerdetegn, et avsluttende komma, en pratsom innledning som «Her er JSON-en De ba om:» – og prosessen Deres feiler.

For en Claude Certified Architect er disse 5 % hele problemet. Produksjonsflyter for ekstraksjon, klassifisering og ruting kan ikke være avhengige av at modellen tilfeldigvis formaterer tekst riktig. Denne leksjonen viser hvordan tool_use pluss et JSON Schema gjør et probabilistisk format garantert – og eliminerer syntaksfeil og håndhever obligatoriske felt.

Kjerneideen

Et verktøy brukes ikke bare til å utføre handlinger. En verktøydefinisjon er også en typet utdata-kontrakt. Når De deklarerer et verktøy med et input_schema, forteller De Claude nøyaktig hvilken struktur argumentene må ha – og API-et validerer verktøykallet mot dette skjemaet.

I stedet for å be om JSON i prosa og håpe på det beste definerer De altså et verktøy hvis parametere er strukturen De ønsker, og tvinger deretter Claude til å kalle det. Modellen fyller ut feltene; skjemaet garanterer strukturen. Som det står i faktabladet: tool_use + JSON Schema eliminerer syntaksfeil og håndhever obligatoriske felt.

Definere skjemaverktøyet

Her er et ekstraksjonsverktøy. Legg merke til de tre grunnpilarene i en god verktøydefinisjon: et tydelig name, en beskrivende description og et presist input_schema med beskrivelser for hver egenskap og en required-liste.

Skjemaet nedenfor ekstraherer en kundestøttesak. Vi krever bare feltene som er alltid til stede – mer om den avgjørelsen snart.

ticket_tool = {
    "name": "record_ticket",
    "description": "Record a structured support ticket extracted from the user message.",
    "input_schema": {
        "type": "object",
        "properties": {
            "summary": {
                "type": "string",
                "description": "One-line summary of the issue",
            },
            "priority": {
                "type": "string",
                "enum": ["low", "medium", "high", "urgent"],
                "description": "Triage priority",
            },
        },
        "required": ["summary", "priority"],
    },
}

tool_choice: Tvinge frem strukturen

Det er ikke nok å deklarere verktøyet – med standardinnstillingen kan Claude svare med tekst i stedet. Parameteren tool_choice styrer denne avgjørelsen:

  • {"type": "auto"} – Claude velger tekst eller et verktøy (standard).
  • {"type": "any"} – Claude må kalle et verktøy. Det er dette som garanterer strukturert utdata.
  • {"type": "tool", "name": "X"} – tving frem ett bestemt verktøy ved navn.

Når De har nøyaktig ett skjemaverktøy og vil garantere at det blir kalt, tvinger De det frem ved navn. Da fjernes hele muligheten til å «svare i prosa».

response = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=1024,
    tools=[ticket_tool],
    tool_choice={"type": "tool", "name": "record_ticket"},
    messages=[{"role": "user", "content": ticket_text}],
)

Lese verktøyinndata tilbake

Når Claude kaller verktøyet, inneholder svaret en tool_use-innholdsblokk. De strukturerte dataene ligger i block.input – allerede analysert som en Python-dict av SDK-et og i samsvar med skjemaet.

En regel fra faktabladet er å alltid analysere det analyserte objektet fra SDK-et, aldri matche rå tekststrenger mot de serialiserte inndataene. Nyere modeller kan escape Unicode-tegn eller skråstreker på ulike måter, så behandle block.input som strukturerte data, ikke som tekst.

for block in response.content:
    if block.type == "tool_use":
        ticket = block.input  # dict, matches the schema
        print(ticket["summary"], ticket["priority"])
        # Do NOT json.loads a re-serialized string here —
        # block.input is already the structured object.

Fellen med required

Dette er den viktigste avgjørelsen som testes i denne leksjonen. Regelen fra faktabladet er kategorisk:

Merk et felt som required KUN hvis det alltid finnes. Krev ALDRI et felt som kan mangle – modellen vil finne på en verdi for å oppfylle skjemaet.

Hvis customer_id noen ganger ikke finnes i kildeteksten, men De fører det opp under required, vil Claude ikke returnere et tomt resultat – den vil finne på en ID som ser plausibel ut, for å gjøre verktøykallet gyldig. Det er en stille dataintegritetsfeil. Required betyr «garantert av kilden», ikke «kjekt å ha».

Håndtere valgfrie felt riktig

Felt som kan mangle, holdes ganske enkelt utenfor required-matrisen. Claude utelater dem når kilden mangler dataene, i stedet for å hallusinere.

Her er customer_id og attachments valgfrie; bare summary og priority – som vi alltid kan utlede – er obligatoriske.

"properties": {
    "summary": {"type": "string"},
    "priority": {"type": "string",
                 "enum": ["low", "medium", "high", "urgent"]},
    "customer_id": {"type": "string",
                    "description": "Only if explicitly stated"},
    "attachments": {"type": "array", "items": {"type": "string"}},
},
"required": ["summary", "priority"]  # NOT customer_id / attachments

Enum-er med en utvei

Enum-er begrenser et felt til et fast sett med verdier – perfekt for kategorier, etiketter og prioriteter. Men en rigid enum tvinger hvert inndata inn i en av de forhåndsdefinerte kategoriene, noe som skaper problemer for randtilfeller De ikke forutså.

Mønsteret fra faktabladet for utvidbarhet er å bruke enum-er med verdien «other» samt et fritekstfelt for detaljer. Når Claude møter noe utenfor kategoriene, velger den other og forklarer i detaljfeltet – i stedet for å feilmerke det.

"category": {
    "type": "string",
    "enum": ["billing", "bug", "account", "other"],
    "description": "Use 'other' if none of the named categories fit",
},
"category_detail": {
    "type": "string",
    "description": "Free-text explanation, required only when category is 'other'",
}

Valider, og gjør deretter et nytt forsøk med tilbakemelding

Skjemaet garanterer syntaktisk struktur, men De må fortsatt validere semantikken – summer som går opp, datoer innenfor riktig intervall og konsistens mellom felter. Bruk en validator i Pydantic-stil på block.input.

Når valideringen feiler på grunn av en format-, struktur- eller aritmetikkfeil, bruker De retry-with-feedback: send den opprinnelige kilden, det feilaktige resultatet og den nøyaktige valideringsfeilen på nytt. Viktig: Faktabladet advarer om at retry IKKE hjelper når informasjonen ganske enkelt mangler i kilden – nye forsøk inviterer bare til at modellen finner på noe.

from pydantic import BaseModel, ValidationError

class Ticket(BaseModel):
    summary: str
    priority: str

try:
    ticket = Ticket(**block.input)
except ValidationError as e:
    # Resend: original text + wrong output + this exact error.
    # Only worth it for format/arithmetic faults, not missing data.
    retry(ticket_text, block.input, str(e))

Selvkorrigering for tall

Ved numerisk ekstraksjon er et effektivt skjematriks å få Claude til å vise arbeidet sitt, slik at avvik blir oppdagbare. Som det står i faktabladet: ekstraher både calculated_total og stated_total for å oppdage avvik.

Hvis dokumentet sier «Total: 1 200 $», men linjepostene summerer seg til 1 150 $, synliggjør to separate felt avviket – validatoren Deres fanger det opp i stedet for å stole på ett enkelt tall. Skjemaet blir et revisjonsverktøy, ikke bare en beholder.

"properties": {
    "line_items": {"type": "array", "items": {"type": "number"}},
    "calculated_total": {"type": "number",
        "description": "Sum you computed from the line items"},
    "stated_total": {"type": "number",
        "description": "Total as literally written in the document"},
},
"required": ["line_items", "calculated_total", "stated_total"]

Hvor dette passer inn i løkken

Strukturert utdata er ett stopp i den større agentiske løkken: forespørsel → inspiser stop_reason → hvis tool_use, håndter verktøyet → gjenta til end_turn. Et tvunget skjemakall returnerer stop_reason: "tool_use"; De leser block.input og fortsetter.

To påminnelser på arkitekturnivå: avslutt på grunnlag av stop_reason, aldri ved å lete etter ord som «ferdig» i teksten. Og bevar proveniens – koble hvert ekstraherte utsagn tilbake til kilden (dokumentnavn, sitat, dato), slik at etterfølgende forbrukere kan stole på og revidere det strukturerte resultatet.

Kort kontroll

De ekstraherer fakturaer. Kilde-PDF-ene utelater noen ganger et innkjøpsordrenummer. En kollega foreslår å legge po_number i skjemaets required-matrise «slik at vi alltid får ett». Hva bør De gjøre?

Oppsummering: Garantert struktur

Dette er hovedpunktene til eksamen og for produksjon:

  • tool_use + JSON Schema eliminerer syntaksfeil og håndhever obligatoriske felt – langt mer pålitelig enn å analysere JSON i prosa.
  • tool_choice: "any" garanterer et verktøykall; {"type":"tool","name":"X"} tvinger frem et bestemt skjemaverktøy; "auto" gjør det valgfritt.
  • required = alltid til stede. Krev aldri et felt som kanskje mangler – det fører til oppdiktede verdier. Valgfrie felt holdes ganske enkelt utenfor required.
  • Enum-er trenger «other» + et detaljfelt for utvidbarhet.
  • Les strukturerte data fra block.input; match aldri rå tekststrenger mot de serialiserte verktøyinndataene.
  • Retry-with-feedback retter format- og aritmetikkfeil – ikke manglende informasjon. Bruk calculated_total kontra stated_total til selvkorrigering, og bevar proveniens.
Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
26
Leksjoner
104

Ofte stilte spørsmål

Er leksjonen «tool_use for garantert struktur» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Claude Architect, inkludert «tool_use for garantert struktur», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Claude Architect inneholder totalt 4 leksjoner.

Hva lærer jeg i «tool_use for garantert struktur»?

Fjern syntaksfeil og håndhev obligatoriske felt. Du øver på Claude Architect med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Claude Architect?

Ingen tidligere erfaring er nødvendig. Claude Architect på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «tool_use for garantert struktur»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Claude Architect-leksjonen?

Ja. Alle Claude Architect-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. tool_use for garantert struktur
  2. Utforme et JSON-skjema
  3. Obligatoriske kontra valgfrie/nullbare felt
  4. Enum med «other» for utvidbarhet
← Tilbake til Claude Architect