给Agent接长期记忆:用户画像存取实操
先说结论:给智能体接长期记忆,别想着把整段对话历史塞进去。真正要存的是"结构化的用户画像"——几条 key-value,外加一个会随对话更新的偏好摘要。我自己搭了个理财问答的小助手踩过坑,这篇把存取链路讲清楚。
最开始我犯的错,是把每轮对话原文都写进一张表,下次进来再全捞出来拼进 prompt。结果两个问题:一是 token 涨得飞快,聊到第二十轮,光历史就吃掉小两千 token;二是模型反而被一堆寒暄噪声带偏,问它"我之前说过我风险偏好低吗",它还得在一堆废话里翻。
后来改成两层存储,清爽多了。
第一层:结构化画像表。固定字段,存确定性事实。比如:
user_id: u_8812
risk_level: 低
investable: 50w以下
age_band: 30-40
last_topic: 指数基金定投
这层我用一张普通的 key-value 表存,每次对话开始按 user_id 拉一次,注入 system prompt。字段是预先定义死的,模型只负责"填空",不让它自由发挥造字段——不然今天叫 risk_level 明天叫 riskLevel,存取直接对不上。
第二层:自然语言偏好摘要。存一段不超过 150 字的"这人是谁"。比如"该用户偏保守,多次拒绝推荐股票型产品,关心手续费,习惯月初定投"。这段由每轮对话结束后,让模型自己增量改写——把新观察 merge 进旧摘要,而不是重写。
存取触发点我是这么设计的(在那种拖拖拽拽就能配工作流的平台上,几个节点连一下就成):
-
对话开始节点 → 查画像表 + 拉偏好摘要 → 注入上下文
-
主对话节点 → 正常回答
-
对话结束节点 → 判断"这轮有没有新的确定性信息",有就更新画像表
-
异步节点 → 让模型重写偏好摘要,写回
第三步那个"判断有没有新信息"特别关键。我一开始每轮都无脑更新画像,后果是用户随口说句"今天天气真好",模型也认真琢磨要不要更新字段,偶尔还真给我把 last_topic 写成"天气"。后来加了一道判断 prompt,明确告诉它"只有出现风险偏好、资金量、年龄、明确投资意向这几类信息才更新,否则原样返回 no_update",乱写才压下去。
说个真实取舍:偏好摘要的"增量改写"其实不稳。让模型 merge 旧摘要和新信息,它偶尔会把旧的关键事实悄悄丢掉——比如原来写着"拒绝股票型",改写完变成只剩最近一句"想了解黄金"。我现在的土办法是,把画像表里的硬字段当锚点,摘要只补软性偏好,硬事实绝不依赖摘要。这样就算摘要漂了,核心画像还在表里兜底。
还有个小细节,存的时候记得带时间戳。我有次发现一个用户画像里 risk_level 是"高",但那是半年前填的,人家早改主意了。现在每个字段都带 updated_at,超过 90 天的软偏好我会让助手主动确认一句"您之前提过偏好积极型,现在还是吗",而不是闷头用旧数据。
整套搭下来,最费劲的不是存取本身,是想清楚"哪些该记、哪些是噪声"。记多了拖累 token 还引入脏数据,记少了又跟没记忆一样。我现在的边界是:确定性事实进表、软偏好进摘要、闲聊一律丢弃。
模型这块我走的讯飞星辰 MaaS,画像更新那道判断和摘要改写都是直接调它的现成接口,没自己部署算力,省事。
更多推荐


所有评论(0)