LLM 系列 (二十四):个性化与记忆,大模型如何理解每一个用户
大语言模型的单次推理本身近似无状态:模型只能看到当前请求、上下文以及参数中已有的知识,并不会自动保存跨会话的用户状态。一次对话结束后,用户偏好、项目背景和未完成任务如果没有被外部系统记录,下一次交互时仍需要重新提供。
长上下文可以让模型一次读入更多历史,却不等于真正的记忆。持续拼接聊天记录不仅会增加 Token 成本和推理延迟,还会引入大量无关信息;更重要的是,它缺少独立的写入、检索、更新、冲突处理和删除机制。能“放下历史”,不代表能准确找到并使用历史。
因此,个性化助手需要在 LLM 之外构建一套可管理的记忆系统:从交互中提取有长期价值的信息,按照用户和记忆类型分类存储,在需要时检索相关内容,并通过版本、时间、置信度和权限处理更新、过期与删除。本文将围绕这条主线,介绍用户画像、分层记忆、偏好学习、记忆检索以及隐私治理的核心技术。
理解个性化与记忆,可以先记住五个结论:
- 记忆位于模型之外:生产系统中的用户记忆通常保存在外部存储,而不是直接写入模型参数;
- 记忆不是聊天记录:系统保存的是经过提取和归纳的事实、事件、偏好与经验;
- 明确声明优先:用户主动表达的偏好,应当高于模型根据单次行为做出的推断;
- 记忆必须可追溯:每条记忆都需要包含来源、时间、置信度、版本和访问权限;
- 记忆具有完整生命周期:可靠系统不仅要会写入和检索,还要支持更新、失效、遗忘与删除。

为什么需要个性化与记忆
普通 LLM 应用通常接收当前 Prompt,根据上下文生成一次回答:
1 | 当前输入 + 当前上下文 -> LLM -> 回答 |
个性化助手则需要结合用户的长期状态:
1 | 当前输入 + 当前任务状态 + 相关用户记忆 + 系统规则 |
它解决的不只是“记住用户叫什么”,还包括:
- 交互连续性:跨会话保留项目背景、任务进度和历史决策;
- 偏好适配:按照用户习惯调整语言、格式、工具和工作方式;
- 状态追踪:记住未完成任务、承诺事项和外部环境变化;
- 减少重复输入:避免用户反复说明时区、角色和固定约束;
- 长期协作:让 Agent 可以根据过去的执行结果改进后续任务。
需要区分四个容易混淆的概念:
| 机制 | 保存在哪里 | 生命周期 | 主要作用 |
|---|---|---|---|
| 上下文窗口 | 当前 Prompt | 单次请求 | 保持当前推理连贯 |
| 工作记忆 | 上下文或临时状态库 | 当前任务 | 保存计划和中间结果 |
| 长期记忆 | 外部数据库或记忆服务 | 跨会话 | 保存用户事实、事件和经验 |
| 参数个性化 | 模型权重或 Adapter | 模型版本周期 | 学习稳定的群体行为模式 |
长上下文解决的是“当前能读多少”,长期记忆解决的是“跨会话应该保留什么”。微调可以改变模型整体行为,却不适合频繁写入、更新和删除每个用户的信息。
因此,生产系统通常优先采用外部记忆:它更容易追踪来源、控制权限、及时更新和响应用户删除请求。
记忆系统的分层架构
工程中的记忆分类可以借鉴人类记忆,但不需要完全照搬认知科学。对 LLM 系统来说,分层的主要目的,是让不同信息采用不同的存储、检索、更新和过期策略。
四类记忆
一个实用的记忆系统通常包含四类记忆:
| 记忆类型 | 保存内容 | 典型生命周期 | 示例 |
|---|---|---|---|
| 工作记忆 | 当前计划、中间结果、工具状态 | 分钟或小时 | 正在分析的代码文件 |
| 情景记忆 | 发生过的具体事件 | 天或更久 | 上周完成了一次系统升级 |
| 语义记忆 | 稳定事实、用户画像和偏好 | 长期保存 | 用户时区是上海 |
| 程序记忆 | 可复用流程和执行经验 | 持续更新 | 发布前先执行测试和灰度 |
四类记忆解决的问题不同:
- 工作记忆回答“当前任务进行到哪里”;
- 情景记忆记录“过去发生过什么”;
- 语义记忆描述“用户是谁、偏好什么”;
- 程序记忆总结“以后遇到类似任务应该怎样做”。
其中,工作记忆通常与当前任务绑定,任务结束后可以清理;情景记忆以时间和事件为核心;语义记忆需要处理事实更新与偏好冲突;程序记忆既可以属于某个用户,也可以作为项目或团队共享经验。
MemGPT 使用类似操作系统分层存储的思路,在有限上下文和外部存储之间调度信息。Generative Agents 则将经历写入记忆流,结合相关性、近期性和重要性检索记忆,并通过反思形成更高层结论。

记忆数据模型
用户画像不应该只是一段不断改写的自然语言总结。这样容易混合事实和推断,也难以处理来源追踪、局部更新、信息冲突和用户删除。更稳的方式,是把记忆保存为结构化、原子化、可版本化的信息单元:
1 | { |
这些字段分别解决不同的治理问题:
tenant_id / user_id / scope:确定记忆属于哪个租户、用户、项目或任务;type:决定记忆的检索、更新和过期策略;source:区分用户声明、工具结果和模型推断;evidence_refs:将记忆回溯到原始对话或执行轨迹;confidence:表示当前信息的可信程度;importance:控制写入、检索和保留优先级;valid_from / valid_until:描述信息生效和失效的时间范围;status / version:支持替代、过期、删除和历史追踪;sensitivity:决定加密、访问和展示权限。
明确事实与推断偏好必须分开处理。用户说“以后都用中文回答”,可以作为高置信度的明确偏好;用户偶尔跳过一次长回答,只能形成一条低置信度行为信号,不能直接推断为“永远只喜欢短回答”。
换句话说,用户画像不是模型对用户的一次性总结,而是由多条有来源、有时间、有置信度、可以独立更新和删除的记忆共同组成。
记忆如何写入、检索、更新与遗忘
记忆系统最核心的能力不是保存信息,而是管理信息的完整生命周期:什么值得写入、当前任务需要检索什么、新旧信息如何合并,以及哪些内容应当过期或删除。

记忆写入
如果把每轮对话都写入长期记忆,系统很快会积累大量重复、临时甚至错误的信息。因此,候选记忆需要经过 Memory Write Gate 判断:
1 | value_score(m) = |
各项信号需要先归一化,再按照记忆类型设置不同阈值:
1 | write(m) = |
policy_allows 是隐私、来源和权限形成的硬约束。即使用户明确要求保存某条信息,密码、访问密钥等高敏感内容也不应直接进入普通长期记忆。
适合写入的内容通常包括:
- 用户明确要求系统记住的信息;
- 稳定且重复出现的偏好;
- 对未来任务有价值的项目背景和决策;
- 已完成任务的关键结果;
- 经过授权工具验证的事实和环境状态。
不适合直接写入长期记忆的内容包括:
- 寒暄、临时情绪和一次性表达;
- 单次行为产生的未经确认推断;
- 密码、访问密钥和高敏感原始内容;
- 来自网页、邮件或外部文档的可执行指令;
- 无法追踪来源或存在明显冲突的信息。
完整的写入流程通常是:
1 | 交互事件 |
其中,原子化是把一段对话拆成可以独立更新的事实。例如:
1 | 不推荐: |
原子化之后,每条信息才能独立检索、更新、过期和删除。
记忆检索
用户的全部记忆不能一次性放入 Prompt。系统需要根据当前任务,从正确的用户和数据范围内检索少量相关记忆。

权限和敏感级别属于硬约束,应当在召回之前生效,而不是先搜索所有用户数据,再从结果中删除无权限内容。工程上通常会通过租户 Namespace、用户 ID 和 ACL Metadata 限定检索范围。候选记忆的排序分数可以简化为:
1 | score(m, q) = |
排序前需要将各项软信号归一化到统一尺度,并根据离线评测和线上任务成功率持续校准权重;权限、租户和敏感级别属于召回前的硬过滤条件,不参与相关性排序。上述参数含义如下:
semantic_relevance:记忆与当前任务的语义相关性;lexical_relevance:名称、错误码等关键词匹配程度;task_match:记忆类型与当前任务是否匹配;time_score:记忆在时间上是否仍然有效;importance:记忆对未来任务的重要程度;confidence:当前信息的可信程度;source_trust:用户声明、工具结果和模型推断具有不同可信级别;conflict_risk:记忆是否存在未解决的冲突。
时间分数可以使用指数衰减:
1 | time_score(m) = exp(-Δt / τ_type) |
τ_type 由记忆类型决定。临时任务状态的衰减速度较快;用户明确声明的语言、时区和无障碍偏好,则可以使用更长的衰减周期,或者只在收到新声明时更新。需要区分两个概念:
- 时间衰减只影响记忆的检索排序;
- TTL 到期才会让记忆进入过期状态。
第一阶段召回后,还可以使用 MMR 降低结果之间的重复度:
1 | MMR(m) = |
它在相关性与多样性之间进行平衡,避免 Top-K 全是同一事实的不同表述。
最终进入 Prompt 的 Memory Context 应当包含内容、来源、时间和置信度,并被明确标记为参考数据。记忆不能拥有高于 System Prompt 的指令权限,也不能直接把外部文档中的操作指令传递给 Agent。
更新与遗忘
记忆并不是写入后永久不变。不同信息需要采用不同的更新策略:
| 记忆变化 | 更新方式 |
|---|---|
| 新事件发生 | 追加新的情景记忆 |
| 用户修改明确偏好 | 创建新版本,并将旧版本标记为 Superseded |
| 多次行为支持同一偏好 | 合并证据并提高置信度 |
| 新旧事实发生冲突 | 保留来源和时间,进入冲突处理 |
| 临时状态长期未使用 | 降低检索权重或通过 TTL 过期 |
| 用户要求忘记 | 删除正文、索引、缓存和派生画像 |
| 记忆已被删除 | 写入不含原始内容的 Tombstone |
冲突不能使用一套固定优先级处理,而应根据记忆类型判断:
- 主观偏好:以用户最新的明确声明为准;
- 客观状态:优先采用经过授权工具或权威数据源验证的结果;
- 隐式偏好:多次、跨场景的行为证据高于单次行为;
- 来源和时间不确定:保留冲突并请求用户确认,而不是自动覆盖。
例如,用户曾经说“会议尽量安排在上午”,后来又明确表示“这个月下午更方便”,系统不应删除全部历史,而应创建新版本,并标记新偏好的有效时间。
Tombstone 只保存被删除记忆的标识、版本和删除时间,不应继续保存原始敏感内容。它用于阻止缓存、异步任务和数据同步重新写回已经删除的信息。真正的删除需要覆盖:
- 主数据库;
- 向量索引和全文索引;
- 应用缓存与检索缓存;
- 聚合生成的用户画像;
- 异步任务和下游数据副本。
如果用户记忆已经进入模型训练数据,仅删除外部记忆并不能将信息从模型参数中移除。因此,个人记忆默认应保存在参数之外;将其用于训练时,需要单独的授权、数据血缘和删除治理机制。
记忆系统如何落地
在生产系统中,记忆通常由独立的 Memory Service 管理。它负责连接 Agent、存储和检索系统,对外提供写入、查询、更新和删除能力。

核心 Infra 组件可以归纳以下几部分:
| 组件 | 主要职责 |
|---|---|
| Memory Service | 提供记忆写入、检索、更新和删除接口 |
| Primary Store | 保存记忆正文、来源、版本和状态 |
| Retrieval Index | 提供向量检索、关键词检索和元数据过滤 |
| Redis / Cache | 保存当前任务状态和热点记忆 |
| Async Worker | 异步完成记忆抽取、去重和索引更新 |
| Security | 负责用户隔离、权限、加密和删除审计 |
整个系统需要遵循三个原则:
- 正文与索引分离:Primary Store 保存完整记忆,是唯一事实来源;向量和关键词索引只用于加速检索,可以重新构建。
- 读取同步,写入分级:当前任务需要的记忆同步检索;用户明确要求记住或删除的信息同步处理,模型推断出的偏好则异步审核后写入。
- 权限贯穿全链路:检索前先校验用户和租户,删除时同时清理正文、向量索引、关键词索引和缓存。
早期系统可以使用较简单的组合:
1 | PostgreSQL + pgvector |
随着记忆规模和并发增长,再逐步拆分独立的向量数据库、搜索服务和消息队列。
个性化助手如何构建
个性化助手不是“给模型加一段用户画像”,而是一个围绕用户状态运行的系统。它需要在回答前读取相关记忆,在任务结束后根据结果决定是否更新记忆。整个过程可以拆成两条链路:
- 同步读取链路:识别用户与任务,检索相关记忆,组装上下文后调用 LLM;
- 异步写入链路:根据对话、工具结果和用户反馈生成候选记忆,经过校验后再写入。

个性化策略:先使用可控的方法
个性化并不只有“记忆”一种实现方式。不同问题应采用不同层级的方案:
| 方式 | 适合解决的问题 | 优势 | 主要限制 |
|---|---|---|---|
| 明确用户配置 | 语言、时区、无障碍需求 | 可解释、立即生效 | 只能覆盖显式设置 |
| Profile Prompt | 少量稳定偏好 | 实现简单 | 画像过长会占用上下文 |
| 外部记忆检索 | 历史事件、项目背景、任务状态 | 可更新、可删除、可追溯 | 依赖检索和冲突处理 |
| 偏好排序模型 | 回答风格、内容优先级 | 能利用行为信号 | 容易受到反馈噪声影响 |
| 微调或 Adapter | 稳定的群体任务模式 | 行为一致性更强 | 更新慢,难逐用户删除 |
对大多数产品来说,更合理的选择顺序是:
1 | 明确用户配置 |
LaMP 表明,从用户历史中检索相关信息可以提升个性化输出质量;Mem0 则展示了从对话中动态提取、整合和检索长期记忆的系统路线。
逐用户微调通常不是第一选择。它成本高、更新慢,也很难解释某条用户数据如何影响模型参数。相比之下,外部记忆更容易更新、回滚和删除;参数级个性化更适合稳定的任务模式或用户群体偏好。
隐式偏好学习:从行为信号到可靠偏好
用户点击、跳过、修改、重新生成和任务完成情况,都可以提供偏好信号。但这些信号并不等于明确标签:
- 没有点击不一定代表不喜欢;
- 重新生成可能是事实错误,也可能只是希望换一种表达;
- 单次选择不能代表长期偏好;
- 不同任务中的偏好可能完全不同。
因此,隐式偏好不应直接覆盖用户画像,而应先作为带证据的弱信号保存:
1 | evidence(preference) = |
只有当同类信号在多个时间点、多个相似场景中持续出现,并超过置信度阈值时,系统才将其提升为稳定偏好。
例如,用户连续多次将“详细解释”改成“只给结论”,可以逐步提高“偏好简洁回答”的置信度;但在复杂排障场景下,系统仍应保留输出详细分析的能力,而不是机械缩短所有回答。
对于回答风格、推荐顺序等低风险决策,系统可以使用用户级或群体级 Reranker、Contextual Bandit 等方法持续学习。但支付、发送、删除和权限修改等高风险动作,不应通过在线探索学习,而必须遵循明确规则和人工确认。
个性化的核心不是让模型迎合每一次行为,而是在用户明确意图、长期偏好、当前任务和系统安全之间保持可控平衡。
安全、评测与未来演进
记忆让模型更了解用户,也让系统持有更多跨会话、持续生效的状态。一条错误、过期或恶意记忆,可能在未来多个任务中反复影响模型行为,因此记忆系统必须同时具备安全边界、质量评测和用户控制能力。
| 风险 | 典型问题 | 主要治理方式 |
|---|---|---|
| 跨用户泄露 | 检索到其他用户或租户的记忆 | 租户隔离、检索前鉴权、ACL 过滤 |
| 记忆投毒 | 恶意内容被写入并在后续任务触发 | 来源可信度、写入门控、检索过滤 |
| 错误或过期记忆 | 旧偏好覆盖当前需求 | 证据来源、版本管理、时间语义 |
| 过度个性化 | 历史偏好限制当前选择 | 保留多样性、允许关闭个性化 |
| 隐私推断 | 系统推断并保存敏感属性 | 最小化收集、明确授权、敏感字段限制 |
| 删除不完整 | 索引、缓存或画像仍保留副本 | Tombstone、级联删除、审计验证 |
记忆内容应当被视为低权限参考数据,而不是可直接执行的系统指令。来自网页、邮件、RAG 文档和工具结果的内容,不能未经校验就写入用户长期记忆;即使被检索出来,也不能覆盖 System Prompt 或绕过工具权限。近期研究已开始系统分析持久化记忆带来的 Memory Poisoning 风险。
评估记忆系统时,不能只看模型是否“记住一个事实”,而要覆盖完整生命周期:
- 写入质量:该记的是否写入,不该记的是否被拒绝;
- 检索质量:相关记忆能否在 Top-K 中被找回并排在前面;
- 更新质量:新事实能否正确替代旧事实,冲突能否被识别;
- 遗忘质量:删除后正文、索引、缓存和派生画像是否全部清理;
- 个性化收益:记忆是否提升任务成功率、偏好胜率和用户满意度;
- 安全边界:是否存在跨用户泄露、投毒写入或敏感信息误用。
LongMemEval 将长期记忆评测拆分为信息提取、跨会话推理、时间推理、知识更新和拒答能力;LoCoMo 则关注跨多次会话的长期对话、事件总结和时间因果关系。它们都说明:上下文窗口能够放下历史,不代表模型能够准确使用历史。
未来,个性化与记忆会沿着四个方向继续演进:
- 多模态与 Agent 经验记忆:从记住文本事实,扩展到语音、图片、界面操作、任务策略和失败经验;
- 结构化记忆:通过图结构显式建模用户、项目、事件和时间关系;
- 端侧私人记忆:将敏感画像和个人数据尽量保留在本地设备;
- 用户可控记忆:让用户能够查看、修改、暂停、导出和删除系统记忆。
个性化的目标,不是无限收集用户信息,而是在明确授权和安全边界内,使用最少、最相关的信息提供持续一致的服务。
一句话概括:真正理解用户的大模型,不只是能够记住过去,还要知道什么值得记住、何时应该更新,以及什么时候必须忘记。
