犀牛鸟 2026 研究笔记 estelledc.github.io

Ch03: 前置知识检查清单

Part 1: 导读总纲 前置章节:Ch02: 阅读路线图——四条路径任你选 后续章节:Ch04: 记忆的四种类型——从工作记忆到外部记忆


1. 为什么要检查前置知识

先说一个类比。假设你要学做川菜,菜谱上写着”下郫县豆瓣酱 30g,小火煸出红油”。如果你不知道什么是郫县豆瓣酱、不理解”煸出红油”的视觉标准,这一步就做不出来——不是菜谱写得不好,而是你缺了前置知识。

读技术文档也是一样。本导读会涉及 LLM 的上下文机制、向量检索的原理、知识图谱的基本结构等内容。如果你对这些概念完全没有概念,读到相关段落时会觉得”每个字都认识但连起来不懂”——这不是你的理解力问题,而是前置知识缺口。

本章的目的不是让你变成这些领域的专家,而是确认你”够用”——就像学川菜不需要先拿到厨师证,但至少需要知道油盐酱醋各自是什么。

我把前置知识分为三级:

下面逐一展开。


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,但需要能读懂以下结构:

为什么需要:七个开源项目中,六个用 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 命令行基础

你需要能在终端中执行以下操作:

为什么需要:阅读本导读的过程中,尤其是走竞赛路径的同学,你需要在本地克隆开源项目、安装依赖、运行示例、查看源码。这些操作都需要在命令行中完成。如果你只习惯图形界面,建议先花半天熟悉上述命令。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 基础概念

Python 基础语法

JSON 格式

命令行基础


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"]
  }
}

问题 8git log。如果想看简洁版,用 git log --oneline

问题 9:根本区别在于持久性和容量。上下文窗口是会话内的短期存储——对话结束后清空,容量有硬上限。记忆系统是跨会话的持久存储——对话结束后信息仍然存在,容量不受上下文窗口限制。上下文窗口不能替代记忆系统的原因有三个:一,窗口容量有限,不能把所有历史信息全塞进去;二,窗口有”注意力稀释”问题,中间位置的信息容易被忽略;三,窗口无法跨会话保留,每次开新对话都要从头开始。

问题 10:这是一个检索问题——Agent 需要从 500 条记忆中找出和当前对话最相关的 50 条注入上下文窗口。这涉及记忆系统的第二个核心问题:”怎么组织和检索”。不同的系统给出不同的答案:mem0 用语义搜索找到和当前话题最相近的记忆,DB-Agent-Memory 用分层结构优先注入高层精炼记忆,Claude Code 用 LLM 自身来判断哪些记忆相关,Codex 则在会话开始前就由 AI 预选好了相关记忆。这些不同的检索策略是本导读后续章节的核心对比维度之一。


9. 准备好了吗

如果你通过了自测清单(10 个问题都能清楚回答),恭喜,你已经具备了阅读本导读的全部前置知识。

如果你在部分问题上卡住了,也不需要焦虑——回到对应的章节补一下,每个知识点最多 30 分钟。关键不是”全都会了才开始”,而是”确保不会因为前置知识缺口而反复卡壳”。

还有一点需要说明:本导读本身也在持续补充前置知识的解释。当某个概念第一次出现时,我会用类比方式给出简要说明,并在注释中标注”如果你熟悉 XX 概念,可以跳过这段”。所以即使你的前置知识不是 100% 完美,也可以先开始读——遇到不理解的地方再回来补。


10. 本章小结

回顾本章的核心要点:

下一章我们正式进入 Part 2——从四种记忆类型开始,建立理解整个导读的分类框架。


导读目录:README.md 上一章:Ch02: 阅读路线图——四条路径任你选 下一章:Ch04: 记忆的四种类型——从工作记忆到外部记忆