记忆与 RAG
Day 12 - RAG Basics
今日目标
能说清清洗、切分、embedding、检索、重排、生成、引用这条完整链路。
学习安排
| 时间 | 模块 | 做什么 |
|---|---|---|
| 0-10 分钟 | 核心概念 | 通读当天术语表,圈出 3 个你最想在工作里用上的概念。 |
| 10-25 分钟 | 阅读输入 | 精读当天章节重点,只抓问题、思路、结论。 |
| 25-45 分钟 | 实践任务 | 动手完成输出模板,必须产出一份可复用产物。 |
| 45-55 分钟 | 追问与反思 | 回答追问练习,标记卡住的概念。 |
| 55-60 分钟 | 复盘与作业 | 整理自检清单,定下明天要复习的一点。 |
核心概念
| 术语 | 中文解释 | 应用场景 |
|---|---|---|
| RAG | 检索增强生成:先检索知识库相关片段,再让模型基于片段生成答案,缓解幻觉与知识过期 | 基于测试文档库回答"如何排查 Nginx 503" |
| document cleaning | 文档清洗:去除页眉页脚、格式标记、乱码等噪声,保留正文 | 从导出的 HTML 测试报告中提取正文 |
| chunking | 切分:把长文档按语义或长度切成小块,作为检索的基本单位 | 把 2000 字排障手册切成 500 字片段 |
| embedding | 嵌入:把文本映射为高维向量,语义相近的文本向量距离更近 | 用向量相似度匹配"CPU 飙高"与"CPU 升高" |
| vector store | 向量库:存储向量并提供相似度检索的数据库 | 用 Chroma / FAISS 存放文档片段向量 |
| retrieval | 检索:根据用户问题召回最相关的文档片段 | 对问题向量做 top-k 相似度查询 |
| rerank | 重排:用更精细的模型对初检结果重新排序,把真正相关的排到前面 | 初检召回 20 条,重排后取前 5 条 |
| top-k | 返回给生成环节的片段数量:太小信息不足,太大会引入噪声并抬高成本 | 常见取值 3-8 条 |
| answer synthesis | 答案合成:模型基于检索片段组织答案,忠实于片段、不越界发挥 | 按片段内容回答并说明依据 |
| citation | 引用:答案标注信息来自哪篇文档、哪个片段,便于用户核验 | 回答末尾附来源文件名与片段编号 |
阅读重点
- 对应章节:第 3 章中 RAG、知识库、结构化索引相关内容
- 关注点:RAG 解决什么问题:模型内置知识有限且会过期,检索外部知识让回答可更新、可核验
- 关注点:为什么不能把所有文档塞进上下文:超出窗口、噪声稀释注意力、成本随 token 上升
- 关注点:Chunk 大小的权衡:太大命中粒度粗、浪费 token;太小上下文不完整、语义断裂
- 关注点:完整链路:retrieval → rerank → answer synthesis → citation,缺一环都不完整
- 补充材料:LangChain 官方 RAG 概念文档,看 loader / splitter / retriever 的模块划分
- 补充材料:向量数据库(Chroma、FAISS 等)官方文档,了解相似度检索的基本用法
理解检查
- RAG 解决了什么问题?请说出它针对模型的两个固有缺陷。
- 为什么不能直接把所有文档塞进上下文?至少给出两个理由。
- Chunk 太大或太小分别有什么问题?各自会体现在检索的哪个环节?
- Top-K 应该如何选择?判断依据是感觉还是可验证的信号?
实践任务
背景:你的团队有 3 篇技术文档(1 篇 Nginx 排查手册、1 篇压测报告模板、1 篇缺陷报告规范),你准备把它们做成一个问答知识库。
- 选好 3 篇文档,为每篇写清"回答哪类问题"
- 按 6 个环节走一遍 RAG 流程:文档清洗、Chunk 切分、Embedding、向量检索、Top-K 重排、生成回答并引用来源
- 每个环节写明:输入、输出、你的具体选择与理由
- 用下方模板输出《RAG 流程设计表》,这是 Day 14 实现 Demo 的施工图
输出模板
# RAG 流程设计:[知识库名称]
## 文档清单
| 文档 | 类型 | 用途 |
|---|---|---|
| [文档名] | [手册/模板/规范] | [回答哪类问题] |
## 1. 文档清洗
- 处理动作:[去掉页眉页脚 / 去除模板占位符 / 修正乱码]
- 保留内容:[正文 / 示例代码 / 结论]
## 2. Chunk 切分
- 策略:[按段落 / 按固定长度]
- 参数:chunk_size=[500],overlap=[50]
- 理由:[说明选择依据]
## 3. Embedding
- 模型选择:[如 text-embedding-3-small]
- 粒度:[按 chunk 逐块向量化]
## 4. 向量检索
- 查询处理:[直接使用原问题 / 先改写为检索语句]
- 参数:top_k=[5]
## 5. 重排
- 方式:[不做 / 用重排模型 / 按关键词加权]
- 取前 N 条:[3]
## 6. 生成与引用
- 生成约束:[只基于片段回答,信息不足时说明]
- 引用格式:[来源文件名 + 片段编号]
示范输出
# RAG 流程设计:Nginx 排查知识库
## 文档清单
| 文档 | 类型 | 用途 |
|---|---|---|
| nginx-cpu-spike.md | 排查手册 | 回答 CPU 升高、WAF 开关、连接数问题 |
| load-test-report-template.md | 模板 | 回答压测报告字段含义 |
| defect-report-guideline.md | 规范 | 回答缺陷单怎么写、优先级怎么定 |
## 1. 文档清洗
- 处理动作:去掉导出的页眉页脚、删除模板占位符、统一代码块缩进
- 保留内容:正文、命令示例、结论与"待验证"标注
## 2. Chunk 切分
- 策略:按标题段落切,超长段落再按固定长度切
- 参数:chunk_size=500,overlap=50
- 理由:按段落切能保住上下文,overlap 防止跨段信息断裂
## 3. Embedding
- 模型选择:text-embedding-3-small
- 粒度:每个 chunk 一个向量,同时存原始文本与来源编号
## 4. 向量检索
- 查询处理:问题去掉"如何""为什么"再检索,如"如何排查 Nginx CPU 升高" → "Nginx CPU 升高 排查"
- 参数:top_k=5
## 5. 重排
- 方式:先按关键词得分加权,再人工抽查前 3 条
- 取前 3 条进入生成
## 6. 生成与引用
- 生成约束:只基于片段回答,片段没提的结论标注"知识库未覆盖"
- 引用格式:[nginx-cpu-spike.md #3] 这类来源编号
追问练习
- Top-K 应该如何选择?试想 top_k=1 和 top_k=50 各会带来什么问题?
- 检索结果相关但不准确时,应该在链路哪一步拦截?重排能解决吗?
- RAG 回答为什么需要引用来源?引用和"可核验性"是什么关系?
- 什么样的文档不适合放进 RAG?包含大量命令输出或宽表格的文档,清洗时要小心什么?
常见误区
- RAG 不等于向量数据库:向量库只是存储与检索环节,清洗、切分、重排、引用、评估与更新缺一不可。
- 文档切完直接丢进向量库不做清洗:页眉页脚、模板占位符会被当成正文检索到。
- chunk_size 随手定:太大命中粒度粗、浪费 token,太小语义断裂、召回差,需要按文档结构调整。
- 以为 embedding 结果天然准确:语义相近不等于事实正确,"CPU 升高"和"CPU 温度升高"是两件事。
进阶扩展
- 混合检索:BM25 关键词检索与向量检索并行,用 RRF 合并结果,兼顾字面与语义。
- 重排模型与精排:初检召回 50-100 条,用 rerank 模型精排到 5 条,命中质量提升明显。
- 知识库更新流水线:文档变更后重新清洗、切分、向量化,并做增量索引,避免回答过期内容。
今日作业
- 完成《RAG 流程设计表》,6 个环节每步写清输入、输出与选择理由。
- 用 3 篇真实文档替换模板里的示例,注明每篇文档回答哪类问题。
- 在流程表里标注一个你觉得最容易出错的环节,并写出应对方案。
- 明天用这份设计去实现最小 Demo(Day 14)。