第 4 章 · 第 19 讲 · 16:10
本集讲 Agent 工程里最容易被低估的一层——记忆与检索。三个核心问题:
为什么产品经理要关心:这一层直接决定三件事——Agent 能聊多久才崩、记不记得用户的历史偏好、给出的答案能不能追责。这三个都是产品体验问题,不是工程细节。
| 层 | 本集内容 | 关键判断 |
|---|---|---|
| 上下文 | 四层压缩(60% / 75% / 85% / 95%) | 信息从哪一层开始丢 |
| 长期记忆 | 向量检索 + topK / minScore | 召回数量本质上是预算参数 |
| 表示 | Embedding → ANN → Top-K | 写入与查询必须同模型、同维度、同 metric |
| 存储 | Collection / Schema / Entity / Index | Search 按含义找,Query 按条件取 |
| 应用 | 切分 / 元数据 / 过滤 / 融合 / 引用 | 权限必须在检索阶段执行 |
| 验收 | Recall@K / 忠实度 / 引用准确率 | 只看「回答像不像」会掩盖召回失败 |
注意:你能用的不是窗口全部,而是窗口减去回复空间。这个差值在设计长对话产品时经常被忘掉。
| 层 | 触发 | 动作 | 损失 | 示例 |
|---|---|---|---|---|
| ① 裁剪 Snip | 120K(60%) | 删早期工具返回的超长原始数据,只留摘要 | 用户完全无感 | 天气接口 1200 Token JSON → 「北京明日多云 12-20°C」(80 Token) |
| ② 微压缩 MicroCompact | 150K(75%) | 早期长对话 → 简短摘要 | 轻微损失,关键信息保留 | 「那个文件不是 PDF,我要 Word,标题改成…」→ 「用户要求换格式、改标题、调配色」 |
| ③ 折叠 Collapse | 170K(85%) | 多轮早期对话 → 一条摘要消息 | 细节丢失,主线保留 | 第 1–8 轮(12 条消息,4200 Token)→ 「React + TS 项目,当前修改报表页」(350 Token) |
| ④ 紧急 AutoCompact | 190K(95%) | 只保留 system + 全局摘要 + 最近 3 轮 | 明显损失,但避免崩溃 | 20 轮(38 条消息,18000 Token)→ 2500 Token |
短期记忆 = 你的桌面(上下文窗口,容量有限)
长期记忆 = 你的档案柜(向量数据库,需要时检索放到桌面)
演示配置:8 条历史记忆 / 维度 768 / topK 5 / minScore 0.3——这就是一套长期记忆的全部配置。
类比的下一层:档案柜里的东西必须先放到桌上才能被用到——检索这个动作本身就占用上下文。召回 5 条就占 5 条的上下文。召回多少表面是检索参数,本质是预算参数。
原始内容(「退款多久到账?」/ 文档 / 图片)
↓ Embedding:同一模型编码成固定长度浮点向量
ANN 搜索(近似最近邻,用少量精度换数量级速度)
↓
Top-K 文档 → 交给应用或大模型
注意:Embedding 捕捉的是统计语义,不是可靠的事实判断。
| Metric | 怎样更相似 | 适用场景 |
|---|---|---|
| L2(欧氏距离) | 越小越近 | 关注绝对空间距离 |
| IP(内积) | 越大越近 | 向量模长会影响分数 |
| COSINE | 越大越近 | 关注方向;文本语义常用 |
关键约束:写入与查询必须使用同一 Embedding 模型、同一预处理方式、同一维度;建索引与搜索的 metric 也必须一致。否则「有结果」不等于「结果可信」。
| 职责 | 说明 |
|---|---|
| 存 | 向量 + 主键 + 来源/类别/时间等标量字段 |
| 找 | 向量索引 Top-K 搜索,并用标量 filter 缩小范围 |
| 管 | collection、索引、加载与数据生命周期 |
它不替你生成 Embedding,也不替大模型回答。 把它当成会思考的黑箱,是很多项目失望的起点。
| 概念 | 可类比为 | 职责 |
|---|---|---|
| Collection | 表 | 一组具有相同 Schema 的 Entity |
| Schema / Field | 表结构 / 列 | 约束主键、向量维数与标量类型 |
| Entity | 行 | 一条业务对象;主键必须能稳定定位 |
| Index | 索引 | 加速向量近邻搜索 |
一条知识库 Entity
{
"id": 42, // 主键:更新、删除、追踪
"vector": [0.12, ...], // 向量字段:用于 Search
"text": "退款通常 3 天到账",
"category": "refund", // 标量字段:用于 Filter / Query
"active": true
}
| 动作 | 输入 | 回答的问题 |
|---|---|---|
| Search | 查询向量 + 可选 filter | 语义上谁最像 |
| Query | 主键或标量表达式(不传向量) | 哪些记录满足条件 |
| Load | — | 把索引与数据准备到查询节点;创建成功 ≠ 已可搜 |
| Index | 优势 | 代价 / 场景 |
|---|---|---|
| FLAT | 精确、无需训练 | 全量比较;小数据集或 Recall 基线 |
| IVF_FLAT | 通过聚类缩小候选 | 需调 nlist / nprobe;数据量较大、成本可控 |
| HNSW | 高 Recall、低延迟 | 占更多内存、建索引较慢;在线检索常用 |
生命周期:定义 Schema → 创建 Collection → 写 Entity → 建 Index → Load → Search / Query
active=false 做逻辑删除并在 filter 中排除;物理删除后空间回收依赖 Compaction,不会立刻缩小文件。Search 返回「可能相关的片段」,RAG 还要把它们变成有来源、有边界、能被评测的回答依据。
最容易被跳过的是第 3 步。拿到结果就全塞给模型,塞得越多越容易被无关片段带偏——控制长度不只是省钱,更是提高信噪比。
| 环节 | 要点 |
|---|---|
| 切分 | 按标题、段落、语义边界切 chunk,保留少量 overlap。太大噪声多,太小上下文断裂——直接决定引用能否「点开对得上」 |
| 元数据 | 保存 source_id、版本、章节、租户、ACL、更新时间。引用、过滤、删除都依赖它 |
| 版本 | 内容或 Embedding 模型变化要重算;蓝绿 collection 切换避免新旧向量混用 |
| 方法 | 解决什么 | 注意 |
|---|---|---|
| 标量 Filter | 租户、权限、时间、语言约束 | 权限必须在检索阶段执行,不能只靠 Prompt |
| 向量 + 关键词混合 | 兼顾语义与产品型号、错误码等精确词 | 两种分数尺度不同,不宜直接相加 |
| RRF 融合 | 按排名融合多路结果 | 简单稳健;再用 reranker 精排候选 |
| Partition / TTL | 隔离热点、清理过期数据 | 扩展能力,先用清晰的 collection 与 filter 设计 |
| 指标 | 回答的问题 |
|---|---|
| Recall@K | 该找的找到了吗 |
| MRR / nDCG | 找到的排得对吗 |
| 过滤正确性 | 不该出现的有没有被挡住 |
| 指标 | 回答的问题 |
|---|---|
| 忠实度 | 回答有没有超出证据 |
| 引用准确率 | 来源对不对得上 |
| 拒答率 | 找不到时敢不敢说不知道 |
最该记住的一句:只看「回答像不像」会掩盖召回失败。 答案看起来很顺,可能只是模型自己补的,根本没用上检索到的东西。
验收时一定先看检索层指标。召回率本身就低的话,再怎么调提示词,都是在给一个空档案柜擦灰。
四层压缩是防洪堤:先裁工具返回,再压早期对话,最后才动 system。知道哪一层先触发,才知道信息从哪开始丢——这是产品侧的必答题。
Prompt 是建议,filter 是硬约束。把安全边界交给一个概率模型,是这个架构里最危险的决定。
在小规模数据上用精确索引跑一遍,得到 Recall 基线,再比较 HNSW 的召回与延迟。没有基线,调优就是盲调。
切太大引用没法精确,切太小语义断裂。这个参数看起来是工程细节,实际上决定用户敢不敢信你的引用。
答案漂亮不代表检索成功。先测 Recall@K 与过滤正确性,再测忠实度与引用准确率——顺序反了,问题会被漂亮话术盖住。
Q:为什么不能把上下文窗口做得更大来避免压缩?
窗口再大也是有限的,且成本随长度上升。压缩解决的是「单位窗口承载多少对话量」,不是「把窗口做大就行」。
Q:语义搜索能替代关键词搜索吗?
不能。产品型号、错误码、人名这类精确词恰恰是语义搜索最容易漏的,所以要做混合检索。
Q:为什么我搜到了结果,答案还是不对?
先确认召回率。也可能是写入与查询的模型/维度/metric 不一致——有结果不等于结果可信。
Q:Load 是什么,为什么搜不到?
Load 把索引与数据准备到查询节点。创建成功 ≠ 已可搜,资源不足时也需要规划释放。
Q:删掉一条记忆后,空间会立刻释放吗?
不会。物理删除后空间回收依赖 Compaction。需要可撤销时,建议先做逻辑删除并在 filter 中排除。
这套系统里最容易出问题的,从来不是模型,而是边界:谁可以看、找不找得到、错了能不能追责。
来源:xueai.miyang.cn(小山学堂 · 洛小山《学 AI 产品,从入门到精通》)
本页文字与音频为基于小山学堂原课程的二次演绎版本,仅供学习交流使用。