s09: Memory — 该记记,该忘忘
LLM无状态,所有信息都在上下文窗口里。当上下文窗口满了就要压缩,压缩就会导致细节丢失。需要一层不参与压缩、跨会话保留的存储。
四种类型的记忆:user(你是谁)、feedback(怎么做事)、project(正在发生什么)、reference(东西在哪找)
- 加载:记忆清单索引常驻SYSTEM;相关记忆按需注入;
- 写入:每轮结束后提取。提取prompt要求 LLM返回的JSON数组确实有新信息时才写文件;
- 整理:低频合并去重;记忆文件会积累。在文件数达到阈值时触发,让LLM去重、合并矛盾、淘汰过时记忆;
User Memory保存跨会话仍然有用的信息:用户偏好、反复出现的反馈、项目背景、常用入口和排查线索。它关注“以后还会用到什么”,并通过索引+按需加载把这些信息带回当前对话。
Session Memory关注同一会话内的连续性:compact之后,当前会话还需要保留哪些上下文。
两者配合使用:Memory管长期知识,session memory管当前会话的压缩续接。
s10: System Prompt — 运行时组装
随着agent功能越来越复杂,系统提示词也越写越多;系统提示词可以做成运行时根据当前状态进行组装配置(哪些工具启用、哪些上下文可见、哪些记忆相关、哪些内容必须保持稳定以命中prompt cache)
把硬编码的SYSTEM拆成独立段落(section),运行时根据真实状态按需拼接,缓存结果避免重复组装;
不要用 hash() 做持久化或跨进程的缓存键。Python 默认开启哈希随机化(PYTHONHASHSEED 随机),同一个字符串在不同进程或 Python 解释器重启后,hash() 的结果可能不同。推荐用 json.dumps(…, sort_keys=True) 生成稳定字符串,必要时再用 MD5 压缩。
s11: Error Recovery — 重试换路子
Agent运行过程中会遇到各种异常,需要加以处理;
常见的三种故障:
- 输出被截断(输出过程中token用完了)
- 上下文超限(压缩后还是太长)
- 临时故障(429限流、529过载)
LLM调用包裹在try/except中,根据错误类型走不同的恢复路径;恢复后continue回到循环开头重新调用LLM;