CI/CD og strukturert ekstraksjon
Hodeløs modus, JSON-utdata, skjemaer og valideringsløkker.
CI/CD og strukturert ekstraksjon er en gratis leksjon i Claude Architect på CoddyKit. Dette er leksjon 3 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.
To scenarioer, ett tema
Denne leksjonen kombinerer to eksamensscenarioer med samme grunnidé: determinisme under automatisering. Scenario 5 (Claude Code for CI/CD) og scenario 6 (strukturert datauttrekking) stiller det samme spørsmålet — hvordan får man maskinlesbar og pålitelig utdata uten et menneske i loopen?
Svaret er det samme i begge verdener:
- Hodeløs / ikke-interaktiv kjøring, slik at en pipeline kan styre Claude.
- JSON-utdata med et skjema, slik at nedstrømskode kan tolke resultatene.
- Valideringssløyfer som oppdager og retter strukturelle feil før de sprer seg.
Behersk dette, så dekker du en betydelig del av D3 (Config & Workflows) og D4 (Structured Output) — til sammen 40 % av eksamen.
Hodeløs modus i CI/CD
En pipeline har ingen TTY og ingen person som kan svare på spørsmål. Claude Code må kjøre ikke-interaktivt. Flagget for dette er -p (også skrevet --print): Det kjører én prompt, skriver ut resultatet og avslutter.
Kombiner det med --output-format json, slik at pipelinen får en strukturert innpakning i stedet for fri prosa. Uten disse to flaggene blir kommandoen hengende mens den venter på interaktiv inndata, og byggingen stopper opp.
-p/--print= ikke-interaktivt, påkrevd i pipelines.--output-format json= tolkningsbart resultat (eventuelt med et skjema).
# Headless review step in a CI job
claude -p "Review the staged diff for correctness bugs only. \
Flag a comment ONLY when it contradicts the code." \
--output-format json \
> review.json
# Pipeline now parses review.json deterministically
jq '.result' review.jsonDen isolerte gjennomgangsøkten
En subtil, men svært ofte testet regel: I CI skal kode gjennomgås i en ISOLERT økt, separat fra økten som genererte den.
Hvorfor? Den genererende økten beholder sin egen tankegang og er tilbøyelig til å forsvare arbeidet sitt — selvgjennomgang i samme økt er et typisk anti-mønster. En ny, uavhengig instans har ingen tilknytning til utdataene og utfordrer dem på en ærlig måte.
Dette gjenspeiler regelen fra uttrekkingsverdenen om at gjennomgang av en uavhengig/ny instans er bedre enn selvgjennomgang i samme økt. Forfatteren vil ikke argumentere mot sine egne konklusjoner; en uhildet gjennomgår vil gjøre det.
Minimering av falske positiver
En CI-gjennomgår som roper «ulv» uten grunn, blir ignorert. Målet i scenario 5 er å minimere falske positiver, slik at utviklerne stoler på kontrollen.
Det som gjør forskjellen, er eksplisitte kriterier, ikke vage oppfordringer. «Vær mer presis» endrer ingenting. «Flagg en kommentar KUN når den motsier koden» gir modellen en tydelig og testbar grense.
Ved nye kjøringer bør du ikke ta alt opp til ny vurdering: ta med de tidligere resultatene og rapporter bare nye eller fortsatt uløste problemer. Slik holdes signalet rent gjennom flere iterasjoner.
claude -p "You are reviewing a re-run. Here are the prior findings:
$(cat prev_findings.json)
Report ONLY issues that are new or remain unfixed.
Flag a defect ONLY when the code's behavior contradicts its stated intent.
Ignore style and subjective preferences." \
--output-format json > findings.jsonBlokkerende kontroller kontra Batch API
En klassisk distraktor: «bruk Batch API for å kutte CI-kostnadene med 50 %». Det er feil for en kontroll før fletting.
Message Batches er 50 % billigere og har et tidsvindu på opptil 24 timer, men de har INGEN SLA for responstid og STØTTER IKKE flertrinns verktøykall. En blokkerende og tidssensitiv kontroll (som en PR-kontroll) kan ikke vente ubestemt lenge.
- Bruk Batch til arbeid som ikke blokkerer: rapporter over natten, store revisjoner og nattlige uttrekk.
- IKKE bruk Batch til kontroller før fletting, blokkerende kontroller eller interaktive kontroller.
For batch-jobber knytter custom_id hver forespørsel til resultatet, og du sender bare inn feilene på nytt.
Strukturert utdata: Tool Use + JSON Schema
Nå til scenario 6. For å trekke ut data på en pålitelig måte bør du ikke be om JSON i prosa og håpe på det beste. Bruk tool_use med et JSON Schema: Dette eliminerer syntaksfeil og håndhever obligatoriske felt.
Sett tool_choice til "any" for å garantere at modellen kaller et verktøy (det vil si produserer strukturert utdata) i stedet for fri tekst. Bruk {"type":"tool","name":"X"} for å tvinge frem ett bestemt uttrekksverktøy.
extract_tool = {
"name": "extract_invoice",
"description": "Extract structured fields from an invoice document.",
"input_schema": {
"type": "object",
"properties": {
"invoice_number": {"type": "string"},
"line_items": {"type": "array", "items": {"type": "object"}},
"stated_total": {"type": "number"},
},
"required": ["invoice_number"],
},
}
resp = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
tools=[extract_tool],
tool_choice={"type": "any"}, # MUST call a tool -> structured output
messages=[{"role": "user", "content": document_text}],
)Obligatoriske felt: Fabrikasjonsfellen
Den mest testede skjemaregelen er: Merk et felt som obligatorisk KUN hvis det alltid finnes i kilden.
Hvis du krever et felt som kan mangle, har modellen ingen lovlig måte å oppfylle skjemaet på, bortsett fra å fabrikere en verdi. Du har byttet ut et manglende felt med en hallusinert verdi — noe som er langt verre i en datapipeline.
For valgfrie eller åpne verdier bør du foretrekke en enum med verdien «other» samt et fritekstfelt for detaljer. Da forblir utdataene strukturerte, samtidig som de kan utvides med tilfeller du ikke hadde spesifisert.
"document_type": {
"type": "string",
"enum": ["invoice", "receipt", "purchase_order", "other"]
},
"document_type_detail": {
"type": "string",
"description": "Free text. Required only when document_type is 'other'."
}
# 'required' lists ONLY fields guaranteed to appear -> no fabrication pressureValiderings- og forsøksløkken
Et skjema begrenser formen, ikke riktigheten. Pakk inn uttrekkingen i en valideringssløyfe (validering i Pydantic-stil er det kanoniske mønsteret).
Når valideringen mislykkes, bruker du retry-with-feedback: Send modellen tre ting samlet — originaldokumentet, den feilaktige utdataen den produserte, og den nøyaktige valideringsfeilen. Dette er presist nok til å rette format-, struktur- og regnefeil.
En viktig grense: nytt forsøk retter FORMATfeil. Det hjelper IKKE når informasjonen ganske enkelt MANGLER i kilden — å spørre et dokument på nytt etter data det aldri inneholdt, inviterer bare til et fabrikert svar.
from pydantic import BaseModel, ValidationError
def extract_with_retry(doc, max_attempts=2):
history = [{"role": "user", "content": doc}]
for _ in range(max_attempts): # cap = safety net, not primary stop
out = call_extractor(history)
try:
return InvoiceModel.model_validate(out)
except ValidationError as e:
history.append({"role": "assistant", "content": str(out)})
history.append({"role": "user", "content":
f"Validation failed: {e}. Re-extract from the SAME document. "
f"If a field is not present in the source, omit it; do not invent it."})
raise ExtractionError("unresolved after retries")Selvkorrigering: Oppdag avvik
Hvordan oppdager du en feilaktig tallverdi som skjemaet uten videre godtok? Bygg kontrollen inn i selve uttrekkingen.
Mønsteret er å trekke ut både calculated_total (summen av linjeelementene) og stated_total (tallet som står på dokumentet). Sammenlign dem deretter i koden.
Hvis de avviker, har du oppdaget et avvik på en deterministisk måte — enten en dokumentfeil eller en uttrekksfeil — og kan flagge, prøve på nytt eller eskalere. Ett tall kan lyve ubemerket; to tall avslører løgnen.
# Schema asks for BOTH so code can self-correct
"calculated_total": {"type": "number",
"description": "Sum of all line_items, computed by you."},
"stated_total": {"type": "number",
"description": "The total figure printed on the document."}
# Downstream deterministic check
if abs(result.calculated_total - result.stated_total) > 0.01:
flag_for_review(result, reason="total mismatch")Proveniens: Påstand til kilde
Uttrekking uten proveniens kan ikke revideres. For hver uttrekkede påstand bør du beholde en kobling mellom påstand og kilde: kildedokumentets navn eller URL, det underbyggende sitatet og publiseringsdatoen.
Når to kilder oppgir motstridende tall, må du ikke velge ett av dem vilkårlig — annoter konflikten. Ofte er det datoene som løser den tilsynelatende motsetningen (det ene tallet er ganske enkelt nyere).
Presenter også innholdet etter innholdstype: tabeller for økonomiske data, prosa for fortellinger og lister for tekniske funn. Proveniens kombinert med riktig presentasjon gjør utdataene pålitelige nok til automatisering.
"fields": [{
"name": "annual_revenue",
"value": "4.2B USD",
"source_doc": "FY24-10K.pdf",
"quote": "Total revenue was $4.2 billion in fiscal 2024.",
"published": "2024-03-01"
}]
# Conflicting value from an older filing? Annotate, don't overwrite.Målinger: Samlet nøyaktighet lyver
Før De lar en uttrekkingspipeline kjøre uten tilsyn, må De validere den på en ærlig måte. En overskrift som «97 % nøyaktighet» kan skjule svak ytelse på én bestemt dokumenttype eller ett bestemt felt.
Den disiplinerte fremgangsmåten:
- Stratifisert tilfeldig utvalg på tvers av dokumenttyper – ikke et bekvemmelighetsutvalg.
- Konfidens på feltnivå, kalibrert mot et merket valideringssett, før automatisering.
Metrikker som bare aggregerer resultater, er et kjent anti-mønster. Et gjennomsnitt på 97 % med 40 % nøyaktighet på skatteskjemaer er en produksjonshendelse som bare venter på å inntreffe.
Eksamensscenario: Kontrollpunktet før sammenslåing
Anvend helhetsbildet på en realistisk eksamensbeslutning.
Oppsummering: Deterministisk resultat ved automatisering
Viktige læringspunkter for CI/CD og strukturert uttrekking:
- Hodeløs kjøring:
-p/--print+--output-format jsonfor ikke-interaktive og analyserbare pipeline-kjøringer. - Isolert gjennomgang er bedre enn egengjennomgang i samme økt; eksplisitte kriterier minimerer falske positiver; ved nye kjøringer rapporteres bare nye eller uløste problemer.
- Batch-API = 50 % billigere, ingen SLA for ventetid, ingen verktøy i flere samtaler – for nattlige jobber, ALDRI blokkerende kontroller.
- Strukturert resultat: tool_use + JSON Schema;
tool_choice:"any"garanterer et strukturert kall. - Påkrevd bare hvis det alltid finnes – å kreve et fraværende felt tvinger frem fabrikering; bruk enum + «other» + detalj for utvidbarhet.
- Ny kjøring med tilbakemelding (originaldokument + feil resultat + nøyaktig feil) korrigerer FORMAT-feil, ikke FRAVÆRENDE data.
- Selvkorrigering med beregnede kontra oppgitte totaler; behold proveniens (kilde, sitat, dato) og kommenter konflikter.
- Valider med stratifisert utvalg + konfidens på feltnivå – aggregert nøyaktighet skjuler svake punkter.
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 «CI/CD og strukturert ekstraksjon» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Claude Architect, inkludert «CI/CD og strukturert ekstraksjon», 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 «CI/CD og strukturert ekstraksjon»?
Hodeløs modus, JSON-utdata, skjemaer og valideringsløkker. 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 3 av 4.
Hvor lang tid tar leksjonen «CI/CD og strukturert ekstraksjon»?
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
- Supportagent og forskning med flere agenter
- Kodegenerering og utviklerproduktivitet
- CI/CD og strukturert ekstraksjon
- Samtalemønstre og agentiske verktøy