クイックスタート

このクイックスタートでは、機能/ツールの呼び出しが可能なチャットモデルを使用して、テキストから情報を抽出します。

機能/ツールの呼び出しを使用した抽出は、機能/ツールの呼び出しをサポートするモデルでのみ機能します。

セットアップ

機能/ツールの呼び出しが可能なLLM(Language Model)で利用可能な構造化された出力方法を使用します。

モデルを選択し、それに必要な依存関係をインストールし、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="メートル単位で測定された身長"
    )

スキーマを定義する際の2つのベストプラクティス:

  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 = "Alan Smithは身長6フィートで、髪はブロンドです。"
runnable.invoke({"text": text})
Person(name='Alan Smith', hair_color='blond', height_in_meters='1.8288')

抽出は生成的です 🤯 LLMは生成モデルなので、提供された身長がフィートであっても、正しくメートル単位での高さを抽出するなど、かなりクールなことができます!

複数のエンティティ

ほとんどの場合、1つのエンティティではなくエンティティのリストを抽出する必要があります。

これは、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 = "私はジェフと申します。髪の色は黒で、身長は6フィートです。アンナも私と同じ髪の色です。"
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)])

スキーマが複数のエンティティの抽出を許可する場合、関連する情報がテキストにない場合は空のリストを提供することで、モデルがエンティティを検出することを強制することなく、エンティティの必須の属性を指定できるようになります。

これは通常、良いことです!モデルにこのエンティティを検出させることなく、エンティティの必須属性を指定できるようになります。