LangChain で function calling で特定構造のデータを取り出す
以外とあんまり書かれてなくない?というわけで調べて使ってみる。
んー、OutputParser のドキュメントを見るのが手っ取り早いのか
生成AIの出力をXXXで受け取りたい、はOutputParserが一番目的に一致しているな
code: python
# まずベタに langchain openai model を使う場合
from typing import Optional
from langchain_openai import ChatOpenAI
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.prompts import ChatPromptTemplate
from langchain.output_parsers.openai_functions import (
PydanticOutputFunctionsParser,
JsonOutputFunctionsParser,
)
from langchain_core.utils.function_calling import (
convert_to_openai_function,
)
class Dog(BaseModel):
"""犬の識別情報"""
name: str = Field(..., description="犬の名前")
color: str = Field(..., description="犬の色")
fav_food: Optionalstr = Field(None, description="犬の好きな食べ物") class Person(BaseModel):
"""人の識別情報"""
name: str = Field(..., description="人の名前")
age: int = Field(..., description="人の年齢")
dogs: listDog = Field(..., description="飼っている犬たち") prompt = ChatPromptTemplate.from_template(
"""
あなたは構造化データを取り出す世界最高のアルゴリズムです。
与えられたフォーマットを使って、以下の入力から情報を抽出しなさい。
## 入力
{input}
## Tip
必ず正確な情報を抽出しなさい。
""".strip()
)
model = ChatOpenAI(temperature=0, model="gpt-3.5-turbo-1106")
model = model.bind_functions(functions)
chain = prompt | model | JsonOutputFunctionsParser(args_only=len(functions) <= 1)
chain.invoke({"input": "犬の名前はポチ、色は黒、好きな食べ物は猪の肉。よく散歩をしました。"})
chain.invoke(
{
"input": "彼は太郎、42歳です。彼が飼っている犬の名前はポチ、色は黒、好きな食べ物は猪の肉。もう一匹はハチ、色は白、好きな食べ物は鹿の肉。よく散歩をしました。"
}
)
chain.invoke({"input": "彼は太郎、四十二歳です。"})
# 用意されている chain を使う
# pydantic の型を自動で選んでくれるので楽
from langchain.chains.openai_functions import (
create_structured_output_runnable,
create_openai_fn_runnable,
)
chain = create_openai_fn_runnable(functions, model, prompt)
chain.invoke({"input": "犬の名前はポチ、色は黒、好きな食べ物は猪の肉。よく散歩をしました。"})
chain.invoke(
{
"input": "彼は太郎、42歳です。彼が飼っている犬の名前はポチ、色は黒、好きな食べ物は猪の肉。もう一匹はハチ、色は白、好きな食べ物は鹿の肉。よく散歩をしました。"
}
)
chain.invoke({"input": "彼は太郎、四十二歳です。"})