如何爲 Langchain Agent 添加記憶功能?

0 前言

在開發複雜的 AI 應用時, 賦予 Agent 記憶能力是一個關鍵步驟。這不僅能提高 Agent 的性能, 還能使其在多輪對話中保持上下文連貫性。本文將詳細介紹如何在 Langchain 框架中爲 Agent 添加記憶功能, 並深入解析每個步驟的原理和最佳實踐。

Agent 記憶功能的核心組件

在 Langchain 中,構建具有記憶功能的 Agent 主要涉及三個核心組件:

  1. 工具 (Tools): Agent 用來執行特定任務的功能模塊。

  2. 記憶 (Memory): 存儲和檢索對話歷史的組件。

  3. 大語言模型 (LLM): 負責理解輸入、決策和生成響應的核心智能體。

這三個組件的協同工作使 Agent 能夠在多輪對話中保持連貫性並做出明智的決策。

1 構建 Agent 可用工具

首先, 我們需要定義 Agent 可以使用的工具。

# 構建一個搜索工具,Langchain提供的一個封裝,用於進行網絡搜索。
search = SerpAPIWrapper()
# 創建一個數學計算工具,特殊的鏈,它使用LLM來解析和解決數學問題。
llm_math_chain = LLMMathChain(
    llm=llm,
    verbose=True
)
tools = [
    Tool(
        name = "Search",
        func=search.run,
        description="useful for when you need to answer questions about current events or the current state of the world"
    ),
    Tool(
        ,
        func=llm_math_chain.run,
        description="useful for when you need to answer questions about math"
    ),
]
print(tools)

2 增加 memory 組件

接下來, 我們需要爲 Agent 添加記憶功能。Langchain 提供了多種記憶組件, 這裏我們使用ConversationBufferMemory:

from langchain.memory import ConversationBufferMemory

# 記憶組件
memory = ConversationBufferMemory(
    # 指定了存儲對話歷史的鍵名
    memory_key="chat_history",
   # 確保返回的是消息對象,而不是字符串,這對於某些Agent類型很重要
    return_messages=True
)

3 定義 agent

現在我們有了工具和記憶組件, 可以初始化我們的 Agent 了:

from langchain.agents import AgentType, initialize_agent

agent_chain = initialize_agent(
    tools, 
    llm, 
    agent=AgentType.OPENAI_FUNCTIONS, 
    verbose=True, 
    handle_parsing_errors=True,
    memory=memory
)

這裏的關鍵點是:

4 查看默認的 agents prompt 啥樣

瞭解 Agent 使用的默認提示詞模板非常重要, 這有助於我們理解 Agent 的行爲並進行必要的調整:

print(agent_chain.agent.prompt.messages)
print(agent_chain.agent.prompt.messages[0])
print(agent_chain.agent.prompt.messages[1])
print(agent_chain.agent.prompt.messages[2])

這將輸出 Agent 使用的默認提示詞模板。通常包括系統消息、人類消息提示詞模板和 AI 消息模板。

5 優化 Agent 配置

爲了更好地利用記憶功能, 我們需要修改 Agent 的配置, 確保它在每次交互中都能訪問對話歷史。

需要使用 agent_kwargs 傳遞參數,將 chat_history 傳入

agent_chain = initialize_agent(
    tools, 
    llm, 
    agent=AgentType.OPENAI_FUNCTIONS, 
    verbose=True, 
    handle_parsing_errors=True,#處理解析錯誤
    agent_kwargs={
        "extra_prompt_messages":[MessagesPlaceholder(variable_)],
    },
    memory=memory #記憶組件
    )

這裏的關鍵改變是:

這樣配置確保了 Agent 在每次決策時都能考慮到之前的對話內容。

6 驗證優化後的提示詞模板

最後, 讓我們檢查一下優化後的提示詞模板:

print(agent_chain.agent.prompt.messages)
print(agent_chain.agent.prompt.messages[0])
print(agent_chain.agent.prompt.messages[1])
print(agent_chain.agent.prompt.messages[2])

能看到新添加的chat_historyagent_scratchpad佔位符。

7 總結

通過以上步驟, 我們成功地爲 Langchain Agent 添加了記憶功能。這使得 Agent 能夠在多輪對話中保持上下文連貫性, 大大提高了其在複雜任務中的表現。

添加記憶功能只是構建高效 Agent 的第一步。在實際應用中, 你可能需要根據具體需求調整記憶組件的類型和參數, 或者實現更復雜的記憶管理策略。

始終要注意平衡記憶的深度和 Agent 的響應速度。過多的歷史信息可能會導致決策緩慢或偏離主題。因此, 在生產環境中, 你可能需要實現某種形式的記憶修剪或總結機制。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/VGIaIHrIiroYcZiebutiJA