在LangChain平台上实现ReAct框架和对话流程

概述

    • LangChainにおける、Few-shotによるReActフレームワークの実装である、REACT_DOCSTOREを通してReActが実際にどのようにLLMと対話しているのかをコードを読みながらシーケンス図に書き起こして調査しました。

 

    • 特に、筆者は以下が不明だったため、整理が必要だったものとなります。

ReActのプロンプトは実際にはどのようなものを用意すればよいのか?
対話を進めるごとにLLMに具体的にどのようなプロンプトを送っているのか?
ReActを用いたLLMとの対話の流れをどうやってコントロールしているのか?

目标读者

ReActについてなんとなく概念は知っているが、LangChainを使って実際に手を動かそうとしたときに、どう動いているのかイメージが付かない人。

LangChainを用いてReActを使う予定であり、プロンプトなどをカスタマイズしてみたいが、標準で提供されている機能の流れをこれから掴もうとしている人

シーケンス図が分かる人

在设计ReAct的提示语时,应该准备什么样的内容才合适呢?

以下是关于ReAct论文的内容。LLM是一种通过模拟逻辑思考来寻找目标答案的方法之一,LLM利用外部工具等进行思考、执行和观察的循环来寻求答案的框架。

 

    • LangChainには、ReActフレームワーク実行用に標準で提供されているエージェントとして、

 

    • initialize_agentで指定できる2種類のAgentTypeが実装されています。

ZERO_SHOT_REACT_DESCRIPTION

0-shotでReActを実行するフレームワーク。ReActの流れと、利用できるツールをLLMに教え込ませ、問題を解かせる方式。
実際のコードの通り、ReActの実行方法を初期のプロンプトとして渡している。
本題以外に使用する文字数がReActの説明文だけになるので、Few-shotに対し、比較的余分な文字数が必要なくなる可能性がある。

ReActの思考を繰り返すことにより、いずれにせよ文字数がどんどんかさましされていくことに注意。

REACT_DOCSTORE

Few-shotのプロンプトを用いて、Wikipediaを検索しながら質問の解答を見つけるフレームワーク。
ReActの流れそのものをいくつかのケースとして入力し、問題を解かせる。
実際のコードでは、サンプルとして6例ほど、ReActの流れを入力している。
Few-shotでReActの流れを記述するため、0-shotに対し、比較的初期時点の文字数が多くなりやすく、その分本題を解かせるために入力できる文字数が少なくなる可能性がある。

关于0-shot和Few-shot的选择
按照OpenAI的最佳实践,首先应使用0-shot进行验证,
如果无法得到预期的结果,则应使用few-shot进行验证,这是较好的选择。

 

每进行一次对话,我们向LLM发送了什么具体的提示呢?

LangChainの公式ドキュメントにおけるReActのページでは、以下のような記載があります。

from langchain import OpenAI, Wikipedia
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
from langchain.agents.react.base import DocstoreExplorer
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 = OpenAI(temperature=0, model_name="text-davinci-002")
react = initialize_agent(tools, llm, agent=AgentType.REACT_DOCSTORE, verbose=True)

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)
> Entering new AgentExecutor chain...

Thought: I need to search David Chanoff and find the U.S. Navy admiral he collaborated with. Then I need to find which President the admiral served under.

Action: Search[David Chanoff]

Observation: David Chanoff is a noted author of non-fiction work. His work has typically involved collaborations with the principal protagonist of the work concerned. His collaborators have included; Augustus A. White, Joycelyn Elders, Đ Văn Toại, William J. Crowe, Ariel Sharon, Kenneth Good and Felix Zandman. He has also written about a wide range of subjects including literary history, education and foreign for The Washington Post, The New Republic and The New York Times Magazine. He has published more than twelve books.
Thought: The U.S. Navy admiral David Chanoff collaborated with is William J. Crowe. I need to find which President he served under.

Action: Search[William J. Crowe]

Observation: William James Crowe Jr. (January 2, 1925 – October 18, 2007) was a United States Navy admiral and diplomat who served as the 11th chairman of the Joint Chiefs of Staff under Presidents Ronald Reagan and George H. W. Bush, and as the ambassador to the United Kingdom and Chair of the Intelligence Oversight Board under President Bill Clinton.
Thought: William J. Crowe served as the ambassador to the United Kingdom under President Bill Clinton, so the answer is Bill Clinton.

Action: Finish[Bill Clinton]

> Finished chain.

在这里的输出看起来就像LLM一次性输出结果一样,但实际上只是为了用户的可读性而输出,它是LLM和用户进行多次交互的结果总结。

为了能够真实地想象LLM是如何进行数据交换的,我在以下列举了LLM与对方进行了3次交流的例子。
下面是我用类似于时序图的方式进行描述并画成的棒图。

image.png

我认为上述特点如下。

    • LLMに対する情報の入力はあくまでステートレス。

ReActの実行中に、過去のReActの履歴を改変して送ることも可能。

ReActの試行を繰り返せば繰り返すほど、LLMに送信する文字数は増えるが、LLMが1度に処理できる文字数(トークン数)に制限があるため、ReActの繰り返しは制限があるため注意が必要。

我们是如何控制与使用ReAct的LLM进行对话的流程的?

我认为对于此问题的回答的主要内容是通过在LangChain内部进行类间交流的想象来获取自定义信息。

image.png
image.png

LangChain版本的确认时间点

 

    v0.0.198

以下是可以参考的资料:

    LangChainにおけるReActの説明は以下となります。

 

广告
将在 10 秒后关闭
bannerAds