LangChain の OutputParser の使い方
「LangChain」の「OutputParser」を試したのでまとめました。
1. OutputParser
「OutputParser」は、LLMの応答を構造化データとして取得するためのクラスです。「LLM」はテキストを出力します。しかし、多くの場合、テキストを返すだけでなく、構造化データで返してほしい場合があります。そんな場合に「OutputParser」は役立ちます。
「OutputParser」には、実装必須のメソッドが2つあります。
2. Colabでの準備
Google Colabでの準備手順は、次のとおりです。
(1) パッケージのインストール。
# パッケージのインストール
!pip install langchain
!pip install openai
(2) 環境変数の準備。
以下のコードの <OpenAI_APIのトークン> にはOpenAI APIのトークンを指定します。(有料)
import os
os.environ["OPENAI_API_KEY"] = "<OpenAI_APIのトークン>"
3. StructuredOutputParser
「StructuredOutputParser」は、複数の応答を辞書型で取得したい場合に便利です。
(1) StructuredOutputParserの準備。
ResponseSchemaで応答と応答の説明を定義し、ResponseSchemaのリストでStructuredOutputParserを生成します。
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
# OutputParserの準備
response_schemas = [
ResponseSchema(name="answer", description="ユーザーの質問に対する回答"),
ResponseSchema(name="source", description="ユーザーの質問への回答に使用されるソース。Webサイトである必要がある。")
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
(2) フォーマット命令の準備。
output_parser.get_format_instructions()でフォーマット命令を生成できます。
# フォーマット命令の準備
format_instructions = output_parser.get_format_instructions()
print(format_instructions)
The output should be a markdown code snippet formatted in the following schema:
```json
{
"answer": string // ユーザーの質問に対する回答
"source": string // ユーザーの質問への回答に使用されるソース。Webサイトである必要がある。
}
```
(3) PromptTemplateにフォーマット命令を挿入。
「partial_variables」は、PartialPromptTemplateの指定になります。
from langchain.prompts import PromptTemplate
# PromptTemplateの準備
prompt = PromptTemplate(
template="ユーザーの質問にできる限り答えてください。\n{format_instructions}\n{question}",
input_variables=["question"],
partial_variables={"format_instructions": format_instructions}
)
(4) LLM呼び出し。
from langchain.llms import OpenAI
# LLM呼び出し
llm = OpenAI(temperature=0)
_input = prompt.format_prompt(question="日本の首都は?")
output = llm(_input.to_string())
print(output)
```json
{
"answer": "日本の首都は東京です。",
"source": "https://www.jnto.go.jp/eng/location/regional/tokyo/index.html"
}
```
(5) 辞書型にパース。
# 辞書型にパース
response = output_parser.parse(output)
print("type:", type(response))
print("response:", response)
type: <class 'dict'>
response: {'answer': '日本の首都は東京です。', 'source': 'https://www.jnto.go.jp/eng/location/regional/tokyo/index.html'}
4. CommaSeparatedListOutputParser
「CommaSeparatedListOutputParser」は、応答をリスト型で取得したい場合に便利です。
(1) CommaSeparatedListOutputParserの準備。
from langchain.output_parsers import CommaSeparatedListOutputParser
# CommaSeparatedListOutputParserの準備
output_parser = CommaSeparatedListOutputParser()
(2) フォーマット命令の準備。
# フォーマット命令の準備
format_instructions = output_parser.get_format_instructions()
print(format_instructions)
Your response should be a list of comma separated values, eg: `foo, bar, baz`
(3) LLM呼び出し。
from langchain.llms import OpenAI
# LLM呼び出し
llm = OpenAI(temperature=0)
_input = prompt.format(subject="アイスクリームのフレーバー")
output = llm(_input)
print(output)
チョコレート, バニラ, ストロベリー, ピーナッツバター, マンゴー
(4) リスト型にパース。
# リスト型にパース
response = output_parser.parse(output)
print("type:", type(response))
print("response:", response)
type: <class 'list'>
response: ['チョコレート', 'バニラ', 'ストロベリー', 'ピーナッツバター', 'マンゴー']
この記事が気に入ったらサポートをしてみませんか?