Szybki start
W tym szybkim starcie będziemy korzystać z modeli czatowych, które potrafią wywoływać funkcje/narzędzia do wyodrębniania informacji z tekstu.
Wyodrębnianie przy użyciu wywoływania funkcji/narzędzi działa tylko w przypadku modeli obsługujących wywoływanie funkcji/narzędzi.
Konfiguracja
Skorzystamy z metody strukturalnego wyjścia dostępnej w LLM, która potrafi wywoływać funkcje/narzędzia.
Wybierz model, zainstaluj dla niego zależności i skonfiguruj klucze API!
!pip install langchain
Schemat
Na początek musimy opisać, jakie informacje chcemy wyodrębnić z tekstu.
Będziemy korzystać z Pydantic, aby zdefiniować przykładowy schemat do wyodrębniania informacji osobistych.
from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Person(BaseModel):
"""Informacje o osobie."""
name: Optional[str] = Field(..., description="Imię osoby")
hair_color: Optional[str] = Field(
..., description="Kolor włosów osoby, jeśli znany"
)
height_in_meters: Optional[str] = Field(
..., description="Wzrost zmierzony w metrach"
)
Istnieją dwie najlepsze praktyki przy definiowaniu schematu:
- Udokumentuj atrybuty oraz sam schemat: Ta informacja jest przesyłana do LLM i służy do poprawy jakości wyodrębniania informacji.
- Nie zmuszaj LLM do wymyślania informacji! Powyżej użyliśmy
Optional
dla atrybutów, pozwalając LLM na zwracanieNone
, jeśli nie zna odpowiedzi.
Dla uzyskania najlepszej wydajności dobrze udokumentuj schemat i upewnij się, że model nie jest zmuszany do zwracania wyników, jeśli nie ma informacji do wyodrębnienia z tekstu.
Wyodrębniacz
Stwórzmy wyodrębniacz informacji, korzystając z zdefiniowanego powyżej schematu.
from typing import Optional
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"Jesteś ekspertem algorytmu wyodrębniania. " "Wyodrębnij tylko istotne informacje z tekstu. " "Jeśli nie znasz wartości pytanych atrybutów do wyodrębnienia, zwróć null dla wartości atrybutu.",
),
("human", "{text}"),
]
)
Musimy korzystać z modelu, który obsługuje wywoływanie funkcji/narzędzi.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
runnable = prompt | llm.with_structured_output(schema=Person)
Sprawdźmy to
text = "Alan Smith ma 6 stóp wzrostu i blond włosy."
runnable.invoke({"text": text})
Person(name='Alan Smith', hair_color='blond', height_in_meters='1.8288')
Wyodrębnianie jest generatywne 🤯 Modele LLM są generatywnymi modelami, więc potrafią zrobić kilka fajnych rzeczy, jak na przykład poprawnie wyodrębnić wzrost osoby w metrach, pomimo że został podany w stopach!
Wiele jednostek
Większość przypadków wymaga wyodrębnienia listy jednostek zamiast pojedynczej jednostki.
Można łatwo osiągnąć to przy użyciu pydantic przez zagnieżdżanie modeli wewnątrz siebie.
from typing import List, Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Osoba(BaseModel):
"""Informacje o osobie."""
name: Optional[str] = Field(..., description="Imię osoby")
hair_color: Optional[str] = Field(
..., description="Kolor włosów osoby, jeśli znany"
)
height_in_meters: Optional[str] = Field(
..., description="Wzrost mierzony w metrach"
)
class Dane(BaseModel):
"""Wydobyte dane o osobach."""
people: List[Osoba]
Wydobycie tutaj może nie być idealne. Proszę kontynuować, aby zobaczyć, jak używać Przykładów odniesienia, aby poprawić jakość wydobycia, oraz zobaczyć sekcję wytyczne!
callable = prompt | llm.with_structured_output(schema=Dane)
tekst = "Mam na imię Jeff, mam czarne włosy i mam 6 stóp wzrostu. Anna ma taki sam kolor włosów jak ja."
callable.invoke({"text": tekst})
Dane(people=[Osoba(name='Jeff', hair_color=None, height_in_meters=None), Osoba(name='Anna', hair_color=None, height_in_meters=None)])
Gdy schemat dopuszcza wydobycie wielu jednostek, pozwala również na wydobycie braku jednostek, jeśli w tekście nie ma odpowiednich informacji, poprzez dostarczenie pustej listy.
To zazwyczaj jest dobrze! Pozwala to określić wymagane atrybuty dla jednostki, nie zmuszając jednocześnie modelu do wykrywania tej jednostki.