AI大模型企業應用實戰(25)-為Langchain Agent新增記憶功能

公众号-JavaEdge發表於2024-06-26

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(
        name="Calculator",
        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
)

這裡的關鍵點是:

  • AgentType.OPENAI_FUNCTIONS: 這種Agent型別特別適合使用OpenAI的function calling特性。
  • verbose=True: 啟用詳細輸出,有助於除錯。
  • handle_parsing_errors=True: 自動處理解析錯誤,提高Agent的穩定性。
  • memory=memory: 將我們之前定義的記憶元件傳遞給Agent。

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_name="chat_history"),MessagesPlaceholder(variable_name="agent_scratchpad")],
    },
    memory=memory #記憶元件
    )

這裡的關鍵改變是:

  • agent_kwargs: 透過這個引數,我們可以自定義Agent的行為

  • extra_prompt_messages:我們新增了兩個MessagesPlaceholder:

    • chat_history: 用於插入對話歷史。
    • agent_scratchpad: 用於Agent的中間思考過程。

這樣配置確保了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的響應速度。過多的歷史資訊可能會導致決策緩慢或偏離主題。因此,在生產環境中,你可能需要實現某種形式的記憶修剪或總結機制。

關注我,緊跟本系列專欄文章,咱們下篇再續!

作者簡介:魔都架構師,多家大廠後端一線研發經驗,在分散式系統設計、資料平臺架構和AI應用開發等領域都有豐富實踐經驗。

各大技術社群頭部專家博主。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。

負責:

  • 中央/分銷預訂系統效能最佳化
  • 活動&券等營銷中臺建設
  • 交易平臺及資料中臺等架構和開發設計
  • 車聯網核心平臺-物聯網連線平臺、大資料平臺架構設計及最佳化
  • LLM應用開發

目前主攻降低軟體複雜性設計、構建高可用系統方向。

參考:

  • 程式設計嚴選網

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章