Open10

LangChainで安定的に俳句を作ろうとしたがうまくいかなかった

kurehajimekurehajime

概要

  • OpenAIのAPIを使っても安定して俳句が作れない
    • 5・7・5のフォーマットに沿ってくれない
    • たまに英語で回答してくる
  • LangChainのToolとして俳句Validatorを作ってAIに利用して貰えば、正しい俳句になるまで試行錯誤してくれるのでは?
kurehajimekurehajime

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: 
""")

中身を詳しく見ていくと

kurehajimekurehajime

ちゃんと俳句になってるかチェックする関数を用意する。
とりあえずYESを返すモック。

def haiku_validator(message):
  # 俳句なら'YES'を返し、俳句でなければ'NO'を返す
  return 'YES'
kurehajimekurehajime

ツールを登録する。

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はこの説明文を参考にしてツールを利用するかどうかを判断し、この説明文をもとに引数を与え、戻り値を利用するから。

kurehajimekurehajime

しかし全然うまくいかない

課題が難しすぎるのでまずはいったん俳句の定義を

  • 半角スペースで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回くらいの確率でしか成功しない。

kurehajimekurehajime

うまくいくパターン

うまくいく場合は以下のように試行錯誤してくれる。

> 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: 猫が跳ねる 岸辺の青い 水の音.
kurehajimekurehajime

うまくいかないパターン① 俳句を表示してくれない

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.
kurehajimekurehajime

うまくいかないパターン② 実在しないツールを使おうとする

実在しないツールをひたすら使おうとしてイテレーションの試行回数オーバーになるパターン。

> 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.
kurehajimekurehajime

うまくいかないパターン③ 急に英語を喋りだす

英語を喋りだして話が通じなくなるパターンもある。
下の例は②と③が併発している。

> 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.
kurehajimekurehajime

まとめ

  • LangChainを使えば、AIに自作のツールを使わせることができる。
  • しかし意図したとおりに使ってくれるとは限らず、説明文やプロンプトでの工夫が必要。

LangChainには「ツールを有効活用しろ」と指示する裏プロンプトがあるのかもしれない。
そのせいか何でもツールで解決しようとする悪いクセが出る。