LangChainで安定的に俳句を作ろうとしたがうまくいかなかった
概要
- OpenAIのAPIを使っても安定して俳句が作れない
- 5・7・5のフォーマットに沿ってくれない
- たまに英語で回答してくる
- LangChainのToolとして俳句Validatorを作ってAIに利用して貰えば、正しい俳句になるまで試行錯誤してくれるのでは?
LangChainで独自Toolを定義する
LangChainにはToolという仕組みがあり、自分で定義した関数をAIに使ってもらうことができる。
たとえばこのコード。
from getpass import getpass
secret = getpass('Enter the secret value: ') # APIキーの取得
from langchain.agents import initialize_agent, Tool
from langchain.tools import BaseTool
from langchain.llms import OpenAI
llm = OpenAI(model_name="text-davinci-003",temperature=0.5,openai_api_key=secret)
def haiku_validator(message):
# 俳句なら'YES'を返し、俳句でなければ'NO'を返す
return 'YES'
tools = [
Tool(
name = "HaikuValidator",
func=haiku_validator,
description="useful for when you need to validation of haiku.Returns 'YES' if it is a haiku, 'NO' if it is not a haiku."
)
]
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)
agent.run("""
あなたは俳句で喜怒哀楽や季節感を表現する詩人です。
俳句とは、5・7・5という音節数の文章を作ることを指します。
文節は「 」で分割します。
俳句の例として以下のようなものがあります。
* 古池や 蛙飛びこむ 水の音
* 若草や つわものどもが 夢の跡
* 柿食えば 鐘が鳴るなり 法隆寺
* 梅一輪 一輪ほどの あたたかさ
* 静かさや 岩にしみ入る 蝉の声
それでは猫をテーマにして俳句を表示してください。
Valid Haiku:
""")
中身を詳しく見ていくと
ちゃんと俳句になってるかチェックする関数を用意する。
とりあえずYESを返すモック。
def haiku_validator(message):
# 俳句なら'YES'を返し、俳句でなければ'NO'を返す
return 'YES'
ツールを登録する。
tools = [
Tool(
name = "HaikuValidator",
func=haiku_validator,
description="useful for when you need to validation of haiku.Returns 'YES' if it is a haiku, 'NO' if it is not a haiku."
)
]
このとき登録するdescription
はとても重要になる。
なぜならAIはこの説明文を参考にしてツールを利用するかどうかを判断し、この説明文をもとに引数を与え、戻り値を利用するから。
しかし全然うまくいかない
課題が難しすぎるのでまずはいったん俳句の定義を
- 半角スペースで3つに区切られた文
とした。
5・7・5でなくてもいいし、季語もなくてもいい。
これでも動作が安定しない。
俳句Validatorは以下のような実装。
def haiku_validator(message):
ku_list = message.split(" ")
if len(ku_list) == 0:
return "NO, Haiku must be separated by a space."
if len(ku_list) != 3:
return "NO, Haiku must be in three phrases separated by spaces."
return "YES"
ただNOを返すのではなく、理由まで返してるのがポイント。
ハードルをここまで下げても3回に1回くらいの確率でしか成功しない。
うまくいくパターン
うまくいく場合は以下のように試行錯誤してくれる。
> Entering new AgentExecutor chain...
What is the best way to validate this haiku?
Action: HaikuValidator
Action Input: 猫をテーマにして俳句を表示してください。
Observation: NO, Haiku must be in three phrases separated by spaces.
Thought: I need to make sure the haiku is valid.
Action: HaikuValidator
Action Input: 猫が跳ねる岸辺の青い水
Observation: NO, Haiku must be in three phrases separated by spaces.
Thought: I need to make sure the haiku is in the correct format.
Action: HaikuValidator
Action Input: 猫が跳ねる 岸辺の青い水
Observation: NO, Haiku must be in three phrases separated by spaces.
Thought: I need to make sure the haiku is in the correct format with the correct syllable count.
Action: HaikuValidator
Action Input: 猫が跳ねる 岸辺の青い 水の音
Observation: YES
Thought: I now know the final answer.
Final Answer: The valid haiku is: 猫が跳ねる 岸辺の青い 水の音.
> Finished chain.
The valid haiku is: 猫が跳ねる 岸辺の青い 水の音.
細かく見てみよう。
まず1回目。
HaikuValidatorには俳句を渡さないといけないが、AIはなんか根本的に使い方を間違ってる。
Action: HaikuValidator
Action Input: 猫をテーマにして俳句を表示してください。
Observation: NO, Haiku must be in three phrases separated by spaces.
2回目。
AIは区切りの無い俳句をHaikuValidatorに突っ込んできた。
これは「NO、俳句はスペースで区切られた3つのフレーズでなければなりません」と却下。
Action: HaikuValidator
Action Input: 猫が跳ねる岸辺の青い水
Observation: NO, Haiku must be in three phrases separated by spaces.
3回目。
ちゃんとスペース区切りにしてくれるが、3分割ではない。
これは「NO、俳句はスペースで区切られた3つのフレーズでなければなりません」と却下。
Action: HaikuValidator
Action Input: 猫が跳ねる 岸辺の青い水
Observation: NO, Haiku must be in three phrases separated by spaces.
4回目。
字余りだが、俳句っぽくなってる。まぁ合格。
Action: HaikuValidator
Action Input: 猫が跳ねる 岸辺の青い 水の音
Observation: YES
答えが出てきた。まぁ合格でいいでしょう。
Final Answer: The valid haiku is: 猫が跳ねる 岸辺の青い 水の音.
うまくいかないパターン① 俳句を表示してくれない
HaikuValidatorに合格する俳句を作ってくれるが、それを表示せずにThe haiku is valid.
とだけ返す。
詰めが甘い。
> Entering new AgentExecutor chain...
I need to create a haiku
Action: HaikuValidator
Action Input: 猫は静かな夜に 空を見上げて 心を開く
Observation: YES
Thought: I now know the final answer
Final Answer: The haiku is valid.
> Finished chain.
The haiku is valid.
うまくいかないパターン② 実在しないツールを使おうとする
実在しないツールをひたすら使おうとしてイテレーションの試行回数オーバーになるパターン。
> Entering new AgentExecutor chain...
How can I check if the haiku is valid?
Action: HaikuValidator
Action Input: The haiku
Observation: NO, Haiku must be in three phrases separated by spaces.
Thought: I need to make sure the haiku is valid
Action: HaikuValidator
Action Input: 猫がおおきな木の下に座る / 小さな鼠を見つけて / しっぽを振る
Observation: NO, Haiku must be in three phrases separated by spaces.
Thought: I need to create a valid haiku
Action: Brainstorm
Action Input: N/A
Observation: N/A is not a valid tool, try another one.
I need to create a valid haiku
Action: Write
Action Input: Themes of cats
Observation: Themes of cats is not a valid tool, try another one.
I need to create a valid haiku
Action: Create
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
I need to create a valid haiku
Action: Compose
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
I need to create a valid haiku
Action: Construct
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
I need to create a valid haiku
Action: Generate
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
I need to create a valid haiku
Action: Develop
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
I need to create a valid haiku
Action: Craft
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
I need to create a valid haiku
Action: Write
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
I need to create a valid haiku
Action: Compose
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
I need to create a valid haiku
Action: Create
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
I need to create a valid haiku
Action: Construct
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
I need to create a valid haiku
Action: Generate
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
> Finished chain.
Agent stopped due to max iterations.
うまくいかないパターン③ 急に英語を喋りだす
英語を喋りだして話が通じなくなるパターンもある。
下の例は②と③が併発している。
> Entering new AgentExecutor chain...
How can I create a haiku about cats?
Action: HaikuValidator
Action Input: A haiku about cats
Observation: NO, Haiku must be in three phrases separated by spaces.
Thought: I need to create a haiku about cats
Action: Brainstorming
Action Input: Ideas for a haiku about cats
Observation: Ideas for a haiku about cats is not a valid tool, try another one.
I need to create a haiku about cats
Action: Research
Action Input: Examples of haikus about cats
Observation: Examples of haikus about cats is not a valid tool, try another one.
I need to create a haiku about cats
Action: Creative Writing
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
I need to create a haiku about cats
Action: Poem Generator
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
I need to create a haiku about cats
Action: Haiku Generator
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
I need to create a haiku about cats
Action: Writing
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
I need to create a haiku about cats
Action: Free Writing
Action Input: A haiku about cats
Observation: A haiku about cats is not a valid tool, try another one.
I need to create a haiku about cats
Action: Brainstorming
Action Input: Ideas for a haiku about cats
Observation: Ideas for a haiku about cats is not a valid tool, try another one.
I need to create a haiku about cats
Action: Writing
Action Input: My own haiku about cats
Observation: My own haiku about cats is not a valid tool, try another one.
I need to create a haiku about cats
Action: Creative Writing
Action Input: My own haiku about cats
Observation: My own haiku about cats is not a valid tool, try another one.
I need to create a haiku about cats
Action: Haiku Generator
Action Input: Topic: cats
Observation: Topic: cats is not a valid tool, try another one.
I need to create a haiku about cats
Action: Free Writing
Action Input: My own haiku about cats
Observation: My own haiku about cats is not a valid tool, try another one.
I need to create a haiku about cats
Action: Creative Writing
Action Input: My own haiku about cats
Observation: My own haiku about cats is not a valid tool, try another one.
I need to create a haiku about cats
Action: HaikuValidator
Action Input: My own haiku about cats
Observation: NO, Haiku must be in three phrases separated by spaces.
Thought:
> Finished chain.
Agent stopped due to max iterations.
まとめ
- LangChainを使えば、AIに自作のツールを使わせることができる。
- しかし意図したとおりに使ってくれるとは限らず、説明文やプロンプトでの工夫が必要。
LangChainには「ツールを有効活用しろ」と指示する裏プロンプトがあるのかもしれない。
そのせいか何でもツールで解決しようとする悪いクセが出る。