跳到正文

领域RAG应用链路怎么搭?

数据准备、检索与生成模块、评估优化全流程

原题:请系统性地描述如何为一个特定专业领域(如医疗、法律、金融等)搭建完整的RAG(检索增强生成)应用链路,包括数据准备、检索模块、生成模块和评估优化等关键环节。

模型微调 · 字节真题

30 秒回答

  1. 领域数据清洗与结构化(非结构化文档解析、表格/图表处理、领域术语标准化)
  2. Embedding模型选型与微调(通用vs领域模型、对比学习微调)
  3. 检索架构设计(多路召回、重排序、查询改写)
  4. 生成环节优化(Prompt工程、上下文压缩、引用溯源)

回答与解析

答案要点

  • 领域数据清洗与结构化(非结构化文档解析、表格/图表处理、领域术语标准化)
  • Embedding模型选型与微调(通用vs领域模型、对比学习微调)
  • 检索架构设计(多路召回、重排序、查询改写)
  • 生成环节优化(Prompt工程、上下文压缩、引用溯源)
  • 端到端评估体系(检索准确率、生成忠实度、领域专家评估)

一、数据准备:领域知识工程化

文档解析与结构化

  • 非结构化:PDF/Word用Unstructured/MinerU解析,保留标题层级、表格结构
  • 多模态:医疗影像报告需OCR+结构化提取,金融财报表格转Markdown
  • 领域标准化:建立术语词典(如ICD-10编码、法律法条编号),统一同义词

分块策略

  • 按语义边界切分(章节/段落),chunk size 由资料结构、模型输入限制与评测结果决定
  • 是否启用重叠窗口及其长度都作为候选,用同一评测集验证边界证据与冗余成本
  • 关键元数据注入:文档来源、发布时间、置信度标签

二、检索模块:精准召回

Embedding选型

  • 基座模型:GTE-large、BGE-M3通用能力强;领域数据充足时微调(如PubMedBERT医疗版)
  • 微调方法:对比学习+难负例挖掘,batch内动态难负例提升显著

多路召回架构

用户Query → 查询改写(HyDE/扩展)→ 向量检索(Dense)+ 关键词检索(BM25)→ 融合排序 → 精排模型(Cross-Encoder)→ Top-K上下文
  • 金融领域加粗体匹配规则(如"第X条"精确命中)
  • 重排序用bge-reranker或轻量LLM打分

三、生成模块:可控输出

Prompt工程

  • 系统角色固化:"你是资深医疗顾问,基于以下参考资料回答,不确定时请说明"
  • 上下文组织:按相关性排序,标注来源编号支持溯源
  • 输出约束:JSON结构化(诊断/依据/置信度)或特定格式(法律意见书模板)

关键优化

  • 上下文压缩:LLMLingua去除冗余,保留核心证据句
  • 引用生成:强制要求标注来源,避免幻觉

四、评估与迭代

自动化指标

  • 检索:Recall@K、MRR;生成:RAGAS(忠实度、答案相关性)

领域专家闭环

  • 抽样人工审核:医疗需执业医师标注答案准确性
  • bad case归因:检索失败(未召回)vs 生成失败(理解偏差)

数据飞轮

  • 用户反馈(👍/👎)→ 难例挖掘 → 微调Embedding/精排模型 → A/B验证

口语版讲法(约4分钟)

  • 一句话定位:这不是搭流水线,是解决领域知识怎么让模型真正用起来
  • 数据准备:文档解析、术语标准化、分块策略
  • 检索模块:混合召回、重排序、查询改写
  • 生成模块:Prompt设计、上下文压缩、引用溯源
  • 评估与迭代:自动化指标、专家闭环、数据飞轮

这道题其实是在问:怎么让大模型在专业领域里真正落地,而不是只是背教材。核心就是怎么把领域知识组织好、检索准、生成稳。我按数据、检索、生成、评估这条线来说。

先说数据准备。专业领域的数据,比如医疗病历、法律合同、金融财报,通常是 PDF 或扫描件,得先解析成结构化文本。我一般用 Unstructured 或 MinerU,保留标题层级和表格结构,表格转成 Markdown。然后做领域术语标准化,比如医疗里把“心梗”和“心肌梗死”统一映射到 ICD-10 编码,不然检索时会漏。 分块策略上,我倾向于按语义边界切,比如按章节或段落,而不是固定长度。医疗场景也不能直接套固定数值;我会按资料结构提出多组 chunk size 与重叠候选,再用同一评测集比较证据完整率、召回和成本。关键是注入元数据,比如文档来源、发布时间、置信度,这样后续检索能按时间或权威度过滤。

检索模块。我很少只用向量检索,因为专业领域里关键词匹配往往更精准。所以我会用 混合检索,把 Dense Retrieval 和 BM25 结合起来。比如金融场景,用户搜“第X条”,BM25 能直接命中,向量反而可能跑偏。查询改写也很重要,用户问“这个药能吃吗”,我会先用 HyDE 生成一个假设回答再检索,或者用 LLM 把问题扩展成更完整的表达。 召回结果用 Cross-Encoder 重排序,比如 bge-reranker,把相关性分数算一遍,取 Top-K。这里有个坑:如果领域数据少,重排序模型可能过拟合,所以我会用通用模型再加少量领域数据微调。

生成模块。Prompt 设计是基础,系统角色要固化,比如“你是资深法律顾问,基于以下参考资料回答,不确定就说不知道”。上下文按相关性排序,标注来源编号,强制要求引用,比如“依据[1]第X条”。这样能减少 Hallucination。 还有上下文压缩,比如用 LLMLingua 去掉冗余句子,只保留核心证据,因为专业文档往往很长,模型上下文窗口有限。输出格式我倾向用 JSON 结构化,比如诊断、依据、置信度,方便下游系统解析。

评估和迭代。自动化指标我用 RAGAS 测忠实度和答案相关性,检索侧看 Recall@K 和 MRR。但更关键的是领域专家抽审,比如医疗场景找执业医师打分,看答案有没有误导。 bad case 归因要区分是检索失败还是生成失败:如果召回没相关文档,那问题在检索;如果召回有但模型答错,那是生成问题。

最后,我会特别关注数据飞轮。用户反馈比如点赞点踩,收集起来做难例挖掘,然后微调 Embedding 或 Rerank 模型,再 A/B 验证。但这里有个前提:反馈量要足够大,小流量场景容易噪声淹没信号。

所以整体上,我更倾向把 RAG 系统看作一个持续优化的闭环,而不是一次性搭建。数据质量永远比模型重要,如果文档解析或者术语标准化没做好,后面检索和生成再努力也白搭。

关键一句:数据飞轮中反馈噪声的处理,小流量场景下信号容易被淹没

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设我们做一个医疗问答助手,用户问“高血压用药指南”,系统需要从几百本医学教材里找答案。你会怎么搭建整个流程,从数据到检索再到生成?

  2. 问法 2 · 层层追问

    RAG系统里检索和生成怎么配合?……如果检索结果不相关,生成会怎么处理?……如果要保证答案准确,整个链路怎么一步步优化?

  3. 问法 3 · 直球架构

    请你系统性地描述一个领域RAG应用,从数据清洗、分块,到检索设计、生成优化,再到评估和迭代,关键环节怎么落地?

同模块相关题目