AI Agent 应用实战(4):设计记忆与上下文管理
上一篇建立了可停止、可恢复的单 Agent 循环。本篇处理循环变长后的核心矛盾历史不能无限塞进模型但关键事实又不能丢。目标不是“记得越多越好”而是在正确作用域内保存可追溯、可撤销的信息。一、痛点从“能演示”走向“可托管”上下文是本次推理的工作集记忆是可被检索的持久数据两者不能混用。建议分三层步骤记忆保存单轮工具结果会话记忆保存当前任务已确认事实长期记忆只保存经过授权、未来确实有用且带来源的事实。原始事件追加保存摘要只是可重建的派生视图。真正可迁移的做法是先写任务契约再选模型输入从哪里来成功产物是什么哪些动作禁止自动执行最多允许多少步、多少时间和多少费用失败后由谁接管。契约一旦写进代码和测试模型升级只是实现替换不会悄悄改变业务责任边界。二、原理把概率判断放进确定性边界每条记忆应包含主体、内容、来源、创建时间、有效期和敏感级别。写入前先去重和冲突检测读取时同时按主体权限、时间有效性与任务相关性过滤。用户纠正信息时不要偷偷覆盖旧值而应把旧记录标为 superseded并保留纠正链方便解释答案为何变化。模型输出、工具数据和记忆内容都按不可信输入处理。每个边界都执行校验、授权、裁剪和审计所有状态变化都有明确原因。这样做看似增加一些代码却把“偶尔答错”拆成可定位的规划错误、参数错误、工具错误或策略错误团队才能针对性改进。三、实现用独立程序跑通最小闭环下面用 SQLite 实现一个极小的事实仓库。它只保存明确事实并通过 owner 隔离用户同一 key 的新版本不会删除旧版本。示例展示写入、纠正和读取当前值迁移到向量库时也应保留这些元数据约束。importsqlite3fromdatetimeimportdatetime,timezone dbsqlite3.connect(:memory:)db.execute(CREATE TABLE memory ( owner TEXT, key TEXT, value TEXT, source TEXT, created_at TEXT, superseded INTEGER DEFAULT 0 ))defremember(owner:str,key:str,value:str,source:str)-None:db.execute(UPDATE memory SET superseded1 WHERE owner? AND key? AND superseded0,(owner,key))nowdatetime.now(timezone.utc).isoformat()db.execute(INSERT INTO memory VALUES (?, ?, ?, ?, ?, 0),(owner,key,value,source,now))db.commit()remember(user-7,timezone,UTC,user_claim)remember(user-7,timezone,Asia/Shanghai,user_correction)rowdb.execute(SELECT value, source FROM memory WHERE owner? AND key? AND superseded0,(user-7,timezone),).fetchone()countdb.execute(SELECT COUNT(*) FROM memory WHERE owner? AND key?,(user-7,timezone)).fetchone()[0]print(fcurrent_timezone{row[0]})print(fversion_count{count})print(flatest_source{row[1]})运行输出current_timezoneAsia/Shanghai version_count2 latest_sourceuser_correction送入模型前应先构造上下文预算。系统规则和当前用户请求优先级最高任务事实其次历史对话只保留与当前决策有关的片段。摘要必须标注它不是原始证据重要数字仍从源记录提取。这样能避免多轮压缩后条件、否定词和责任主体逐渐漂移。第二个程序补上生产中最容易遗漏的控制点。它与前一个示例完全独立可单独保存运行不依赖本系列其他文件示例数据是内存假实现因此不会访问真实账户或产生外部副作用。fromdataclassesimportdataclassdataclass(frozenTrue)classSegment:name:strtokens:intpriority:intsegments[Segment(system_rules,120,100),Segment(current_request,90,90),Segment(verified_facts,160,80),Segment(old_chitchat,110,10),]budget400used0forsegmentinsorted(segments,keylambdaitem:item.priority,reverseTrue):ifusedsegment.tokensbudget:print(fskipped{segment.name}reasonbudget)continueusedsegment.tokensprint(fincluded{segment.name}tokens{segment.tokens})print(ftotal_tokens{used})运行输出includedsystem_rules tokens120 includedcurrent_request tokens90 includedverified_facts tokens160 skippedold_chitchat reasonbudget total_tokens370落地时应把示例中的内存状态替换为事务型存储把打印日志替换为结构化事件但不要改变契约。事件至少包含 run_id、步骤、输入摘要、策略结果、耗时、错误类别和版本密钥、完整个人信息及未经脱敏的提示不得进入日志。四、踩坑失败路径决定系统上限第一类坑是把模型自行推断写成长期事实之后不断自我强化第二类坑是跨租户检索语义相似却没有权限过滤第三类坑是只保留摘要无法核对原文。记忆写入要区分 user_claim、tool_fact 与 model_inference默认不持久化推断删除请求还要能定位所有派生索引并同步清理。还要防止把确定逻辑模型化。金额计算、权限判断、枚举路由和状态转移应使用普通代码模型适合处理分类、抽取、歧义消解与证据综合。每减少一个无必要的模型决策点就减少一处延迟、成本和不可复现性同时让测试更容易覆盖。五、验证用轨迹和门槛验收用四组测试验收同一用户能取回有效事实其他用户无法命中过期与被替代记录不会进入上下文删除后原表和索引都不可检索。再用固定问题比较裁剪前后的答案确认关键约束未丢且 token 明显下降。下一篇的多 Agent 协作会继续复用带来源事实而不是互传整段对话。发布顺序固定为离线回放、影子流量、小比例灰度和有限自治。每阶段先定义通过线和回滚条件再看结果不能在看到分数后移动门槛。关键样本要保存初始状态、每步动作、观察、最终产物与终止原因模型、提示和工具契约版本也必须一起记录。多 Agent 之间只传结构化任务包和证据引用能显著降低角色之间的上下文污染。参考来源SQLite PythonLangGraph MemoryOWASP LLM Prompt Injection 觉得有用就点个赞 收藏方便回头查阅有疑问直接在评论区留言我看到都会回。 本文属于《AI Agent 应用实战》系列持续更新关注不迷路。 文章里的代码都能直接跑。想要可直接 clone 的完整工程 配套部署脚本 / 踩坑清单评论一声或发邮件到cj2664qq.com我免费发你。如果你正好在做类似系统、或有工程化难题想找人做也欢迎邮件聊一句——我按实际情况评估能落地的就接单或出方案。评论和邮件都能直接找到我不用跳别的平台。

相关新闻

AI Agent动态JSON性能优化:从观测到索引化与懒加载实践

AI Agent动态JSON性能优化:从观测到索引化与懒加载实践

1. 项目概述:当AI Agent遇上动态JSON,性能观测的“暗礁”与“灯塔” 最近在设计和优化一个AI驱动的智能客服Agent时,我遇到了一个非常典型且棘手的问题。这个Agent的核心逻辑是,它会根据用户的实时对话内容,动态生成一…

2026/10/17 15:44:03 阅读更多 →
荒岛求生:极端环境下的生存技巧与实践指南

荒岛求生:极端环境下的生存技巧与实践指南

1. 荒岛求生问题概述 想象一下,当你突然发现自己置身于一座无人荒岛,周围只有茫茫大海和原始丛林,没有任何现代设施和救援信号。这种极端环境下的生存挑战,就是经典的"荒岛求生问题"。作为一个户外生存爱好者&#xff0…

2026/10/16 19:12:20 阅读更多 →
构建大规模近实时视频推荐系统:从内容理解到多路召回

构建大规模近实时视频推荐系统:从内容理解到多路召回

最近在刷短视频时,你是不是经常被一些“逆天操作”的集锦视频刷屏?比如“大数据把你推给我,就是为了让你看这波逆天4杀!”,这类标题精准地抓住了你的好奇心,让你忍不住点进去。作为开发者,我们在…

2026/10/16 5:45:19 阅读更多 →

最新新闻

双串锂电主动均衡设计:MP2642GR-Z与ATmega324P工程实践

双串锂电主动均衡设计:MP2642GR-Z与ATmega324P工程实践

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

2026/10/17 15:43:10 阅读更多 →
量化交易入门:CANSLIM模型N要素如何捕捉股价创新高的买入时机

量化交易入门:CANSLIM模型N要素如何捕捉股价创新高的买入时机

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

2026/10/17 15:43:10 阅读更多 →
指令系统详解:从指令格式、寻址方式到CISC与RISC架构博弈

指令系统详解:从指令格式、寻址方式到CISC与RISC架构博弈

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

2026/10/17 15:43:10 阅读更多 →
IndexedDB实战:从localStorage迁移到浏览器内置数据库的完整指南

IndexedDB实战:从localStorage迁移到浏览器内置数据库的完整指南

1. 为什么你的项目需要IndexedDB:从localStorage的局限说起在聊IndexedDB之前,先说说我为什么在几个项目里坚决地把数据存储方案从localStorage换成了它。很多人在做前端数据持久化的时候,第一个想到的就是localStorage,毕竟API简…

2026/10/17 15:43:10 阅读更多 →
用Python和Pygame实现Boulder Dash:网格地图、重力与碰撞详解

用Python和Pygame实现Boulder Dash:网格地图、重力与碰撞详解

简介:这是一款用JavaScript实现的简易版《宝石迷阵》游戏源码包,面向初学前端游戏开发的读者,适合用来理解网页游戏从地图搭建、角色控制到碰撞反馈的完整流程。压缩包共20个文件,囊括HTML入口、CSS样式、3个JS逻辑文件以及多张GI…

2026/10/17 15:43:10 阅读更多 →
Qt界面美化实战:基于JSON主题配置的通用UI架构设计

Qt界面美化实战:基于JSON主题配置的通用UI架构设计

简介:本资源是一套基于Qt开发的高颜值、跨平台通用界面示例工程,面向Qt初学者与中阶开发者,聚焦GUI设计实战,解决传统界面风格单一、适配性差、代码复用率低等常见痛点。压缩包共41个文件(294KB)&#xff0…

2026/10/17 15:42:09 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/16 14:23:36 阅读更多 →