Ekstrakcja danych sterowana schematem
Udostępniaj schematy JSON w promptach, aby zagwarantować ustrukturyzowany format wyniku.
Ekstrakcja danych sterowana schematem to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Prompt Engineering, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.
Dlaczego ekstrakcja oparta na schemacie
Gdy powie się modelowi wyodrębnij ważne dane, otrzymuje się niespójne i nieprzewidywalne wyniki. Gdy poda się schemat JSON i polecenie wyodrębnij dane zgodne dokładnie z tym schematem, za każdym razem otrzymuje się spójne, odczytywalne maszynowo dane zgodne z typami.
Ekstrakcja oparta na schemacie to wzorzec używany w systemach produkcyjnych przetwarzających faktury, umowy, dokumentację medyczną, notatki ze spotkań i wszelkie dokumenty, z których trzeba niezawodnie wyodrębniać ustrukturyzowane dane z nieustrukturyzowanego tekstu.
Umieszczanie schematu w prompcie
Schemat znajduje się bezpośrednio w prompcie. Model używa go jako kontraktu wyjściowego:
import anthropic, json
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
INVOICE_SCHEMA = '''
{
"invoice_number": "string",
"vendor_name": "string",
"vendor_address": "string or null",
"invoice_date": "YYYY-MM-DD",
"due_date": "YYYY-MM-DD or null",
"line_items": [
{
"description": "string",
"quantity": "number",
"unit_price": "number",
"total": "number"
}
],
"subtotal": "number",
"tax": "number or null",
"total_amount": "number",
"currency": "3-letter ISO code e.g. USD"
}
'''
def extract_invoice(invoice_text):
prompt = f'Extract structured data from this invoice.\nReturn JSON matching this schema exactly:\n{INVOICE_SCHEMA}\n\nInvoice:\n{invoice_text}'
r = client.messages.create(model='claude-opus-4-5', max_tokens=500, messages=[{'role': 'user', 'content': prompt}])
return json.loads(r.content[0].text)
print('Invoice schema defined.')Przykład ekstrakcji danych z faktury
Zastosowanie schematu do wyodrębniania ustrukturyzowanych danych z rzeczywistej treści faktury:
invoice_text = '''
INVOICE #INV-2025-0342
From: Acme Software Ltd.
123 Tech Street, San Francisco, CA 94105
Date: March 15, 2025
Due: April 14, 2025
Items:
- Annual Pro License (5 seats) x1 @ $2,400.00 = $2,400.00
- Setup & Onboarding x2 @ $300.00 = $600.00
Subtotal: $3,000.00
Tax (8.5%): $255.00
TOTAL DUE: $3,255.00 USD
'''
result = extract_invoice(invoice_text)
print(f'Invoice: {result["invoice_number"]}')
print(f'Vendor: {result["vendor_name"]}')
print(f'Total: {result["currency"]} {result["total_amount"]}')
print(f'Line items: {len(result["line_items"])}')Ekstrakcja z notatek ze spotkania
Ekstrakcja oparta na schemacie zastosowana do notatek ze spotkania — mniej ustrukturyzowanego rodzaju dokumentu:
MEETING_SCHEMA = '''
{
"meeting_title": "string",
"date": "YYYY-MM-DD",
"attendees": ["string"],
"decisions": ["string"],
"action_items": [
{
"task": "string",
"owner": "string or null",
"due_date": "YYYY-MM-DD or null"
}
],
"next_meeting": "string or null"
}
'''
meeting_notes = '''
Product Sync - March 20, 2025
Attendees: Sarah (PM), Jake (Engineering), Priya (Design)
Decided to push the v2.0 launch to April 15.
Will not include the analytics dashboard in v2.0.
Actions:
- Jake to fix the login bug by March 25
- Priya to finalize mockups by March 22
- Sarah to send updated roadmap to stakeholders (no date set)
Next sync: March 27, same time.
'''
print(f'Meeting schema: {len(MEETING_SCHEMA)} chars')
print(f'Notes length: {len(meeting_notes)} chars')Ekstrakcja specyfikacji produktu
Wyodrębnianie ustrukturyzowanych specyfikacji produktu z opisu katalogowego:
PRODUCT_SCHEMA = '''
{
"product_name": "string",
"sku": "string or null",
"category": "string",
"price": {"amount": "number", "currency": "string"},
"dimensions": {
"length_cm": "number or null",
"width_cm": "number or null",
"height_cm": "number or null",
"weight_kg": "number or null"
},
"colors": ["string"],
"materials": ["string"],
"features": ["string"],
"in_stock": true | false
}
'''
product_text = 'AlphaDesk Pro standing desk. SKU: AD-PRO-001. $899. Available in white and black. 120x60x75cm, 35kg. Steel frame, bamboo top. Features: memory height, anti-collision, app control. In stock.'
prompt = f'Extract product specs. Return JSON:\n{PRODUCT_SCHEMA}\n\nProduct: {product_text}'
r = client.messages.create(model='claude-opus-4-5', max_tokens=400, messages=[{'role': 'user', 'content': prompt}])
print(json.loads(r.content[0].text))Obsługa pól opcjonalnych
Schematy muszą poprawnie obsługiwać pola opcjonalne. W przypadku brakujących danych należy używać wartości domyślnej null zamiast pomijać pole — dzięki temu struktura wyników pozostaje spójna:
prompt_optional = '''
Extract the data. For fields not present in the source text,
use null — do NOT omit the field.
Every field in the schema must appear in the output.
Schema:
{
"company": "string",
"ceo": "string or null",
"founded": "YYYY or null",
"revenue": "string or null",
"employees": "number or null"
}
Text: Vertex AI Solutions is a B2B SaaS company.
'''
# Expected output: ceo, founded, revenue, employees all set to null
# NOT omitted — null fields are still present in the JSON
print(prompt_optional)Ekstrakcja wielu dokumentów z użyciem tego samego schematu
Ten sam schemat można spójnie stosować do wielu dokumentów. W ten sposób na dużą skalę buduje się ustrukturyzowaną bazę danych na podstawie nieustrukturyzowanych dokumentów:
def extract_many(documents, schema):
results = []
for i, doc in enumerate(documents):
try:
r = client.messages.create(
model='claude-opus-4-5', max_tokens=400,
messages=[{'role': 'user', 'content': f'Extract data. Return JSON matching schema:\n{schema}\n\nDocument:\n{doc}'}]
)
parsed = json.loads(r.content[0].text)
parsed['_source_doc'] = i
parsed['_extraction_ok'] = True
results.append(parsed)
except (json.JSONDecodeError, Exception) as e:
results.append({'_source_doc': i, '_extraction_ok': False, '_error': str(e)})
return results
invoices = ['Invoice from Acme, March 2025, $500', 'Invoice from Beta Corp, April 2025, $1200']
results = extract_many(invoices, INVOICE_SCHEMA)
print(f'Processed: {len([r for r in results if r["_extraction_ok"]])} success, {len([r for r in results if not r["_extraction_ok"]])} failed')Walidacja schematu po ekstrakcji
Należy walidować wyodrębnione dane względem oczekiwanego schematu za pomocą biblioteki jsonschema języka Python lub niestandardowych walidatorów:
def validate_extracted(data, required_fields, type_checks):
errors = []
# Check required fields
for field in required_fields:
if field not in data or data[field] is None:
errors.append(f'Required field missing or null: {field}')
# Check types
for field, expected_type in type_checks.items():
if field in data and data[field] is not None:
if not isinstance(data[field], expected_type):
errors.append(f'{field}: expected {expected_type.__name__}, got {type(data[field]).__name__}')
return errors
extracted = {'invoice_number': 'INV-001', 'total_amount': 3255.0, 'vendor_name': 'Acme', 'invoice_date': '2025-03-15'}
required = ['invoice_number', 'total_amount', 'vendor_name']
types = {'total_amount': float, 'invoice_number': str, 'line_items': list}
errors = validate_extracted(extracted, required, types)
print('Validation errors:', errors)Iteracyjne udoskonalanie schematu
Schematy ewoluują w wyniku iteracyjnego testowania. Proces:
- Zdefiniować początkowy schemat na podstawie wiedzy domenowej
- Uruchomić ekstrakcję na 20 przykładowych dokumentach
- Przeanalizować wyniki — które pola są stale błędne lub brakujące?
- Udoskonalić opis schematu i dodać definicje pól
- Ponownie uruchomić ekstrakcję na tych samych 20 dokumentach
- Powtarzać proces do osiągnięcia wymaganego poziomu jakości
Dodawanie opisów pól do schematu
Gdy pole jest niejednoznaczne, należy dodać komentarz z opisem, aby pokierować modelem:
ANNOTATED_SCHEMA = '''
{
"invoice_number": "string // The unique identifier for this invoice, e.g., INV-2025-001",
"invoice_date": "YYYY-MM-DD // Date the invoice was issued",
"due_date": "YYYY-MM-DD or null // Payment due date; null if not specified",
"subtotal": "number // Amount before tax, as a decimal number",
"tax": "number or null // Tax amount as a decimal; null if tax is not listed",
"total_amount": "number // Final amount to pay, including tax",
"payment_terms": "string or null // e.g., Net 30, Due on receipt; null if not mentioned"
}
'''
print('Annotated schema adds context per field.')
print(f'Schema length: {len(ANNOTATED_SCHEMA)} chars')Oceny pewności wyodrębnionych pól
W systemach produkcyjnych należy uwzględnić ocenę pewności dla każdego pola. Wyniki ekstrakcji o niskiej pewności można kierować do weryfikacji przez człowieka:
SCHEMA_WITH_CONFIDENCE = '''
{
"fields": {
"invoice_number": {"value": "string", "confidence": "high|medium|low"},
"total_amount": {"value": "number", "confidence": "high|medium|low"},
"due_date": {"value": "YYYY-MM-DD or null", "confidence": "high|medium|low"}
},
"overall_confidence": "high|medium|low",
"extraction_notes": "string or null // Any ambiguities encountered"
}
'''
prompt = f'Extract invoice data with confidence scores.\nReturn JSON:\n{SCHEMA_WITH_CONFIDENCE}\n\nInvoice: Payment due within 30 days. Total is approximately $500.'
r = client.messages.create(model='claude-opus-4-5', max_tokens=300, messages=[{'role': 'user', 'content': prompt}])
result = json.loads(r.content[0].text)
print('Overall confidence:', result.get('overall_confidence'))
print('Notes:', result.get('extraction_notes'))Szybki test
Gdy wymagane pole nie występuje w dokumencie źródłowym, co powinien zwrócić model dla tego pola zgodnie z instrukcją promptu opartego na schemacie?
Ekstrakcja oparta na schemacie — najważniejsze wnioski
Ekstrakcja oparta na schemacie jest standardem niezawodnego przetwarzania dokumentów w środowisku produkcyjnym:
- Podawać dokładny schemat JSON w prompcie — model używa go jako kontraktu wyjściowego
- Dodawać opisy pól niejednoznacznych, aby pokierować interpretacją modelu
- Zawsze instruować: w przypadku brakujących pól zwracać null, nigdy ich nie pomijać
- Stosować ten sam schemat do wielu dokumentów, aby uzyskać spójne wyniki gotowe do użycia w bazie danych
- Uwzględniać oceny pewności dla poszczególnych pól, aby umożliwić kierowanie wyników do weryfikacji przez człowieka
- Programowo walidować wyodrębnione dane po każdej ekstrakcji
- Iteracyjnie udoskonalać schematy: wyodrębniać dane z 20 próbek, analizować wyniki, ulepszać schemat i powtarzać proces
Często zadawane pytania
Czy lekcja „Ekstrakcja danych sterowana schematem” jest bezpłatna?
Tak — pełny tekst „Ekstrakcja danych sterowana schematem” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Prompt Engineering, przejdź na CoddyKit PRO. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.
Co nauczysz się w „Ekstrakcja danych sterowana schematem”?
Udostępniaj schematy JSON w promptach, aby zagwarantować ustrukturyzowany format wyniku. Ćwiczysz AI Prompt Engineering z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Prompt Engineering?
Nie wymagamy żadnego doświadczenia. AI Prompt Engineering w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Ekstrakcja danych sterowana schematem”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Prompt Engineering?
Tak. Każda lekcja AI Prompt Engineering zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Prompty do ekstrakcji nazwanych jednostek
- Ekstrakcja danych sterowana schematem
- LLM jako klasyfikator tekstu
- Pewność i niepewność w klasyfikacji