专业领域 RAG 链路怎么搭?
医疗法律场景下文档处理、检索策略与评估方法
原题:在医疗或法律等专业领域构建智能助手时,请设计一个基于检索增强生成(RAG)的完整技术链路,涵盖文档处理、索引构建、检索策略、生成优化及评估方法。
评估与监控 · 字节真题
回答与解析
一、文档处理层
核心挑战:专业文档格式复杂(PDF扫描件、表格、手写批注)
- 多模态解析:OCR+LayoutLM提取图文混排内容,保留章节层级结构
- 智能分块:按语义边界切分(条款/病例段落),非固定长度;医疗场景保留"主诉-检查-诊断"完整上下文
- 元数据标注:标注文档来源、时效性、效力等级(如法律条文效力层级)
二、索引构建
双轨索引策略:
| 类型 | 用途 | 实现 |
|---|---|---|
| 稠密向量索引 | 语义匹配 | 领域微调Embedding(如医疗用PubMedBERT) |
| 稀疏关键词索引 | 精准匹配 | BM25 + 医学/法律专业词表 |
- 知识图谱增强:抽取"疾病-症状-药品"或"法条-案例-解释"关系,构建实体链接
三、检索策略
多路召回 → 精排 → 重排:
- 召回层:向量检索(Top-K)+ 关键词检索 + 图谱邻居扩展
- 精排层:Cross-Encoder打分,过滤低相关片段
- 重排层:按时效性、权威性加权;医疗优先临床指南,法律优先生效条文
查询优化:识别专业术语缩写(如"心梗"→"心肌梗死"),扩展同义词
四、生成优化
- Prompt工程:强制引用来源,格式如"根据《XX指南》第X条..."
- 约束解码:禁止生成索引外信息,设置医学安全词表拦截
- 上下文压缩:用LLM对检索结果去冗余,保留关键证据链
五、评估方法
| 维度 | 指标 | 方法 |
|---|---|---|
| 检索质量 | Recall@K、MRR | 人工标注相关性 |
| 生成质量 | 事实准确性 | 对比原文,用NLI模型检测幻觉 |
| 可追溯性 | 引用覆盖率 | 检查生成内容是否都有来源支撑 |
| 业务价值 | 专家满意度 | 领域专家盲评 |
关键取舍:医疗法律对准确性极度敏感,宁可"检索不到"也不"生成错误",需设置置信度阈值触发人工兜底。
学习建议
建议系统学习该知识点
口语版讲法(约4分钟)
- 一句话定位:本质是专业场景下的可信生成问题
- 文档处理与索引:双轨策略加图谱
- 检索策略:多路召回加精排重排
- 生成优化:强制引用加约束解码
- 评估与取舍:宁缺毋滥,人工兜底
这道题问的是专业领域知识助手怎么落地,本质是在准确性和覆盖度之间找平衡,不能像通用聊天机器人那样瞎编。医疗、法律这种场景,错了就是人命关天或者法律纠纷,所以整个链路都得围绕「可信」来设计。
先说文档处理。专业文档不是排版漂亮的网页,很多是扫描件、表格、手写批注。我会先用 OCR 加 Multimodal 模型,比如 LayoutLM,把图文混排的内容抽成结构化文本,同时保留章节层级,比如病历里的主诉、检查、诊断这些段落。切分的时候不能按固定字数切,那样会把关键上下文切断。我会按语义边界来切,比如法律条文按条款切,医疗按一个完整病例段落切,保证每块信息自包含。另外,我会给每个块打上元数据,比如文档来源、发布时间、效力等级,因为临床指南和专家共识权重不一样。
索引这块,我倾向双轨策略。稠密向量用领域微调的 Embedding,比如医疗用 PubMedBERT,法律用法律语料微调的模型,做语义匹配。同时保留稀疏关键词,用 BM25 配合专业词表,做精准匹配,比如药品名、法条编号这种不能靠语义。这俩互补,向量管模糊搜索,关键词管精确查找。真正落地时,我很少只用一种,都是混合检索。另外,如果领域知识结构性强,我会搭一个 Knowledge Graph,抽取实体关系,比如疾病和症状、药品和禁忌,这样检索时能通过图谱邻居扩展,找到间接相关的片段。
检索策略,我走多路召回加精排再加重排。召回层同时跑向量、关键词和图谱邻居,各取 Top-K,合并去重。然后精排用 Cross-Encoder 打分,把低相关的过滤掉。重排时我会按时效性和权威性加权,比如医疗场景,临床指南排前面,个人经验帖排后面。这里有个坑:查询里经常有专业缩写,比如心梗、PCI,如果不扩展,向量可能匹配不上。所以我会做同义词扩展,把缩写还原成全称。
生成优化是最后防线。我会在 System Prompt 里强制要求引用来源,格式像「根据《XX指南》第X条」这样,不允许无来源输出。同时用约束解码,禁止生成索引里没有的信息,比如设一个医学安全词表,拦截不存在的药品名。另外,检索结果有时很长,我会用 LLM 自己做上下文压缩,去冗余,只保留关键证据链。
评估不能只看常规指标。检索质量我关注 Recall@K,生成质量我关注事实准确性,用 NLI 模型检测有没有 Hallucination。但更重要的业务指标是可追溯性,看生成内容是不是每句话都能追到源文档,还有专家满意度,请领域专家盲评。我的取舍是:宁可回答不了,也不瞎回答。 如果检索结果置信度不够,我会触发人工兜底,而不是硬生成。
说到人工兜底,其实这里有个延伸问题:如果用户问的是多跳问题,比如「这个症状应该用哪种药,但指南里没有直接说,需要从两个段落推理出来」,那简单的 Naive RAG 就不够用了。这时候我会考虑 Agentic RAG 或者 Self-RAG,让模型自己决定要不要再搜、要不要推理。但这个对延迟和稳定性要求高,得根据业务场景权衡。
关键一句:如果用户问的是多跳推理问题,简单的 Naive RAG 不够,需要考虑 Agentic RAG 或 Self-RAG,但延迟和稳定性是风险。
面试官还可能这样问
- 问法 1 · 场景切入
假设我们做一个法律咨询助手,用户上传了一份几十页的合同PDF,里面有扫描件和表格,想让你自动找出其中跟违约责任相关的条款,并给出法律依据。你会怎么设计整个RAG链路来处理这种复杂文档?
- 问法 2 · 层层追问
专业领域的RAG系统,你觉得最关键的是什么?……文档怎么切块才不丢上下文?……检索策略上,光靠向量够吗?……生成时怎么保证不瞎编、还引用来源?
- 问法 3 · 直球架构
设计一个医疗领域的RAG系统,从文档处理、索引构建、检索策略到生成优化和评估,完整链路你怎么搭?重点说说多模态解析、双轨索引、多路召回加精排、以及防止幻觉的生成约束。