W2D6 学习手册 1.为何2.链路3.PDF4.清洗 5.Chunk6.Embed7.BM25vs向量8.ES向量 9.混合10.拼接11.溯源12.拒答 达标①达标②自测速记

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 工具与策略

类型工具适用
文本型 PDFPyPDF / pdfplumber / unstructured原生可选中文本
扫描件OCR(如 PaddleOCR / 第5天 OCR Tool)图片型,需识别
复杂排版unstructured / 版面分析多栏、表格、图表
医保场景:保单 PDF 常是扫描件,要先 OCR(接第5天 OCR Tool)再解析;条款表格多,要用能保表格结构的解析器,否则"适应症/限制"对齐错会导致检索错。解析阶段要保留页码/段落号作为后续引用锚点。
PDF 解析 = 把文件变文本,难点在扫描件(OCR)、表格、多栏。文本型用 pdfplumber/unstructured,扫描件先 OCR。医保保单多为扫描件+表格,要保结构并留页码作引用锚点。
① 解析丢失内容(尤其表格/页脚条款)是 RAG 质量头号杀手——"资料里没有,模型只能编"。② 别只用最朴素 PyPDF 提取扫描件,会得到空文本。③ 解析要保留来源位置(页码/段落),否则后面无法引用溯源。

四、文本清洗

解析出的原始文本含噪声,需清洗后再切分:

医保清洗要保留"条款编号/药品名称"等关键实体不被破坏,且表格清洗后保持"字段-值"对齐,否则检索到"奥希美替尼 报销上限"会错位。清洗规则要可配置、可回滚。
文本清洗 = 去噪(页眉页脚/页码/重复标题)、合并断句、统一格式、保结构。核心是"去噪声但不伤语义"——医保要保条款编号与药品名对齐,清洗规则可配置可回滚。
① 清洗过度会删掉关键实体(如把"第3.2条"当噪声删了),导致引用丢失。② 别用正则暴力删行,易误删有效内容。③ 清洗要在切分前、Embedding 前完成,顺序错了白做。

五、Chunk 切分策略

5.1 为什么要切分

Embedding 模型有长度上限,且整篇文档向量会"语义平均"丢失细节;检索要"命中局部相关段落",所以要把文档切成 chunk。

5.2 常见策略

策略做法优点缺点
固定长度按字符/ token 数硬切简单切断语义、跨句
按段落/标题依结构边界切保语义完整长度不均
递归切分按 \n\n、\n、句 逐级回退兼顾语义与长度实现稍复杂
滑动窗口带 overlap 的窗口减少边界丢失有冗余

5.3 关键参数

医保条款切分建议"按条款编号递归切 + 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 模型对条款 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
  }
}
权威资源(中文/官方,非 OpenAI):
医保落地:保单条款/特药目录存 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 上下文
医保场景:用户问"我有糖尿病能吃这个特药报销吗",BM25 命中"糖尿病/特药"关键词,向量命中"慢病用药限制"语义,融合后既准又全。生产用 RRF 融合 + 可选 rerank,成本与效果平衡。
混合检索 = BM25 + 向量两路结果融合,兼顾精确词与语义。常用 RRF(按排名倒数融合,不依赖分数量纲);可再加 cross-encoder rerank 精排。医保里"关键词+语义"互补,召回更全更准。
① 两路分数量纲不同,直接加权求和要先归一化,否则一路淹没另一路。② 别只取单路 top1 就生成,容易漏关键信息。③ rerank 有额外算力成本,要按延迟预算决定用不用。

十、拼接上下文(Prompt 组装)

检索到 topK chunk 后,把它们与问题拼成生成 prompt。要点:

医保生成 prompt 模板:"你是特药理赔审核员,仅依据下列带编号资料回答;每条结论标注引用编号;资料未覆盖则输出 should_refuse=true。"拼接质量决定生成质量——垃圾上下文进,垃圾答案出。
拼接 = 把 topK chunk 带引用标记拼进 prompt,指令明确"仅基于资料、无则拒答"。控制总量不超窗口、去重排序提信噪比。上下文质量直接决定答案质量(garbage in garbage out)。
① 不标引用 = 后面没法溯源,也难逼模型"贴着资料答"。② 拼太多无关 chunk 会稀释重点、甚至引偏模型。③ 指令不写"无则拒答",模型易硬编——必须显式约束(见 s12)。

十一、引用溯源(Citation / Grounding)

要求模型每条结论附来源引用(对应哪个 chunk/页码/条款号),生成后系统可校验"答案是否真有资料支撑"。

答案 + 引用[1][2] → 校验引用是否真实存在且支持结论 → 不可证的结论标记为不确定/拒答
医保理赔是"钱+合规"场景,引用溯源是硬需求:每句赔付/拒付结论都要能点开看"依据哪条条款"。系统层要做引用校验——模型标了 [3] 但检索结果没 [3],就是幻觉信号,要拦截。
引用溯源 = 要求结论附来源(条款号/页码),并系统校验引用真实性。为什么需要:防幻觉、合规审计、客户可质疑。医保理赔每句结论都要能回溯条款,引用不可证即拦截。
① 模型可能"编造引用编号"——标了 [3] 但检索里没有,必须后处理校验,不能盲信。② 引用只证明"有这段资料",不证明"结论正确",还要看资料是否真支持。③ 不保留 chunk 元数据(s5)就做不了溯源——链路要贯通。

十二、无答案拒答(Refusal)

企业知识库场景,资料没覆盖时应当拒答,而非硬编。机制:

医保:"患者问某进口药报销,但知识库只有国产目录"→ 应拒答"未查询到该药报销依据",而非编一个。拒答准确率是 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 为什么需要引用溯源与无答案拒答

达标线②核心:BM25 精确词、向量语义,互补用混合;引用溯源为防幻觉+合规,拒答为避免硬编误导。医保"编"比"拒"危害大,两者都是生产 RAG 的必做项。

十五、W2D6 自测清单

十六、高频面试题速记卡

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》自测
📌 待查★ 重要