文章目录
- 一、核心结论
- [二、整体架构(Memory System 典型设计)](#二、整体架构(Memory System 典型设计))
-
-
- [信息提取(Memory Extraction)](#信息提取(Memory Extraction))
- [Memory 存储(Memory Store)](#Memory 存储(Memory Store))
-
- [结构化 Memory(强约束)](#结构化 Memory(强约束))
- [向量 Memory(语义记忆)](#向量 Memory(语义记忆))
- [Memory 检索(Retrieval)](#Memory 检索(Retrieval))
- [Prompt 注入](#Prompt 注入)
-
- [三、Memory 的几种类型](#三、Memory 的几种类型)
-
-
- [Profile Memory(用户画像)](#Profile Memory(用户画像))
- [Preference Memory(偏好)](#Preference Memory(偏好))
- [Episodic Memory(对话记忆)](#Episodic Memory(对话记忆))
- [Semantic Memory(知识偏好)](#Semantic Memory(知识偏好))
-
- [四、Memory 设计的关键难点](#四、Memory 设计的关键难点)
-
- [1. 什么该记?什么不该记?](#1. 什么该记?什么不该记?)
- [2. 记忆更新(冲突问题)](#2. 记忆更新(冲突问题))
- [3. 记忆污染(Hallucination Memory)](#3. 记忆污染(Hallucination Memory))
- [4. 上下文长度限制](#4. 上下文长度限制)
- 五、进阶设计
-
-
- [分层 Memory](#分层 Memory)
- [Memory + RAG + Tool 的融合](#Memory + RAG + Tool 的融合)
-
- 六、一个实际工程实现(简化版)
-
-
- [Step 1:定义结构](#Step 1:定义结构)
- [Step 2:提取 memory](#Step 2:提取 memory)
- [Step 3:存储](#Step 3:存储)
- [Step 4:检索](#Step 4:检索)
- [Step 5:拼 Prompt](#Step 5:拼 Prompt)
-
- 七、总结
大模型是怎么记住使用者偏好的?memory系统是怎么设计的?
本质上涉及"大模型 ≠ 数据库",以及"长期记忆是外挂系统而不是模型本体能力"。
今天我们从原理 → 架构 → 实现细节 → 常见设计权衡,介绍一套完整框架。
一、核心结论
大模型本身不会"记住你"。
所谓"记住用户偏好",通常是通过一个外挂的 Memory System(记忆系统) 实现的,本质是:
把用户信息结构化存储 + 在合适时机喂回模型(Prompt Augmentation)
二、整体架构(Memory System 典型设计)
可以抽象成 4 层:
用户输入 → 信息提取 → Memory存储 → 检索 → 拼接Prompt → 模型生成
具体拆开:
信息提取(Memory Extraction)
从对话中提取"值得记住的信息"
比如:
- "我用 React + TypeScript"
- "我在新加坡工作"
- "我不喜欢太啰嗦的回答"
这里通常会用一个"小模型 / prompt"做分类:
text
判断这句话是否包含用户长期偏好信息,如果是,提取成结构化数据
输出类似:
json
{
"type": "preference",
"key": "tech_stack",
"value": "React + TypeScript"
}
Memory 存储(Memory Store)
通常分两类:
结构化 Memory(强约束)
- KV / JSON
- 用户画像
- 明确偏好
json
{
"language": "zh",
"location": "Singapore",
"tech_stack": ["React", "TypeScript"]
}
优点:稳定、可控
缺点:不灵活
向量 Memory(语义记忆)
- 存 embedding
- 用于语义检索(RAG)
text
"用户曾经问过:如何优化 React 性能"
优点:灵活
缺点:可能噪声大
RAG(Retrieval-Augmented Generation,检索增强生成)是一种通过外部知识源增强大语言模型(LLM)能力的技术。它在生成答案前,先从私有知识库或互联网检索相关信息,再结合这些信息由LLM生成回答。这有效解决了LLM产生的"幻觉"问题,确保答案更准确、即时且透明。
Memory 检索(Retrieval)
每次用户提问时:
两种检索方式:
① 精确检索(结构化)
ts
if (user.pref.language) → 加入prompt
② 语义检索(向量)
text
找和当前问题最相关的历史记忆 Top-K
Prompt 注入
把记忆拼进 prompt:
text
System:
用户信息:
- 使用 React + TypeScript
- 偏好简洁回答
User:
怎么优化前端性能?
这一步决定体验好坏
三、Memory 的几种类型
业内通常会分 4 类:
Profile Memory(用户画像)
- 技术栈
- 地区
- 职业
稳定长期存在
Preference Memory(偏好)
- 回答风格
- 输出格式
- 语言
最核心
Episodic Memory(对话记忆)
- 最近聊了什么
- 上下文
短期(window memory)
Semantic Memory(知识偏好)
- 用户关注领域
- 常问问题类型
用 embedding 存
embedding 是把"语言"变成"数学坐标"。比如一句话:我喜欢用 React 写前端。会被模型编码成一个向量(比如 1536 维):[0.012, -0.98, 0.33, ..., 0.441]。这个向量的特点是:语义相似 → 向量相近;语义不同 → 向量距离远。
机器不擅长理解文字,但擅长算距离,这就是为什么存 embedding。
四、Memory 设计的关键难点
1. 什么该记?什么不该记?
如果全记 → 垃圾爆炸
如果太严格 → 记不住用户
常见策略:
- 只记"长期稳定信息"
- 过滤情绪、一次性问题
2. 记忆更新(冲突问题)
用户可能会说:
"我现在不用 Vue 了,改用 React"
需要:
- 覆盖旧值
- 或版本化
3. 记忆污染(Hallucination Memory)
模型可能误提取:
用户只是举例,但被当成偏好
解决:
- 提高 extraction prompt 精度
- 人工确认(像 ChatGPT 的"是否记住")
4. 上下文长度限制
不能把所有 memory 塞进去
所以必须:
- 检索 Top-K
- 做摘要(memory compression)
五、进阶设计
如果看 Cursor 这种 AI IDE,它的 memory 更复杂:
分层 Memory
Global Memory(用户偏好)
Project Memory(项目规则)
Session Memory(当前对话)
Codebase Memory(代码索引)
Memory + RAG + Tool 的融合
Memory(你是谁)
+
RAG(你在做什么)
+
Tool(你能做什么)
六、一个实际工程实现(简化版)
如果自己做一个 memory system:
Step 1:定义结构
ts
type Memory = {
userId: string
key: string
value: string
type: 'profile' | 'preference'
updatedAt: number
}
Step 2:提取 memory
ts
const extractPrompt = `
请判断用户输入是否包含长期偏好信息...
`
Step 3:存储
- PostgreSQL(结构化)
-
- 向量库(如 Pinecone / Weaviate)
Step 4:检索
ts
const memories = [
...structuredMemory,
...vectorSearch(query)
]
Step 5:拼 Prompt
ts
const prompt = `
用户信息:
${memories.join('\n')}
问题:
${userInput}
`
七、总结
Memory 系统 ≈ 一个"智能的用户画像数据库 + 检索系统 + prompt拼接器"
而不是模型本身的能力。
很多人误以为:
"模型记住我了"
其实是:
系统在每次请求时,把"你是谁"重新告诉模型