新闻详情

新闻详情

首页 / 资讯中心 / 详情

125.Agent-LangChain核心组件-删除消息removeMessage(模型输出后)

发布时间:2026/9/27 22:41:13来源:尧图网络
125.Agent-LangChain核心组件-删除消息removeMessage(模型输出后)
摘要本文介绍如何在 LangChain 智能代理中通过after_model注解与RemoveMessage函数自动清理对话历史。核心思路是在每次模型响应后检查消息总数若超过阈值则删除最早的消息从而将上下文控制在可控范围内。文中提供了完整的 Python 示例代码演示了从环境配置、代理创建到多轮对话验证的完整流程。内容参考于图灵AI大模型全栈模型输出后是通过 after_model 注解来实现如下图红框删除消息是通过 RemoveMessage 函数来实现它是通过消息的id来删除下图红框是通过for循环得到所有消息的id然后调用 RemoveMessage 删除所有的消息代码fromlangchain.messagesimportRemoveMessagefromlangchain.agentsimportcreate_agent,AgentStatefromlangchain.agents.middlewareimportafter_modelfromlanggraph.checkpoint.memoryimportInMemorySaverfromlanggraph.runtimeimportRuntimefromlangchain_core.runnablesimportRunnableConfigfromlangchain_qwqimportChatQwenfromdotenvimportload_dotenvimportos# 加载环境变量load_dotenv()# 初始化模型llmChatQwen(modelqwen3.6-plus,api_keyos.getenv(DASHSCOPE_API_KEY),base_urlos.getenv(DASHSCOPE_BASE_URL))# 通过 after_model 注解设置模型输出后执行 delete_old_messages 函数after_modeldefdelete_old_messages(state:AgentState,runtime:Runtime)-dict|None: 删除旧消息以保持对话上下文在可控范围内。 工作原理 1. 每次模型响应后检查消息总数 2. 如果超过阈值2条删除最早的消息 3. 使用 RemoveMessage 标记删除LangGraph 会自动处理 参数 state: 当前代理状态包含所有消息历史 runtime: 运行时上下文提供额外配置信息 返回 dict | None: 包含要删除的消息列表或 None不执行删除 # 从状态中获取所有消息messagesstate[messages]# 检查消息数量是否超过限制保留最近2条iflen(messages)2:print(----------------------开始删除部分消息---------------------------)# 获取要删除的消息最早的2条messages_to_removemessages[:2]# 创建删除标记列表 10 通过循环删除前8条# RemoveMessage 是一个特殊对象告诉 LangGraph 要删除哪些消息removal_markers[RemoveMessage(idmsg.id)formsginmessages_to_remove]# 返回字典LangGraph 会自动处理删除操作return{messages:removal_markers}# 如果消息数量未超限不做任何操作returnNone# 创建智能代理 # 配置代理agentcreate_agent(# 使用的语言模型此处为示例模型名modelllm,# 工具列表示例为空实际可添加搜索、计算等工具tools[],# 系统提示词定义代理的基本行为准则system_prompt请保持回答简洁明了直击要点。,# 注册中间件列表# delete_old_messages 会在每次模型响应后自动执行middleware[delete_old_messages],# 检查点保存器用于保存和恢复对话状态# InMemorySaver 在内存中存储适合开发和测试checkpointerInMemorySaver(),)# 配置对话会话 # 配置对象设置当前对话线程ID# 相同的 thread_id 可以恢复之前的对话历史config:RunnableConfig{configurable:{thread_id:1# 线程ID用于标识不同的对话会话}}# 第一轮对话 print(*50)print(第一轮对话自我介绍)print(*50)streamagent.stream_events(# 用户输入消息{messages:[{role:user,content:你好我叫计算机王}]},config,versionv3,# 使用 v3 版本的流式事件协议)# 遍历流式响应打印当前状态快照forsnapshotinstream.values:# 提取并显示消息列表类型 内容messages_info[(msg.type,msg.content)formsginsnapshot[messages]]print(f当前消息历史 ({len(snapshot[messages])}条):)formsg_type,contentinmessages_info:print(f [{msg_type}]:{content[:50]}...)# 截断显示print(-*30)# 第二轮对话 print(\n*50)print(第二轮对话请求创作内容)print(*50)streamagent.stream_events({messages:[{role:user,content:请写一首关于猫咪的短诗}]},config,versionv3,)forsnapshotinstream.values:messages_info[(msg.type,msg.content)formsginsnapshot[messages]]print(f当前消息历史 ({len(snapshot[messages])}条):)formsg_type,contentinmessages_info:print(f [{msg_type}]:{content[:50]}...)print(-*30)# 第三轮对话 print(\n*50)print(第三轮对话询问个人信息)print(*50)streamagent.stream_events({messages:[{role:user,content:我叫什么名字}]},config,versionv3,)forsnapshotinstream.values:messages_info[(msg.type,msg.content)formsginsnapshot[messages]]print(f当前消息历史 ({len(snapshot[messages])}条):)formsg_type,contentinmessages_info:print(f [{msg_type}]:{content[:50]}...)print(-*30)
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Codeforces Round #707 Div2 1501C. Going Home 2026/9/27 23:33:25

Codeforces Round #707 Div2 1501C. Going Home

题意&#xff1a; 给我们一个长度为n&#xff08;4<n<2e5&#xff09;的数组a&#xff08;0<a[i]<2.5e6&#xff09;&#xff0c;然后需要我们判断是否存在四个下标x,y,z,w,使得a[x]a[y]a[z]a[w],存在则输出yes&#xff0c;否则no. 题解&#xff1a; 简单数论 其实…

阅读更多 →
原产地证怎么办才能帮客户真省关税?2026外贸CO、FTA优惠证书与RCEP办理清单 2026/9/27 23:33:25

原产地证怎么办才能帮客户真省关税?2026外贸CO、FTA优惠证书与RCEP办理清单

文/林芳老师 很多业务员把原产地证当成报关时顺带的一张纸&#xff0c;客户没提就不办。其实它是整套单据里少见的“能直接帮进口商少交税款”的凭证&#xff1a;同样的货、同样的报价&#xff0c;附一张符合规则的优惠原产地证&#xff0c;客户清关时适用的税率就可能比最惠国…

阅读更多 →
STM32 GPIO点灯深度解析:从寄存器到时钟树 2026/9/27 23:33:19

STM32 GPIO点灯深度解析:从寄存器到时钟树

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AD9361 Fast Lock跳频加速:原理、寄存器配置与性能优化实战 2026/9/27 23:33:19

AD9361 Fast Lock跳频加速:原理、寄存器配置与性能优化实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
虚拟现实智慧校园开发:从Maya建模到Unity交互的完整路径 2026/9/27 23:33:19

虚拟现实智慧校园开发:从Maya建模到Unity交互的完整路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
触电危险电压为何是65V?人体电阻与电流效应解析 2026/9/27 23:33:18

触电危险电压为何是65V?人体电阻与电流效应解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉