基於ReAct機制的AI Agent

程序员半支烟發表於2024-06-04

當前,在各個大廠紛紛卷LLM的情況下,各自都藉助自己的LLM推出了自己的AI Agent,比如位元組的Coze,百度的千帆等,還有開源的Dify。

你是否想知道其中的原理?是否想過自己如何實現一套AI Agent?當然,藉助LangChain就可以。

1. 簡述AI Agent

何為AI Agent呢?如果拿人來對比的話,半支菸認為AI Agent就是一個會思考和行動的人,其中LLM就是這個人的大腦。

說白了,AI Agent就是藉助LLM這個大腦,加上一些 能夠感知外部環節 和 能夠發起行動 的部件,共同組成的一個 機器人。

那怎樣能夠讓 AI Agent這個機器人,充分利用LLM 和 各種部件呢?那ReAct就是這個協作工具。利用ReAct機制,LLM可以很好的結合外部環境和行動元件,形成一個完整的AI Agent。

下面將探討ReAct框架的概念、原理、優勢,並透過程式碼示例展示如何在LangChain中使用ReAct構建AI Agent。

2. ReAct概念和原理

2.1 為什麼需要ReAct

我們知道,LLM在訓練完畢後,會具備較強的推理能力,但是他的知識隨著時間的推移會過時,但是又不可能經常性的去訓練LLM,畢竟每次訓練的成本太高了。

那怎麼解決這個問題?機器可以像人一樣自己主動去學習和搜尋新知識呀。

那機器怎麼知道什麼時候該去搜尋知識?什麼時候時候該去呼叫什麼樣的工具解決當前的問題呢?

ReAct應運而生。ReAct的核心在於,推理和行動。

2.2 ReAct的定義

ReAct(Reasoning and Action)是一個框架,其概念來源於一篇論文,其核心思想,就是透過思維鏈的方式,引導模型將複雜問題進行拆分,一步一步地進行推理(Reasoning)和行動(Action),同時還引入了觀察(Observation)環節,在每次執行(Action)之後,都會先觀察(Observation)當前現狀,然後再進行下一步的推理(Reason)。

ReAct這個框架,就是要讓LLM,進行推理,然後採取行動與外界環境互動。

ReAct這個框架,就是要讓開發者一步步引導LLM進行推理,然後根據推理的結果,判斷採取哪個行動。

2.3 ReAct的核心元件

ReAct框架的核心元件包括:

  • 思維鏈(Chain of Thought):將一個大的複雜任務進行拆解,拆解成多個思維步驟。
  • 推理(Reasoning):負責分析和處理輸入的資料,生成有效的決策。
  • 行動(Action):執行具體的操作,比如搜尋、執行程式碼,或者其餘自定義的行動。
  • 觀察(Observation):監控和收集環境反饋的資料,為下一步的推理和行動提供依據。

2.4 工作流程

ReAct框架的工作流程如下:

  1. 輸入資料:接收使用者輸入或環境資料。
  2. 推理階段:分析輸入資料,生成決策和計劃。
  3. 行動階段:根據決策執行具體操作。
  4. 觀察階段:監控操作結果,收集反饋資料。
  5. 迴圈迭代:根據反饋資料調整推理和行動,持續最佳化結果。

2.5 舉個例子說明ReAct步驟

比如,要知道2024年周杰倫最新的演唱會是時間和地點是什麼,透過ReAct機制,會被拆解成以下步驟:

推理1:使用者想知道2024年周杰倫最新的演唱會是時間和地點是什麼,需要查詢最新的資訊。
行動1:呼叫Google的搜尋API進行搜尋。
觀察1:搜尋結束,搜尋的結果中出現一些關於《2024年周杰倫最新的演唱會》的網頁資訊。

推理2:搜尋出來的網頁較多,大概瀏覽前6個網頁的具體內容。
行動2:點選第一個網頁,開始瀏覽。
觀察2:瀏覽結束,瀏覽的網頁內容提及到了2024年周杰倫最新的演唱會資訊。

推理3:針對網頁的內容進行,問題的總結。
結果:將最終的答案輸出給使用者。

3. LangChain的ReAct機制實現AI Agent

以上我們已經瞭解的原理和步驟,接下來我們使用LangChain定義一個ReAct機制的AI Agent。

3.1 示例

比如,在不使用ReAct機制藉助外部工具的情況下,讓LLM幫我們計算兩個小數相加,則直接出錯。

然後,藉助ReAct機制,會讓LLM自動使用自定義工具,最終計算正確。

然後,繼續測試,問別的問題,藉助ReAct機制,則不會使用到工具,直接給出答案。

3.2 程式碼

具體程式碼如下:

from langchain import hub
from langchain.agents import create_structured_chat_agent, AgentExecutor
from langchain.memory import ConversationBufferMemory
from langchain.schema import HumanMessage
from langchain.tools import BaseTool
from langchain_openai import ChatOpenAI

# 模型
model = ChatOpenAI(model="gpt-3.5-turbo",
                   openai_api_key="sk-XXXXXXXXXX",
                   openai_api_base="https://api.aigc369.com/v1")
# 直接讓模型計算數字,模型會算錯
model.invoke([HumanMessage(content="你幫我算下,3.941592623412424+4.3434532535353的結果")])


# 下面開始使用ReAct機制,定義工具,讓LLM使用工具做專業的事情。

# 定義工具,要繼承自LangChain的BaseTool
class SumNumberTool(BaseTool):
    name = "數字相加計算工具"
    description = "當你被要求計算2個數字相加時,使用此工具"

    def _run(self, a, b):
        return a.value + b.value
        
# 工具合集
tools = [SumNumberTool()]
# 提示詞,直接從langchain hub上下載,因為寫這個ReAct機制的prompt比較複雜,直接用現成的。
prompt = hub.pull("hwchase17/structured-chat-agent")
# 定義AI Agent
agent = create_structured_chat_agent(
    llm=model,
    tools=tools,
    prompt=prompt
)
# 使用Memory記錄上下文
memory = ConversationBufferMemory(
    memory_key='chat_history',
    return_messages=True
)
# 定義AgentExecutor,必須使用AgentExecutor,才能執行代理定義的工具
agent_executor = AgentExecutor.from_agent_and_tools(
    agent=agent, tools=tools, memory=memory, verbose=True, handle_parsing_errors=True
)
# 測試使用到工具的場景
agent_executor.invoke({"input": "你幫我算下3.941592623412424+4.3434532535353的結果"})

# 測試不使用工具的場景
agent_executor.invoke({"input": "請你充當稿件稽核師,幫我看看'''號裡的內容有沒有錯別字,如果有的話幫我糾正下。'''今天班級裡的學生和老實要去哪裡玩'''"})        


4. 總結

本文主要介紹了AI Agent的概念,探討了ReAct框架的概念、原理、優勢,並透過程式碼示例展示如何在LangChain中使用ReAct構建AI Agent。希望對你有幫助!

======>>>>>> 關於我 <<<<<<======

本篇完結!歡迎點贊 關注 收藏!!!

原文連結:https://mp.weixin.qq.com/s/OAQ3nPeRaC7mSNFNFDqF_A

相關文章