Langchainで記憶を実装したGoogle検索を使うChatGPTを作る【agentの利用】

FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail

参考:https://langchain.readthedocs.io/en/latest/modules/agents/examples/chat_conversation_agent.html

タイトルが長い。Google 検索と GPT-3.5-turbo を組み合わせる方法は以前、試してみました。Langchain の GPT-3.5-turbo Wrapper が進化したお陰で、日本語での検索でもparse errorなどが出なくなって使いやすくなりました。ただ、このやり方では LLM は GPT-3.5-turbo でしたが、ChatGPTやBingとは異なりユーザーとの会話の記憶を保持していなかったため、文脈に応じた返答などは行ってくれませんでした。

ということで、前回実装したように Memoryを搭載しつつ、Google検索を実行しての回答をさせてみます。

Langchain の agent

Langchain の chain は、主に LLM の処理を繋げるものになっています。LLM の 出力を次の LLM の入力とするのが、最もシンプルなシリアルな Chain とのことです。

一方で、agent は LLM という頭脳の他に色々なtool(Google 検索やembedされたドキュメントの検索)、そして Memory という記憶を持たせられる仮想的な人格と考えるとよさそうです(そのうちちゃんとまとめます)。

これまでは、LLM と単独の機能だったので、agentだったりchainだったり使うモジュールがバラバラでしたが、複数の機能とLLMを組み合わせる場合、適切なagentを使うことになりそうです。

Langchain の conversation agent(チャットモデル用)を使って見る

とりあえず必要なモジュールの読み込み

# Google Search API
from langchain.utilities import GoogleSearchAPIWrapper
# Memory
from langchain.memory import ConversationBufferMemory
# ChatOpenAI GPT 3.5
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.prompts.chat import (
    # メッセージテンプレート
    ChatPromptTemplate,
    # System メッセージテンプレート
    SystemMessagePromptTemplate,
    # assistant メッセージテンプレート
    AIMessagePromptTemplate,
    # user メッセージテンプレート
    HumanMessagePromptTemplate,
)
from langchain.schema import (
    # それぞれ GPT-3.5-turbo API の assistant, user, system role に対応
    AIMessage,
    HumanMessage,
    SystemMessage
)
# agentと agentが使用するtool
from langchain.agents import Tool, initialize_agent

# env に読み込ませるAPIキーの類
import key

# 環境変数にAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = key.OPEN_API_KEY
os.environ["GOOGLE_CSE_ID"] = key.GOOGLE_CSE_ID
os.environ["GOOGLE_API_KEY"] = key.GOOGLE_API_KEY
# LANGCHAIN_HANDLER 設定
os.environ["LANGCHAIN_HANDLER"] = "langchain"

モジュールの読み込みと、環境変数の設定を行います。

大きく分けて、

  • toolの元になる、Google検索エンジン utility
  • memory の元になる、会話のメモリ
  • llm に入れる ChatOpenAI と指示を与えるためのtemplate, schema
  • utility を agentが使用可能なtoolとしてパックするためのTool と、 agentを実体化させるinitialize_agent

というグループでimport しています。

会話型のエージェントの場合は「tool」の部分を変えるだけでGoogle検索だけではない様々なtoolやAPIに対応できると思います。筆者はまだ触っていないですが、Zapierとの連携が強化されたみたいなので、Zapier経由でアクセスできるツールであれば、なんでも LLM と組み合わせられると思います。

また、今は llm に ChatOpenAI を利用していますが、GPT-4 に変えてもいいですし、(Langchainが対応しさえすれば)もっと軽量だったりローカル環境で動作する LLM を利用するように変更することも可能だと思います。

Tool, Memory, LLM の初期化と agent の作成

続いて、agentに搭載する各機能(tool, memory, llm)を作成し、それらを元にagent を作成します。

# agent が使用するGoogleSearchAPIWrapperのツールを作成
search = GoogleSearchAPIWrapper()
tools = [
    Tool(
        name = "Search",
        func=search.run,
        description="useful for when you need to answer questions about current events"
    )
]
# agent が使用する memory の作成
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

# Agent用 prefix, suffix
prefix = """Anser the following questions as best you can, but speaking Japanese. You have access to the following tools:"""
suffix = """Begin! Remember to speak Japanese when giving your final answer. Use lots of "Args"""

# agent の使用する LLM
llm=ChatOpenAI(temperature=0)

# tool, memory, llm を設定して agent を作成
agent_chain = initialize_agent(tools, llm, agent="chat-conversational-react-description", verbose=True, memory=memory, prefix=prefix, suffix=suffix)

基本的に、これまでのコードがほぼそのまま使えます。しかし、agent の作成で使用する関数を initialize_agent に変更し、 agent の種類に、 chat-conversational-react-description を指定しています(単純な検索の例ではZeroShotAgentを利用していた)。

その他、引数にはtoolsやmemory, そして prefix や suffix を代入して必要な機能を実装しています。

対話用のループ

# 会話ループ
user = ""
while user != "exit":
    user = input("何か質問してください。")
    print(user)
    # 入力はagent経由
    ai = agent_chain.run(input=user)
    print(ai)

ロジックは変わりませんが、ここでも使用するメソッドが変わることに注意します。

実行結果

何か質問してください。中小企業診断士について
中小企業診断士について

> Entering new AgentExecutor chain…
{
“action”: “Search”,
“action_input”: “中小企業診断士とは何か”
}
Observation: ここではまず中小企業診断士とはどんな資格・仕事で、どんな人に役立つ資格なのか、 … 中小企業診断士の資格自体が、何か就職等において「直接的に有利に働く」 … 中小企業診断士は、中小企業の経営課題に対応するための診断・助言を行う専門家です。法律上の国家資格として、「中小企業支援法」第11条に基づき、経済産業大臣が登録 … 中小企業診断士とは、 中小企業をターゲットとして経営課題に関する診断や助
言を行う専門家のことです。 全国には数多くの中小企業が存在していて、それぞれの中小企業が … 中小企業診断士は、国から認められた経営コンサルタントです。コンサルタントとは、あるモノゴトに関する相談相手と なり、アドバイスや提案を行うことで、報酬をもらう職業 … 独立型の場合、何か得意分野があると仕事を得やすいという独立系診断士もいます。独立する際、最初は自宅を事務所にしてはじめることができます。そうすることで事務所を … Oct 24, 2020 … 何か資格を取得しようと考える時には、取得するまでの難易度もそうですが、その資格の需要や将来性についても考慮する材料に含まれることと思います。 ビジネスパーソンが新たに取得したい資格 第1位*」それが、中小企業診断士です。 なぜなら、中小企業診断士の学習をすることによって、企業の経営に関わる知識を横断 … Dec 14, 2017 … そこで国が定める経営コンサルタントとしての、中小企業診断士の資格を取ろうと考えました。 難易度は高いですが、すんなりと取れたんですか。 土屋:それ … Dec 6, 2016 … 協会では、都道府県協会の中小企業診断士を対象に中小企業の経営者と会員診 … 小職の要 請に従っていただくという条件でお受けし、その後は何か … 中小企業診断士とは、経営コンサルタントとしての唯一の国家資格です。 企業をさまざまな角度から診断し、適切なアドバイスができる人を認定する資格で、 最近では、日本版 …
Thought:{
“action”: “Final Answer”,
“action_input”: “中小企業診断士とは、中小企業の経営課題に対応するための診断・助言を行う専門家であり、国家資格です。中小企業支援法第11条に基づき、経済産業大臣が登録します。”
}

> Finished chain.
中小企業診断士とは、中小企業の経営課題に対応するための診断・助言を行う専門家であり、国家資格です。中小企業支援法第11条に基づき、経済産業大臣が登録します。
何か質問してください。資格取得のメリットは?
資格取得のメリットは?

> Entering new AgentExecutor chain…
{
“action”: “Final Answer”,
“action_input”: “中小企業診断士の資格を取得することで、中小企業の経営課題に対応するための専門的な知識やスキルを身につけることができます。また、中小企業診断士としての信頼性が高まり、顧客獲得や業務拡大につながる可能性があります。”
}

> Finished chain.
中小企業診断士の資格を取得することで、中小企業の経営課題に対応するための専門的な知識やスキルを身につけることができます。また、中小企業診断士としての信頼性が高まり、顧客獲得や業務拡大につながる可能性が あります。
何か質問してください。どのような顧客が獲得できますか?
どのような顧客が獲得できますか?

> Entering new AgentExecutor chain…
{
“action”: “Search”,
“action_input”: “中小企業診断士の資格を持つことで、中小企業の経営課題に対応するための専門的な知識やスキルを身につけることができ、中小企業の顧客獲得につながる可能性があるとされています。”
}
Observation: Jun 15, 2022 … マネージャーとは、マネジメントを実行する人のこと。 … 中小企業診断士は、中小企業の経営課題に対応するための診断、助言を行う専門家で、中小 … Feb 28, 2023 … 資格取得を目指すことで知識を得られるだけでなく、経営者としての信用度 … 対して、会社経営における課題解決には、MBA や中小企業診断士が役立つ … 中小企業診断士は、中小企業の経営課題に対応するための診断・助言を行う 専門家です。 … 実践的な法律知識を体系的・効率的に学ぶことで、現代のビジネス・パーソン … Nov 3, 2022 … 企業の成長や経営課題の解決のために、財務的な手法を用いた解決策を提案する。 必要な知識・スキルを身につける. コンサルティングファームでは「即戦力 … Sep 14, 2022 … 麗澤大学経済学部経営学科 近藤明人教授 監修】経営学とは経営者になるためだけの学問だと思っていませんか? 今回は経営学についてどんなことを学ぶ … Jul 13, 2022 … 経営企画部は企業の経営を担う人気の職種ですが、広範囲かつ専門的なスキル … 中小企業診断士は、経営状況の把握や経営課題を解決するための助言を … Feb 27, 2023 … 中小企業診断士は、財務や税務のみならず、マーケティングや人事等に至るまで知識を持つ経営のスペシャリストであり、経営者が取得していれば、自ら適切な … Feb 24, 2023 … ・中小企業診断士主な業務は中小企業の経営に 対する課題提起や診断、助言を行うなど経営コンサルタントとして活躍します。国家資格のため、資格を持つこと … Jul 25, 2022 … マネジメントの資格には企業の経営課題解決に関するものや、部下との人間 … 診断士 は、中小企業の経営課題に対応するための診断や助言を行う専門家 … 営業スキル以外に法律やマーケティング、経営などの知識の幅を広げていくことが … 中小企業診断士とは、中小企業の経営課題に対応するための診断・助言を行う専門家 …
Thought:{
“action”: “Final Answer”,
“action_input”: “中小企業診断士の資格を持つことで、中小企業の経営課題に対応するための専門的な知識やスキルを身につけることができ、中小企業の顧客獲得につながる可能性があるとされています。”
}

> Finished chain.
中小企業診断士の資格を持つことで、中小企業の経営課題に対応するための専門的な知識やスキルを身につけることができ、中小企業の顧客獲得につながる可能性があるとされています。

Google 検索を組み合わせた場合でも、前回 predict メソッドを用いたときと同様に、Memory に会話の内容が記録され、文脈に則った回答(中小企業診断士の資格、と言っていないのにきちんと文脈から判断して、他の資格ではないと判断している)をしていることが分かります。

また、LangchainのAgentが優秀なのは、検索の必要がないと判断した場合(ユーザーからの質問が「資格取得のメリットは?」のとき)、Search アクションが行われずに、Final Answerが出力されていることが分かります。適切なツールを使用するという、Langchainの説明通りになっています。

まとめ

  • Langchainで LLM と他のAPIやツールを組み合わせるときはagentを使う
  • Memory はagentがなくても使えるが、他ツールと組み合わせるときはagentを使う
  • ツールや目的にあわせて、適切なagentを選択する
  • どういう仕組みかは分からないけど、agentは賢い
FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

最新の記事