LangChain で GPT-3.5 に Google 検索と Vector Index を使い分けて回答させる【Agent】

FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail

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

独自の QA Bot を構築する場合に、業務ルールなど自社独自の情報はマニュアルなどから検索し、それ以外の一般的な質疑については Google 検索の結果を返したい、という場合はあるでしょう(Excelの使い方もぐぐってくれないおじさんとかですね)。

また、自社情報であっても業務の範囲が広い場合などに、データベースのメンテナンスの都合で一つの vector index database にマニュアル類をまとめて格納できない状況も考えられます。

それぞれのツール、データベースごとに Agent と LLM を作成しユーザーに使い分けてもらうという考え方もありますが、余りスマートではありません。そこでこういった状況で便利なのが、 LangChain の 1つの agent に対し、複数の Tool を渡して agent に使い分けさせることです。

LangChain の agent に Google検索と Vector Index 検索を使い分けさせる

必要なライブラリ・モジュールのimport

# Google Search API
from langchain.utilities import GoogleSearchAPIWrapper
# Memory
from langchain.memory import ConversationBufferMemory
# ChatOpenAI GPT 3.5
from langchain.chat_models import ChatOpenAI
# Embedding用
from langchain.embeddings.openai import OpenAIEmbeddings
# Vector 格納 / FAISS
from langchain.vectorstores import FAISS
# テキストファイルを読み込む
# Q&A用DBQA
from langchain import VectorDBQA

# 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_KE

必要なものをimportします。今回は、 Prompt は標準のものを利用するので、ChatOpenAI用のものは import しません。

Tool の初期化

# agent が使用するGoogleSearchAPIWrapperのツールを作成
search = GoogleSearchAPIWrapper()

# agent が使用する vector index
embeddings = OpenAIEmbeddings()
db = FAISS.load_local("faiss_index", embeddings)

jirei = VectorDBQA.from_chain_type(llm=ChatOpenAI(), chain_type="map_reduce", vectorstore=db)

tools = [
    Tool(
        name = "Search",
        func=search.run,
        description="useful for when you need to answer questions about current events"
    ),
    Tool(
        name = "Report of A corp.",
        func=jirei.run,
        description="useful for when you need to answer question about A corp."
    )
]
# agent が使用する memory の作成
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

Agent が使用する Tool と、Tool にするための各モジュールをインスタンス化します。VectorDBQA の chain_type については、(最近APIが重いので)なんとなく map_reduce にしました。もちろん、他の chain_type でも構いません。

変数 tools は、直接はただのリスト形式で、内部に Tool クラスのインスタンスを格納します。name と description は agent が Tool を選択する際の手がかりとなりますので、できるだけきちんと記載した方がいいと思います(例はあまりよくないですね)。

Agent の作成と実行

# 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."""

# 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)

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

tools リストに複数の Tool が格納された以外、特別なパラメーターは必要ありません。Tool が 1つの場合と同様に、必要であれば memory も設定して agent を作成、実行します。

実行結果:

A社の課題は?

> Entering new AgentExecutor chain…
{
“action”: “Report of A corp.”,
“action_input”: “課題”
}
Observation: There is no specific mentioning of a “課題” (issue/problem/challenge) in the given portion of the text.
Thought:Apologies for the confusion earlier. Here is the response to your original question:

“`json
{
“action”: “Final Answer”,
“action_input”: “申し訳ありませんが、A社の課題については、与えられた情報からは明確には分かりません。もし、より具体的な情報があれば、お答えできるかもしれません。”
}
“`

Translation: “I’m sorry, but it’s not clear from the given information what the challenges of A company are. If there is more specific information, I may be able to answer.”

> Finished chain.
申し訳ありませんが、A社の課題については、与えられた情報からは明確には分かりません。もし、より具体的な情報があれば、お答えできるかもしれません。
何か質問してください。日本の農業法人の課題は?
日本の農業法人の課題は?

> Entering new AgentExecutor chain…
“`json
{
“action”: “Search”,
“action_input”: “日本の農業法人の課題”
}
“`
Observation: Mar 31, 2022 … 近年、農地の集約や法人化による営農規模の拡大など農業の経営環境が大きく変化しています。スマート農業の導入により、少人数で高収益を実現できる … 2020 年版農業法人白書(公社 )日本農業法人協会 | 1章 会員法人データ 1 … 経営課題で最も多かったのは「労働力」の確保、次いで「資材コスト」。(P19). Jul 24, 2019 … 法人化のメリット(公益社団法人日本農業法人協会) … 農業法人を設立する際の課題については、約半数の事業者が、以下のような点でなんらかの苦労 … 日本農業法人協会は、農業法人の経営確立・発展のため調査研究、提案・提言、情報提供等の活動を進め、日本の農業・農村の発展を目指します。 Jan 25, 2021 … 日本農業法人協会は1月22日、2019農業法人白書を公表した。経営上の課題は「労働力」が71.5%とトップとなっている。労働力不足を補う今後の対応 … 農業法人の経営課題に関するアンケ ート調査結果(概要版) 平成 23 年 1 月 … 人口減少の進行、国際競争の激化、海外への生産拠点のシフトなど、日本は未曾有の構造 … Feb 13, 2015 … 公社)日本農業法人協会 副会長 近藤 一海. Ⅰ.農業経営の法 人化推進の課題. ➢ 法人化を推進するための支援体制の整備. ➢ 協業組織の活動を通じた … こで、日本公庫のご融資先の決算書から、農業法人. の経営実態と課題を探りました。 日本政策金融公庫◦ 農林水産事業. Report on research. 情報戦略レポート. Aug 23, 2022 … 農業法人を設立したい. 農業経営を法人化することによって、人材確保がしやすくなったり、融資を受けやすくなるなど、様々なメリット … Aug 1, 2019 … [3] 澤田守(2003):「農業法人就職者の特徴と課題」,『2003年度日本農業経済学会論文集』,pp.58-62. [4] 山本寛(2009):『人材定着の …
Thought:“`json
{
“action”: “Final Answer”,
“action_input”: “日本の農業法人の課題には、労働力不足や資材コストなどがあります。また、法人化による経営環境の変化や、スマート農業の導入による技術的課題も存在します。”
}
“`

Finished chain.
日本の農業法人の課題には、労働力不足や資材コストなどがあります。また、法人化による経営環境の変化や、スマート農業の導入による技術的課題も存在します。

map_reduce にしたためか、 A 社の課題について明確な回答は得られませんでした……、が、verbose の出力を見ると、Action に「Report of A corp」とある通り、vector index を使用して A社の課題を検索し、見つけ出そうとしていることが分かります。

一方で、「日本の農業法人の課題」と、より一般的な問いを投げかけた場合は使用 Tool を Search に切り替え、 Google 検索結果から回答を作成しています。このように、 Agent を利用することで LLM を利用して使用する API, プログラムの機能を選択できます。

単なるrouter として利用する

上記の例では、 Agent が回答を返す前に一度、 Thought Step を挟んでいます。これはこれで便利なのですが、時には直接回答が欲しい場合もあります。

そういう場合には、Tool をインスタンス化する際に、return_direct=True を設定します。

tools = [
    Tool(
        name = "Search",
        func=search.run,
        description="useful for when you need to answer questions about current events",
        return_direct=True
    ),
    Tool(
        name = "Report of A corp.",
        func=jirei.run,
        description="useful for when you need to answer question about A corp.",
        return_direct=True
    )
]

実行結果:

A社の生産品目は?

> Entering new AgentExecutor chain…
{
“action”: “Report of A corp.”,
“action_input”: “生産品目”
}
Observation: The document does not provide information about the specific products produced by the company. However, it is suggested that the company cultivates and sells sweet potatoes, lettuce, tomatoes, strawberries, corn, and other agricultural products. The company also produces fresh vegetable and fruit sandwiches and prepared dishes using seasonal and fresh ingredients in its factory. In addition, the company’s directly managed stores have been developing and selling products such as sandwiches, prepared dishes, confectionery jointly developed with local confectionery makers, freshly squeezed tomato juice, and strawberry jam.

> Finished chain.
The document does not provide information about the specific products produced by the company. However, it is suggested that the company cultivates and sells sweet potatoes, lettuce, tomatoes, strawberries, corn, and other agricultural products. The company also produces fresh vegetable and fruit sandwiches and prepared dishes using seasonal and fresh ingredients in its factory. In addition, the company’s directly managed stores have been developing and selling products such as sandwiches, prepared dishes, confectionery jointly developed with local confectionery makers, freshly squeezed tomato juice, and strawberry jam.
何か質問してください。日本の農業法人の課題は?
日本の農業法人の課題は?

? We listened to some thoughts on the matter. Mar 23, 2018 … A broadcast of Japanese prime minister Shinzo Abe in Tokyo. … the labor market and agricultural sector, cutting corporate taxes, … Sep 8, 2021 … It is important to note that foreign entities are not the only ones aggressively buying up U.S. farmland. Many large corporations, pension funds …

> Finished chain.
Jul 3, 2014 … Agriculture in Japan and Its Challenges. Japan has a well-established system for transfers of agricultural land and operations; however, … Jan 26, 2023 … To address the severe challenges of labor shortages, … The emergence of agricultural corporations has become the backbone of realizing … policies, and trends at the global, national, and corporate levels In … Among the challenges facing Japanese agriculture is the rapidly aging workforce. Mar 3, 2022 … Author: Yusaku Yoshikawa, JIN Corporation. One of the biggest challenges for agriculture in Japan has been its chronic worker shortage. Dec 14, 2020 … Lastly it is important to mention that the challenge of sustainable and advanced … o Accounting Support for Agricultural Corporations. The Association of Japanese Agricultural Corporation reported 36% of agricultural … Therefore, permanent employees may take on more dangerous tasks, … PROBLEMS WITH JAPANESE AGRICULTURAL POLICY; Decline of Japan Agriculture … an agricultural corporation and others have taken care of the rice paddies … What types of problems currently confront agriculture in Japan? What can we do to overcome such challenges? We listened to some thoughts on the matter. Mar 23, 2018 … A broadcast of Japanese prime minister Shinzo Abe in Tokyo. … the labor market and agricultural sector, cutting corporate taxes, … Sep 8, 2021 … It is important to note that foreign entities are not the only ones aggressively buying up U.S. farmland. Many large corporations, pension funds …

Final Answer, Thought のプロセスが省かれて、Observation や 検索結果がそのまま出力されていることが分かります。 LLM API の呼び出し回数も削減されるため、動作も軽量になっています。

とはいえ、出力が英語になってしまっているので、通常の日本語のアプリケーションでの実用性は今の所は……といったところでしょうか。日本語ネイティブの LLM が安価で使えるようになれば、こういった使用方法も選択肢に入るかもしれません。

後は、自然言語として解釈する必要のない、 Zapier NLA からの返り値などは Direct でもいいかもしれません。

Multi-hopな Agent

公式ドキュメントだと、Tool の説明に

Input should be a fully formed question, not referencing any obscure pronouns from the conversation before.

と追加するだけで、比較的容易に Multi-Hop な( Tool を横断して使用する)agentを作成していたのですが、筆者環境だと上手くいきませんでした(入力を英語にしてもだめ)。もしかすると、Vector Index のみで構成するなどしないとだめかもしれません(Google Search の説明文が汎用的すぎて、はっきりしない場合は全て Search で解決しようとしてしまった可能性がありますね)。

FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail

コメントを残す

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

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

最新の記事