Introduzione rapida
In questa guida rapida, utilizzeremo modelli di chat capaci di funzioni/chiamate degli strumenti per estrarre informazioni dal testo.
L'estrazione tramite funzioni/chiamate degli strumenti funziona solo con modelli che supportano funzioni/chiamate degli strumenti.
Configurazione
Utilizzeremo il metodo di output strutturato disponibile su LLM che sono in grado di funzioni/chiamate degli strumenti.
Scegli un modello, installa le dipendenze e imposta le chiavi API!
!pip install langchain
Lo Schema
Iniziamo descrivendo le informazioni che vogliamo estrarre dal testo.
Utilizzeremo Pydantic per definire uno schema di esempio per estrarre informazioni personali.
from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Person(BaseModel):
"""Informazioni su una persona."""
name: Optional[str] = Field(..., description="Il nome della persona")
hair_color: Optional[str] = Field(
..., description="Il colore dei capelli della persona, se noto"
)
height_in_meters: Optional[str] = Field(
..., description="Altezza misurata in metri"
)
Ci sono due buone pratiche nella definizione dello schema:
- Documentare gli attributi e lo schema stesso: Queste informazioni vengono inviate al LLM e vengono utilizzate per migliorare la qualità dell'estrazione delle informazioni.
- Non costringere il LLM a inventare informazioni! Sopra abbiamo usato
Optional
per gli attributi permettendo al LLM di restituireNone
se non conosce la risposta.
Per le migliori prestazioni, documenta bene lo schema e assicurati che il modello non sia costretto a restituire risultati se non ci sono informazioni da estrarre nel testo.
L'Estensore
Creiamo un estrattore di informazioni utilizzando lo schema che abbiamo definito in precedenza.
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.pydantic_v1 import BaseModel, Field
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"Sei un algoritmo di estrazione esperto. "
"Estrai solo informazioni rilevanti dal testo. "
"Se non conosci il valore di un attributo richiesto da estrarre, "
"restituisci null per il valore dell'attributo.",
),
("human", "{text}"),
]
)
Dobbiamo utilizzare un modello che supporti le funzioni/chiamate degli strumenti.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
runnable = prompt | llm.with_structured_output(schema=Person)
Proviamolo
text = "Alan Smith è alto 6 piedi e ha i capelli biondi."
runnable.invoke({"text": text})
Person(name='Alan Smith', hair_color='biondo', height_in_meters='1.8288')
L'estrazione è Generativa 🤯 Gli LLM sono modelli generativi, quindi possono fare cose molto interessanti come estrarre correttamente l'altezza della persona in metri anche se è stata fornita in piedi!
Entità multiple
Nella maggior parte dei casi, dovresti estrarre un elenco di entità anziché una singola entità.
Questo può essere facilmente ottenuto utilizzando pydantic nidificando modelli l'uno dentro l'altro.
from typing import List, Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Persona(BaseModel):
"""Informazioni su una persona."""
nome: Optional[str] = Field(..., description="Il nome della persona")
colore_capelli: Optional[str] = Field(
..., description="Il colore dei capelli della persona, se noto"
)
altezza_in_metri: Optional[str] = Field(
..., description="Altezza misurata in metri"
)
class Dati(BaseModel):
"""Dati estratti sulle persone."""
persone: List[Persona]
L'estrazione potrebbe non essere perfetta qui. Continua a vedere come utilizzare Esempi di riferimento per migliorare la qualità dell'estrazione e consulta la sezione linee guida!
eseguibile = prompt | llm.with_structured_output(schema=Dati)
testo = "Mi chiamo Luca, ho i capelli castani e sono alto 1,80 metri. Maria ha lo stesso colore di capelli che ho io."
eseguibile.invoke({"testo": text})
Dati(persone=[Persona(nome='Luca', colore_capelli='castani', altezza_in_metri='1.80'), Persona(nome='Maria', colore_capelli='castani', altezza_in_metri=None)])
Quando lo schema consente l'estrazione di entità multiple, consente anche al modello di estrarre nessuna entità se non ci sono informazioni rilevanti nel testo, fornendo un elenco vuoto.
Questo di solito è una cosa positiva! Consente di specificare attributi obbligatori su un'entità senza forzare necessariamente il modello a rilevare questa entità.