那如果是个人助理场景呢?用户告诉系统自己有糖尿病不能吃甜食,过了一个月问'帮我推荐个下午茶',系统应该记住这个信息吧?这种长期记忆你们怎么做的
P1 · rag · 🏢 小红书
🏷 标签:user-profile, long-term-memory, personal-assistant, preference-extraction
1️⃣ 考察意图
面试官想看你是否理解“长期记忆”在个人助理场景下的核心挑战:不是简单存对话历史,而是从非结构化对话中提取并维护结构化用户画像(user profile),并解决时效性、冲突更新、冷启动问题。这是系统设计题,刁钻点在于:用户说“有糖尿病”是隐式约束,一个月后推荐下午茶时,系统需主动关联画像而非依赖对话检索。答好了能展示你对记忆分层(episodic vs. semantic)、画像更新策略、以及检索时注入画像的工程落地能力。
2️⃣ 标准答
个人助理的长期记忆,核心是构建一个用户画像系统,将对话中的事实(偏好、禁忌、属性)提取为结构化键值对,并持久化存储。具体分三步:
- **画像提取(Profile Extraction)**用 LLM 或小模型(如基于 BERT 的序列标注)从对话中抽取出三元组:
(实体, 属性, 值)。例如“我有糖尿病” →(用户, 禁忌, 高糖食物)。注意:需要处理否定句(“不能吃甜食”)、隐式表达(“我血糖高”)。工程取舍:用 LLM 提取灵活但成本高,可用规则+小模型做初筛,LLM 做复杂推理(如跨句推理)。坑:用户可能说“偶尔吃一点”,需引入置信度评分,避免过度泛化。 - **画像存储与更新(Profile Storage & Update)**用键值数据库(如 Redis)或图数据库(如 Neo4j)存储画像,每个用户一个文档,字段如
dietary_restrictions: [“no_sugar”]。更新策略:覆盖式:新信息直接覆盖旧值(适合明确变更,如“我现在可以吃甜食了”)。 - 累积式:保留历史版本,用时间戳标记(适合偏好变化,如“最近在控糖”)。实际落地坑:用户可能一个月后说“我糖尿病好了”,系统需检测冲突并触发确认(“您之前说不能吃甜食,现在可以了吗?”)。解法:设置冲突检测阈值,当新信息与旧画像矛盾时,用 LLM 生成确认问题。 画像注入与检索(Profile Injection & Retrieval)每次对话开始时,从画像库加载用户画像,注入到系统 prompt 中。例如推荐下午茶时,prompt 包含:用户饮食禁忌:高糖食物。同时,结合向量检索历史记忆(如用 ColBERT 编码对话片段),但画像优先级高于历史记忆——因为画像更稳定、更结构化。工程取舍:全量注入画像可能超出 token 限制,需按场景裁剪(如推荐场景只注入饮食相关字段)。坑:用户画像可能过时(如“糖尿病”是临时状态),需设置 TTL(time-to-live)或定期用 LLM 验证(“您还保持这个习惯吗?”)。
总结:长期记忆不是存日志,而是构建一个可更新、可注入的画像系统,结合结构化存储和向量检索,解决隐式约束的主动关联问题。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从画像提取、存储更新、注入检索三个层面回答。画像提取用 LLM 从对话中抽结构化事实;存储用键值库加时间戳,支持覆盖和累积两种更新策略;注入时按场景裁剪画像,优先级高于历史记忆。总结一句:长期记忆的核心是构建可维护的用户画像,而非简单存对话。”
4️⃣ 高频追问 & 应对
追问 1:用户画像更新时,如果新信息和旧信息冲突,你怎么处理?
用置信度+时间戳做决策。如果新信息置信度高(如用户明确说“我现在可以吃甜食了”),直接覆盖旧值;如果置信度低(如“偶尔吃一点”),累积式存储并降低旧值权重。实际中,我会设置冲突检测:当新旧值矛盾时,用 LLM 生成确认问题(“您之前说不能吃甜食,现在改变了吗?”),避免静默覆盖导致推荐错误。
追问 2:如果用户画像字段很多(比如 100+),每次对话都注入会超 token 限制,你怎么优化?
按场景动态裁剪。例如推荐场景只注入饮食、偏好相关字段(约 10-20 个),忽略无关的(如工作地点)。具体做法:用分类模型(如 fastText)对用户 query 做意图识别,然后从画像库中检索相关字段。工程取舍:裁剪可能遗漏隐式相关字段(如“下午茶”可能关联“过敏史”),所以保留一个“高优先级”字段列表(如健康禁忌)始终注入。
追问 3:用户画像的冷启动问题怎么解决?新用户没有历史数据。
用默认画像+渐进式构建。默认画像基于用户注册信息(如年龄、地区)或设备信号(如 iOS/Android),给出通用偏好(如“下午茶推荐低糖选项”)。然后,在首次对话中主动询问(“您有什么饮食禁忌吗?”),并用 LLM 从初始对话中提取画像。坑:不要一次性问太多,否则用户反感;用渐进式提问,每次对话只问 1-2 个关键问题。
5️⃣ 避坑 · 常见错误答法
- ❌ 说“用向量数据库存所有对话历史,每次检索最近对话” → ✅ 正确做法:对话历史是 episodic memory,画像才是 semantic memory;向量检索无法处理隐式约束(如“糖尿病”需推理为“不能吃甜食”),必须用结构化画像。
- ❌ 说“用 LLM 在每次对话时重新分析历史” → ✅ 正确做法:LLM 分析成本高且不稳定,应离线提取画像并持久化,在线只做注入和检索。
- ❌ 说“用户画像一旦建立就不更新” → ✅ 正确做法:用户偏好会变,需设置 TTL 或冲突检测机制,定期用 LLM 验证。
6️⃣ 简历呼应
- 如果你有 RAG 项目:从“如何将用户画像作为元数据注入检索”切入,强调你用过向量检索+结构化过滤的混合方案,并处理过画像冲突。
- 如果你只做过传统 NLP:用“实体抽取+知识图谱”类比,说你做过从文本中抽三元组,并维护过动态知识库,迁移到用户画像的更新策略。
- 如果你是校招无项目:聚焦“论文复现”,说你研究过 Memory-Augmented Neural Networks 或 Persona-Chat 数据集,理解画像提取和注入的挑战,并写过 demo 用 LLM 做简单画像更新。
- “Personalized LLM Agents: A Survey on Memory and User Modeling” (2024)
- “Persona-Chat: A Large-Scale Dataset for Personalized Dialogue” (Zhang et al., 2018)
- “MemoryBank: A Large-Scale Memory System for LLM Agents” (2023)
- “ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction” (Khattab & Zaharia, 2020)
- Redis + LLM 实现用户画像更新的开源项目(如 MemGPT 的 profile 模块)