0Pricing
AI Prompt Engineering · Lección

Prompts para extraer entidades con nombre

Extraiga nombres, fechas, ubicaciones y entidades personalizadas de texto no estructurado.

Prompts para extraer entidades con nombre es una lección gratuita de AI Prompt Engineering en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Prompt Engineering, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Prompt Engineering incluye 4 lecciones en total.

¿Qué es la extracción de entidades nombradas?

La extracción de entidades nombradas (NER) consiste en identificar y categorizar entidades concretas del mundo real mencionadas en un texto. El NLP tradicional utiliza modelos estadísticos para NER; los LLM pueden hacerlo con un prompt bien diseñado.

Tipos habituales de entidades:

  • PERSON: Nombres de personas (Elon Musk, Dr. Jane Smith)
  • ORG: Empresas y organizaciones (Apple, WHO)
  • DATE: Fechas y expresiones temporales (15 de enero, el martes pasado, T3 de 2024)
  • LOCATION: Lugares (New York, el río Amazonas)
  • MONEY: Cantidades monetarias (4,2 mil millones de dólares)

Prompt básico de NER

El prompt de NER más sencillo solicita todas las entidades en un formato específico:

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))

Añadir restricciones de tipo a la extracción

La extracción básica devuelve cadenas de entidades. Las restricciones de tipo añaden validación: garantizan que las fechas tengan un formato específico y que las organizaciones no incluyan palabras comunes:

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.')

Extracción basada en esquemas

Para el uso en producción, defina de antemano el esquema de entidades y haga referencia a él en el prompt. Esto hace explícito el contrato de salida:

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])

Gestión de entidades ambiguas

Algunas cadenas de entidades son ambiguas: Apple podría ser la empresa o la fruta, y Jordan podría ser una persona o un país. Guíe al modelo para resolver la ambigüedad utilizando el contexto:

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)

Extracción con definiciones de campos

Para los tipos de entidades personalizados específicos de su dominio, proporcione definiciones de campos en el prompt para que el modelo sepa exactamente qué debe considerar una entidad:

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)

Extracción de entidades por lotes

Para procesar varios documentos, la extracción por lotes es más eficiente. Diseñe el prompt para gestionar varias entradas y devolver un resultado estructurado por documento:

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))

Posprocesamiento de entidades extraídas

Las entidades extraídas suelen necesitar posprocesamiento antes de utilizarse:

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))

Evaluación de la calidad de la extracción

La calidad de NER se mide mediante la precisión, la cobertura y la puntuación F1 en comparación con un conjunto de pruebas etiquetado:

  • Precisión: De todas las entidades extraídas, ¿qué proporción es correcta?
  • Cobertura: De todas las entidades reales, ¿qué proporción se extrajo?
  • F1: Media armónica de la precisión y la cobertura
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))

Reducción de entidades alucinadas

A veces, los modelos extraen entidades que no existen en el texto de origen: son alucinaciones. Estrategias de mitigación:

  • Indique: Extraiga únicamente las entidades mencionadas explícitamente en el texto. No infiera ni añada entidades que no estén presentes.
  • Indique: Para cada entidad, incluya la cita exacta del texto en la que aparece.
  • Realice un posprocesamiento: verifique que cada cadena de entidad extraída aparezca realmente en el texto original
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)

Correferencia y vinculación de entidades

Después de extraer las cadenas de entidades sin procesar, hay dos tareas adicionales que mejoran su utilidad posterior:

  • Resolución de correferencias: Vincular él, la empresa y eso con la entidad nombrada a la que hacen referencia
  • Vinculación de entidades: Asignar los nombres extraídos a identificadores canónicos (por ejemplo, "Apple" → apple_inc en una base de conocimiento)

Ambas tareas pueden gestionarse con un paso adicional del prompt después de la extracción inicial.

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)

Comprobación rápida

¿Cuál es la forma más eficaz de evitar que un modelo extraiga entidades que no están presentes en el texto de origen?

Extracción de entidades nombradas: conclusiones clave

La extracción de entidades nombradas basada en LLM es flexible y potente cuando el prompt está bien diseñado:

  • Defina explícitamente los tipos de entidades: PERSON, ORG, DATE, LOCATION, MONEY y tipos específicos del dominio
  • Utilice un esquema JSON en el prompt para imponer una estructura de salida coherente
  • Añada definiciones de campos para los tipos de entidades personalizados para que el modelo sepa exactamente qué cumple los requisitos
  • Exija citas del texto de origen para evitar alucinaciones de entidades
  • Realice un posprocesamiento para normalizar los formatos de las entidades (fechas a ISO y nombres a formato de título)
  • Evalúe la calidad con la precisión, la cobertura y la puntuación F1 en comparación con un conjunto de pruebas etiquetado
  • Para los lotes, procese varios documentos en una sola llamada con una salida estructurada por documento

Preguntas frecuentes

¿La lección «Prompts para extraer entidades con nombre» es gratis?

Sí — el texto completo de «Prompts para extraer entidades con nombre» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Prompt Engineering, actualiza a CoddyKit PRO. El curso de AI Prompt Engineering incluye 4 lecciones en total.

¿Qué aprenderé en «Prompts para extraer entidades con nombre»?

Extraiga nombres, fechas, ubicaciones y entidades personalizadas de texto no estructurado. Practicas AI Prompt Engineering con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar AI Prompt Engineering?

No se requiere experiencia previa. AI Prompt Engineering en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Prompts para extraer entidades con nombre»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de AI Prompt Engineering?

Sí. Cada lección de AI Prompt Engineering incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Prompts para extraer entidades con nombre
  2. Extracción de datos basada en esquemas
  3. El LLM como clasificador de texto
  4. Confianza e incertidumbre en la clasificación
← Volver a AI Prompt Engineering