Быстрый старт

В этом быстром старте мы будем использовать модели чатов, способные к вызову функций/инструментов, для извлечения информации из текста.

Извлечение с использованием вызова функций/инструментов работает только с моделями, поддерживающими вызов функций/инструментов.

Настройка

Мы будем использовать метод структурированного вывода, доступный в LLM, способных к вызову функций/инструментов.

Выберите модель, установите для нее зависимости и настройте API-ключи!

!pip install langchain

Схема

Сначала мы должны описать, какую информацию мы хотим извлечь из текста.

Мы будем использовать Pydantic, чтобы определить пример схемы для извлечения личной информации.

from typing import Optional

from langchain_core.pydantic_v1 import BaseModel, Field


class Person(BaseModel):
    """Информация о человеке."""

    name: Optional[str] = Field(..., description="Имя человека")
    hair_color: Optional[str] = Field(
        ..., description="Цвет волос человека, если известен"
    )
    height_in_meters: Optional[str] = Field(
        ..., description="Рост измеряется в метрах"
    )

Существуют две bewt практики при определении схемы:

  1. Документируйте атрибуты и саму схему: Эта информация отправляется в LLM и используется для улучшения качества извлечения информации.
  2. Не заставляйте LLM выдумывать информацию! В приведенном выше примере мы использовали Optional для атрибутов, позволяя LLM выводить None, если она не знает ответа.

Для лучшей производительности хорошо задокументируйте схему и убедитесь, что модель не заставляется возвращать результаты, если в тексте нет информации для извлечения.

Извлекатель

Давайте создадим извлекатель информации, используя определенную выше схему.

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",
            "Вы - экспертный алгоритм извлечения. "
            "Извлекайте только актуальную информацию из текста. "
            "Если вы не знаете значение запрашиваемого атрибута, "
            "верните значение null для атрибута.",
        ),
        ("human", "{text}"),
    ]
)

Нам нужно использовать модель, которая поддерживает вызов функций/инструментов.

from langchain_openai import ChatOpenAI

llm = ChatOpenAI()

runnable = prompt | llm.with_structured_output(schema=Person)

Давайте протестируем

text = "Алан Смит ростом 6 футов и блондин."
runnable.invoke({"text": text})
Person(name='Алан Смит', hair_color='блондин', height_in_meters='1.8288')

Извлечение Генеративное 🤯 LLM - это генеративные модели, поэтому они могут делать некоторые крутые вещи, такие как правильное извлечение роста человека в метрах, даже если он был указан в футах!

Несколько сущностей

В большинстве случаев вам следует извлекать список сущностей, а не отдельную сущность.

Это легко достигается с помощью pydantic путем вложения моделей друг в друга.

from typing import List, Optional

from langchain_core.pydantic_v1 import BaseModel, Field


class Person(BaseModel):
    """Информация о человеке."""


    name: Optional[str] = Field(..., description="Имя человека")
    hair_color: Optional[str] = Field(
        ..., description="Цвет волос человека, если известен"
    )
    height_in_meters: Optional[str] = Field(
        ..., description="Рост измеряется в метрах"
    )


class Data(BaseModel):
    """Извлеченные данные о людях."""

    people: List[Person]

Здесь извлечение может быть не идеальным. Продолжайте изучать, как использовать Примеры ссылок для улучшения качества извлечения, и обратите внимание на раздел руководства!

runnable = prompt | llm.with_structured_output(schema=Data)
text = "Меня зовут Джейф, у меня черные волосы, и я ростом 183 см. У Анны такой же цвет волос, как у меня."
runnable.invoke({"text": text})
Data(people=[Person(name='Джефф', hair_color=None, height_in_meters=None), Person(name='Анна', hair_color=None, height_in_meters=None)])

Когда схема позволяет извлекать несколько сущностей, она также позволяет модели извлекать нулевые сущности, если в тексте нет соответствующей информации, предоставляя пустой список.

Это обычно хорошо! Это позволяет указать обязательные атрибуты сущности, не обязательно заставляя модель обнаруживать эту сущность.