AI-prompt engineering · leksjon

Ledetekster for OCR og dokumentanalyse

Trekk ut tekst, tabeller og struktur fra bilder av dokumenter.

Leksjon 4 av 413 trinn

Ledetekster for OCR og dokumentanalyse er en gratis leksjon i AI-prompt engineering på CoddyKit. Dette er leksjon 4 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 AI-prompt engineering, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i AI-prompt engineering inneholder totalt 4 leksjoner.

LLM-er som dokumentlesere

OCR (Optical Character Recognition) krevde tradisjonelt spesialisert programvare for å trekke ut tekst fra bilder. Vision-LLM-er kan nå lese tekst fra bilder og også forstå innholdet – ikke bare trekke ut tegn, men analysere struktur, tabeller, håndskrift og kontekst.

Vanlige oppgaver innen dokumentanalyse:

  • Uttrekking av tekst fra skannede dokumenter
  • Lesing av kvitteringer, fakturaer og skjemaer
  • Tolking av tabeller og diagrammer
  • Transkribering av håndskrevne notater
  • Lesing av trykte etiketter og skilt

Prompt for grunnleggende tekstuttrekking

For enkel tekstuttrekking fra et dokumentbilde:

import anthropic, base64

client = anthropic.Anthropic(api_key='YOUR_API_KEY')

def extract_text(image_path, extraction_prompt):
    with open(image_path, 'rb') as f:
        img_b64 = base64.standard_b64encode(f.read()).decode('utf-8')

    r = client.messages.create(
        model='claude-opus-4-5', max_tokens=1000,
        messages=[{'role': 'user', 'content': [
            {'type': 'image', 'source': {'type': 'base64', 'media_type': 'image/jpeg', 'data': img_b64}},
            {'type': 'text', 'text': extraction_prompt}
        ]}]
    )
    return r.content[0].text

# Basic extraction
basic_prompt = 'Extract all text from this document image exactly as it appears. Preserve line breaks.'

# Structure-preserving extraction
structured_prompt = 'Extract all text from this document image. Preserve: paragraph structure, line breaks, and any visible formatting. Do not add any text not present in the image.'

print('Text extraction functions defined.')

Bevaring av tabellstruktur

Når et dokument inneholder en tabell, går strukturen tapt hvis den trekkes ut som ren tekst. Bruk prompter som eksplisitt bevarer tabellformatet:

table_prompt = '''
Extract all text from this document image.
If the document contains any tables, preserve the table structure using markdown table format:
| Column 1 | Column 2 | Column 3 |
|----------|----------|----------|
| Value    | Value    | Value    |

For any text outside tables, use plain text preserving paragraph structure.
Do not invent or infer any data not visible in the image.
'''

# For structured output:
table_json_prompt = '''
Extract the table from this image.
Return JSON:
{
  "headers": ["column name"],
  "rows": [["cell value", "cell value"]],
  "caption": "table caption if present or null"
}
If a cell is empty or illegible, use null.
'''

print('Table extraction prompts defined.')

Linjevis oppdeling av kvitteringer

Kvitteringer har en bestemt struktur – topptekst (forhandler), linjeelementer og totalbeløp. En kvitteringsspesifikk prompt trekker denne strukturen ut på en pålitelig måte:

import json

receipt_prompt = '''
Extract all information from this receipt image.
Return JSON:
{
  "merchant": {
    "name": str,
    "address": str or null,
    "phone": str or null
  },
  "transaction": {
    "date": "YYYY-MM-DD or as written",
    "time": "HH:MM or as written or null",
    "receipt_number": str or null,
    "payment_method": str or null
  },
  "items": [
    {"description": str, "quantity": number or null, "unit_price": number or null, "total": number}
  ],
  "subtotal": number or null,
  "tax": number or null,
  "tip": number or null,
  "total": number,
  "currency": "3-letter ISO code"
}
For any field not visible, use null. For numbers, use numeric type (not string).
'''

def extract_receipt(image_path):
    text = extract_text(image_path, receipt_prompt)
    return json.loads(text)

print('Receipt extraction function defined.')

Transkribering av håndskrevne notater

Transkribering av håndskrevet innhold krever prompter som tar høyde for utfordringene – uleselige ord, overstrøket tekst og forkortelser:

handwriting_prompt = '''
Transcribe the handwritten text in this image as accurately as possible.

Handling rules:
- If a word is illegible, write [ILLEGIBLE]
- If a word is partially legible, write [PARTIAL: best_guess]
- If text is crossed out, include it with strikethrough notation: ~~crossed out text~~
- Preserve line breaks as they appear
- If there are arrows, circles, or annotations, note them in brackets: [arrow pointing right]
- Do not correct spelling or grammar

After transcription, estimate overall legibility: high (>90% readable) | medium (70-90%) | low (<70%)

Format:
TRANSCRIPTION:
[transcribed text here]

LEGIBILITY: [rating]
'''

print(handwriting_prompt)

Uttrekking av skjemafelt

Trykte skjemaer har felt med etiketter og registrerte verdier. En prompt for skjemauttrekking kobler etiketter til verdier:

form_prompt = '''
Extract all form fields and their values from this document image.

For each field:
- Field label: the printed label (e.g., "First Name:", "Date of Birth:")
- Field value: the filled-in value (handwritten or typed)
- Filled: whether the field has been filled in (true/false)

Return JSON:
{
  "form_title": str or null,
  "fields": [
    {
      "label": str,
      "value": str or null,
      "filled": true | false
    }
  ],
  "signature_present": true | false,
  "date_signed": str or null
}

If the value is illegible, use "[ILLEGIBLE]".
If the field is blank, value should be null and filled should be false.
'''

print('Form field extraction prompt defined.')
print('Handles: printed forms, questionnaires, applications.')

Klassifisering av dokumenter før uttrekking

Sett inn et klassifiseringstrinn før uttrekkingen, slik at riktig uttrekkingsskjema kan brukes for hver dokumenttype:

import json

DOC_SCHEMAS = {
    'receipt': receipt_prompt,
    'form': form_prompt,
    'table': table_json_prompt,
    'letter': 'Extract all text preserving paragraph structure. Identify: sender, recipient, date, subject, body.',
    'label': 'Extract all text from this label. Include: product name, ingredients/contents, weight, expiry date, barcode numbers.'
}

def classify_and_extract(image_path):
    # Step 1: Classify document type
    classify_prompt = 'What type of document is this? Return JSON: {"type": "receipt|form|table|letter|label|other", "confidence": "high|medium|low"}'
    classification_text = extract_text(image_path, classify_prompt)
    doc_type = json.loads(classification_text)['type']

    # Step 2: Apply correct schema
    schema = DOC_SCHEMAS.get(doc_type, 'Extract all visible text from this document.')
    extracted = extract_text(image_path, schema)

    return {'type': doc_type, 'data': extracted}

print('Document classify-then-extract pipeline defined.')

Håndtering av bilder med lav kvalitet

Ikke alle dokumentbilder er tydelige. Prompter bør håndtere forringede bilder på en robust måte:

low_quality_prompt = '''
Extract text from this document image. The image may be low quality, blurry, or poorly lit.

Extraction guidelines:
- Extract all text you can read with reasonable confidence
- For unclear sections, use [UNCLEAR] as a placeholder
- For completely unreadable sections, use [UNREADABLE: approximately N words]
- Do not guess or hallucinate words you cannot see clearly
- Note image quality issues at the end: "Image quality: [good/fair/poor]. Issues: [description]"

Be conservative — it is better to mark something as unclear than to guess incorrectly.
'''

print(low_quality_prompt)
print('\nConservative approach: unclear beats hallucinated.')

Sammendrag av dokumenter med flere sider

For dokumenter med flere sider som sendes som flere bilder, kombiner uttrekking side for side med et sammenstillingstrinn:

def extract_multi_page_document(image_paths):
    # Step 1: Extract text from each page
    page_texts = []
    for i, path in enumerate(image_paths):
        page_text = extract_text(path, f'Extract all text from page {i+1} of this document. Preserve structure.')
        page_texts.append(f'=== PAGE {i+1} ===\n{page_text}')

    full_text = '\n\n'.join(page_texts)

    # Step 2: Synthesize summary and key information
    r = client.messages.create(
        model='claude-opus-4-5', max_tokens=500,
        messages=[{'role': 'user', 'content': f'''
Here is the extracted text from a {len(image_paths)}-page document:\n\n{full_text}\n\n
Provide:
1. Document type and title
2. 3-sentence summary
3. Key data points extracted
Return JSON: {{"type": str, "title": str, "summary": str, "key_data": [str]}}
'''}]
    )
    return json.loads(r.content[0].text)

print('Multi-page document pipeline defined.')

Validering etter OCR-uttrekking

OCR-resultater må valideres før de brukes i nedstrømssystemer. Vanlige valideringskontroller:

import re
from datetime import datetime

def validate_receipt_extraction(data):
    errors = []

    # Validate total is present and numeric
    if data.get('total') is None:
        errors.append('total is missing')
    elif not isinstance(data['total'], (int, float)):
        errors.append(f'total is not numeric: {data["total"]}')

    # Validate date format
    if data.get('transaction', {}).get('date'):
        date_str = data['transaction']['date']
        try:
            datetime.strptime(date_str, '%Y-%m-%d')
        except ValueError:
            errors.append(f'date format invalid: {date_str}')

    # Validate line items total approximately equals subtotal
    if data.get('items') and data.get('subtotal'):
        items_total = sum(item.get('total', 0) for item in data['items'] if item.get('total'))
        if abs(items_total - data['subtotal']) > 0.05:
            errors.append(f'Items total {items_total} does not match subtotal {data["subtotal"]}')

    return errors

print('Receipt validation function defined.')

Uttrekking av strukturerte data fra diagrammer og grafer

Diagrammer og grafer i dokumentbilder inneholder data som er usynlige for tradisjonell OCR, men som kan leses av Vision-LLM-er. En prompt for uttrekking fra diagrammer ber modellen lese de underliggende dataverdiene:

chart_prompt = '''
Extract the data from this chart or graph image.

Identify:
1. Chart type (bar, line, pie, scatter, table)
2. Title and axis labels
3. All data series names
4. All data points with their labels/values
5. Any notable trend or pattern

Return JSON:
{
  "chart_type": str,
  "title": str or null,
  "x_axis_label": str or null,
  "y_axis_label": str or null,
  "data_series": [
    {"name": str, "values": [{"label": str, "value": number}]}
  ],
  "key_insight": str
}

If exact values are not readable, provide best estimates with a note.
'''

print(chart_prompt)

Rask kontroll

Når håndskrevet innhold transkriberes fra et bilde, hva er anbefalt fremgangsmåte for uleselige ord?

OCR og dokumentanalyse – viktigste poeng

Vision-LLM-er tilbyr fleksibel dokumentanalyse som går utover tegngjenkjenning:

  • Grunnleggende uttrekking: bevar linjeskift og avsnittsstruktur; angi dette eksplisitt
  • Tabeller: bruk markdown-tabellformat eller et JSON-skjema med rader og kolonneoverskrifter for å bevare strukturen
  • Kvitteringer: bruk et eget skjema med felter for forhandler, poster og totalbeløp
  • Håndskrift: instruer modellen til å bruke [ILLEGIBLE] for uleselig tekst og [PARTIAL] for delvis lesbar tekst – gjett aldri
  • Skjemaer: koble etikett–verdi-par; ta med status for utfylt eller ikke utfylt for hvert felt
  • Klassifiser dokumenttypen først, og bruk deretter riktig uttrekkingsskjema
  • Valider uttrekte data programmatisk: obligatoriske felt, numeriske typer, datoformater og matematiske kontroller
  • Bilder med lav kvalitet: konservativ uttrekking er bedre enn selvsikre hallusinasjoner
Gratis å komme i gang

Lær deg AI-prompt engineering 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
53
Leksjoner
199

Ofte stilte spørsmål

Er leksjonen «Ledetekster for OCR og dokumentanalyse» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien AI-prompt engineering, inkludert «Ledetekster for OCR og dokumentanalyse», 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 AI-prompt engineering inneholder totalt 4 leksjoner.

Hva lærer jeg i «Ledetekster for OCR og dokumentanalyse»?

Trekk ut tekst, tabeller og struktur fra bilder av dokumenter. Du øver på AI-prompt engineering 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 AI-prompt engineering?

Ingen tidligere erfaring er nødvendig. AI-prompt engineering 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 4 av 4.

Hvor lang tid tar leksjonen «Ledetekster for OCR og dokumentanalyse»?

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 AI-prompt engineering-leksjonen?

Ja. Alle AI-prompt engineering-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. Ledetekster for bildebeskrivelse og bildeteksting
  2. Visuell spørsmålsbesvarelse
  3. Ledetekster for sammenligning av flere bilder
  4. Ledetekster for OCR og dokumentanalyse
← Tilbake til AI-prompt engineering