参考: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.
日本の農業法人の課題には、労働力不足や資材コストな