AI Prompt Engineering · Lektion

Prompts zur Named-Entity-Extraktion

Extrahieren Sie Namen, Datumsangaben, Orte und benutzerdefinierte Entitäten aus unstrukturiertem Text

Lektion 1 von 413 Schritte

Prompts zur Named-Entity-Extraktion ist eine kostenlose AI Prompt Engineering-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Prompt Engineering-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.

Was ist die Named-Entity-Extraktion?

Named-Entity-Extraktion (NER) bezeichnet die Aufgabe, bestimmte in Text erwähnte Entitäten der realen Welt zu identifizieren und zu kategorisieren. Traditionelles NLP verwendet für NER statistische Modelle; LLMs können dies mit einem gut gestalteten Prompt erledigen.

Häufige Entitätstypen:

  • PERSON: Namen von Personen (Elon Musk, Dr. Jane Smith)
  • ORG: Unternehmen und Organisationen (Apple, WHO)
  • DATE: Datums- und Zeitangaben (15. Januar, letzten Dienstag, Q3 2024)
  • LOCATION: Orte (New York, der Amazonas)
  • MONEY: Geldbeträge (4,2 Milliarden $)

Einfacher NER-Prompt

Der einfachste NER-Prompt fordert alle Entitäten in einem bestimmten Format an:

import anthropic, json

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

text = 'Apple CEO Tim Cook met with European Commission President Ursula von der Leyen in Brussels on March 15, 2025 to discuss the Digital Markets Act.'

prompt = f'''
Extract all named entities from the text below.
Return ONLY a JSON object with no other text:
{{
  "people": ["string"],
  "organizations": ["string"],
  "locations": ["string"],
  "dates": ["string"]
}}

Text: {text}
'''

r = client.messages.create(
    model='claude-opus-4-5', max_tokens=300,
    messages=[{'role': 'user', 'content': prompt}]
)
print(json.loads(r.content[0].text))

Der Extraktion Typbeschränkungen hinzufügen

Eine einfache Extraktion liefert Zeichenketten von Entitäten. Typbeschränkungen fügen eine Validierung hinzu — sie stellen sicher, dass Datumsangaben ein bestimmtes Format haben und Organisationen keine allgemeinen Wörter enthalten:

prompt_typed = '''
Extract named entities from the text below with type constraints.
Return JSON:
{
  "people": ["Full name as written in text"],
  "organizations": ["Official organization name only, no articles (the, a)"],
  "dates": ["ISO 8601 format if possible: YYYY-MM-DD, else exact text as written"],
  "money": ["Include currency symbol and amount: $4.2B, EUR 500K"],
  "locations": ["City, Country format if applicable"]
}
If a category has no entities, use an empty array [].

Text: {text}
'''

print(prompt_typed[:200])
print('\nConstraints enforce consistent output format per entity type.')

Schema-basierte Extraktion

Definieren Sie für den produktiven Einsatz das Entitätsschema im Voraus und verweisen Sie im Prompt darauf. Dadurch wird der Ausgabevertrag explizit:

ENTITY_SCHEMA = '''
{
  "entities": [
    {
      "text": "exact text as it appears in the document",
      "type": "PERSON | ORG | DATE | LOCATION | MONEY | PRODUCT | EVENT",
      "normalized": "canonical form (e.g., full name, ISO date)",
      "start_char": "integer, character offset in source text",
      "confidence": "high | medium | low"
    }
  ]
}
'''

def extract_entities(text):
    prompt = f'Extract all named entities. Return JSON matching this schema exactly:\n{ENTITY_SCHEMA}\n\nText: {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)

result = extract_entities('Tesla stock rose 5% after Elon Musk announced the Cybertruck delivery on December 1.')
print(result['entities'][0])

Mehrdeutige Entitäten behandeln

Einige Entitätszeichenketten sind mehrdeutig — Apple könnte das Unternehmen oder die Frucht sein, Jordan könnte eine Person oder ein Land sein. Leiten Sie das Modell an, Mehrdeutigkeiten anhand des Kontexts aufzulösen:

prompt_disambiguation = '''
Extract named entities from the text. For ambiguous entities, use the surrounding
context to determine the correct type. Include your reasoning in an "evidence" field.

Return JSON:
{
  "entities": [
    {
      "text": "string",
      "type": "PERSON | ORG | LOCATION | OTHER",
      "evidence": "brief reason for type assignment"
    }
  ]
}

Text: Jordan and Apple signed a distribution deal for the new Air Jordan shoes.
'''

# Expected output: Jordan = PERSON (context: Air Jordan), Apple = ORG (context: signed a deal)
print(prompt_disambiguation)

Extraktion mit Fel 정의itionen

Geben Sie für benutzerdefinierte, domänenspezifische Entitätstypen Felddefinitionen im Prompt an, damit das Modell genau weiß, was als Entität gilt:

prompt_custom = '''
Extract entities from the medical text below using these custom entity types:

Entity Types:
- MEDICATION: Any drug name, trade name, or generic name
- DOSAGE: Amounts and frequencies (mg, mcg, units/day)
- CONDITION: Diagnoses, symptoms, or medical conditions
- PROCEDURE: Medical tests, surgeries, or treatments
- PROVIDER: Doctor names and medical professionals

Return JSON: {"entities": [{"text": str, "type": str}]}

Text: Dr. Patel prescribed Metformin 500mg twice daily for Type 2 Diabetes.
A follow-up HbA1c test is scheduled for next month.
'''

print(prompt_custom)

Stapelverarbeitung bei der Entitätsextraktion

Bei der Verarbeitung mehrerer Dokumente ist die Extraktion im Stapel effizienter. Entwerfen Sie den Prompt so, dass er mehrere Eingaben verarbeitet und pro Dokument ein strukturiertes Ergebnis zurückgibt:

def batch_extract(documents):
    docs_formatted = '\n'.join(
        f'<document id="{i+1}">\n{doc}\n</document>'
        for i, doc in enumerate(documents)
    )

    prompt = f'''
Extract named entities from each document below.
Return JSON: {{
  "results": [
    {{"doc_id": int, "entities": {{"people": [], "organizations": [], "dates": []}}}}
  ]
}}

{docs_formatted}
'''

    r = client.messages.create(
        model='claude-opus-4-5', max_tokens=1000,
        messages=[{'role': 'user', 'content': prompt}]
    )
    return json.loads(r.content[0].text)

docs = [
    'Satya Nadella presented at Microsoft Build 2025.',
    'The WHO released guidelines on May 10.'
]
print(batch_extract(docs))

Extrahierte Entitäten nachbearbeiten

Extrahierte Entitäten müssen vor ihrer Verwendung häufig nachbearbeitet werden:

from datetime import datetime

def normalize_entities(raw_entities):
    normalized = {'people': [], 'organizations': [], 'dates': [], 'money': []}

    for person in raw_entities.get('people', []):
        normalized['people'].append(person.strip().title())

    for org in raw_entities.get('organizations', []):
        normalized['organizations'].append(org.strip())

    for date_str in raw_entities.get('dates', []):
        # Try to parse to ISO format
        for fmt in ['%B %d, %Y', '%Y-%m-%d', '%b %d, %Y']:
            try:
                parsed = datetime.strptime(date_str.strip(), fmt)
                normalized['dates'].append(parsed.strftime('%Y-%m-%d'))
                break
            except ValueError:
                pass
        else:
            normalized['dates'].append(date_str.strip())

    return normalized

raw = {'people': ['tim cook', 'URSULA VON DER LEYEN'], 'dates': ['March 15, 2025']}
print(normalize_entities(raw))

Qualität der Extraktion bewerten

Die NER-Qualität wird anhand eines annotierten Testsatzes mit Precision, Recall und F1-Score gemessen:

  • Precision: Welcher Anteil aller extrahierten Entitäten ist korrekt?
  • Recall: Welcher Anteil aller tatsächlich vorhandenen Entitäten wurde extrahiert?
  • F1: Harmonisches Mittel aus Precision und Recall
def evaluate_extraction(predicted, ground_truth):
    pred_set = set(predicted)
    true_set = set(ground_truth)

    true_positives = len(pred_set & true_set)
    false_positives = len(pred_set - true_set)
    false_negatives = len(true_set - pred_set)

    precision = true_positives / (true_positives + false_positives) if pred_set else 0
    recall = true_positives / (true_positives + false_negatives) if true_set else 0
    f1 = 2 * precision * recall / (precision + recall) if (precision + recall) else 0

    return {'precision': round(precision, 3), 'recall': round(recall, 3), 'f1': round(f1, 3)}

predicted = ['Tim Cook', 'Apple', 'Brussels', 'March 15 2025']
ground_truth = ['Tim Cook', 'Apple', 'Ursula von der Leyen', 'Brussels', 'March 15, 2025', 'European Commission']
print(evaluate_extraction(predicted, ground_truth))

Halluzinierte Entitäten reduzieren

Modelle extrahieren manchmal Entitäten, die im Quelltext nicht vorkommen — sogenannte Halluzinationen. Strategien zur Vermeidung:

  • Weisen Sie an: Extrahieren Sie nur Entitäten, die im Text ausdrücklich erwähnt werden. Leiten Sie keine Entitäten her und fügen Sie keine hinzu, die nicht vorhanden sind.
  • Weisen Sie an: Fügen Sie für jede Entität das exakte Zitat aus dem Text ein, in dem sie vorkommt.
  • Nachbearbeitung: Überprüfen Sie, ob jede extrahierte Entitätszeichenkette tatsächlich im Originaltext vorkommt
def anti_hallucination_extract(text):
    prompt = f'''
Extract ONLY entities that are explicitly present in the text below.
Do NOT infer, add, or supplement with external knowledge.
For each entity, include the exact quote from the text.

Return JSON: {{"entities": [{{"text": str, "type": str, "quote": str}}]}}

Text: {text}
'''
    r = client.messages.create(model='claude-opus-4-5', max_tokens=400, messages=[{'role': 'user', 'content': prompt}])
    extracted = json.loads(r.content[0].text)

    # Post-process: verify each entity appears in original text
    verified = [e for e in extracted['entities'] if e['text'].lower() in text.lower()]
    return {'entities': verified}

result = anti_hallucination_extract('Google announced a $5B investment in AI infrastructure.')
print(result)

Koreferenz und Entity Linking

Nach der Extraktion roher Entitätszeichenketten verbessern zwei zusätzliche Aufgaben die weitere Verwendbarkeit:

  • Koreferenzauflösung: Verknüpfen von er, das Unternehmen und es mit der Named Entity, auf die sie sich beziehen
  • Entity Linking: Zuordnen extrahierter Namen zu kanonischen Identifikatoren (z. B. "Apple" → apple_inc in einer Wissensdatenbank)

Beides kann nach der anfänglichen Extraktion in einem zusätzlichen Prompt-Schritt erledigt werden.

coref_prompt = '''
Resolve coreferences in the text below.
For each pronoun or definite reference (he, she, it, the company, the CEO),
identify which named entity it refers to.

Return JSON: {"coreferences": [{"text": str, "refers_to": str, "position": int}]}

Text: Apple released its new chip. The company said it would ship in Q4.
Tim Cook announced that he would present it at the fall event.
'''

print(coref_prompt)

Kurzüberprüfung

Wie lässt sich am effektivsten verhindern, dass ein Modell Entitäten extrahiert, die im Quelltext nicht vorkommen?

Named-Entity-Extraktion — wichtigste Erkenntnisse

Die Named-Entity-Extraktion auf Basis von LLMs ist flexibel und leistungsfähig, wenn der Prompt gut gestaltet ist:

  • Definieren Sie Entitätstypen ausdrücklich — PERSON, ORG, DATE, LOCATION, MONEY und domänenspezifische Typen
  • Verwenden Sie ein JSON-Schema im Prompt, um eine konsistente Ausgabestruktur zu erzwingen
  • Fügen Sie für benutzerdefinierte Entitätstypen Felddefinitionen hinzu, damit das Modell genau weiß, was als Entität gilt
  • Verlangen Sie Quelltextzitate, um Halluzinationen von Entitäten zu verhindern
  • Führen Sie eine Nachbearbeitung durch, um Entitätsformate zu normalisieren (Datumsangaben in ISO-Format, Namen in Title Case)
  • Bewerten Sie die Qualität anhand eines annotierten Testsatzes mit Precision, Recall und F1
  • Verarbeiten Sie bei Stapeln mehrere Dokumente in einem Aufruf mit einer strukturierten Ausgabe pro Dokument
Kostenlos starten

Lerne AI Prompt Engineering mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
53
Lektionen
199

Häufig gestellte Fragen

Ist die Lektion „Prompts zur Named-Entity-Extraktion“ kostenlos?

Ja — der vollständige Text von „Prompts zur Named-Entity-Extraktion“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Prompt Engineering-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Prompts zur Named-Entity-Extraktion“?

Extrahieren Sie Namen, Datumsangaben, Orte und benutzerdefinierte Entitäten aus unstrukturiertem Text Du übst AI Prompt Engineering mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um AI Prompt Engineering zu starten?

Keine Vorkenntnisse erforderlich. AI Prompt Engineering auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Prompts zur Named-Entity-Extraktion“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser AI Prompt Engineering-Lektion Code schreiben und ausführen?

Ja. Jede AI Prompt Engineering-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Prompts zur Named-Entity-Extraktion
  2. Schema-gesteuerte Datenextraktion
  3. LLM als Textklassifikator
  4. Konfidenz und Unsicherheit bei der Klassifikation
← Zurück zu AI Prompt Engineering