Ch03: 前置知识检查清单
Part 1: 导读总纲 前置章节:Ch02: 阅读路线图——四条路径任你选 后续章节:Ch04: 记忆的四种类型——从工作记忆到外部记忆
1. 为什么要检查前置知识
先说一个类比。假设你要学做川菜,菜谱上写着”下郫县豆瓣酱 30g,小火煸出红油”。如果你不知道什么是郫县豆瓣酱、不理解”煸出红油”的视觉标准,这一步就做不出来——不是菜谱写得不好,而是你缺了前置知识。
读技术文档也是一样。本导读会涉及 LLM 的上下文机制、向量检索的原理、知识图谱的基本结构等内容。如果你对这些概念完全没有概念,读到相关段落时会觉得”每个字都认识但连起来不懂”——这不是你的理解力问题,而是前置知识缺口。
本章的目的不是让你变成这些领域的专家,而是确认你”够用”——就像学川菜不需要先拿到厨师证,但至少需要知道油盐酱醋各自是什么。
我把前置知识分为三级:
- 必须掌握:没有这些知识,后面的章节读起来会处处卡壳。就像炒菜不会开火——这不是”有点不方便”,是根本做不了。
- 有帮助但不必须:有了更好理解,没有也能跟着走。就像有个好刀工做菜更漂亮,但刀工不好菜也能炒熟。
- 不需要:本导读不会用到的知识。明确列出来是为了消除”我是不是需要先学 XX 再来读”的焦虑。
下面逐一展开。
2. 必须掌握的前置知识
2.1 LLM 基础概念
你不需要知道 Transformer 的注意力机制怎么算,但需要理解三个核心概念。
Token(词元)
LLM 不是按”字”或”词”来处理文本的,而是按 token。一个 token 大致对应 0.75 个英文单词或 0.5-0.6 个中文字。比如”你好世界”可能被分成”你”“好”“世界”三个 token,而”Hello world”可能被分成”Hello”“world”两个 token。具体的分法取决于模型的 tokenizer。
为什么需要:本导读中所有关于”容量”“成本”“延迟”的讨论,单位都是 token。不理解 token 是什么,就无法理解”上下文窗口 128K token 意味着什么”“为什么全量注入 10 万条记忆成本不可接受”这些核心论点。
上下文窗口(Context Window)
每次给 LLM 发消息时,你发出的内容加上 LLM 回复的内容的总 token 数有一个上限,这个上限就是上下文窗口。可以把它想象成一张固定大小的桌子——你能在上面同时摊开的书本数量是有限的。GPT-4 早期版本的上下文窗口是 8K token,Claude 3.5 Sonnet 是 200K,Gemini 1.5 Pro 是 1M。窗口越大,能同时处理的信息越多,但推理成本也越高。
为什么需要:上下文窗口是理解 Agent 记忆系统的最核心概念。记忆系统存在的根本原因就是”上下文窗口有限且会话结束后清空”——如果窗口无限大且持久存在,就不需要外部记忆系统了。本导读中反复出现的”注入”(把记忆塞进上下文窗口)、”压缩”(把记忆提炼以节省窗口空间)、”检索”(从外部存储找到相关记忆再注入窗口)等操作,全都是在和上下文窗口的限制做博弈。
System Prompt(系统提示词)
在用户消息之前,有一个开发者预设的、用户通常看不到的”系统级指令”,就是 system prompt。它告诉 LLM”你是一个什么角色”“你应该遵守什么规则”。比如 ChatGPT 背后的 system prompt 大致是”你是一个有用的助手”,而 Claude Code 背后的 system prompt 包含了整个 CLAUDE.md 的内容——代码规范、项目结构、行为准则等。
为什么需要:本导读讨论的 Profile Memory(画像记忆),其核心载体就是 system prompt。理解 system prompt 是”在对话开始前就注入的、优先级最高的指令”,才能理解为什么 Profile Memory 有”确定性注入”的特性——它不像 User Memory 需要检索,而是在每次对话开始时就被塞进了上下文窗口的最前面。
2.2 Python 基础语法
本导读中的代码示例全部使用 Python。你不需要会写生产级 Python,但需要能读懂以下结构:
- 变量赋值和基本数据类型(str / int / float / bool / list / dict)
- 函数定义(def)和调用
- if / elif / else 条件判断
- for / while 循环
- 类定义(class)和实例化——至少能认出”这是一个类,它有这些方法”
- 列表推导式([x for x in items if condition])
- with 语句(用于文件操作等上下文管理)
- import 语句——理解”从哪里导入了什么”
为什么需要:七个开源项目中,六个用 Python 编写(只有 OpenClaw 用 Go)。当你需要在源码中验证某个设计选择时,读懂 Python 代码是基本前提。本导读中的代码示例会控制在一个简化的范围内,并加注释标注关键行,但不会逐行解释 Python 语法。
如果你目前对 Python 不熟悉,推荐先花 1-2 天过一遍 Python 官方教程的 1-8 章(https://docs.python.org/zh-cn/3/tutorial/),或者用任何中文 Python 入门教程做到”能读懂代码”的程度即可。
2.3 JSON 格式
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,长这样:
{
"user_id": "u123",
"preferences": ["python", "vim"],
"active": true,
"metadata": {
"created_at": "2025-01-15"
}
}
核心规则只有几条:数据是键值对的集合(用花括号),键必须是字符串(用双引号),值可以是字符串、数字、布尔值、数组(用方括号)、嵌套对象或 null。数组内的元素用逗号分隔。
为什么需要:本导读中几乎所有的记忆存储格式都基于 JSON 或其变体。mem0 的每条记忆是一个 JSON 对象,Codex 的 Phase1 输出是结构化 JSON,DB-Agent-Memory 的 MMD 文件也用类似 JSON 的格式描述记忆元数据。理解 JSON 是读懂”记忆长什么样”的基础。
2.4 命令行基础
你需要能在终端中执行以下操作:
cd(切换目录)ls(列出文件)cat(查看文件内容)或less(分页查看)grep(在文件中搜索关键词)python(运行 Python 脚本)pip install(安装 Python 包)git clone(克隆仓库)git log(查看提交历史)
为什么需要:阅读本导读的过程中,尤其是走竞赛路径的同学,你需要在本地克隆开源项目、安装依赖、运行示例、查看源码。这些操作都需要在命令行中完成。如果你只习惯图形界面,建议先花半天熟悉上述命令。macOS 用户打开 Terminal.app 即可,Windows 用户推荐使用 Windows Terminal + WSL。
3. 有帮助但不必须的前置知识
3.1 向量数据库概念
是什么:向量数据库存储的不是”一行一行的文本记录”,而是”一段文本经过 embedding 模型转换后的高维数值向量”。每段文本被压缩成一个固定长度的数字数组(比如 1536 维),语义相近的文本在向量空间中的距离也相近。检索时不是”精确匹配关键词”,而是”找到和查询向量最相近的几个向量”——这就是语义搜索。余弦相似度是衡量两个向量方向一致性的常用指标,值域 [-1, 1],越大表示越相似。
为什么有帮助:mem0、supermemory、Graphiti 都用向量数据库作为核心存储后端。理解 embedding 和余弦相似度,能让你更顺畅地理解”为什么语义搜索能找到’我喜欢 Python’和’钟爱 Python 编程’是相关的”这个核心能力。
本导读中哪里用到:Ch09(mem0 的向量检索)、Ch11(Graphiti 的两阶段检索:向量粗筛 + Cross-Encoder 精排)、Ch13(supermemory 的三流融合检索)、Ch18(设计模式中的”语义检索”模式)。
跳过的影响:不影响理解整体架构和设计选择。当你读到”用向量数据库做语义检索”时,可以把它简化理解为”根据意思相近程度搜索,而不是根据关键词匹配搜索”——这个简化理解对本导读的阅读已经够用。需要深入源码做贡献时再回来补。
3.2 知识图谱概念
是什么:知识图谱用”节点”和”边”来组织信息。节点是实体(人、物、概念),边是关系。比如”小明-住在-北京”“北京-是首都-中国”就是两条边,它们构成了一组”主语-谓语-宾语”的三元组。知识图谱的查询方式不是”搜索关键词”,而是”从一个节点出发,沿着边遍历相邻节点”——这叫图遍历。当你想知道”小明的国籍”,可以从”小明”节点出发,沿着”国籍”类型的边,找到”中国”节点。
为什么有帮助:Graphiti 和 cognee 都以知识图谱为核心存储结构。理解节点、边、三元组的基本概念,能让你理解”为什么 Graphiti 能回答’小明的同事住在哪个城市’这种需要多跳推理的问题”——因为图结构天然支持”沿着关系链条一步步走”。
本导读中哪里用到:Ch11(Graphiti 的时序知识图谱)、Ch12(cognee 的本体论图谱)、Ch13(supermemory 的图遍历检索流)、Ch18(设计模式中的”图谱”模式)。
跳过的影响:不影响理解”为什么用图谱”的设计决策,但会影响你理解”图谱检索具体怎么走”的细节。如果你走竞赛路径且不打算贡献 Graphiti/cognee 相关功能,可以安全跳过。走全景或学术路径建议补上。
3.3 MCP 协议基础
是什么:MCP(Model Context Protocol)是 Anthropic 在 2024 年底推出的开放协议,目的是让 AI 应用和外部工具/数据源之间有一个标准化的通信方式。类比:MCP 之于 AI 工具,相当于 USB 之于电脑——一个标准接口,任何设备(MCP Server)都能插到任何电脑(MCP Client)上用。MCP 定义了三种原语:Tools(让 AI 调用外部函数)、Resources(让 AI 读取外部数据)、Prompts(让 AI 使用预定义的提示模板)。
为什么有帮助:MCP 是记忆系统和 AI 工具之间的标准集成通道。supermemory 已经提供了 MCP Server,任何支持 MCP 的 AI 工具都可以直接连接 supermemory 的记忆库。理解 MCP 的基本概念,能让你理解”为什么记忆系统可以作为 MCP Server 被任意 AI 工具调用”这个集成模式。
本导读中哪里用到:Ch08(DB-Agent-Memory 的 MCP 集成)、Ch13(supermemory 的 MCP Server)、Ch18(设计模式中的”协议桥接”模式)。
跳过的影响:最小。MCP 在本导读中更多作为”集成通道”被提及,而非核心设计决策。你可以把 MCP 简单理解为”一种让 AI 工具调用外部服务的标准接口”,这个理解已经够用。
4. 不需要的前置知识
明确列出”不需要”的知识,是因为很多人在开始读技术文档之前会自我怀疑:”我是不是需要先学 XX 才有资格看这个?”以下三个领域经常被误认为前置知识,但本导读确实不需要。
深度学习训练经验
你不需要知道怎么训练一个 LLM、什么是反向传播、怎么调学习率。本导读讨论的是”怎么在已有 LLM 之上构建记忆系统”,不是”怎么训练更好的 LLM”。LLM 在本导读中是一个黑盒——你只需要知道它接收文本输入、返回文本输出、有上下文窗口限制。不需要打开这个黑盒。
为什么不需要:十个记忆系统没有一个涉及模型训练。mem0 的记忆提取是”让 LLM 输出结构化 JSON”而非微调模型;DB-Agent-Memory 的分层提炼也是”让 LLM 做摘要和归纳”而非训练新模型。所有系统都在”应用层”工作,不碰”模型层”。
分布式系统经验
你不需要知道 CAP 定理、Raft 共识算法、分布式事务怎么实现。本导读讨论的记忆系统都是单机或简单分布式部署,不涉及跨数据中心的强一致性问题。
为什么不需要:当前 Agent 记忆系统的核心挑战在”怎么存、怎么找、怎么忘”,不在”怎么在 100 台机器上保持一致”。mem0 支持的 25+ 种向量后端中,大多数是单机嵌入式数据库。就算用 Neo4j 这样的服务端数据库,也只是单节点部署。分布式一致性是未来的挑战,但不是现在的重点。
数据库内核开发经验
你不需要知道 B+ 树怎么实现、WAL 日志怎么写、MVCC 是什么。本导读中使用向量数据库和图数据库时,把它们当作”黑盒存储引擎”——你只需要知道它支持什么操作(插入、搜索、删除),不需要知道它内部怎么实现这些操作。
为什么不需要:七个开源项目中,只有 Graphiti 深度依赖 Neo4j 的图查询能力,但即使在使用层面,你只需要会写 Cypher 查询语句,不需要理解 Neo4j 的存储引擎。其他项目更是把向量数据库当作 pip install 进来的库使用。本导读的视角是”记忆系统设计者”而非”数据库内核开发者”。
5. 对三类知识边界的进一步说明
上面列了三级知识,但边界不是绝对清晰的。有几个容易混淆的点值得单独说明。
“必须掌握”和”有帮助但不必须”的边界:判断标准是”跳过之后后续章节是否读得下去”。比如 token 和上下文窗口——如果你不知道 token 是什么,Ch04 中”工作记忆 = 上下文窗口里的信息”这个定义你就理解不了。而 embedding——如果你不知道 embedding 是什么,Ch09 中”mem0 用向量数据库做语义检索”你可以简化理解为”按意思搜索”,不影响整体理解。所以前者是必须,后者是有帮助。
“有帮助但不必须”和”不需要”的边界:判断标准是”本导读中是否会出现相关概念”。向量数据库、知识图谱、MCP 都会在多个章节中被讨论——你跳过之后需要用简化理解替代,但至少文档中会出现这些概念。而深度学习训练、分布式系统、数据库内核在本导读中几乎不会被提及——它们根本不在讨论范围内。
“零基础”到底零到什么程度:本导读面向”Agent 记忆领域的零基础”读者,不是”编程的零基础”。如果你完全不会写代码、完全不知道什么是 API,那先补编程基础再来。”零基础”的意思是:你可能从未接触过 Agent 记忆、不知道 mem0 是什么、没听说过 MemGPT 论文——但你至少能用 Python 写一个简单的脚本、知道什么是 API 调用。
6. 前置知识学习资源推荐
如果你发现自己在”必须掌握”的部分有缺口,以下是推荐的学习资源。每个资源我都标注了”只需学哪些部分”,避免你陷入”为了学一个概念而看完一整本书”的低效循环。
LLM 基础概念:
- Anthropic 官方文档的”Key Concepts”页面(https://docs.anthropic.com/en/docs/get-started)——只需看 token 和 context window 两个概念的解释,5 分钟搞定
- OpenAI 官方文档的”Tokens”页面(https://platform.openai.com/tokenizer)——可以实际体验文本如何被分词,直观理解 token
- System prompt 不需要专门学——理解”在用户消息之前预设的指令”这个概念即可,后续在 Ch05 会深入讨论
Python 基础语法:
- Python 官方教程 1-8 章(https://docs.python.org/zh-cn/3/tutorial/)——大约需要 4-6 小时,只需读到”类”那一章
- 如果更喜欢视频,B 站搜索”Python 零基础”任选一个播放量高的即可——目标不是精通,是”能读懂代码”
JSON 格式:
- MDN 的 JSON 教程(https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/JSON)——只需 15 分钟
- 或者直接看本文 2.3 节的示例,然后打开任意一个 .json 文件对照理解
命令行基础:
- 如果完全没接触过命令行,花 2 小时过一遍”命令行一小时入门教程”类型的文章
- macOS 用户确保知道怎么打开 Terminal.app、怎么用 cd 和 ls
- 重点掌握 git clone 和 pip install,这是后续操作最多用到的两个命令
7. 自测清单
以下 10 个问题覆盖了”必须掌握”的全部知识点。如果你能清楚回答每一个,可以直接开始读 Ch04。如果有不确定的,回到对应章节补一下——每个知识点 15-30 分钟就够。
问题 1(token):一句话解释 token 是什么。如果一段中文文本有 1000 个字,大约对应多少 token?
问题 2(上下文窗口):如果一个 LLM 的上下文窗口是 128K token,你和它已经聊了 100K token 的内容,此时你再发一条消息,LLM 还能完整处理你之前的所有对话吗?为什么?
问题 3(system prompt):system prompt 和用户消息在 LLM 看来有什么区别?谁优先级更高?
问题 4(Python 基础):以下代码执行后 result 的值是什么?
items = [1, 2, 3, 4, 5]
result = [x * 2 for x in items if x > 2]
问题 5(Python 基础):以下代码定义了一个什么?它有一个什么方法?方法返回什么?
class MemoryStore:
def __init__(self):
self.memories = []
def add(self, text: str):
self.memories.append(text)
return len(self.memories)
问题 6(JSON):以下 JSON 有一处语法错误,找出来:
{
'name': 'mem0',
'version': 1.0,
'features': ['extraction', 'retrieval'],
'active': True
}
问题 7(JSON):如果要在一个 JSON 对象中嵌套另一个对象,应该用什么语法?写一个包含嵌套对象的 JSON 示例。
问题 8(命令行):你克隆了一个 GitHub 仓库后,想查看仓库的提交历史,应该用什么命令?
问题 9(综合):Agent 记忆系统和上下文窗口的根本区别是什么?为什么上下文窗口不能替代记忆系统?
问题 10(综合):如果 Agent 记忆系统中存储了 500 条记忆,而上下文窗口只能容纳 50 条,Agent 应该怎么决定”每次对话时把哪些记忆放进上下文窗口”?这涉及记忆系统的哪个核心问题?
8. 自测答案参考
不要直接看答案——先自己回答,再看参考。
问题 1:token 是 LLM 处理文本的基本单位,大致对应 0.75 个英文单词或 0.5-0.6 个中文字。1000 个中文字大约对应 1700-2000 个 token。
问题 2:可以,但接近上限。128K token 的窗口意味着所有输入(包括 system prompt + 对话历史 + 你的新消息)加起来不能超过 128K token。已经用了 100K,还剩 28K 的空间。如果新消息加上 LLM 回复的预估长度不超过这个剩余空间,就能完整处理。但如果继续聊下去,迟早会触及上限——这时候要么截断早期的对话内容,要么启用记忆系统把重要信息保存到窗口之外。
问题 3:system prompt 在消息序列中排在最前面,是开发者预设的指令,用户通常看不到也不直接修改。用户消息是用户输入的对话内容。在 LLM 的处理中,system prompt 的优先级通常更高——当两者产生矛盾时,LLM 倾向于遵循 system prompt。这也是为什么 Profile Memory 放在 system prompt 中能确保 Agent 行为的一致性。
问题 4:[6, 8, 10]。列表推导式先过滤 x > 2(得到 3, 4, 5),再对每个元素乘以 2。
问题 5:定义了一个名为 MemoryStore 的类,它有一个 add 方法,该方法接收一个字符串参数 text,将其追加到 self.memories 列表中,并返回列表的新长度。
问题 6:有两处错误。第一,JSON 中的键必须用双引号,不能用单引号——'name' 应该是 "name"。第二,JSON 中的布尔值必须小写——True 应该是 true。
问题 7:嵌套对象就是值本身是一个用花括号包裹的键值对集合。示例:
{
"user": {
"name": "小明",
"preferences": ["python", "vim"]
}
}
问题 8:git log。如果想看简洁版,用 git log --oneline。
问题 9:根本区别在于持久性和容量。上下文窗口是会话内的短期存储——对话结束后清空,容量有硬上限。记忆系统是跨会话的持久存储——对话结束后信息仍然存在,容量不受上下文窗口限制。上下文窗口不能替代记忆系统的原因有三个:一,窗口容量有限,不能把所有历史信息全塞进去;二,窗口有”注意力稀释”问题,中间位置的信息容易被忽略;三,窗口无法跨会话保留,每次开新对话都要从头开始。
问题 10:这是一个检索问题——Agent 需要从 500 条记忆中找出和当前对话最相关的 50 条注入上下文窗口。这涉及记忆系统的第二个核心问题:”怎么组织和检索”。不同的系统给出不同的答案:mem0 用语义搜索找到和当前话题最相近的记忆,DB-Agent-Memory 用分层结构优先注入高层精炼记忆,Claude Code 用 LLM 自身来判断哪些记忆相关,Codex 则在会话开始前就由 AI 预选好了相关记忆。这些不同的检索策略是本导读后续章节的核心对比维度之一。
9. 准备好了吗
如果你通过了自测清单(10 个问题都能清楚回答),恭喜,你已经具备了阅读本导读的全部前置知识。
如果你在部分问题上卡住了,也不需要焦虑——回到对应的章节补一下,每个知识点最多 30 分钟。关键不是”全都会了才开始”,而是”确保不会因为前置知识缺口而反复卡壳”。
还有一点需要说明:本导读本身也在持续补充前置知识的解释。当某个概念第一次出现时,我会用类比方式给出简要说明,并在注释中标注”如果你熟悉 XX 概念,可以跳过这段”。所以即使你的前置知识不是 100% 完美,也可以先开始读——遇到不理解的地方再回来补。
10. 本章小结
回顾本章的核心要点:
- 前置知识分为三级:必须掌握(缺了读不下去)、有帮助但不必须(有了理解更深,没有也能走)、不需要(明确排除,消除焦虑)
- 必须掌握的四项知识:LLM 基础概念(token / 上下文窗口 / system prompt)、Python 基础语法、JSON 格式、命令行基础
- 有帮助但不必须的三项知识:向量数据库概念(embedding / 余弦相似度)、知识图谱概念(节点 / 边 / 三元组)、MCP 协议基础
- 不需要的三项知识:深度学习训练经验、分布式系统经验、数据库内核开发经验
- 每个知识点的判断标准是”跳过后的影响范围”,不是”学了有没有用”
- 10 个自测问题覆盖必须掌握的全部知识点,全部答对可以直接开始 Ch04
下一章我们正式进入 Part 2——从四种记忆类型开始,建立理解整个导读的分类框架。
导读目录:README.md 上一章:Ch02: 阅读路线图——四条路径任你选 下一章:Ch04: 记忆的四种类型——从工作记忆到外部记忆