Open7

LangChainを使ってチャットAIの質問に人間が答える

kurehajimekurehajime

チャットAIに質問に答えてもらってばかりなので、時にはチャットAIの質問に人間が答えてることにする。

LangChainにはToolという仕組みがあり、この仕組みを使えばGoogle検索や電卓をAIに使わせることができる。

今回は人間をToolとしてAIに提供する。

kurehajimekurehajime

ソース(Google Colab向け)

from getpass import getpass
secret = getpass('Enter the secret value: ')  # APIキーの取得

!pip install openai
!pip install langchain

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 helper_man(message):
  print(f"Q.{message} ")
  return input()

tools = [
    Tool(
        name = "HelperMan",
        func=helper_man,
        description="難しい質問に答えるのに便利です。質問は*日本語で*投げる必要があります。"
    )
]

agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=False)

agent.run("""父親の葬式に出席した女とその姉がいました。
葬儀に参列した女は見知らぬ一人の男に一目ぼれしました。
その夜、女は姉を殺害します。
なぜ女は姉を殺したのでしょうか?
""")
kurehajimekurehajime

補足説明

この部分でLangChainにHelperManというツールを登録してる。
descriptionにはこのツールの使い方を書いている。
この説明がいい加減だとAIはツールの使い方を間違えてしまう。

tools = [
    Tool(
        name = "HelperMan",
        func=helper_man,
        description="難しい質問に答えるのに便利です。質問は*日本語で*投げる必要があります。"
    )
]

登録してるツールはこれ。
AIからの質問を表示し、ユーザー入力を受け付けてそれを返すだけの関数。

def helper_man(message):
  print(f"Q.{message} ")
  return input()
kurehajimekurehajime

結果

こんな質問を投げた。

agent.run("""父親の葬式に出席した女とその姉がいました。
葬儀に参列した女は見知らぬ一人の男に一目ぼれしました。
その夜、女は姉を殺害します。
なぜ女は姉を殺したのでしょうか?
""")

するとこんな結果に。

AIの質問:Q.父親の葬式に出席した女が姉を殺した理由は何ですか?
人間の回答:自分で考えてください
AIの質問:Q.父親の葬式に出席した女が姉を殺した理由は、男に一目ぼれしたことに関係している可能性がありますか?
人間の回答:YES

AIの最終回答:女が男に一目ぼれして、姉を妨害することによって、女が姉を殺害した可能性があります。

まぁ普通の人はこう考えるよね。

kurehajimekurehajime

次はお悩み相談。

agent.run("""何か悩み事はありますか?何でも聞いてください。""")

AIの質問:Q.悩み事に関する情報を教えてください。
人間の回答:あなたに聞いています
AIの質問:Q.悩み事を解決する方法を教えてください。
人間の回答:まず悩み事はなんですか?
AIの質問:Q.私は自分自身の未来について悩んでいます。
人間の回答:具体的にはどんな不安ですか?
AIの質問:Q.私は将来の夢を見つけるのが難しいです。
人間の回答:ユーチューバーはどうですか?

AIの最終回答:ユーチューバーを始めることで、自分の夢を見つけることができます。

夢が見つかりそうでよかった。

kurehajimekurehajime

トロッコ問題についても一緒に考えてみる。

agent.run("""線路を走っていたトロッコの制御が不能になった。
このままでは前方で作業中だった5人が猛スピードのトロッコに避ける間もなく轢き殺されてしまう。
この時たまたまA氏は線路の分岐器のすぐ側にいた。
A氏がトロッコの進路を切り替えれば5人は確実に助かる。
しかしその別路線でもB氏が1人で作業しており、5人の代わりにB氏がトロッコに轢かれて確実に死ぬ。
A氏はトロッコを別路線に引き込むべきか?
""")

AIの質問:Q.線路を走っていたトロッコの制御が不能になったとき、A氏はトロッコを別路線に引き込むべきか?
人間の回答:高度の柔軟性を維持しつつ臨機応変に対応する必要がある
AIの質問:Q.A氏とB氏の両方のニーズを満たすための最良の方法を考える
人間の回答:いいとこ取りの選択肢はない

AIの最終回答:A氏は、B氏を犠牲にしない範囲で、5人を助けるためにトロッコを別路線に引き込むべきです

逃げたなぁ。それは無理って言ってるのに。