Prompty do ekstrakcji nazwanych jednostek
Wyodrębniaj imiona i nazwy, daty, lokalizacje oraz niestandardowe jednostki z nieustrukturyzowanego tekstu.
Prompty do ekstrakcji nazwanych jednostek to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 1 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.
Czym jest ekstrakcja nazwanych encji
Ekstrakcja nazwanych encji (NER) polega na identyfikowaniu i kategoryzowaniu konkretnych encji ze świata rzeczywistego wymienionych w tekście. Tradycyjne NLP wykorzystuje do NER-u modele statystyczne, natomiast LLM-y mogą wykonywać to zadanie za pomocą dobrze zaprojektowanego promptu.
Typowe rodzaje encji:
- PERSON: Imiona i nazwiska osób (Elon Musk, Dr. Jane Smith)
- ORG: Firmy i organizacje (Apple, WHO)
- DATE: Daty i wyrażenia czasowe (15 stycznia, zeszły wtorek, III kw. 2024)
- LOCATION: Miejsca (Nowy Jork, rzeka Amazonka)
- MONEY: Kwoty pieniężne (4,2 mld USD)
Podstawowy prompt NER
Najprostszy prompt NER prosi o wszystkie encje w określonym formacie:
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))Dodawanie ograniczeń typów do ekstrakcji
Podstawowa ekstrakcja zwraca ciągi znaków reprezentujące encje. Ograniczenia typów dodają walidację — zapewniają, że daty mają określony format, a nazwy organizacji nie zawierają pospolitych słów:
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.')Ekstrakcja oparta na schemacie
W zastosowaniach produkcyjnych należy z góry zdefiniować schemat encji i odwołać się do niego w prompcie. Dzięki temu kontrakt wyjściowy jest jawny:
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])Obsługa niejednoznacznych encji
Niektóre ciągi znaków reprezentujące encje są niejednoznaczne — Apple może oznaczać firmę lub owoc, a Jordan może oznaczać osobę lub kraj. Należy poprowadzić model tak, aby rozstrzygał niejednoznaczności na podstawie kontekstu:
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)Ekstrakcja z definicjami pól
W przypadku niestandardowych typów encji właściwych dla danej domeny należy podać w prompcie definicje pól, aby model dokładnie wiedział, co należy uwzględnić:
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)Wsadowa ekstrakcja encji
W przypadku przetwarzania wielu dokumentów ekstrakcja wsadowa jest wydajniejsza. Należy zaprojektować prompt tak, aby obsługiwał wiele danych wejściowych i zwracał ustrukturyzowany wynik dla każdego dokumentu:
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))Przetwarzanie wyekstrahowanych encji
Wyekstrahowane encje często wymagają przetworzenia po ekstrakcji, zanim będzie można ich użyć:
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))Ocena jakości ekstrakcji
Jakość NER-u mierzy się za pomocą miar Precision, Recall i F1 na podstawie oznaczonego zbioru testowego:
- Precision: Jaki odsetek wszystkich wyekstrahowanych encji jest poprawny?
- Recall: Jaki odsetek wszystkich rzeczywistych encji został wyekstrahowany?
- F1: Średnia harmoniczna wartości Precision i 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))Ograniczanie halucynacji encji
Modele czasami wyodrębniają encje, które nie występują w tekście źródłowym — są to halucynacje. Strategie ograniczania tego problemu:
- Polecić: Wyodrębniaj tylko encje jawnie wymienione w tekście. Nie wnioskuj o encjach ani nie dodawaj encji, których w nim nie ma.
- Polecić: Do każdej encji dołącz dokładny cytat z tekstu, w którym się pojawia.
- Przetwarzać po ekstrakcji: sprawdzić, czy każdy wyekstrahowany ciąg znaków reprezentujący encję rzeczywiście występuje w oryginalnym tekście
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)Rozwiązywanie koreferencji i linkowanie encji
Po wyodrębnieniu surowych ciągów znaków reprezentujących encje dwa dodatkowe zadania zwiększają użyteczność wyników w kolejnych etapach:
- Rozwiązywanie koreferencji: Powiązanie zaimków on, określenia firma i zaimka to z nazwanymi encjami, do których się odnoszą
- Linkowanie encji: Mapowanie wyodrębnionych nazw na identyfikatory kanoniczne (np. "Apple" → apple_inc w bazie wiedzy)
Oba zadania można obsłużyć za pomocą dodatkowego etapu promptu po początkowej ekstrakcji.
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)Szybki test
Jaki jest najskuteczniejszy sposób zapobiegania wyodrębnianiu przez model encji, których nie ma w tekście źródłowym?
Ekstrakcja nazwanych encji — najważniejsze wnioski
Ekstrakcja nazwanych encji oparta na LLM-ach jest elastyczna i skuteczna, gdy prompt został dobrze zaprojektowany:
- Jawnie definiować typy encji — PERSON, ORG, DATE, LOCATION, MONEY oraz typy właściwe dla danej domeny
- Używać w prompcie schematu JSON, aby wymusić spójną strukturę wyników
- Dodawać definicje pól dla niestandardowych typów encji, aby model dokładnie wiedział, co się kwalifikuje
- Wymagać cytatów źródłowych, aby zapobiegać halucynacjom encji
- Przetwarzać wyniki po ekstrakcji w celu normalizacji formatów encji (daty do formatu ISO, nazwy do formatu tytułowego)
- Oceniać jakość za pomocą miar precision, recall i F1 na podstawie oznaczonego zbioru testowego
- W przypadku partii przetwarzać wiele dokumentów w jednym wywołaniu i zwracać ustrukturyzowany wynik dla każdego dokumentu
Ucz się AI Prompt Engineering dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 53
- Lekcje
- 199
Często zadawane pytania
Czy lekcja „Prompty do ekstrakcji nazwanych jednostek” jest bezpłatna?
Tak — pełny tekst „Prompty do ekstrakcji nazwanych jednostek” 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 „Prompty do ekstrakcji nazwanych jednostek”?
Wyodrębniaj imiona i nazwy, daty, lokalizacje oraz niestandardowe jednostki z nieustrukturyzowanego tekstu. Ć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 1 z 4.
Ile czasu zajmuje lekcja „Prompty do ekstrakcji nazwanych jednostek”?
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