FDE W2D6 学习手册 · 基础 RAG
W2 Day6 · A 级(必须掌握,面试核心)· 4h · 学完能讲透"RAG 从文档到答案的完整链路 + BM25/向量检索差异 + 引用溯源与无答案拒答"
本日定位:W2 前三天讲 MCP(接工具/数据),今天讲"数据怎么进来并被检索"——即 RAG(检索增强生成)的基础。这是企业知识库(保险知识库)的底座,也是 FDE 面试 A 级核心。重点在完整链路与"为什么需要引用/拒答"。
学完能回答:① RAG 从文档到答案的完整链路(解析→切分→Embedding→检索→拼接→生成);② BM25 和向量检索的区别、为什么需要引用溯源和无答案拒答。
使用方法:通读原理 → 重点看「工程含义」「面试话术」「易错点」→ 做自测清单 → 配合《W2D6 评测题.md》。选中不熟的词可标注(左下★重要 / 右下📌待查)。
一、为什么需要 RAG:从"模型记不住"到"随时查"
LLM 的知识停在训练截止日,且无法知道企业内部(保单条款、特药目录、理赔规则)的私有事实。若纯靠"模型记忆"回答,会幻觉。RAG 的思路:把知识外置到检索系统,回答时先查相关资料,再让模型"基于资料答",从而可控、可溯源、可更新。
一句话定位:RAG = 检索(Retrieval)+ 增强(Augmentation,把资料拼进 prompt)+ 生成(Generation)。对医保:把保单条款、特药目录、政策条文做成可检索知识库,理赔问答"基于条文答",而非模型瞎编。
工程含义:RAG 把"知识更新"从"重训模型"变成"更新文档+重建索引",成本为 1/N。医保条款常变,RAG 是性价比最高的解法;同时每条答案可挂引用,满足合规审计。
RAG 解决"模型记不住私有/最新知识"的问题——回答前先检索相关资料拼进 prompt,再生成。它是企业知识库(保险知识库)的底座,让答案可控、可溯源、可更新,避免幻觉。
① RAG 不是"银弹"——检索不准,生成照样错(garbage in garbage out)。② RAG 不替代模型能力,只是"喂资料",资料之外的推理/计算仍靠模型。③ 别以为"接了向量库就完事",链路每一环都影响最终质量。
二、RAG 完整链路总览(达标线①铺垫)
文档 → PDF解析 → 文本清洗 → Chunk切分 → Embedding向量化 → 写入向量库(ES)
↓ 查询时
问题 → Embedding → 检索(BM25/向量/混合) → 拼接上下文 → 生成(低T) → 答案+引用
链路分两段:离线建库(解析→清洗→切分→向量化→入库)和在线查询(问题向量化→检索→拼接→生成)。面试常要求"从文档讲到答案",就是这条链。
RAG 完整链路:离线把文档解析→清洗→切分→Embedding→入库;在线把问题 Embedding→检索→拼接上下文→低 T 生成→带引用答案。能一口气讲完这条链,是 RAG 面试的及格线。
工程上离线建库是"一次性成本"(可批处理、可增量),在线查询要低延迟。医保知识库通常夜间增量重建索引,白天查询走混合检索。每一环都要有质量监控(解析丢失率、切分覆盖率)。
① 别漏掉"离线建库"——很多人只讲在线检索,链路不完整。② Chunk 切分质量直接决定检索上限,"切烂了"后面再好也救不回。③ 生成要用低 T(0.1~0.3),RAG 问答要稳不要飘。
三、PDF 解析:从文件到文本
3.1 难点
保单/条款多是 PDF(扫描件+表格+多栏),解析难点:扫描件要 OCR、表格结构易乱、页眉页脚噪声、公式/特殊符号。
3.2 工具与策略
| 类型 | 工具 | 适用 |
| 文本型 PDF | PyPDF / pdfplumber / unstructured | 原生可选中文本 |
| 扫描件 | OCR(如 PaddleOCR / 第5天 OCR Tool) | 图片型,需识别 |
| 复杂排版 | unstructured / 版面分析 | 多栏、表格、图表 |
医保场景:保单 PDF 常是扫描件,要先 OCR(接第5天 OCR Tool)再解析;条款表格多,要用能保表格结构的解析器,否则"适应症/限制"对齐错会导致检索错。解析阶段要保留页码/段落号作为后续引用锚点。
PDF 解析 = 把文件变文本,难点在扫描件(OCR)、表格、多栏。文本型用 pdfplumber/unstructured,扫描件先 OCR。医保保单多为扫描件+表格,要保结构并留页码作引用锚点。
① 解析丢失内容(尤其表格/页脚条款)是 RAG 质量头号杀手——"资料里没有,模型只能编"。② 别只用最朴素 PyPDF 提取扫描件,会得到空文本。③ 解析要保留来源位置(页码/段落),否则后面无法引用溯源。
四、文本清洗
解析出的原始文本含噪声,需清洗后再切分:
- 去页眉页脚、页码、重复标题。
- 合并被换行打断的句子(避免句中间切坏)。
- 统一全半角、繁简、空白符。
- 修正 OCR 明显错字(谨慎,别改语义)。
- 保留结构标记(标题层级、表格分隔)。
医保清洗要保留"条款编号/药品名称"等关键实体不被破坏,且表格清洗后保持"字段-值"对齐,否则检索到"奥希美替尼 报销上限"会错位。清洗规则要可配置、可回滚。
文本清洗 = 去噪(页眉页脚/页码/重复标题)、合并断句、统一格式、保结构。核心是"去噪声但不伤语义"——医保要保条款编号与药品名对齐,清洗规则可配置可回滚。
① 清洗过度会删掉关键实体(如把"第3.2条"当噪声删了),导致引用丢失。② 别用正则暴力删行,易误删有效内容。③ 清洗要在切分前、Embedding 前完成,顺序错了白做。
五、Chunk 切分策略
5.1 为什么要切分
Embedding 模型有长度上限,且整篇文档向量会"语义平均"丢失细节;检索要"命中局部相关段落",所以要把文档切成 chunk。
5.2 常见策略
| 策略 | 做法 | 优点 | 缺点 |
| 固定长度 | 按字符/ token 数硬切 | 简单 | 切断语义、跨句 |
| 按段落/标题 | 依结构边界切 | 保语义完整 | 长度不均 |
| 递归切分 | 按 \n\n、\n、句 逐级回退 | 兼顾语义与长度 | 实现稍复杂 |
| 滑动窗口 | 带 overlap 的窗口 | 减少边界丢失 | 有冗余 |
5.3 关键参数
- chunk_size:太大→语义稀释、超长;太小→上下文割裂。常用 300~800 token。
- overlap:相邻 chunk 重叠,避免关键信息卡在边界。常用 10%~20%。
- 元数据:每个 chunk 存来源(文档名/页码/段落号),供引用溯源。
医保条款切分建议"按条款编号递归切 + overlap",保证一条"适应症/限制"完整落在一个 chunk,且带条款号元数据。切分策略要针对语料评测(看检索召回率),不是拍脑袋定。
Chunk 切分:常用"递归切分(按段落/标题逐级回退)+ overlap 重叠"。核心是保语义完整、带元数据(文档/页码/段落号)。chunk_size 太大语义稀释、太小割裂,常用 300~800 token,overlap 10~20%。
① 固定长度硬切最易"把一句话砍成两半",检索命中半句白搭。② 切分后必须带来源元数据,否则无法引用溯源(见 s11)。③ chunk_size 没有万能值,要按语料+Embedding 模型评测定,别照抄别人参数。
六、Embedding 向量化
6.1 原理
Embedding 模型把文本映射成高维稠密向量(如 768/1024 维),语义相近的文本向量距离近。检索时把"问题向量"与"chunk 向量"比相似度(余弦/点积)找最相近的。
similarity(q, c) = cos(q_vec, c_vec) = (q_vec · c_vec) / (|q_vec|·|c_vec|)
6.2 工程要点
- 同模型同维度:建库与查询必须用同一 Embedding 模型,否则向量空间不一致,相似度无意义。
- 中文模型:医保用中文语料,选中文优化模型(如 bge/m3e/ERNIE 等),效果远胜英文模型。
- 维度与性能:维度越高表达力越强但存储/算力越大;kNN 检索靠向量索引(HNSW)。
医保落地:用中文 Embedding 模型对条款 chunk 向量化,存入 Elasticsearch 的 dense_vector 字段,建 HNSW 索引加速 kNN。模型版本要钉死,换模型必须全量重建索引(否则新旧向量不可比)。
Embedding 把文本变向量,语义近则向量近;检索用余弦相似度找最近 chunk。工程铁律:建库与查询必须同模型同维度;中文语料用中文模型;换模型要全量重建索引。
① 建库和查询用不同 Embedding 模型 = 灾难(向量空间不同,相似度乱套)。② 别用通用英文模型跑中文医保条款,召回率差。③ 模型升级后只增量更新部分索引,新旧向量混用会出错——要全量重建或严格版本隔离。
七、检索:BM25 vs 向量检索
| 维度 | BM25(稀疏/关键词) | 向量检索(稠密/语义) |
| 匹配方式 | 词面精确匹配(TF-IDF 变体) | 语义相似(向量距离) |
| 优势 | 精确词、专有名词、编号命中准 | 同义/改写/语义近也能召回 |
| 劣势 | 同义词/表述不同则漏召回 | 精确编号/罕见词可能不敏感 |
| 医保例子 | "奥希美替尼"精确出现才召回 | "肺癌靶向药"也能召回相关条款 |
BM25 基于词频与逆文档频率,对"保单号、药品名、条款编号"这类精确词极准;向量检索能理解"表述不同但意思一样"。医保里两者都重要:编号/药名靠 BM25,语义问法靠向量。
BM25=关键词精确匹配(TF-IDF 变体),擅长专有名词/编号;向量检索=语义相似匹配,擅同义改写。医保里"奥希美替尼"靠 BM25 精确命中,"肺癌靶向药"靠向量语义召回。两者互补。
① 别以为"向量检索全面碾压 BM25"——对精确编号/罕见药名,BM25 往往更准。② 向量检索也有"语义近但答非所问"的误召回。③ 现代 RAG 几乎都用混合检索,不是二选一(见 s9)。
八、Elasticsearch 向量检索(kNN)
Elasticsearch 同时支持 BM25(默认 text 字段)与向量 kNN 检索(dense_vector 字段 + HNSW 索引)。用 knn 查询做近似最近邻:
{
"knn": {
"field": "embedding",
"query_vector": [0.12, -0.03, ...],
"k": 10,
"num_candidates": 100
}
}
- k:返回最近邻数量(最终取几条)。
- num_candidates:每分片候选数,越大越准越慢。
- HNSW:图索引,近似检索,速度快、召回略低于暴力但工程可用。
医保落地:保单条款/特药目录存 ES,dense_vector 建 HNSW;查询时把问题向量化做 knn,同时用 BM25 查药名/编号,两路结果融合(s9)。ES 一个引擎兼顾两种检索,运维成本低。
ES 用 dense_vector 字段 + HNSW 索引做 kNN(近似最近邻),查询传 query_vector 与 k/num_candidates。ES 一个引擎同时支持 BM25 与向量,医保知识库常用它兼顾两种检索。
① kNN 是"近似"检索,num_candidates 太小会漏召回;要按数据量调。② dense_vector 维度须与 Embedding 模型一致,否则写入失败。③ HNSW 是图索引,写入期建图有开销,大批量建库要调批量参数。
九、混合检索(Hybrid Search)
把 BM25 与向量检索结果融合,兼顾精确词与语义:
hybrid = fuse( BM25_topN , vector_topN ) → rerank → topK 上下文
- RRF(Reciprocal Rank Fusion):按各自排名倒数求和,不依赖分数量纲,简单稳健。
- 加权求和:把两路分数归一化后加权(需调权重)。
- 可选 rerank:融合后再用 cross-encoder reranker 精排,进一步提升精度。
医保场景:用户问"我有糖尿病能吃这个特药报销吗",BM25 命中"糖尿病/特药"关键词,向量命中"慢病用药限制"语义,融合后既准又全。生产用 RRF 融合 + 可选 rerank,成本与效果平衡。
混合检索 = BM25 + 向量两路结果融合,兼顾精确词与语义。常用 RRF(按排名倒数融合,不依赖分数量纲);可再加 cross-encoder rerank 精排。医保里"关键词+语义"互补,召回更全更准。
① 两路分数量纲不同,直接加权求和要先归一化,否则一路淹没另一路。② 别只取单路 top1 就生成,容易漏关键信息。③ rerank 有额外算力成本,要按延迟预算决定用不用。
十、拼接上下文(Prompt 组装)
检索到 topK chunk 后,把它们与问题拼成生成 prompt。要点:
- 带引用标记:每段上下文标注来源([1] 条款X第3条 / [2] 特药目录...),供模型引用与下游溯源。
- 控制总量:chunk 数 × 长度 ≤ 上下文窗口,留足生成空间。
- 指令明确:要求"仅基于以下资料回答,资料没有就拒答,并标注引用"。
- 去重/排序:相似 chunk 去重,按相关度排序提升信噪比。
医保生成 prompt 模板:"你是特药理赔审核员,仅依据下列带编号资料回答;每条结论标注引用编号;资料未覆盖则输出 should_refuse=true。"拼接质量决定生成质量——垃圾上下文进,垃圾答案出。
拼接 = 把 topK chunk 带引用标记拼进 prompt,指令明确"仅基于资料、无则拒答"。控制总量不超窗口、去重排序提信噪比。上下文质量直接决定答案质量(garbage in garbage out)。
① 不标引用 = 后面没法溯源,也难逼模型"贴着资料答"。② 拼太多无关 chunk 会稀释重点、甚至引偏模型。③ 指令不写"无则拒答",模型易硬编——必须显式约束(见 s12)。
十一、引用溯源(Citation / Grounding)
要求模型每条结论附来源引用(对应哪个 chunk/页码/条款号),生成后系统可校验"答案是否真有资料支撑"。
答案 + 引用[1][2] → 校验引用是否真实存在且支持结论 → 不可证的结论标记为不确定/拒答
- 为什么需要:① 防幻觉(无引用=可能编);② 合规(理赔结论要能回溯条款);③ 可审计(客户质疑时可定位依据)。
- 实现:chunk 带元数据(文档/页码/段落),prompt 要求标 [n],后处理校验 [n] 是否真在检索结果里。
医保理赔是"钱+合规"场景,引用溯源是硬需求:每句赔付/拒付结论都要能点开看"依据哪条条款"。系统层要做引用校验——模型标了 [3] 但检索结果没 [3],就是幻觉信号,要拦截。
引用溯源 = 要求结论附来源(条款号/页码),并系统校验引用真实性。为什么需要:防幻觉、合规审计、客户可质疑。医保理赔每句结论都要能回溯条款,引用不可证即拦截。
① 模型可能"编造引用编号"——标了 [3] 但检索里没有,必须后处理校验,不能盲信。② 引用只证明"有这段资料",不证明"结论正确",还要看资料是否真支持。③ 不保留 chunk 元数据(s5)就做不了溯源——链路要贯通。
十二、无答案拒答(Refusal)
企业知识库场景,资料没覆盖时应当拒答,而非硬编。机制:
- prompt 明确:"资料未覆盖则输出 should_refuse=true 并说明缺什么"。
- 检测拒答信号(should_refuse 字段 / "未查询到相关条款"等)。
- 评测集专门留
should_refuse=true 的 case,测拒答准确率。
医保:"患者问某进口药报销,但知识库只有国产目录"→ 应拒答"未查询到该药报销依据",而非编一个。拒答准确率是 RAG 评测核心指标——"硬编"比"不知道"危害大(误导理赔决策)。
无答案拒答 = 资料没覆盖就明确说"不知道/未查询到",不硬编。机制:prompt 约束 + should_refuse 字段 + 评测专测拒答 case。医保里"编"比"拒"危害大,拒答准确率是核心指标。
① 别只追求"答得多",拒答能力更难更关键——模型爱"自信地编",要专门 prompt+评测逼它承认不知道。② 检测拒答别只靠关键词,模型会换说法("未查询到"),要结合 should_refuse 字段。③ 拒答也要带引用/说明缺什么,方便补资料。
十三、面试达标线①:RAG 从文档到答案的完整链路
解析(PDF/OCR) → 清洗(去噪保结构) → 切分(递归+overlap+元数据) → Embedding(同模型同维度) → 入库(ES dense_vector/HNSW)
查询:问题 Embedding → 检索(BM25/向量/混合) → 拼接(带引用) → 生成(低T) → 答案+引用
| 环节 | 必须能讲清 |
| 离线建库 | 解析→清洗→切分→Embedding→入库,每环质量影响上限 |
| 在线查询 | 问题向量化→检索→拼接→低T生成→带引用答案 |
| 关键参数 | chunk_size/overlap、同模型同维度、k/num_candidates |
| 医保例 | 保单PDF(OCR)→条款chunk→ES→混合检索→理赔问答带引用 |
达标线①核心:能一口气讲完"解析→清洗→切分→Embedding→入库(离线);问题向量化→检索→拼接→生成(在线)"全链路,并说清每环为什么、关键参数与医保例子。这是 RAG 面试及格线。
十四、面试达标线②:BM25 vs 向量 + 为何要引用与拒答
14.1 BM25 与向量检索的区别
| BM25 | 向量检索 |
| 匹配 | 词面精确(TF-IDF 变体) | 语义相似(向量距离) |
| 擅长 | 专有名词/编号/药名 | 同义改写/语义近 |
| 结论 | 两者互补,用混合检索 | — |
14.2 为什么需要引用溯源与无答案拒答
- 引用溯源:防幻觉(无引用=可能编)、合规审计(理赔结论回溯条款)、可质疑。
- 无答案拒答:"资料没有就拒答"比"硬编"安全;拒答准确率是 RAG 核心评测指标。
达标线②核心:BM25 精确词、向量语义,互补用混合;引用溯源为防幻觉+合规,拒答为避免硬编误导。医保"编"比"拒"危害大,两者都是生产 RAG 的必做项。
十五、W2D6 自测清单
- 能说清 RAG 解决什么问题(模型记不住私有/最新知识、防幻觉)。
- 能一口气讲完完整链路:解析→清洗→切分→Embedding→入库 + 问题向量化→检索→拼接→生成。
- 能说明 PDF 解析难点(扫描件/OCR/表格)与医保保单场景的特殊性。
- 能列出文本清洗的常见操作,并说明"去噪不伤语义"。
- 能讲清 Chunk 切分策略(递归+overlap)与 chunk_size/overlap/元数据的作用。
- 能解释 Embedding 原理(语义近→向量近)与"同模型同维度"铁律。
- 能对比 BM25 与向量检索的差异与互补关系。
- 能写出 ES kNN 查询要点(dense_vector/HNSW/k/num_candidates)。
- 能说明混合检索(RRF 融合 + 可选 rerank)的做法与好处。
- 能讲清拼接上下文的要点(带引用、控总量、明确指令、去重排序)。
- 能论证"为什么需要引用溯源"(防幻觉/合规/可审计)并说清引用校验。
- 能论证"为什么需要无答案拒答",并说明 should_refuse 与拒答评测。
十六、高频面试题速记卡
Q:RAG 完整链路是什么?
离线:解析→清洗→切分→Embedding→入库;在线:问题向量化→检索→拼接→低T生成→带引用答案。能一口气讲完即及格。
Q:BM25 和向量检索区别?
BM25=关键词精确匹配(TF-IDF),擅专有名词/编号;向量=语义相似,擅同义改写。互补,用混合检索。
Q:为什么 Embedding 要同模型同维度?
向量空间须一致,相似度才有意义。建库与查询模型不同=灾难;换模型要全量重建索引。
Q:Chunk 切分为何重要?
切分质量决定检索上限。常用递归切分+overlap,带来源元数据;chunk_size 太大语义稀释、太小割裂。
Q:ES 怎么做向量检索?
dense_vector 字段+HNSW 索引,knn 查询传 query_vector 与 k/num_candidates。一个引擎兼顾 BM25+向量。
Q:混合检索怎么做?
BM25+向量两路结果融合,常用 RRF(按排名倒数融合,不依赖分数量纲),可加 cross-encoder rerank 精排。
Q:为什么需要引用溯源?
防幻觉(无引用=可能编)、合规审计(理赔结论回溯条款)、可质疑。还要后处理校验引用真实性。
Q:为什么需要无答案拒答?
资料没覆盖就拒答而非硬编——"编"比"拒"危害大(误导理赔)。拒答准确率是 RAG 核心评测指标。
Q:拼接上下文要注意什么?
带引用标记、控总量不超窗口、指令明确"仅基于资料无则拒答"、去重排序提信噪比。
Q:模型会编造引用编号吗?怎么防?
会。后处理校验标注的 [n] 是否真在检索结果里,不可证的结论标记为不确定/拒答。
FDE W2D6 学习手册 · 基础 RAG(面试级)· 配合《W2D6 评测题.md》自测
📌 待查★ 重要