0 前言
在開發複雜的AI應用時,賦予Agent記憶能力是一個關鍵步驟。這不僅能提高Agent的效能,還能使其在多輪對話中保持上下文連貫性。本文將詳細介紹如何在Langchain框架中為Agent新增記憶功能,並深入解析每個步驟的原理和最佳實踐。
Agent記憶功能的核心元件
在Langchain中,構建具有記憶功能的Agent主要涉及三個核心元件:
- 工具(Tools): Agent用來執行特定任務的功能模組。
- 記憶(Memory): 儲存和檢索對話歷史的元件。
- 大語言模型(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_history
和agent_scratchpad
佔位符。
7 總結
透過以上步驟,我們成功地為Langchain Agent新增了記憶功能。這使得Agent能夠在多輪對話中保持上下文連貫性,大大提高了其在複雜任務中的表現。
新增記憶功能只是構建高效Agent的第一步。在實際應用中,你可能需要根據具體需求調整記憶元件的型別和引數,或者實現更復雜的記憶管理策略。
始終要注意平衡記憶的深度和Agent的響應速度。過多的歷史資訊可能會導致決策緩慢或偏離主題。因此,在生產環境中,你可能需要實現某種形式的記憶修剪或總結機制。
關注我,緊跟本系列專欄文章,咱們下篇再續!
作者簡介:魔都架構師,多家大廠後端一線研發經驗,在分散式系統設計、資料平臺架構和AI應用開發等領域都有豐富實踐經驗。
各大技術社群頭部專家博主。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。
負責:
- 中央/分銷預訂系統效能最佳化
- 活動&券等營銷中臺建設
- 交易平臺及資料中臺等架構和開發設計
- 車聯網核心平臺-物聯網連線平臺、大資料平臺架構設計及最佳化
- LLM應用開發
目前主攻降低軟體複雜性設計、構建高可用系統方向。
參考:
- 程式設計嚴選網
本文由部落格一文多發平臺 OpenWrite 釋出!