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:

  1. Udokumentuj atrybuty oraz sam schemat: Ta informacja jest przesyłana do LLM i służy do poprawy jakości wyodrębniania informacji.
  2. Nie zmuszaj LLM do wymyślania informacji! Powyżej użyliśmy Optional dla atrybutów, pozwalając LLM na zwracanie None, 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.