FDE W3D1 学习手册 · AI 数据工程(元数据 / 血缘 / Golden Case)
W3 Day1 · A 级(必须掌握,面试核心)· 5h · 学完能讲透"企业 RAG 的数据底座:从一份 PDF 到可追溯、可重跑、可评测的索引"
本日定位: W2 讲的是怎么把"问题"和"知识"对齐(检索/重排),W3 回到最底层——数据本身。企业 RAG 能不能跑稳,80% 取决于数据工程:元数据设计、血缘、版本、评测集。这是你 36 岁 Java+大数据+医疗背景最能打出来的差异化优势。
学完能回答: ① 企业 RAG 的元数据(Doc/Chunk ID、File Hash、版本、状态)为什么必须设计;② Golden Case 怎么造、评测集怎么从 10 个长到 50 个;③ 怎么把 ETL/数据治理经验迁移到 RAG 血缘。
使用方法: 通读原理 → 重点看「🔧工程含义」「🎤面试话术」「⚠易错点」→ 做自测清单 → 配合《FDE-W3D1-评测题.md》。选中不熟的词可标注(左下★重要 / 右下📌待查)。
一、企业 RAG 数据工程全景:为什么元数据是地基
很多人以为 RAG = "切 chunks → 灌向量库 → 检索",但企业级 RAG 真正的难点不在模型,而在数据底座 。一份《特药理赔手册》PDF 从上传到可检索,要经历「摄取(Ingestion)→ 解析 → 切片 → 向量化 → 入库 → 版本管理 → 评测」一长串环节,每一步都可能丢失信息或引入错误。
如果阶段之间没有可靠的元数据 串联,就会出现:查到一个 chunk 却不知道它来自哪份文件、哪个版本;文件更新后旧向量还在;评测出错了却无法定位是哪份源文档导致的。元数据的本质就是数据血缘(Data Lineage) 。
一句话定位: 元数据是 RAG 的"身份证 + 户口本"。没有它,检索结果不可溯源、更新不可重跑、评测不可归因——这在医疗保险这种强合规、强审计场景里是硬伤。
工程含义:数据工程是 RAG 质量的天花板。模型再强,喂进去的 chunk 如果错了、旧了、对不上版本,答案必然错。医疗理赔场景一个错 chunk 可能导致错误赔付,所以可溯源(traceability) 是刚需,不是锦上添花。
企业 RAG 的稳定性 80% 靠数据工程,不是模型。我要做的是给每一份文档、每一个 chunk 发"身份证"(ID)、贴"指纹"(Hash)、标"版本"(Version)、记"状态"(Status),这样任何一条检索结果都能回溯到"哪份文件、哪个版本、什么时候切的",出问题能定位、能重跑。
① 别以为"切完灌库就完事"。没有 ID/Hash/版本,文件一更新你就分不清线上跑的是新还是旧向量。② 元数据不是越多越好,但Doc ID、Chunk ID、File Hash、版本、状态 这五个是底线,缺一不可。③ 很多人把 Chunk ID 简单用"递增数字",一旦删除中间某个 chunk,下游引用全错位——要用稳定全局唯一 ID(如 UUID 或 内容Hash 派生)。
二、Document ID 与 Chunk ID:血缘的最小单元
2.1 设计原则
字段 作用 推荐方案
document_id 一份源文档(一份 PDF/一篇网页)的稳定主键 首次摄取时生成 UUID,长期不变;可同时存业务编号(如 policy_doc_no)
chunk_id 一个切片 chunk 的稳定主键 由 document_id + 切片序号 或 内容 Hash 派生,保证可追溯、可重建
chunk_index 该 chunk 在原文档中的顺序位置 整数,便于还原上下文、合并相邻 chunk
2.2 为什么 Chunk ID 不能简单用自增
如果用数据库自增主键,删除一个 chunk 后重建会改变所有后续 ID,导致已存的"评测标注""用户反馈"引用失效。正确做法是让 chunk_id 与内容强绑定 (如 sha1(document_id + chunk_index + text)),内容不变 ID 就不变。
chunk_id = hash(document_id ‖ chunk_index ‖ content) → 内容不变则 ID 不变,可追溯可重建
2.3 Chunk 还要挂哪些元数据
{
"chunk_id": "c_8f3a...",
"document_id": "d_1b2c...",
"chunk_index": 12,
"content": "特药『奥希替尼』限用于 EGFR 突变阳性...",
"source_file": "特药理赔手册_2025Q2.pdf",
"page_no": 38,
"section": "第三章 靶向药报销范围",
"doc_version": "v2025Q2",
"embedding_version": "bge-large-zh-v1.5",
"ingest_task_id": "task_20250701_009",
"created_at": "2025-07-01T10:22:00Z"
}
工程含义:chunk 不是孤立文本,它是带"出生证明"的数据单元。下游检索命中后,能立刻拿到 page_no、section、doc_version——这些对"引用溯源""答案可审计"至关重要,医疗合规尤其要吃这一套。
Document ID 是一份文件的主键,Chunk ID 是一个切片的主键,而且 Chunk ID 最好由"文档ID+序号+内容"派生,这样内容不变 ID 就不变,删了重建也不会让评测标注和引用错位。每个 chunk 还要挂 source、page、版本、任务号这些血缘字段。
① Chunk ID 千万别用自增整数,删除/重建就会全错位。② chunk 里只存 text 是常见错误——丢了 page/section/version,答案出来你没法告诉用户"这条来自手册第38页第三章",医疗合规场景不可接受。③ embedding_version 一定要随 chunk 存,否则你不知道这个向量是旧模型生成的还是新模型。
三、文件 Hash 与摄取任务状态机
3.1 文件 Hash:去重与变更检测
对源文件计算 内容 Hash (如 SHA-256),是判断"要不要重新摄取"的唯一可靠依据。文件名相同、内容改了,Hash 不同 → 触发更新;文件名不同、内容一样 → Hash 相同 → 跳过重复。
file_hash = sha256(raw_bytes) → 同 Hash 跳过、异 Hash 触发重新摄取 / 失效旧版本
3.2 摄取任务状态机
一个摄取任务从提交到完成,应有明确状态,便于可观测与失败重试:
状态 含义 触发动作
PENDING已入队,等待处理 入消息队列
PARSING解析中(PDF/HTML 抽取) 调用 PyMuPDF / unstructured
CHUNKING切片中 分块策略执行
EMBEDDING向量化中 调 embedding 服务
INDEXING写入向量库 bulk 写入 ES
SUCCESS全部成功 标记 doc.status=ready
FAILED失败 进死信 / 告警 / 重试
工程含义:状态机能让你回答"这份手册现在到底能不能被检索到"。医疗知识库上线新手册时,运营要知道是 PARSING 卡住还是 EMBEDDING 超时,而不是"用户说搜不到"。状态 + 任务号是排查的入口。
文件 Hash 用来判断要不要重新摄取——同一份内容不重复算;摄取任务做成状态机(PENDING→PARSING→CHUNKING→EMBEDDING→INDEXING→SUCCESS/FAILED),这样任一环节挂了都能定位、能重试、能告警,而不是一坨黑盒。
① 用"文件名+修改时间"判断变更不可靠——手动 copy 会改时间,Git 上的时间也不代表内容。一定要用内容 Hash。② 状态机不能只在内存里,要落库(任务表),否则进程重启状态就丢了,分布式多 worker 还会重复摄取。③ FAILED 后必须有去向(重试/死信),不能静默消失。
四、文档版本与 Embedding 版本:变更可追踪
4.1 两套版本
document_version :源文档内容的版本。如《特药理赔手册》2025Q1 → 2025Q2 因目录调整改版。改版后应保留旧版本可回滚,且新版本上线要失效旧 chunk。
embedding_version :向量模型的版本。如 bge-large-zh v1.5 → v2。模型升级后所有 chunk 的向量都要重算 ,否则新模型检索空间里混着旧向量,召回质量崩。
4.2 版本与 Hash 的关系
document_version 变化 ⟹ file_hash 通常变 ⟹ 触发重新摄取 + 旧 chunk 失效
embedding_version 变化 ⟹ 同 content 但要重算向量 ⟹ 全量重 embed
4.3 旧版本怎么失效
不能物理删除旧 doc(要保留审计),而是把旧 version 的 chunk 标记为 status=deprecated,检索时 filter status=active 即可。回滚时把新版本标 deprecated、旧版本恢复 active。
工程含义:版本管理让"知识库更新"变成可逆操作。医疗保险条款随时可能修订,运营必须能"一键回滚到上周版本"应对监管质疑,而不是去翻备份磁带。
文档版本跟踪内容改了没,Embedding 版本跟踪向量模型换没换。内容改版要重摄取并失效旧 chunk;模型升级要对所有 chunk 重算向量,不能新旧混用。旧版本用 deprecated 软失效而不是物理删,方便回滚和审计。
① 只换 embedding 模型却不重算旧向量,是最隐蔽的坑——检索空间一半旧一半新,召回率莫名下跌,还不好查。② 失效旧 chunk 用软标记(status 字段),别直接物理删,否则审计追溯断链。③ 版本号别用"日期字符串"偷懒,要有明确的语义化版本与生效时间。
五、结合 ETL / 数据治理经验设计血缘(医疗保险场景)
你有 Java + 大数据 + 医疗保险(ETL/数据治理)背景,这正是 RAG 数据工程的"现成资产"。把传统数仓血缘思想平移过来:
数仓 ETL 概念 RAG 数据工程对应
源系统 / ODS 贴源层 原始 PDF / 网页 / 理赔工单(raw_bytes)
主键 / 代理键 document_id / chunk_id
checksum 校验 file_hash 去重与变更检测
任务调度状态(成功/失败/重跑) 摄取任务状态机
数据血缘( lineage 图) 源文件 → 解析 → chunk → 向量 → 索引 全链路可追溯
元数据管理 / 数据资产目录 文档元数据表 + 评测集版本管理
5.1 一个医疗理赔血缘示例
特药理赔手册_2025Q2.pdf
└─ file_hash: 9f2a... (去重/变更检测)
└─ ingest_task: task_0701_009 (PARSING→CHUNKING→EMBEDDING→SUCCESS)
└─ document_id: d_1b2c... (doc_version=v2025Q2)
├─ chunk_12 (page 38, §靶向药报销范围) ─┐
├─ chunk_13 (page 39) ├─ embedding_version=bge-large-zh-v1.5
└─ chunk_14 (page 39) ──────────────────┘ → vectors 写入 ES index=claim_kb
(全部挂 ingest_task_id,可整体回滚)
工程含义:你以前做 ETL 的"一次跑错全表重算""字段血缘追溯"经验,在 RAG 里是同一套方法论。面试时把"数仓血缘"和"RAG 血缘"对齐讲,能立刻拉开和纯算法候选人的差距——企业最缺"能让数据可信"的工程能力。
我之前做医疗数仓 ETL,核心就是"主键 + checksum + 任务状态 + 血缘可追溯"。这套原样平移到 RAG:源 PDF 是 ODS 贴源层,document_id/chunk_id 是代理键,file_hash 是 checksum,摄取任务状态机是调度状态,整条"文件→解析→chunk→向量→索引"就是血缘图。比如一份特药理赔手册,从 PDF 到每个 chunk 都挂 ingest_task_id,出问题时能定位到是哪个任务的哪一步,甚至整体回滚。
① 别把"RAG 数据工程"当成全新领域——它就是 ETL + 元数据治理 + 版本管理,概念一一对应,别被"AI"吓到重新造轮子。② 血缘要端到端,很多人只记到 chunk 这一层,忘了把 ingest_task_id 也挂上,结果"哪个任务产生的向量"答不上来。③ 医疗合规要的是"可审计证据链",血缘设计要能回答监管"这条答案依据的是哪版文件"。
六、摄取管道骨架与解析策略(PDF / 特药手册)
6.1 典型摄取管道
源文件 → 落盘 + 算 Hash → 解析(extract) → 清洗 → 切片(chunk) → 向量化(embed) → 写库(index) → 状态置 SUCCESS
6.2 切片策略(医疗手册特有关注)
固定窗口 + 重叠 :通用做法,overlap 保留跨段语义。医疗条款常跨页,overlap 要够大。
按结构切 :保留标题层级(§章/节),避免把"报销范围"和"免责条款"切到一个 chunk 而丢失上下文。
表格单独处理 :理赔比例表、药品目录表要保留为结构化 chunk 或存为表格字段,别让模型从 OCR 噪声里猜数字。
def chunk_document(doc, max_tokens=512, overlap=64):
blocks = doc.structure_aware_blocks() # 保留 §章节 结构
chunks, buf, idx = [], [], 0
for b in blocks:
if len(buf) + len(b) > max_tokens:
chunks.append(build_chunk(doc.doc_id, idx, buf))
buf = buf[-overlap:]; idx += 1
buf += b
if buf: chunks.append(build_chunk(doc.doc_id, idx, buf))
return chunks
工程含义:切片直接决定召回质量。医疗手册结构复杂(条款嵌套、表格多),"无脑按 512 token 切"会切断"条件-例外"逻辑,导致模型只看到半句免责条款而错误赔付。结构感知切片是医疗 RAG 的硬要求。
摄取管道就是"文件→落盘算Hash→解析→清洗→切片→向量化→写库→置 SUCCESS"。切片别无脑按 token 数切,医疗手册要结构感知、保留章节层级、表格单独存,不然一段"报销范围"和"免责条款"被切碎,模型就只看到半句,容易赔错。
① overlap 太小跨页条款会断;太大则向量库膨胀、召回重复。要按文档密度调(医疗手册建议 ≥ 64~128 token)。② 表格被当纯文本切是最常见丢信息点,应单独结构化存储或配多模态解析。③ 解析后必须做"空 chunk / 超短 chunk"过滤,噪声 chunk 会污染检索。
七、LangChain Document 元数据规范
LangChain 的 Document 对象天然是 { page_content, metadata } 结构,正好承载我们的血缘字段。规范好 metadata schema 是团队协力的前提。
from langchain_core.documents import Document
doc = Document(
page_content="特药『奥希替尼』限用于 EGFR 突变阳性...",
metadata={
"document_id": "d_1b2c...",
"chunk_id": "c_8f3a...",
"chunk_index": 12,
"source_file": "特药理赔手册_2025Q2.pdf",
"page_no": 38,
"section": "第三章 靶向药报销范围",
"doc_version": "v2025Q2",
"embedding_version": "bge-large-zh-v1.5",
"file_hash": "9f2a...",
"ingest_task_id": "task_0701_009",
"status": "active"
}
)
7.1 为什么要收敛 metadata schema
检索可过滤 :metadata 是后续 metadata_filter(按部门/版本/状态过滤)的数据基础(W3D3 权限章节要用到)。
可观测 :所有 chunk 字段一致,监控系统才能统一统计。
可迁移 :换向量库(ES→Milvus)时 schema 稳定,迁移成本低。
工程含义:LangChain 只是载体,真正值钱的是你定的 metadata schema。把它当成"数据契约"来管——改字段要走评审,别谁写代码谁加字段,否则下游过滤和评测全乱。
LangChain 的 Document 就是 {page_content, metadata},我们所有血缘字段都塞进 metadata:document_id、chunk_id、版本、hash、task_id、status 等。关键是把 metadata schema 当成"数据契约"统一管理,这样后面做 metadata 过滤、做监控、换向量库都不会乱。
① 不要把所有信息塞进 page_content(如把 page_no 写进正文),会污染语义检索。metadata 归 metadata。② 不同数据源的 metadata 字段要对齐,否则检索过滤条件写不齐。③ LangChain 只是工具,元数据设计思想与框架无关,别被框架绑定。
八、PyMuPDF / unstructured 解析实战
8.1 PyMuPDF(pymupdf):精确控制 PDF
优点:快、能精确拿到 page number、坐标、表格 ,适合结构化要求高的医疗手册。
用法:逐页 page.get_text("dict") 拿到带层级的文本块,可保留章节结构。
import fitz # PyMuPDF
doc = fitz.open("特药理赔手册_2025Q2.pdf")
for i, page in enumerate(doc):
blocks = page.get_text("dict")["blocks"] # 带层级结构
for b in blocks:
if b["type"] == 0: # 文本块
text = b["text"]
# 记 page_no=i+1,可定位到手册页码
8.2 unstructured:多格式统一抽取
优点:一套 API 处理 PDF/HTML/Word/图片,自动做标题识别、表格提取,适合数据源杂的企业。
用法:partition_pdf(..., strategy="hi_res") 配合 OCR 处理扫描件(医疗理赔常遇扫描件)。
from unstructured.partition.pdf import partition_pdf
elements = partition_pdf("特药理赔手册.pdf", strategy="hi_res",
infer_table_structure=True)
for el in elements:
print(el.category, el.text) # Title / NarrativeText / Table
工程含义:选解析器看数据源。规则强、要精确页码表格的(如理赔手册)→ PyMuPDF;格式杂、要快速统一的 → unstructured。扫描件必须走 OCR 路径,否则文本块为空,整本手册变噪声。
PDF 解析两个常用库:PyMuPDF 精确、能拿页码和表格结构,适合医疗手册这种要准的场景;unstructured 一套 API 通吃多种格式、自动识别标题表格,适合数据源杂的企业。遇到扫描件都得走 OCR,不然抽出来是空的。
① 扫描版 PDF 不配 OCR 会抽出空文本,整本手册变噪声 chunk,检索时永远召不回。② PyMuPDF 的 "text" 模式会丢结构,"dict" 模式才保留层级,别图省事用错 API。③ 解析结果要落盘存档(后面 W3D3 一致性校验要用"原文件 vs 解析结果")。
九、Golden Case 的构成与采集方法
Golden Case(黄金样本) 是人工精心构造的"标准答案评测对",是评测集的种子。一个合格的 Golden Case 至少包含:
字段 说明
query(问题) 真实用户会问的,如"EGFR 突变的肺癌患者用奥希替尼能报多少?"
expected_answer(标准答案) 人工撰写的参考答案,可带引用
expected_chunks / references 应该被检索到的 chunk_id 列表(评测召回用)
标签 难度、场景(特药/住院/拒赔)、应拒答 should_refuse 等
9.1 怎么"造"前 10 个
从真实日志挖 :翻客服工单、搜索日志,挑高频 + 有代表性的问题。
从业务规则反推 :每条理赔条款写 1~2 个对应问题(如"靶向药报销范围"→ 问奥希替尼)。
覆盖边界与拒答 :至少 2 个"知识库没有"应拒答的 case,测拒答能力。
双人标注 + 评审 :医疗答案不能一人说了算,答案要可解释、可引用条款。
前 10 个 Golden Case 的"配方": 6 个高频正常问答(覆盖靶向药/住院/门急诊)+ 2 个边界值 + 2 个应拒答。先小而精,保证每条都能当"标尺"。
工程含义:Golden Case 是评测的"锚"。没有它,你改了切片策略、换了 reranker,根本不知道变好还是变坏。前 10 个不求多但求准,是每个改动都能对标的基准线。
Golden Case 就是人工精心写的"问题+标准答案+应该召回的chunk+标签"。怎么造前 10 个?从客服日志挖高频问题、从理赔条款反推问题、再补边界和应拒答 case,最后双人标注评审。医疗答案不能一人说了算。这 10 条是后续所有改动的"标尺"。
① 别用 LLM 自动生成 Golden Case 当标准答案——答案本身可能错,污染评测。标准答案必须人工写。② 漏了"应拒答"类 case 是通病,导致系统"什么都敢答"。③ 标签不全(难度/场景)后续没法做分层分析。④ 前 10 个要覆盖不同章节,别 10 个都问同一种药。
十、评测集从 10 → 50 的演进策略
Golden Case 是种子,评测集(Evaluation Set)要长大才能反映真实分布。演进路径:
10 个人工 Golden(标尺) ──→ 30 个(加变体+边界,W3D3 目标)──→ 50 个(覆盖全场景+历史 badcase)
10.1 增长手段
手段 做法 作用
问题改写(paraphrase) 同一意图换说法/口语化/错别字 测鲁棒性,扩到 20~30
badcase 回收 线上答错的、用户点"没帮助"的 针对性补强,扩到 40
规则穷举 按理赔条款矩阵逐条造 覆盖全业务,扩到 50
LLM 辅助造问 LLM 生成候选问题,人工筛 提效,但答案仍人工定
10.2 评测集要像代码一样版本化
评测集本身也要有版本(eval_v1 / eval_v2),每次改 RAG 链路都跑同一版本评测集,才能横向对比。这就是"评测即回归测试"。
工程含义:评测集是 RAG 的"测试套件"。从 10 到 50 不是堆数量,而是覆盖度提升——分布要贴近真实用户。每加一个 case 都要想"它在测什么短板",否则只是数字好看。
评测集从 10 长大到 50,靠四种手段:问题改写(一种意图多种问法测鲁棒)、回收线上 badcase、按理赔条款矩阵穷举、LLM 辅助造问但答案人工定。关键是评测集要版本化,每次改链路都跑同一版,才能横向比"这次到底是变好还是变差"。
① 别用 LLM 生成答案当标准答案(同 9.1)。② 数量涨了但分布偏(比如 50 个里 40 个问同一种药)没意义。③ 评测集不版本化,前后两次分数不可比,等于白测。④ 改写问题别只加同义词,要加口语/错别字/多轮指代,才贴近真实。
十一、数据质量与血缘可观测性
数据工程上线后要有"体检指标",否则你不知道知识库是健康还是腐烂。
指标 含义 告警阈值(参考)
摄取成功率 SUCCESS / 总任务 < 99% 告警
平均摄取时延 PARSING→SUCCESS 耗时 超基线 2x 告警
死信堆积 FAILED 且进 DLQ 的数量 > 0 即处理
向量覆盖度 active chunk 中有向量的比例 < 100% 异常
hash 冲突/重复 相同 hash 的 doc 数 应=去重后数
版本漂移 混用 embedding_version 的 chunk 占比 应 = 0
工程含义:可观测性让"数据腐烂"可见。医疗知识库若 silently 混了旧 embedding 向量或丢了某个 chunk,业务侧要很久才发现答案变差。指标 + 告警把问题暴露在萌芽期。
数据工程要有"体检指标":摄取成功率、时延、死信堆积、向量覆盖度、embedding 版本漂移率。尤其版本漂移(同一索引里混了不同模型向量)要为 0,否则召回质量莫名下跌还查不出原因。这些指标接告警,问题早暴露。
① 只盯"摄取成功"不够,要盯"向量覆盖度 100%"——成功入库但 embed 失败会留空向量。② 版本漂移是最隐蔽的,要定期扫 index 检查 embedding_version 分布。③ 指标不接告警等于没监控,人不会天天看面板。
十二、面试达标线①:企业 RAG 数据工程的元数据设计为什么重要
元数据 解决的痛点 没有它的后果
document_id / chunk_id 精准定位每个切片来源 检索结果无法溯源,答案不可审计
file_hash 去重 + 变更检测 重复摄取浪费、改了内容却不更新
ingest_task_id + 状态 追踪摄取进度、失败定位 用户搜不到却不知哪步挂了
doc_version / embedding_version 变更可回滚、向量可重算 新旧混用、召回率莫名下跌
status(active/deprecated) 软失效旧版本 旧条款仍被召回,导致错赔
核心一句话:元数据是 RAG 的"身份证+户口本+血缘图"。Doc/Chunk ID 让结果可溯源,Hash 让变更可检测,版本让更新可回滚,状态让过程可观测。没有这套,企业 RAG 在医疗这种强合规场景根本不可信——你答出来的每句话都经不起"依据哪版文件"的追问。
十三、面试达标线②:Golden Case 怎么造、评测集怎么从 10 长到 50
造:真实日志挖 + 业务条款反推 + 边界/拒答补充 + 双人标注评审(答案人工定)
长:问题改写(paraphrase) → 回收 badcase → 按条款矩阵穷举 → LLM 辅助造问(答案仍人工) → 评测集版本化做回归
Golden Case 构成 :query + 标准答案(人工)+ 应召回 chunk_id + 标签(场景/难度/should_refuse)。
前 10 个配方 :6 正常 + 2 边界 + 2 拒答,覆盖不同章节,双人评审。
长到 50 :改写扩鲁棒、badcase 补强、条款矩阵穷举、LLM 造问人工筛;评测集版本化,每次改动跑同版做回归对比。
铁律 :标准答案必须人工写,绝不用 LLM 生成答案当 ground truth;评测集分布要贴近真实,不为凑数。
十四、W3D1 自测清单
能说清企业 RAG 数据工程为什么是质量天花板,元数据/血缘解决什么痛点。
能设计 document_id / chunk_id,讲清为什么 chunk_id 要用"文档ID+序号+内容"派生而非自增。
能解释 file_hash 在去重与变更检测中的作用,以及为什么不能靠文件名/时间。
能画出摄取任务状态机(PENDING→...→SUCCESS/FAILED)并说明每态动作。
能区分 document_version 与 embedding_version,讲清两者变化各触发什么、旧版本怎么软失效。
能把 ETL/数据治理经验(主键/checksum/血缘/任务状态)平移到 RAG 数据工程。
能讲清切片策略(结构感知、overlap、表格单独处理)对医疗手册的意义。
能写出 LangChain Document 的 metadata 设计,说清为什么 metadata schema 要当"数据契约"管。
能对比 PyMuPDF 与 unstructured 的取舍,以及扫描件必须 OCR。
能讲清 Golden Case 的构成、前 10 个怎么造、评测集怎么从 10 长到 50、为什么答案必须人工定。
能列出数据质量可观测指标(摄取成功率/向量覆盖度/版本漂移等)。
能讲清达标线①(元数据设计为什么重要)与达标线②(Golden Case 与评测集长大)。
十五、高频面试题速记卡
Q:企业 RAG 为什么数据工程比模型更重要?
检索到的 chunk 错了/旧了/版本不对,模型再强答案也错。数据底座决定质量天花板,医疗强合规场景尤其要可溯源。
Q:Chunk ID 为什么不能自增?
删除/重建会让后续 ID 全错位,评测标注与引用失效。应让 chunk_id 由 document_id+序号+内容派生,内容不变则 ID 不变。
Q:file_hash 和版本号有什么区别?
hash 是内容指纹,用于去重和变更检测(内容变 hash 变);版本号是语义标签。改内容通常 hash 变,需重摄取并失效旧 chunk。
Q:embedding 模型升级为什么必须重算所有向量?
不同模型向量空间不同,新旧混用会让召回率莫名下跌。要按 embedding_version 全量重 embed,版本漂移率应为 0。
Q:你之前做 ETL,和 RAG 数据工程有什么关系?
同一套方法论:主键=Doc/Chunk ID,checksum=file_hash,任务状态=摄取状态机,血缘图=文件→chunk→向量→索引全链路可追溯。
Q:Golden Case 能直接用 LLM 生成答案当标准答案吗?
不能。标准答案必须人工写,否则答案本身可能错会污染评测。LLM 只能辅助造"问题",答案仍人工定。
Q:前 10 个 Golden Case 怎么配?
6 个高频正常问答 + 2 个边界值 + 2 个应拒答,覆盖不同章节,双人标注评审,先小而精当标尺。
Q:评测集从 10 长到 50 靠什么?
问题改写(鲁棒)、回收线上 badcase、按理赔条款矩阵穷举、LLM 辅助造问(答案人工),评测集版本化做回归对比。
Q:扫描件 PDF 直接解析会怎样?
不配 OCR 会抽出空文本,整本手册变噪声 chunk,检索永远召不回。必须走 OCR 路径。
Q:怎么做摄取失败的可观测?
任务状态机落库 + 死信队列 + 指标告警(摄取成功率/时延/向量覆盖度/版本漂移),问题早暴露。
FDE W3D1 学习手册 · AI 数据工程(面试级)· 配合《FDE-W3D1-评测题.md》自测
📌 待查 ★ 重要
★0
📌0