如何为Langchain Agent添加记忆功能?
点击下方“JavaEdge”,选择“设为星标”第一时间关注技术干货!免责声明~任何文章不要过度深思!万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」;不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人。怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」0.
点击下方“JavaEdge”,选择“设为星标”
第一时间关注技术干货!
免责声明~
任何文章不要过度深思!
万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」;
不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人。
怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」
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的响应速度。过多的历史信息可能会导致决策缓慢或偏离主题。因此,在生产环境中,你可能需要实现某种形式的记忆修剪或总结机制。
完整专栏内容,尽在编程严选网免费阅读学习:
写在最后
编程严选网:
http://www.javaedge.cn/
专注分享软件开发全生态相关技术文章
、视频教程
资源、热点资讯等,全站资源免费学习,快来看看吧~
欢迎长按图片加好友
,我会第一时间和你分享软件行业趋势
,面试资源
,学习方法
等等。
添加好友备注【技术群交流】拉你进技术交流群
关注公众号后,在后台私信:
-
回复【架构师】,获取架构师学习资源教程
-
回复【面试】,获取最新最全的互联网大厂面试资料
-
回复【简历】,获取各种样式精美、内容丰富的简历模板
-
回复 【路线图】,获取直升Java P7技术管理的全网最全学习路线图
-
回复 【大数据】,获取Java转型大数据研发的全网最全思维导图
-
更多教程资源应有尽有,欢迎
关注并加技术交流群,慢慢获取
-
为避免大量资源被收藏白嫖而浪费各自精力,以上全部需要收取1元门槛费!
更多推荐
所有评论(0)