ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

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

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)
返回列表