医疗法律 RAG 架构关键环节
医疗/法律场景下数据预处理、检索器与生成器优化方案
原题:请设计一个面向专业领域(如医疗、法律)的RAG(Retrieval-Augmented Generation)系统架构,包括数据预处理、检索器设计、生成器优化等关键环节。
重排与优化 · 字节真题
30 秒回答
- 领域知识结构化与分层存储设计
- 多路召回与重排序策略
- 生成器领域适配与约束机制
- 幻觉控制与可解释性保障
回答与解析
答案要点
- 领域知识结构化与分层存储设计
- 多路召回与重排序策略
- 生成器领域适配与约束机制
- 幻觉控制与可解释性保障
- 系统全链路的评测与迭代闭环
整体架构
用户Query → 意图识别 → 多路检索 → 重排序 → 上下文组装 → 领域生成 → 后校验 → 输出
一、数据预处理(领域知识工程)
核心挑战:专业文档结构复杂、术语密集、时效性强
| 层级 | 处理策略 |
|---|---|
| 文档解析 | 医疗:DICOM/HL7标准解析、病历结构化;法律:合同条款拆分、法条引用识别 |
| Chunk策略 | 语义切分(基于BERTopic)+ 结构切分(章节/条款边界),chunk大小200-500 tokens |
| 元信息增强 | 提取<疾病编码, 科室, 时效性>或<法条编号, 效力级别, 修订日期> |
| 存储设计 | 三级索引:Dense(语义)+ Sparse(关键词)+ Graph(实体关系) |
二、检索器设计(多路召回+精排)
召回层
- 向量检索:领域微调Embedding(如医疗用PubMedBERT,法律用Legal-BERT)
- 关键词检索:BM25 + 领域同义词扩展(UMLS/法律术语库)
- 图谱检索:Neo4j存储"疾病-症状-药品"或"法条-案例-解释"关系
精排层
- 交叉编码器(Cross-encoder)做相关性打分
- 引入时效性衰减因子:
score_final = score_semantic × λ^(当前日期-发布日期)
三、生成器优化
领域适配
- 基座模型选择:7B/13B专业模型(如Huatuo-LLM、ChatLaw)或通用模型+LoRA微调
- SFT数据构建:Query-Context-Answer三元组,强调引用溯源("根据《XX法》第X条...")
生成约束
- Prompt模板强制要求:① 不确定性声明 ② 引用来源标注 ③ 拒绝回答机制(超范围问题)
- 解码参数:降低temperature(0.3-0.5),使用重复惩罚避免循环生成
四、关键保障机制
| 机制 | 实现 |
|---|---|
| 幻觉检测 | 检索内容与生成答案的NLI一致性校验;实体链接回标 |
| 可解释性 | 输出附带引用片段高亮、置信度分数 |
| 人机协同 | 低置信度案例自动转人工审核,形成数据飞轮 |
五、评测闭环
- 检索评测:Recall@K、MRR、领域特定指标(如法律:法条命中率)
- 生成评测:RAGAS(faithfulness, answer_relevance)+ 专家人工评估
- 线上监控:用户反馈收集、拒答率追踪、时效性告警
口语版讲法(约4分钟)
- 一句话定位:这道题本质是领域知识结构化+检索生成闭环
- 数据预处理:分层切分与元信息增强
- 检索器:混合检索加重排,边界条件
- 生成器:领域适配与约束机制
- 落地风险与评测闭环
这道题其实问的是,怎么把通用RAG改造成能在一个专业领域真正落地,核心挑战就是领域知识怎么结构化、检索怎么精准、生成怎么可控,而且这三环要能闭环迭代。
先说数据预处理。专业文档不像通用网页,结构复杂、术语密集,随便切段落肯定不行。我会根据文档类型做不同处理,比如医疗病历有DICOM标准,法律合同有条款边界,先用OCR或解析器把元信息提出来,像疾病编码、法条编号、时效性这些。然后chunk策略要兼顾语义和结构:一方面用语义模型识别主题边界,另一方面按章节条款切,保证一个chunk内逻辑完整。chunk大小我通常控制在200到500token,太小缺上下文,太大检索容易跑偏。存储上我会建三层索引:语义向量、关键词、实体关系图谱。这不是炫技,是不同场景互补:向量适合模糊语义匹配,关键词适合精确术语,图谱能回答多跳关系问题,比如某个药和某个症状的关联。
检索器设计这块,我会走混合检索加重排。召回层分三路:一是领域微调的向量模型,比如医疗用PubMedBERT,法律用Legal-BERT;二是BM25加领域同义词扩展,像医疗里UMLS同义词库,避免用户说“头疼”但知识库写“头痛”就搜不到;三是知识图谱检索,用Neo4j存实体关系,比如“疾病-症状-药品”三元组。这三路结果合并后用交叉编码器精排。这里有个坑:向量检索对时效性不敏感,但专业领域很多知识会过时,比如法律条文修订、药品说明书更新。所以我会在精排时引入时效性衰减因子,发布日期越早,分数打折扣越多。
生成器优化方面,基座模型我会选领域微调过的,比如Huatuo-LLM或ChatLaw,或者用通用模型加LoRA微调,成本低效果好。关键是在SFT数据里强调引用溯源,训练模型生成时主动引用原文,比如“根据《XX法》第X条”。生成时用Prompt模板做硬约束:必须声明不确定性,标注引用来源,对超范围问题直接拒答。解码参数我会调低temperature到0.3左右,再开重复惩罚,避免模型车轱辘话。
落地时有两个关键保障机制。一是幻觉检测,用NLI模型校验生成内容是否和检索结果一致,再通过实体链接回标,看实体在原文里有没有。二是可解释性,输出时高亮引用片段并给置信度,用户能追查来源。低置信度的案例我会自动转人工审核,形成数据飞轮,人工修正后反馈回模型,持续优化。
不过这里有个延伸点:当领域知识库更新频繁时,增量索引和时效性平衡会变得很棘手。比如法律条文每年修订,旧版和新版同时存在,检索时该怎么处理?我倾向于用版本号加时间戳做过滤,但具体实现还要看场景。
最后讲评测闭环。检索侧看Recall@K和MRR,生成侧用RAGAS框架评估忠实度和相关性,再配合专家人工抽检。线上监控我会重点追踪拒答率和用户反馈,如果拒答率突然升高,可能是新知识没入库或检索策略偏保守。我更倾向把系统看成持续迭代的工程,不是一次建完就完事,所以数据飞轮和监控告警是上线必配的。
关键一句:领域知识库频繁更新时,增量索引和时效性平衡的挑战
面试官还可能这样问
- 问法 1 · 场景切入
假设我们要做个医疗问诊助手,用户问‘这个药怎么吃’,RAG需要从病历和指南里找信息。但是病历格式乱、术语多,你怎么设计整个流程,从数据处理到检索再到生成,才能保证答案准确又安全?
- 问法 2 · 层层追问
RAG系统你肯定熟悉,那如果场景换成法律咨询……数据是法条和案例,检索时怎么确保召回准确?……生成时怎么避免胡编乱造、必须引用原文?你从预处理到生成给我讲一遍架构。
- 问法 3 · 直球架构
设计一个面向专业领域如医疗或法律的RAG系统,包括数据预处理、检索器设计、生成器优化三个核心环节。你直接给整体架构,每个环节的关键策略和难点是什么?