场景一:豆包客服
我之前找豆包,咨询过我的电动车座椅的尺寸大小,给豆包说了电动车的型号。
过了 2 周之后,我咨询我电动车没办法充电,他立刻拿到了我电动车的型号,用这个型号去判断为什么不能充电。
核心逻辑
核心实现:用户身份唯一ID+会话长期记忆知识库+业务实体抽取绑定,搭配意图识别触发关联检索。
流程步骤
- 【输入层】用户问题:我的电动车为什么不能充电
- 【模型层】意图识别Agent:
2.1 顶层意图分类(主意图):设备故障咨询;
2.2 领域子意图+实体词归类:提取到核心名词(电动自行车),映射到封闭集类目transportation(交通工具)-> electric_bicycle(电动自行车) - 【规则层】触发规则,该意图需要拉取用户私有资产实体。
当意图 = 设备故障 / 配件咨询 / 使用参数查询,且归属领域 = 交通工具 → 执行读取当前用户 transportation 分类下全部结构化 KV 实体,并在捞出的交通工具实体里做二次过滤(只保留sub_type = electric_bicycle,vehicle_model=台铃XXX) - 【模型层】请求改写Agent:改写后
台铃 XX 型号电动自行车,本次为该车辆充电故障排查,请结合车型硬件结构分析原因。
记忆实现
画像存储格式
- 主存储:结构化键值 KV 库(关系数据库),负责确定性用户画像实体;
- 辅助存储:向量数据库,负责非结构化对话语义兜底记忆。
画像合并清理
- KV 结构化键值画像:强规则驱动合并 + 淘汰,以业务语义、时间戳、用户修正为核心。
- 向量非结构化画像:无 “合并” 概念,只有增量追加 + 冷数据淘汰,靠检索排序做内容取舍
| 维度 | 键值画像 | 向量画像 |
|---|---|---|
| 记忆合并方式 | 主键冲突时间戳覆盖、LLM 语义判定更新 / 新增、离线归一化 | 不合并,仅离线摘要压缩后单条向量化,增量追加 |
| 自动淘汰规则 | 长期未访问冷淘汰、信息迭代覆盖、条数上限控制 | TTL 过期、冷访问淘汰、高重复相似度去重 |
键值画像合并清理
触发时机:会话关闭时触发,统一取本次会话全部多轮上下文,一次性执行实体抽取。
取数据源:就是本次会话的聊天记录+该用户存量键值画像。
意图列表:封闭集(存储结构固定,便于后续检索使用)。
- 【请求进入】用户本轮所有对话信息。
- 【类目判断LLM】在给定封闭集中输出「类目
(交通工具)」。 - 【数据查询】根据userId+类目查询数据库,取出该用户所有
交通工具存量资产。 - 【实体抽取LLM】对比历史资产,判断是
update/add画像信息。 - 【离线归一化】对用户下全量的画像数据,进行离线批量清洗,进行归一化(事后体检,把日积月累的脏数据、同义冗余、抽取错误一次性修复);
向量画像合并清理
- 触发时机:T+1 定时离线批量执行(非实时、会话结束不触发)。
- 读取数据源:用户昨日全部会话聊天记录(跨会话、跨轮次合并)。
- 提取范围(核心)开放集
3.1 ✅ 正向提取:用户侧稳定信息、长期诉求、持续偏好、过往经历、确定事实。
3.2 ❌ 需要剔除(Prompt 强制约束)
3.2.1 模型单方面输出的回答、临时建议;
3.2.2 一次性临时查询、瞬时闲聊、无长期价值客套话、单纯情绪宣泄;
3.2.3 短期临时计划(很快失效的事件)。 - 输出产物:合并同话题对话 → 生成话题摘要文本 → Embedding 向量 → 持久入库构成向量画像;同时配套前置价值过滤:无长期记忆价值的对话直接跳过,不生成向量记录。
举例子
需要记录:用户拥有比亚迪汉,在意冬季能耗、反感高速噪音(稳定偏好 / 事实)
不记录:“今天想开车去超市”(单次临时行动,无长期价值)
意图列表来源
底层源头:算法侧人工梳理的业务场景枚举表,产品&算法预定义的封闭枚举体系。
产品根据长期记忆需要沉淀哪些信息,先圈定可落库实体的准入意图白名单,是一份固定配置文档,例如:
可允许执行实体抽取并写入长期记忆的意图(仅举例):
- 物品 / 设备参数咨询
- 个人自有资产告知(车辆、数码、家具等)
- 家庭成员信息告知
- 长期饮食、生活固定偏好说明
- 常住地、常用联系方式(仅非敏感留存)
- 长期任务、固定要求、个人习惯设定
第二层:固化到 LLM 抽取 Prompt 指令里(运行时生效)
在每次后置异步执行抽取任务时,给大模型的系统提示词直接粘贴这份意图全集,强制要求模型:
- 先对本轮对话判定属于哪一类意图;
- 如果不在可持久化白名单意图内,直接返回:不执行实体抽取,不入库;
- 只有命中白名单,再继续做 NER 实体提取。
相当于把静态配置表,通过 Prompt 注入变成模型可识别的判断标准。
第三层:规则引擎兜底二次校验
即便大模型误判意图,后台还有硬编码规则拦截:
比如意图识别为 “闲聊”“临时问答”,直接切断入库流程;
同时配置关键词黑名单,提及身份证、银行卡、住址等,无论什么意图都禁止实体落地。
画像隐私处理
| 维度 | 做法 | 明细 |
|---|---|---|
| 数据隔离 | 用户粒度数据隔离 | 所有记忆数据统一以 UserID 作为顶级分区键 |
| 采集脱敏 | 记忆内容本身的最小化采集原则 | 只抽取长期静态非敏感事实,直接丢弃敏感意图 |
| 存储加密 | 存储到DB的数据进行加密处理 | 向量不可逆、存储加密、数据自动过期; |
| 调用权限 | 严格的检索触发规则,避免隐私泄露式乱调用 | 只有修车、用车这类意图才调取标签,闲聊绝不触碰私有画像。 |
附录
短期记忆、中期记忆、长期记忆
短期记忆:本质是上下文窗口、工作记忆、临时缓存。
长期记忆:向量记忆、图谱记忆、键值记忆、事件流记忆
短期记忆:依托Prompt、按顺序调用、无持久化能力。
长期记忆:独立记忆,事件触发写入、主动检索召回、跨场景复用、定期运维清理。
记忆存储边界:
长期记忆:用户画像,项目信息,客观数据,稳定偏好。
短期记忆:临时提问、运算变量、隐私片段。
长期记忆写入流程:事件抽取->提炼过滤->结构化->Embedding
检索机制:相似度召回->Rerank重排->拼接Prompt
核心工程细节:独立命名空间、隐私加密
常态化治理:合并重复。清理过期偏好。