Inicio rápido

En este inicio rápido, utilizaremos modelos de chat que son capaces de llamar funciones/herramientas para extraer información del texto.

La extracción usando llamadas de función/herramienta solo funciona con modelos que admiten llamadas de función/herramienta.

Configuración

Utilizaremos el método de salida estructurada disponible en LLMs que son capaces de llamar funciones/herramientas.

¡Selecciona un modelo, instala las dependencias y configura las claves de la API!

!pip install langchain

El Esquema

Primero, necesitamos describir qué información queremos extraer del texto.

Usaremos Pydantic para definir un esquema de ejemplo para extraer información personal.

from typing import Optional

from langchain_core.pydantic_v1 import BaseModel, Field


class Person(BaseModel):
    """Información sobre una persona."""

    name: Optional[str] = Field(..., description="El nombre de la persona")
    hair_color: Optional[str] = Field(
        ..., description="El color del cabello de la persona si se conoce"
    )
    height_in_meters: Optional[str] = Field(
        ..., description="Altura medida en metros"
    )

Hay dos mejores prácticas al definir el esquema:

  1. Documentar los atributos y el propio esquema: Esta información se envía al LLM y se utiliza para mejorar la calidad de la extracción de información.
  2. ¡No obligar al LLM a inventar información! Arriba usamos Optional para los atributos permitiendo que el LLM devuelva None si no conoce la respuesta.

Para obtener el mejor rendimiento, documenta bien el esquema y asegúrate de que el modelo no esté obligado a devolver resultados si no hay información que se pueda extraer del texto.

El Extractor

Creemos un extractor de información usando el esquema que definimos anteriormente.

from typing import Optional

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "Eres un algoritmo experto en extracción. "
            "Solo extrae información relevante del texto. "
            "Si no conoces el valor de un atributo solicitado para extraer, "
            "devuelve nulo para el valor del atributo.",
        ),
        ("human", "{text}"),
    ]
)

Necesitamos usar un modelo que admita llamadas de función/herramienta.

from langchain_openai import ChatOpenAI

llm = ChatOpenAI()

runnable = prompt | llm.with_structured_output(schema=Person)

Probémoslo

text = "Alan Smith mide 1.83 metros y tiene el pelo rubio."
runnable.invoke({"text": text})
Person(name='Alan Smith', hair_color='rubio', height_in_meters='1.83')

La extracción es generativa 🤯

Los LLMs son modelos generativos, ¡así que pueden hacer cosas muy interesantes como extraer correctamente la altura de la persona en metros aunque se haya proporcionado en pies!

Múltiples Entidades

En la mayoría de los casos, deberías extraer una lista de entidades en lugar de una sola entidad.

Esto se puede lograr fácilmente utilizando pydantic anidando modelos dentro de otros.

from typing import List, Optional

from langchain_core.pydantic_v1 import BaseModel, Field


class Persona(BaseModel):
    """Información sobre una persona."""


    nombre: Optional[str] = Field(..., description="El nombre de la persona")
    color_cabello: Optional[str] = Field(
        ..., description="El color del cabello de la persona si se conoce"
    )
    altura_en_metros: Optional[str] = Field(
        ..., description="Altura medida en metros"
    )


class Datos(BaseModel):
    """Datos extraídos sobre personas."""

    personas: List[Persona]

La extracción puede no ser perfecta aquí. ¡Continúa para ver cómo usar los Ejemplos de Referencia para mejorar la calidad de la extracción, y consulta la sección de directrices!

ejecutable = prompt | llm.with_structured_output(schema=Datos)
texto = "Mi nombre es Jeff, tengo el cabello negro y mido 6 pies de altura. Anna tiene el mismo color de cabello que yo."
ejecutable.invoke({"texto": texto})
Datos(personas=[Persona(nombre='Jeff', color_cabello=None, altura_en_metros=None), Persona(nombre='Anna', color_cabello=None, altura_en_metros=None)])

Cuando el esquema permite la extracción de múltiples entidades, también permite que el modelo extraiga ninguna entidad si no hay información relevante en el texto, proporcionando una lista vacía.

¡Esto suele ser algo bueno! Permite especificar atributos requeridos en una entidad sin forzar necesariamente al modelo a detectar esta entidad.