Início rápido

Neste rápido início, vamos usar modelos de chat que são capazes de chamar função/ferramenta para extrair informações do texto.

A extração usando chamadas de função/ferramenta só funciona com modelos que suportam chamadas de função/ferramenta.

Configuração

Vamos usar o método de saída estruturada disponível em LLMs que são capazes de chamadas de função/ferramenta.

Selecione um modelo, instale as dependências necessárias e configure as chaves da API!

!pip install langchain

O Esquema

Primeiro, precisamos descrever que informações queremos extrair do texto.

Vamos usar o Pydantic para definir um esquema de exemplo para extrair informações pessoais.

from typing import Optional

from langchain_core.pydantic_v1 import BaseModel, Field


class Person(BaseModel):
    """Informações sobre uma pessoa."""


    name: Optional[str] = Field(..., description="O nome da pessoa")
    hair_color: Optional[str] = Field(
        ..., description="A cor do cabelo da pessoa, se conhecida"
    )
    height_in_meters: Optional[str] = Field(
        ..., description="Altura medida em metros"
    )

Há duas melhores práticas ao definir um esquema:

  1. Documente os atributos e o próprio esquema: Esta informação é enviada para o LLM e é usada para melhorar a qualidade da extração de informações.
  2. Não force o LLM a inventar informações! Acima, usamos Optional para os atributos, permitindo que o LLM retorne None se não souber a resposta.

Para melhor desempenho, documente bem o esquema e certifique-se de que o modelo não seja forçado a retornar resultados se não houver informações para extrair no texto.

O Extrator

Vamos criar um extrator de informações usando o esquema que definimos acima.

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",
            "Você é um algoritmo de extração especializado. "
            "Apenas extraia informações relevantes do texto. "
            "Se não souber o valor de um atributo a ser extraído, "
            "retorne nulo para o valor do atributo.",
        ),
        ("human", "{text}"),
    ]
)

Precisamos usar um modelo que suporte a chamada de função/ferramenta.

from langchain_openai import ChatOpenAI

llm = ChatOpenAI()

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

Vamos testar

text = "Alan Smith tem 1,83 metros de altura e cabelos loiros."
runnable.invoke({"text": text})
Person(name='Alan Smith', hair_color='loiro', height_in_meters='1.8288')

A Extração é Generativa 🤯 Os LLMs são modelos generativos, então eles podem fazer coisas bem legais, como extrair corretamente a altura da pessoa em metros, mesmo que tenha sido fornecida em pés!

Múltiplas Entidades

Na maioria dos casos, você deve extrair uma lista de entidades em vez de uma única entidade.

Isso pode ser facilmente alcançado usando o pydantic aninhando modelos uns dentro dos outros.

from typing import List, Optional

from langchain_core.pydantic_v1 import BaseModel, Field


class Pessoa(BaseModel):
    """Informações sobre uma pessoa."""


    nome: Optional[str] = Field(..., description="O nome da pessoa")
    cor_do_cabelo: Optional[str] = Field(
        ..., description="A cor do cabelo da pessoa, se conhecida"
    )
    altura_em_metros: Optional[str] = Field(
        ..., description="Altura medida em metros"
    )


class Dados(BaseModel):
    """Dados extraídos sobre pessoas."""

    pessoas: List[Pessoa]

A extração pode não ser perfeita aqui. Continue a ver como usar Exemplos de Referência para melhorar a qualidade da extração e veja a seção de diretrizes!

executável = prompt | llm.with_structured_output(schema=Dados)
texto = "Meu nome é João, meu cabelo é preto e eu tenho 1,80 metros de altura. Ana tem a mesma cor de cabelo que eu."
executável.invoke({"texto": texto})
Dados(pessoas=[Pessoa(nome='João', cor_do_cabelo=None, altura_em_metros=None), Pessoa(nome='Ana', cor_do_cabelo=None, altura_em_metros=None)])

Quando o esquema acomoda a extração de múltiplas entidades, também permite que o modelo extraia nenhuma entidade se nenhuma informação relevante estiver no texto, fornecendo uma lista vazia.

Isso geralmente é uma coisa boa! Isso permite especificar atributos obrigatórios em uma entidade sem necessariamente forçar o modelo a detectar essa entidade.