AI Agent
做过 Agent 的人都会遇到同一个问题:聊了三天,它还是不记得你叫什么。上下文窗口装不下所有历史,把全部对话塞进去又贵又乱。记忆系统的本质,是回答一个问题——什么该记、记多久、怎么取。本文分享我们给客服 Agent 设计记忆架构的完整思路。
三层记忆模型
参照人类记忆的分层,Agent 记忆也分三层:
层 介质 生命周期 存什么 工作记忆 上下文窗口 当前会话 本轮任务的状态 情景记忆 向量数据库 长期 具体事件:"上周三用户反馈过物流慢" 语义记忆 结构化存储 长期 提炼后的知识:"用户偏好简洁回复"工作记忆就是 prompt 里那部分上下文,不用建系统。真正要设计的是后两层。
情景记忆:写入前先过三道闸
不是所有对话都值得存。我们的写入管道:
defmaybe_store(turn):# 闸1:信息量 —— 无事实、无决策的水话不存ifextract_facts(turn)isNone:return# 闸2:重要性打分 —— 用小模型打 1-10 分score=importance_score(turn)ifscore<6:return# 闸3:去重 —— 与已有记忆相似度 > 0.92 的合并而非新增merge_or_store(turn,threshold=0.92)``` 重要性打分这一步很关键。我们早期全量入库,三个月后向量库变成垃圾场,检索噪声把召回质量拖垮了。加上打分后,存储量下降70%,检索命中质量反而上升。## 语义记忆:从对话流里"结晶"情景记忆存的是流水账,语义记忆存的是结论。实现上是定期跑一个离线任务: ```text 每晚 → 取当日高分情景记忆 → LLM 归纳成结构化条目 → 与既有语义记忆冲突时,新信息覆盖旧信息(带时间戳) ``` 例如从20条"用户每次都要求重发汇总邮件"的情景记忆,结晶出一条语义记忆:"该用户偏好邮件汇总而非即时消息"。下轮对话直接注入 system prompt,不用检索。## 读取:比存储更重要读取策略决定了记忆系统的实际价值:1.**固定注入**:用户画像类语义记忆(偏好、禁忌、身份信息),每轮直接拼进 system prompt,量控制在500token 内;2.**按需检索**:情景记忆用当前 query 检索 top-3,只取时间衰减后的高分条目;3.**时间衰减**:`score × exp(-λ × 天数)`,λ 取0.01(半衰期约70天),让旧记忆自然淡出而非永久霸榜。## 一个容易被忽略的坑:记忆污染用户随口一句"我可能下周去上海",被存成事实并永久注入,之后每次对话都被误导。对策:给每条记忆加**确定性标注**(事实/推测/偏好),推测类条目只在被再次确认后升级,两周未确认自动降权。 记忆系统没有开源银弹,但架构是清晰的:写入设闸、定期结晶、读取分层、防污染。四件事做对,Agent 就从"金鱼记忆"变成"靠谱同事"。