LangChain の Agent（ReAct document store） の動作確認メモ

少し前に LangChain の Agent (ReAct document store) を触ったので書き残しておいたメモをこちらで共有しておきます。まあ、ソースコードを読めばわかることだけど、こちらに書いておくと思い出すのに便利なので。

# ReAct document store プログラム
参考にしているサイトはこちら。

https://python.langchain.com/docs/modules/agents/agent_types/react_docstore

こちらのサイトでは OpenAI を利用していましたので、私は Azure OpenAI Service を利用したプログラムを共有しておきます。

```sh
pip install python-dotenv openai langchain
```

.env ファイルに環境変数の DEPLOYMENT_NAME と MODEL_NAME を設定しています。まずは、.env ファイルから環境変数を読み込みます。

```python
from dotenv import load_dotenv
load_dotenv()
```

Azure OpenAI Service を使用した ReAct document store のサンプルです。

```python
from langchain.llms import AzureOpenAI
from langchain import OpenAI, Wikipedia
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
from langchain.agents.react.base import DocstoreExplorer
import os

docstore = DocstoreExplorer(Wikipedia())
tools = [
    Tool(
        name="Search",
        func=docstore.search,
        description="useful for when you need to ask with search",
    ),
    Tool(
        name="Lookup",
        func=docstore.lookup,
        description="useful for when you need to ask with lookup",
    ),
]

llm = AzureOpenAI(
    deployment_name=os.getenv("DEPLOYMENT_NAME"),
    model_name=os.getenv("MODEL_NAME"),
    temperature=0
)

react = initialize_agent(tools, llm, agent=AgentType.REACT_DOCSTORE, verbose=True)
```

tools で機能を定義した後に、 initialize_agent で LangChain が用意している AgentType を選んで Agent を初期化します。

Wikiの複数のページを読まないと求められない質問をしてみます。

```python
question = "Author David Chanoff has collaborated with a U.S. Navy admiral who served as the ambassador to the United Kingdom under which President?"
react.run(question)
```

実行した結果は以下のような感じ。（読みやすいように日本語翻訳しています）

```
質問: 著者のデビッド・チャノフは、どの大統領の下で駐英国大使を務めたアメリカ海軍提督と協力していますか?  

- 考えた: デビッド チャノフを検索し、彼が協力したアメリカ海軍の提督を見つけて、その提督が駐英国大使を務めた大統領を見つける必要がある。  
- アクション: Search[デビッド チャノフ]  
- 所見: デビッド・チャノフは著名なノンフィクション作家です。 彼の作品には通常、当該作品の主要な主人公とのコラボレーションが含まれています。 彼の協力者には次のような人がいます。 オーガスタス・A・ホワイト、ジョイセリン・エルダーズ、ジョアン・ヴァン・トーイ、ウィリアム・J・クロウ、アリエル・シャロン、ケネス・グッド、フェリックス・ザンドマン。 また、ワシントン・ポスト、ニュー・リパブリック、ニューヨーク・タイムズ・マガジンなどで文学史、教育、外国など幅広いテーマについて執筆している。 彼は12冊以上の本を出版しています。
- 感想: デヴィッド・チャノフはウィリアム・J・クロウとコラボレーションしています。 ウィリアム・J・クロウを検索して、彼が英国大使を務めた大統領を見つける必要がある。
アクション: Search[ウィリアム J. クロウ]
- 考察: ウィリアム・ジェームス・クロウ・ジュニア（William James Crowe Jr.、1925年1月2日 – 2007年10月18日）は、ロナルド・レーガン大統領とジョージ・H・W・ブッシュ大統領の下で第11代統合参謀本部議長を務め、ビル・クリントン大統領の下で駐英国大使および情報監視委員会委員長を務めたアメリカ海軍提督および外交官であった。
- 感想: ウィリアム・J・クロウはビル・クリントン大統領の下で駐英国大使を務めた。 したがって、答えはビル・クリントンです。
- アクション: Finish[ビル・クリントン]
```

最後の Finish で結果が出ていますが、それまでに2回 Wiki で検索しています。

# LangChain の Agent について
LangChain の Agent は、LangChain が用意したプロンプトで動作するエージェントです。用意されているエージェントは、以下のファイルで定義されています。
 
https://github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/agents/types.py

```python
AGENT_TO_CLASS: Dict[AgentType, AGENT_TYPE] = {
    AgentType.ZERO_SHOT_REACT_DESCRIPTION: ZeroShotAgent,
    AgentType.REACT_DOCSTORE: ReActDocstoreAgent,
    AgentType.SELF_ASK_WITH_SEARCH: SelfAskWithSearchAgent,
    AgentType.CONVERSATIONAL_REACT_DESCRIPTION: ConversationalAgent,
    AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION: ChatAgent,
    AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION: ConversationalChatAgent,
    AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION: StructuredChatAgent,
    AgentType.OPENAI_FUNCTIONS: OpenAIFunctionsAgent,
    AgentType.OPENAI_MULTI_FUNCTIONS: OpenAIMultiFunctionsAgent,
}
```

# ReAct document store のプロンプトについて

ReAct document store は、論理的思考をしているような動作で、tools で定義したプログラムによりデータを取得し、最終的な結果を求めます。この動作が行えるのも LangChain が ReAct document store 用に以下のようなプロンプトを用意しているからです。ファイル名からして Wiki で検索することを想定したプロンプトになっているようです。

https://github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/agents/react/wiki_prompt.py

プロンプトの理解のために日本語に翻訳してみました。ステップ・バイ・ステップで文字列を生成することで理論的な思考をしているような動作を期待し、アクションのところで tools で定義した機能を実行することで Wiki から情報を取得することを想定しているようです。

```
例１
- 質問: コロラド造山地帯の東部が広がる地域の標高範囲はどれくらいですか?
- 考えたこと: コロラド造山運動を検索し、コロラド造山運動の東部が広がっている地域を見つけて、その地域の標高範囲を見つける必要があります。
- アクション: Search[コロラド造山運動]
- 観察: コロラド造山運動は、コロラド州とその周辺地域における造山運動 (造山運動) のエピソードでした。
- 感想：東部セクターについては言及されていない。 したがって、東部セクターを調べる必要があります。
- アクション: Lookup[東部セクター]
- 観察: (結果 1 / 1) 東部セクターは高原地帯に広がり、中央平原造山運動と呼ばれます。
- 考察: コロラド造山地帯の東部は高原地帯まで広がっています。 したがって、高原を検索してその標高範囲を見つける必要があります。
- アクション: Search[高原]
- 観察: 高原とは、2 つの異なる陸地地域のうちの 1 つを指します。考えました: 代わりにハイ プレーンズ (米国) を検索する必要があります。
- アクション: Search[ハイ プレーンズ (アメリカ)]
- 観察: ハイ プレーンズはグレート プレーンズの一部の地域です。 高原地帯は東から西に向かって、標高約 1,800 フィートから 7,000 フィート (550 メートルから 2,130 メートル) まで上昇します [3]。
- 考察: 高原地帯の標高は約 1,800 フィートから 7,000 フィートなので、答えは 1,800 フィートから 7,000 フィートです。
- アクション: Finish[1,800 ～ 7,000 フィート]  

例２
- 質問: ミュージシャンで風刺家のアリー・ゲルツは、マット・グレイニングが誰にちなんで名付けた「ザ・シンプソンズ」の登場人物ミルハウスについての曲を書きました。
- 考察: この質問は、「ザ・シンプソンズ」の登場人物であるミルハウスの名前が誰にちなんで名付けられたかということを単純化したものです。 ミルハウスを検索して、誰の名前にちなんで名付けられたのかを見つけるだけで済みます。
- アクション: Search[ミルハウス]
- 考察: ミルハウス・ムッソリーニ・ヴァン・ホーテンは、パメラ・ヘイデンが声を担当し、マット・グレイニングが制作したフォックスのアニメテレビシリーズ「ザ・シンプソンズ」の繰り返し登場人物です。
- 感想: この段落ではミルハウスの名前が誰にちなんで名付けられたのかが書かれていませんが、「名前にちなんで」を調べてみるとよいかもしれません。
- アクション: Lookup[名前]
- 観察: (結果 1 / 1) ミルハウスは、ミドルネームがミルハウスだった米国大統領リチャード ニクソンにちなんで命名されました。
- 考察: ミルハウスは米国大統領リチャード・ニクソンにちなんで名付けられたので、答えはリチャード・ニクソンです。
- アクション: Finish[リチャード・ニクソン]

例３
- 質問: フィンランドのロック グループ、アダム クレイトン パウエルとサイマー ジェスチャーについてのドキュメンタリーはどれですか?
- 考えたこと: アダム クレイトン パウエルとサイマー ジェスチャーを検索して、フィンランドのロック グループに関するドキュメンタリーを見つけなければなりません。
- アクション: Search[アダム クレイトン パウエル]
- 観察: [アダム・クレイトン・パウエル] が見つかりませんでした。 類似: [「アダム クレイトン パウエル 3 世」、「7 番街 (マンハッタン)」、「アダム クレイトン パウエル ジュニア州庁舎」、「イザベル ワシントン パウエル」、「アダム パウエル」、「アダム クレイトン パウエル (映画)」、「ジャンカルロ エスポジート」]。
- 感想: ドキュメンタリーを見つけるには、「アダム クレイトン パウエル (映画)」を検索します。
- アクション: Search[アダム クレイトン パウエル (映画)]
『観察: アダム・クレイトン・パウエル』は、リチャード・キルバーグ監督による 1989 年のアメリカのドキュメンタリー映画です。 この映画は、アフリカ系アメリカ人の影響力のある政治家アダム・クレイトン・パウエル・ジュニアの栄枯盛衰を描いたものである[3][4]。 その後、PBS シリーズ「The American Experience」の一部として放映されました。
- 感想: アダム・クレイトン・パウエル (映画) は、フィンランドのロックグループではなく、アフリカ系アメリカ人の政治家についてのドキュメンタリーです。 したがって、フィンランドのロックグループに関するドキュメンタリーは、代わりに「The Saimaa Gesture」でなければなりません。
- アクション: Finish[サイマー ジェスチャー]

例４
- 質問: ニコラス・レイとエリア・カザンの共通の職業は何ですか?
- 考察: ニコラス・レイとエリア・カザンを検索し、彼らの職業を見つけてから、彼らに共通する職業を見つける必要があります。
- アクション: Search[ニコラス レイ]
- 所見：ニコラス・レイ（本名レイモンド・ニコラス・キエンツル・ジュニア、1911年8月7日 - 1979年6月16日）は、1955年の映画『理由なき反抗』で最もよく知られるアメリカの映画監督、脚本家、俳優である。
- 感想：ニコラス・レイの職業は監督、脚本家、俳優。 次にエリア・カザンを検索して、彼の職業を見つけなければなりません。
- アクション: Search[エリア・カザン]
- 考察: エリア・カザンは、アメリカの映画および演劇の監督、プロデューサー、脚本家、俳優でした。
- 感想：エリア・カザンの職業は監督、プロデューサー、脚本家、俳優。 ニコラス・レイとエリア・カザンの共通の職業は、監督、脚本家、俳優です。
- アクション: Finish[監督、脚本家、俳優]

例５
- 質問: Arthur's Magazine と First for Women のどちらが最初に創刊されましたか?
- 考察：「Arthur's Magazine」と「First for Women」を検索して、どちらが先に創刊されたのかを見つけなければなりません。
- アクション:Search [アーサーの雑誌] 
- 考察: 『アーサーズ マガジン』 (1844 ～ 1846 年) は、19 世紀にフィラデルフィアで発行されたアメリカの文学定期刊行物です。
- 考えたこと: Arthur's Magazine は 1844 年に創刊されました。次は First for Women を検索する必要があります。
- アクション：Search【女性初】
- 観察: First for Women は、米国のバウアー メディア グループが発行する女性向け雑誌です。[1] この雑誌は1989年に創刊されました。
- 感想: First for Women は 1989 年に創刊されました。 1844 (Arthur’s Magazine) < 1989 (First for Women) なので、Arthur’s Magazine が先に創刊されました。
- アクション: Finish[アーサーズマガジン]

例６
- 質問: パベル・ウリソーンとレオニード・レヴィンは同じ種類の作品で知られていましたか?
- 考察: パベル・ウリソーンとレオニード・レヴィンを検索し、彼らの作品の種類を見つけて、それらが同じかどうかを確認する必要があります。
- アクション: Search[Pavel Urysohn]
- 考察: パベル・サムイロヴィチ・ウリソーン (Pavel Samuilovich Urysohn、1898 年 2 月 3 日 - 1924 年 8 月 17 日) は、次元理論における貢献で最もよく知られているソビエトの数学者でした。
- 感想: パベル・ウリソーンは数学者です。 次にレオニード・レヴィンを検索して、その作品の種類を見つける必要があります。
- アクション: Search[レオニード レビン]
- 観察: レオニード・アナトリエヴィッチ・レビンは、ソ連系アメリカ人の数学者でありコンピューター科学者です。
- 感想: レオニード・レビンは数学者でありコンピューター科学者です。 つまり、Pavel UrysohnとLeonid Levinは同じ種類の仕事をしています。
- アクション: Finish[はい]

```

# さいごに
AIモデルがどのような順番で、どのような関数を、どのような引数で実行するか決めていくのは面白いですね。あと、ReAct document store の結果に満足しない場合は、プロンプトを見直して新しいAgentを作ったほうがよさそうです。