E· Universitetsprakmodeller· ca 60 min· utvecklande· verifierad 2026-09-20
Strukturerad utdata och schema
Kunna tvinga fram JSON enligt schema och validera det robust.
Förkunskaper
Intuition
Ett program kan inte använda «Kategorin är nog faktura, och det verkar brådskande». Det behöver {"kategori": "faktura", "bradskande": true}.
Tre sätt att få det, i stigande tillförlitlighet:
- Prompt: «Svara ENDAST med JSON enligt … ». Fungerar oftast, failar ibland — modellen lägger till förklaringar eller kodstaket.
- Funktionsanrop / JSON-läge: leverantören tar emot ett JSON-schema och garanterar syntaktiskt giltig JSON.
- Grammatikstyrd avkodning (GBNF i llama.cpp, Outlines): vid varje token maskeras alla tokens som skulle bryta schemat. Utdata kan inte bli ogiltig.
Men giltig JSON är inte samma sak som korrekt JSON. Validera alltid semantiskt också.
Kod
import json, re
from pydantic import BaseModel, ValidationError, Field
from typing import Literal
class Arende(BaseModel):
kategori: Literal["faktura", "teknik", "annat"]
bradskande: bool
sammanfattning: str = Field(max_length=200)
def extrahera(llm, text, forsok=2):
schema = json.dumps(Arende.model_json_schema(), ensure_ascii=False)
prompt = f"Svara ENDAST med JSON enligt schemat.\nSCHEMA: {schema}\nTEXT: {text}"
senaste_fel = None
for _ in range(forsok):
ut = llm(prompt if not senaste_fel else f"{prompt}\n\nFörra svaret var ogiltigt: {senaste_fel}. Svara bara med giltig JSON.",
temperature=0, json_mode=True)
rensad = re.sub(r"^```(?:json)?|```$", "", ut.strip(), flags=re.M).strip()
try:
return Arende.model_validate_json(rensad)
except (ValidationError, json.JSONDecodeError) as e:
senaste_fel = str(e)[:200]
raise ValueError(f"kunde inte extrahera: {senaste_fel}")
Fyra praktiska regler: Literal i stället för fri sträng där värdemängden är känd (då kan modellen inte hitta på kategorier), rensa kodstaket innan parsning, skicka tillbaka felet vid omförsök (modellen rättar sig ofta direkt), och ha ett definierat beteende när alla försök misslyckats — aldrig en krasch mot användaren.
Behärskning innebär
- Tvingar fram JSON enligt schema
- Validerar och hanterar fel robust
- Väljer mellan prompt, grammatik och funktionsanrop
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- OpenAI — Structured Outputs — dokumentation, fri läsning
- Outlines — strukturerad generering (Apache-2.0) — Apache-2.0