长对话实体记忆:让智能体记住用户说过的关键信息
Q为什么我的聊天智能体聊到第十轮就失忆开头说的事全忘了A大概率是把整段历史一股脑塞进上下文token 撑爆后被截断最早那几句先被丢掉。靠堆历史记不住关键信息得单独抽一份实体记忆出来另存。我用问答体把这套方法讲清楚。Q什么叫实体记忆跟塞历史有啥区别A塞历史是把每一句原话都留着又长又乱。实体记忆是只抽出值得长期记住的事实结构化存。比如用户说我叫张磊对花生过敏住在杭州我存的是姓名: 张磊 过敏源: 花生 城市: 杭州下次对话不用翻历史直接把这几条注入 system prompt模型就记得了。原话可以丢事实留着。Q怎么判断哪句话该记总不能每句都抽。A我的做法是每轮用户发言后跑一次轻量抽取让模型只回答这句里有没有值得长期记住的用户属性/偏好/约束。有就返回结构化字段没有就返回空。判断标准我给它列了几类身份信息、明确偏好、限制条件过敏、预算、忌口、已做决定。闲聊寒暄一律不记。一个坑别让它太勤快。我一开始没限制用户随口说今天有点累也被存成了长期记忆下次对话模型还关心人家累不累挺出戏。后来加了一句临时情绪、一次性状态不要记才正常。Q用户改主意了怎么办比如先说住杭州后来说搬上海了。A这是实体记忆最容易出 bug 的地方。我用同 key 覆盖抽取出的字段如果 key 已存在新值覆盖旧值并留个时间戳。城市从杭州改上海直接覆盖。但有些字段不能覆盖只能追加比如买过的商品。所以我把字段分了两类单值覆盖和多值追加。这块没法偷懒得按业务一个个字段定清楚。我那张配置表当时列了二十多个字段填得手酸。Q记忆存哪要不要数据库A我没上数据库。每个用户一份 JSON存在会话状态里注入时拼成几行文本塞进 system。量不大完全够用。真到了用户量很大、要跨设备同步再考虑外置存储不迟——别一上来就过度设计。Q整套怎么落地的A我在一个拖拖拽拽就能配智能体工作流的平台上搭的用户消息进来 → 抽取节点判断结构化→ 写入记忆 → 下一轮回复前把记忆拼回 prompt。抽取那步调的模型 API 走讯飞星辰 MaaS现成接口没自己养模型。记忆这事的精髓是少而准记十条准的比记一百条糊的有用得多。