找回密码
 立即注册
首页 业界区 业界 AI开发-python-langchain框架(3-17-ReactAngent的增加 ...

AI开发-python-langchain框架(3-17-ReactAngent的增加会话记录)

懵诬哇 3 小时前
LangChain ReAct Agent 实现会话记录功能:让智能体拥有“记忆”

在基于LangChain构建智能体(Agent)的过程中,很多开发者都会遇到一个常见问题:默认的ReAct Agent缺乏会话记忆能力,每一次交互都是孤立的,无法记住上一轮的对话内容,导致多轮对话体验生硬,甚至无法完成连贯的交互任务。比如当我们向智能体自我介绍后,再询问“我叫什么”,没有会话记录功能的智能体只会茫然无措。而今天,我们就来分享如何为ReAct Agent添加会话记录功能,让它拥有“记忆”,实现自然流畅的多轮对话,同时结合具体实践,拆解其核心实现逻辑,适合刚接触LangChain Agent开发的小伙伴参考。一、核心痛点:为什么需要给ReAct Agent添加会话记录?

ReAct Agent的核心优势在于“推理-行动”的迭代循环,能够自主判断是否需要调用工具、如何调用工具来完成用户需求,但它的原生设计中,每一次调用都是无状态的——也就是说,智能体不会主动保存上一轮的对话信息,每一次交互都相当于“重新认识用户”。这种无状态特性在单次交互场景下影响不大,但在多轮对话中会显得非常笨拙:无法衔接上下文、重复询问已告知的信息、无法基于历史对话推进复杂任务,这极大地降低了智能体的交互体验,也限制了其在实际场景中的应用。而添加会话记录功能,本质上就是为ReAct Agent增加“短期记忆”,让它能够记录每一轮的用户输入和自身响应,在后续交互中调用这些历史信息,实现连贯、自然的多轮对话,这也是智能体走向实用化的关键一步。二、关键实现思路:会话记录功能的核心逻辑

实现ReAct Agent的会话记录功能,核心围绕“记录-传递-调用”三个环节展开,无需复杂的额外依赖,基于LangChain原生组件即可完成,整体思路简洁易懂,具体可分为三个核心步骤,全程避开复杂代码,聚焦逻辑拆解:1. 预留会话记录占位符

ReAct Agent的交互逻辑依赖提示词模板(PromptTemplate),我们需要在模板中预留出会话记录的占位位置,明确告知智能体“可以调用之前的对话历史”。这个占位符会作为后续传递会话信息的入口,让智能体知道需要从哪里获取历史对话内容。这一步的核心是让提示词模板支持上下文传递,打破“单次交互孤立”的限制,为会话记忆提供基础载体。2. 实时记录对话历史

在每一轮对话完成后,我们需要主动记录下“用户输入”和“智能体响应”这两组关键信息,将其整理成统一的格式,存储在一个可调用的容器中。这个容器就相当于智能体的“记忆库”,会随着多轮对话的推进,不断追加新的对话内容。需要注意的是,对话历史的记录格式要与提示词模板的要求保持一致,确保智能体能够正确识别和解析这些历史信息,避免出现上下文混乱的情况。3. 多轮调用时传递会话历史

在发起下一轮对话时,将“记忆库”中存储的所有历史对话信息,通过之前预留的占位符,传递给ReAct Agent的执行器。此时,智能体会结合当前的用户输入和历史对话内容,进行推理和响应,从而实现“记住上下文”的效果。比如用户第一次自我介绍后,对话历史会被记录下来;当用户再次询问自身姓名时,智能体会从传递的历史信息中提取相关内容,准确给出回复,而不是陷入“不知道你叫什么”的困境。三、实践亮点:轻量实现,无需额外依赖

本次实现会话记录功能的最大亮点,在于完全基于LangChain原生组件,无需引入额外的记忆模块 ,轻量且灵活,非常适合快速落地和调试。我们不需要复杂的配置,只需通过简单的逻辑设计,就能实现会话历史的记录与传递,既保留了ReAct Agent原有的“推理-行动”能力,又新增了会话记忆功能,兼顾了功能性和简洁性。同时,这种实现方式具有良好的可扩展性:如果后续需要实现会话记录的持久化(比如保存到文件或数据库),只需在“记忆库”的基础上,增加存储和读取逻辑即可,无需修改核心的会话传递流程。四、效果验证:会话记录功能的实际价值

通过上述实现方式,我们可以轻松验证会话记录功能的效果:1. 第一轮对话:用户进行自我介绍,智能体给出响应,此时对话历史被成功记录到“记忆库”中;2. 第二轮对话:用户询问“我叫什么”,智能体通过传递的会话历史,准确提取出用户的姓名并回复,实现了上下文的连贯衔接;3. 多轮延伸:即使后续发起与历史对话相关的需求,智能体也能基于已记录的信息,快速响应,无需用户重复输入,极大提升了交互体验。五、总结与延伸

为ReAct Agent添加会话记录功能,是提升智能体交互体验的关键一步,其核心逻辑就是“预留占位符-记录历史-传递上下文”,全程基于LangChain原生组件即可轻量实现,无需复杂代码。对于开发者而言,这种实现方式不仅简单易上手,还能灵活扩展,后续可以根据实际需求,增加会话记录的持久化、清理、总结等功能,让智能体的“记忆”更高效、更实用。 代码实现:
  1. from langchain_openai import ChatOpenAI
  2. from langchain_core.tools import Tool
  3. from langchain.agents import create_react_agent  # 改用 ReAct 智能体
  4. from langchain.agents import AgentExecutor
  5. from langchain_core.prompts import PromptTemplate  # ReAct 用 PromptTemplate 而非 ChatPromptTemplate
  6. from langchain_core.messages import AIMessage, HumanMessage
  7. # 1. 初始化 LLM
  8. DEEPSEEK_API_KEY = "123"  # 替换为实际的 API Key
  9. llm = ChatOpenAI(
  10.     api_key=DEEPSEEK_API_KEY,
  11.     base_url="http://192.168.0.100:8085/v1",
  12.     model="qwen3.5-27b-awq",
  13.     temperature=0.3,
  14.     max_tokens=1024,
  15. )
  16. # 2. 工具函数
  17. def huawei_mall_search(query: str) -> str:
  18.     """华为商城搜索工具"""
  19.     print(f"[DEBUG] 工具被调用!搜索关键词:{query}")
  20.     search_results = {
  21.         "众测活动": "华为商城众测活动是让用户体验新品并反馈意见的活动。目前有Mate 60系列众测,参与可赢取礼品。",
  22.         "手机": "华为商城最新手机:Mate 60系列、P60系列、nova系列等。",
  23.         "笔记本": "华为MateBook X Pro、MateBook D系列笔记本电脑。",
  24.         "手表": "华为Watch 4、Watch GT系列智能手表。",
  25.         "默认": "请在华为商城官网查看详细信息或联系客服。"
  26.     }
  27.     for keyword in search_results:
  28.         if keyword in query:
  29.             return f"华为商城搜索结果:{search_results[keyword]}"
  30.     return search_results["默认"]
  31. # 3. 创建工具(保持不变)
  32. huawei_tool = Tool(
  33.     name="huawei_mall_search",
  34.     description="查询华为商城相关信息,包括产品、活动、政策等",
  35.     func=huawei_mall_search,
  36. )
  37. tools = [huawei_tool]
  38. # 4. 定义 ReAct 提示词模板 (关键修改!)
  39. react_prompt = PromptTemplate.from_template("""
  40. Answer the following questions as best you can. You have access to the following tools:
  41. {tools}
  42. Use the following format:
  43. Question: the input question you must answer
  44. Thought: you should always think about what to do
  45. Action: the action to take, should be one of [{tool_names}]
  46. Action Input: the input to the action
  47. Observation: the result of the action
  48. ... (this Thought/Action/Action Input/Observation can repeat N times)
  49. Thought: I now know the final answer
  50. Final Answer: the final answer to the original input question
  51. Begin!
  52. Previous conversation history:
  53. {chat_history}
  54. Question: {input}
  55. Thought: {agent_scratchpad}
  56. """)
  57. # 5. 创建 ReAct 智能体
  58. try:
  59.     agent = create_react_agent(llm=llm, tools=tools, prompt=react_prompt)
  60.     print("Agent 创建成功")
  61. except Exception as e:
  62.     print(f"创建 Agent 失败: {e}")
  63.     exit()
  64. # 6. 创建执行器
  65. agent_executor = AgentExecutor(
  66.     agent=agent,
  67.     tools=tools,
  68.     verbose=True,
  69.     max_iterations=3,
  70.     handle_parsing_errors=True,
  71.     return_intermediate_steps=True
  72. )
  73. # 7. 测试
  74. print("\n" + "=" * 60)
  75. print("测试 Agent 工具调用")
  76. print("=" * 60)
  77. # 这里我们为 chat_history 传递一个空的消息列表,因为它是聊天中的第一条消息
  78. chat1 = agent_executor.invoke({"input": "你好,我叫小老虎", "chat_history": []})
  79. print(chat1)
  80. history = [] + [HumanMessage(content=chat1['input']), AIMessage(content=chat1['output'])]
  81. chat2 = agent_executor.invoke({"chat_history": history, "input": "我叫是什么?", })
  82. print('---------------')
  83. print(chat2['output'])
  84. print('#################')
  85. print(chat2)
复制代码
输出:

Agent 创建成功

============================================================
测试 Agent 工具调用
============================================================


> Entering new AgentExecutor chain...
n.


Thought: 用户是在打招呼并自我介绍,这不是一个需要查询华为商城信息的问题,我应该友好地回应这个问候。

Final Answer: 你好,小老虎!很高兴认识你。我是你的智能助手,有什么我可以帮助你的吗?比如查询华为商城的产品信息、活动优惠、购买政策等,都可以告诉我哦!

> Finished chain.
{'input': '你好,我叫小老虎', 'chat_history': [], 'output': '你好,小老虎!很高兴认识你。我是你的智能助手,有什么我可以帮助你的吗?比如查询华为商城的产品信息、活动优惠、购买政策等,都可以告诉我哦!', 'intermediate_steps': []}


> Entering new AgentExecutor chain...
y.


Thought: 这个问题是关于用户自己的名字,从之前的对话历史中我可以看到用户已经自我介绍过叫"小老虎",所以我不需要使用工具来查询,可以直接从对话历史中回答。

Final Answer: 你叫小老虎!这是你在我们第一次对话时告诉我的名字。

> Finished chain.
---------------
你叫小老虎!这是你在我们第一次对话时告诉我的名字。
#################
{'chat_history': [HumanMessage(content='你好,我叫小老虎'), AIMessage(content='你好,小老虎!很高兴认识你。我是你的智能助手,有什么我可以帮助你的吗?比如查询华为商城的产品信息、活动优惠、购买政策等,都可以告诉我哦!')], 'input': '我叫是什么?', 'output': '你叫小老虎!这是你在我们第一次对话时告诉我的名字。', 'intermediate_steps': []}

Process finished with exit code 0


更多学习资料尽在 老虎网盘资源
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册