0Pricing
AI Prompt Engineering · Lekcja

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:

  1. Zdefiniować początkowy schemat na podstawie wiedzy domenowej
  2. Uruchomić ekstrakcję na 20 przykładowych dokumentach
  3. Przeanalizować wyniki — które pola są stale błędne lub brakujące?
  4. Udoskonalić opis schematu i dodać definicje pól
  5. Ponownie uruchomić ekstrakcję na tych samych 20 dokumentach
  6. 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

  1. Prompty do ekstrakcji nazwanych jednostek
  2. Ekstrakcja danych sterowana schematem
  3. LLM jako klasyfikator tekstu
  4. Pewność i niepewność w klasyfikacji
← Powrót do AI Prompt Engineering