Schnellstart
Im Schnellstart werden wir Chatmodelle verwenden, die in der Lage sind, Funktions-/Tool-Aufrufe durchzuführen, um Informationen aus Texten zu extrahieren.
Die Extraktion mit Funktions-/Tool-Aufrufen funktioniert nur mit Modellen, die Funktions-/Tool-Aufrufe unterstützen.
Einrichtung
Wir werden die strukturierte Ausgabemethode von LLMs verwenden, die in der Lage sind, Funktions-/Tool-Aufrufe durchzuführen.
Wählen Sie ein Modell aus, installieren Sie die dafür erforderlichen Abhängigkeiten und richten Sie die API-Schlüssel ein!
!pip install langchain
Das Schema
Zunächst müssen wir beschreiben, welche Informationen wir aus dem Text extrahieren möchten.
Wir werden Pydantic verwenden, um ein Beispiel-Schema zur Extraktion persönlicher Informationen zu definieren.
from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Person(BaseModel):
"""Informationen über eine Person."""
name: Optional[str] = Field(..., description="Name der Person")
hair_color: Optional[str] = Field(
..., description="Haarfarbe der Person, falls bekannt"
)
height_in_meters: Optional[str] = Field(
..., description="Größe in Metern"
)
Beim Definieren des Schemas gibt es zwei bewährte Methoden:
- Dokumentieren Sie die Attribute und das Schema selbst: Diese Informationen werden an den LLM gesendet und dienen dazu, die Qualität der Informationsextraktion zu verbessern.
- Zwingen Sie den LLM nicht, Informationen zu erfinden! Oben haben wir
Optional
für die Attribute verwendet, wodurch der LLMNone
ausgeben kann, wenn er die Antwort nicht kennt.
Zur bestmöglichen Leistung dokumentieren Sie das Schema sorgfältig und stellen Sie sicher, dass das Modell nicht gezwungen wird, Ergebnisse zurückzugeben, wenn im Text keine Informationen extrahiert werden können.
Der Extraktor
Lassen Sie uns einen Informationsextraktor anhand des oben definierten Schemas erstellen.
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",
"Du bist ein Experte für Extraktionsalgorithmen. "
"Extrahiere nur relevante Informationen aus dem Text. "
"Wenn du den Wert eines abgefragten Attributes nicht kennst, "
"gib für den Wert des Attributes null zurück.",
),
("human", "{text}"),
]
)
Wir müssen ein Modell verwenden, das Funktions-/Tool-Aufrufe unterstützt.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
ausführbar = prompt | llm.with_structured_output(schema=Person)
Lassen Sie uns das einmal testen
text = "Alan Smith ist 1,83 Meter groß und hat blondes Haar."
ausführbar.invoke({"text": text})
Person(name='Alan Smith', hair_color='blond', height_in_meters='1.8288')
Die Extraktion ist generativ 🤯 LLMs sind generative Modelle, daher können sie einige ziemlich coole Dinge tun, wie zum Beispiel die korrekte Extraktion der Größe der Person in Metern, obwohl sie in Fuß angegeben wurde!
Mehrere Entitäten
In den meisten Fällen sollten Sie eine Liste von Entitäten extrahieren, anstatt nur eine einzige Entität.
Dies kann ganz einfach mit Pydantic erreicht werden, indem Sie Modelle ineinander verschachteln.
from typing import List, Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Person(BaseModel):
"""Informationen über eine Person."""
name: Optional[str] = Field(..., description="Der Name der Person")
hair_color: Optional[str] = Field(
..., description="Die Haarfarbe der Person, sofern bekannt"
)
height_in_meters: Optional[str] = Field(
..., description="Körpergröße gemessen in Metern"
)
class Data(BaseModel):
"""Extrahierte Daten über Personen."""
people: List[Person]
Die Extraktion ist möglicherweise nicht perfekt. Bitte fahren Sie fort, um zu sehen, wie Sie Referenzbeispiele zur Verbesserung der Extraktionsqualität nutzen können, und sehen Sie den Abschnitt Richtlinien!
runnable = prompt | llm.with_structured_output(schema=Data)
text = "Mein Name ist Jeff, meine Haare sind schwarz und ich bin 1,83 Meter groß. Anna hat die gleiche Haarfarbe wie ich."
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)])
Wenn das Schema die Extraktion von mehreren Entitäten ermöglicht, erlaubt es auch dem Modell, keine Entitäten zu extrahieren, wenn keine relevanten Informationen im Text vorhanden sind, indem es eine leere Liste bereitstellt.
Das ist in der Regel eine gute Sache! Es ermöglicht die Angabe von erforderlichen Attributen für eine Entität, ohne das Modell zwangsläufig zur Erkennung dieser Entität zu zwingen.