尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

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

AI Agent 应用实战(4):设计记忆与上下文管理

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我免费发你。如果你正好在做类似系统、或有工程化难题想找人做也欢迎邮件聊一句——我按实际情况评估能落地的就接单或出方案。评论和邮件都能直接找到我不用跳别的平台。
返回列表