見出し画像

LangChain の OutputParser の使い方

「LangChain」の「OutputParser」を試したのでまとめました。

1. OutputParser

「OutputParser」は、LLMの応答を構造化データとして取得するためのクラスです。「LLM」はテキストを出力します。しかし、多くの場合、テキストを返すだけでなく、構造化データで返してほしい場合があります。そんな場合に「OutputParser」は役立ちます。

「OutputParser」には、実装必須のメソッドが2つあります。

・get_format_instructions() -> str : LLM出力のフォーマット方法に関する命令を返す。
・parse(str) -> Any : 文字列 (LLMからの応答を想定) を受け取り、それを構造解析。

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: ['チョコレート', 'バニラ', 'ストロベリー', 'ピーナッツバター', 'マンゴー']




この記事が気に入ったらサポートをしてみませんか?