Démarrage rapide
Dans ce démarrage rapide, nous utiliserons des modèles de chat capables d'appeler des fonctions/outils pour extraire des informations à partir de textes.
L'extraction à l'aide de l'appel de fonction/outil ne fonctionne qu'avec les modèles qui prennent en charge l'appel de fonction/outil.
Configuration
Nous utiliserons la méthode de sortie structurée disponible sur les LLM capables d'appel de fonction/outil.
Sélectionnez un modèle, installez les dépendances et configurez les clés API !
!pip install langchain
Le Schéma
Tout d'abord, nous devons décrire les informations que nous voulons extraire du texte.
Nous utiliserons Pydantic pour définir un exemple de schéma pour extraire des informations personnelles.
from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Person(BaseModel):
"""Informations sur une personne."""
name: Optional[str] = Field(..., description="Le nom de la personne")
hair_color: Optional[str] = Field(
..., description="La couleur des cheveux de la personne si connue"
)
height_in_meters: Optional[str] = Field(
..., description="Taille mesurée en mètres"
)
Il existe deux bonnes pratiques lors de la définition du schéma :
- Documenter les attributs et le schéma lui-même : Cette information est envoyée au LLM et est utilisée pour améliorer la qualité de l'extraction des informations.
- Ne forcez pas le LLM à inventer des informations ! Ci-dessus, nous avons utilisé
Optionnel
pour les attributs permettant au LLM de renvoyerNone
s'il ne connaît pas la réponse.
Pour de meilleures performances, documentez bien le schéma et assurez-vous que le modèle n'est pas contraint de renvoyer des résultats s'il n'y a aucune information à extraire dans le texte.
L'Extracteur
Créons un extracteur d'informations en utilisant le schéma que nous avons défini précédemment.
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(
[
(
"système",
"Vous êtes un algorithme d'extraction expert. "
"Extrayez uniquement les informations pertinentes du texte. "
"Si vous ne connaissez pas la valeur d'un attribut à extraire, "
"renvoyez null pour la valeur de l'attribut.",
),
("humain", "{text}"),
]
)
Nous devons utiliser un modèle qui prend en charge l'appel de fonction/outil.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
exécutable = prompt | llm.with_structured_output(schema=Person)
Testons
texte = "Alan Smith mesure 6 pieds de haut et a les cheveux blonds."
exécutable.invoke({"text": texte})
Personne(nom='Alan Smith', couleur_des_cheveux='blond', hauteur_en_mètres='1.8288')
L'extraction est générative 🤯 Les LLM sont des modèles génératifs, donc ils peuvent faire des choses assez cool comme extraire correctement la hauteur de la personne en mètres même si elle était donnée en pieds !
Plusieurs entités
Dans la plupart des cas, vous devriez extraire une liste d'entités plutôt qu'une seule entité.
Cela peut être facilement réalisé en utilisant pydantic en imbriquant des modèles les uns dans les autres.
from typing import List, Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Person(BaseModel):
"""Informations sur une personne."""
name: Optional[str] = Field(..., description="Le nom de la personne")
hair_color: Optional[str] = Field(
..., description="La couleur des cheveux de la personne si connue"
)
height_in_meters: Optional[str] = Field(
..., description="Hauteur mesurée en mètres"
)
class Data(BaseModel):
"""Données extraites sur les personnes."""
people: List[Person]
L'extraction pourrait ne pas être parfaite ici. Veuillez continuer à voir comment utiliser des Exemples de Référence pour améliorer la qualité de l'extraction, et consultez la section des directives !
runnable = prompt | llm.with_structured_output(schema=Data)
text = "Je m'appelle Jeff, j'ai les cheveux noirs et je mesure 1,83 m. Anna a la même couleur de cheveux que moi."
runnable.invoke({"text": text})
Data(people=[Person(name='Jeff', hair_color=None, height_in_meters=None), Person(name='Anna', hair_color=None, height_in_meters=None)])
Lorsque le schéma permet l'extraction de multiples entités, il permet également au modèle d'extraire aucune entité si aucune information pertinente n'est trouvée dans le texte, en fournissant une liste vide.
C'est généralement une bonne chose! Cela permet de spécifier des attributs obligatoires sur une entité sans pour autant forcer le modèle à détecter cette entité.