想象一位老中医带刚毕业的实习生。实习生脑子灵光、说话利索,可一旦被问“这个方子凭什么开给发热三天的病人”,他就支支吾吾,甚至编出个不存在的“古方”。老中医不慌,转身从药柜里翻出泛黄的医案,指着其中一页说:“看,1921 年这本《温病条辨》里就记着这个证型,用的是银翘散加减。” 实习生恍然大悟——原来高手看病,不是靠死记硬背,而是先查证、再开方,还顺手把出处指给人看。 这个故事里藏着今天的主角:检索增强生成(RAG)。大模型就像那个实习生,知识面广却容易“信口开河”;老中医的医案库,就是循证医学里的文献知识库;“先翻书再回答”是检索;“指出出处”是引用约束;“查不到就说不确定”是幻觉抑制。RAG 要做的,就是让 AI 在回答医学问题时,每一步都有据可依、标得出处、敢说“不知道”。

岗位关联

掌握 RAG 是 AI 医疗从业者的必备技能:它能显著降低大模型幻觉,让临床问答系统达到“可用、可信、可追溯”的落地标准,是连接大模型与真实医学知识库的关键桥梁。

目录
  1. 可视化演示
  2. RAG基本原理
  3. 知识库构建
  4. 检索策略
  5. 引用约束
  6. 幻觉抑制
  7. 性能调优
  8. 局限展望
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

演示RAG在循证医学问答中的应用:知识库构建、检索策略与引用约束抑制幻觉,实现有据可依。

本节配有交互动效(进入视口后自动加载,约 3KB)。

知识库构建 文献 切分 Doc→Chunk 将医学文献切分为检索块

RAG基本原理

实习生跟诊第一天,患者问“反复头痛该吃什么药”,实习生张口就答“布洛芬”。老中医却皱起眉头:“病人还没查体、没看舌苔,你怎么敢定药?” 第二天,实习生学会了:先问诊、再翻书、后开方。这就是 RAG 的灵魂——先检索再生成,让模型不凭记忆“裸答”,而是带着材料作答。

把这一幕映射到技术上:患者的问题是用户的查询(query),医案库是外部知识库(knowledge base),老中医的大脑是大语言模型(LLM)。RAG(Retrieval-Augmented Generation,检索增强生成)先用检索器(retriever)找到与问题最相关的几篇文档片段,再把它们拼进提示词,最后让大模型基于这些“医案”生成答案。比起直接让大模型硬答,RAG 相当于给模型配了一位图书管理员,随时递上参考资料。

在循证医学场景中,这一步的意义怎么强调都不为过。医生问的是“这个症状最可能是什么病”,如果模型凭训练数据里的粗略印象回答,很容易给出过时或片面的结论。而 RAG 要求模型“先看书再说话”——检索到的文献本身就带着时效性(比如最新版指南),答案自然更贴近临床真实需求。

实习生终于明白,师傅的“翻书”不是装样子——那是在循证。每一次作答前先检索,本质上是在用最权威的证据做决策支撑,这正是循证医学“慎重、准确、明智地应用当前最佳证据”精神的技术实现。

Top-K=arg⁡max⁡i=1D  sim(q,di)\text{Top-}K = \arg\max_{i=1}^{D} \; \text{sim}(q, d_i)
这个式子是说:在知识库的全部 \(D\) 篇文档里,逐一计算每篇文档 \(d_i\) 与查询 \(q\) 的相似度,最后只挑出相似度最高的 \(K\) 篇作为参考材料。\(K\) 通常取 3 到 5,就像老中医翻书不会把整个药柜都搬来,只挑最对症的三五本。
  1. 候选集合知识库中共有 \(D\) 篇文档,每一篇都是潜在的参考材料。
    D={d1,d2,…,dD}D = \{d_1, d_2, \dots, d_D\}
  2. 相似度打分计算查询 \(q\) 与文档 \(d_i\) 的相关程度,分数越高越相关。
    sim(q,di)∈[0,1]\text{sim}(q, d_i) \in [0, 1]
  3. 取前 K 个\(\arg\max\) 表示“找出使式子最大的那些”,这里就是取分数最高的前 \(K\) 篇。
    Top-K={d(1),d(2),…,d(K)}\text{Top-}K = \{d_{(1)}, d_{(2)}, \dots, d_{(K)}\}

知识库构建

老中医的药柜不是随便堆的:每味药贴好标签、按科目分抽屉、发霉的及时清理。实习生问:“师傅,您这柜子怎么收拾得这么整齐?” “病人等着救命,乱糟糟的柜子,关键时刻找不着药,那不是害人么?”

知识库构建就是整理药柜。在循证医学场景里,“药材”是论文、指南、病例报告和药品说明书。第一步是文献采集——从 PubMed、Cochrane、UpToDate 等权威来源抓取文献;第二步是清洗——去掉重复发表、撤稿、格式错乱的文档;第三步是文本切分(chunking)——论文太长(动辄几千字),而模型一次能“吃”的上下文有限,必须切成几百字的片段;第四步是向量化(embedding)——把每个片段变成一串数字向量,让计算机能算“哪段文字和问题最接近”。

切分不是拿刀乱砍。段落中缝切开,意思就断了——前一半说“阿司匹林有效”,后一半说“但出血风险高”,模型只读到前一半就可能误判。所以切分通常设置重叠窗口,让相邻片段保持一部分重合,像连环锁扣一样保住上下文连贯性。

药柜整理好了,还要定期检查——撤稿的论文要移除,新版指南要上架。知识库的质量直接决定了检索的上限:柜子里全是霉变的假药,再厉害的抓药师傅也抓不出一剂好方。维护一个“干净、新鲜、分好类”的医学知识库,是 RAG 系统的地基。

C={c1,c2,…,cn},cj=chunk(dj,s,o)C = \{c_1, c_2, \dots, c_n\}, \quad c_j = \text{chunk}(d_j, s, o)
这里的 \(d_j\) 是第 \(j\) 篇文献,\(s\) 是切分窗口的大小(比如每段 500 字),\(o\) 是相邻两段的重叠长度(比如 50 字)。所有切出来的片段 \(c_j\) 构成知识库的检索单元 \(C\)。
  1. 切分单元把一篇长文献拆成多个小片段,每个片段 \(c_j\) 是独立可检索的最小单位。
    dj→{c1,c2,…,cm}d_j \rightarrow \{c_1, c_2, \dots, c_m\}
  2. 窗口大小\(s\) 控制每个片段的长度,太短丢失语义,太长浪费上下文空间。
    ∣cj∣≈s|c_j| \approx s
  3. 重叠长度\(o\) 让相邻片段共享边界文字,防止一句话被从中间切断。
    cj∩cj+1≠∅c_j \cap c_{j+1} \neq \emptyset

检索策略

药柜整理得井井有条,接下来考验的是“怎么找”。老中医教实习生:找药有三层功夫——先凭直觉锁定抽屉(向量检索),再顺着药名索引精确核对(关键字检索),最后把候选药方摊开逐一比对,选出最贴证的(重排序)。

向量检索是主力。每个文档片段被编码成一个向量(一堆数字),查询问题也被编码成向量,然后在向量空间里找“方向最接近”的邻居。这就像凭“清热解毒”的感觉在药柜里找药材,不需要说出确切药名。余弦相似度是最常用的度量。

关键字检索(BM25) 则像查字典:计算查询词在文档中出现频率、逆文档频率等,擅长精确匹配“阿司匹林”“心肌梗死”这类专有名词。混合检索把向量和关键字分数加权合并,兼顾语义理解与精确命中。重排序(rerank)是在第一轮粗筛出几十篇后,用更强的模型逐篇精读打分,最后只留 Top-3 到 Top-5。

实习生感慨:师傅找药不是蛮力翻柜子,而是“粗筛 + 精挑”层层递进。检索策略的每一层优化,都是在“快”与“准”之间寻找最佳平衡——这也是 RAG 系统设计中最见功力的一环。

sim(q⃗,d⃗)=q⃗⋅d⃗∥q⃗∥∥d⃗∥\text{sim}(\vec{q}, \vec{d}) = \frac{\vec{q} \cdot \vec{d}}{\lVert \vec{q} \rVert \lVert \vec{d} \rVert}
分子是两个向量的点积,分母是两个向量长度的乘积。结果越接近 1,说明两个向量方向越一致——相当于两个“药方思路”越吻合。这个值把“相似程度”变成了一个可以排序的分数。
  1. 向量点积逐维度相乘再相加,衡量两个向量在每一维上的一致程度。
    q⃗⋅d⃗=∑iqi×di\vec{q} \cdot \vec{d} = \sum_{i} q_i \times d_i
  2. 向量模长每个向量的长度,把点积结果归一化,消除文本长短的影响。
    ∥q⃗∥=∑iqi2\lVert \vec{q} \rVert = \sqrt{\sum_{i} q_i^2}
  3. 余弦相似度夹角余弦值,只看方向不看长短,范围在 -1 到 1 之间。
    sim(q⃗,d⃗)∈[−1,1]\text{sim}(\vec{q}, \vec{d}) \in [-1, 1]

引用约束

老中医开方有个规矩:每味药后都要注明“《伤寒论》第三十五条”“《温病条辨》某卷某条”。实习生不解:“师傅,病人只看病,看什么出处?” 老中医摇头:“没有出处的方子,病人不敢吃;出了事,更没人担得起。”

引用约束就是给大模型的答案上“户口”。在 RAG 生成阶段,提示词里会明确要求:“只能基于提供的参考材料作答,且每句话末尾必须标注引用编号,如 [1][2]。” 模型输出的每个论断,都要能找到它依据的那篇原文片段。更进一步,系统会在后处理时做上下文锚定——检查答案关键句和引用片段是否真的吻合,防止模型“张冠李戴”。

循证医学对引用的要求近乎苛刻:医生看一句话要能反查到原始研究、看一个结论要能追溯到 Meta 分析。这就要求 RAG 输出除了自然语言,还要附带机器可读的引用元数据(文献 ID、段落位置、发表年份),让“证据链”完整闭环。若某一句找不到对应出处,宁可删掉那句话,也不能留着无源之水。

有了强制引用,实习生再也不敢随口编“古方”了——没标出处的句子根本过不了师傅的审核关。引用约束本质上是给模型戴上了“紧箍咒”,让每一句医学论断都接受证据的检验。

Scite=1K∑i=1Ksim(q⃗,di⃗)S_{\text{cite}} = \frac{1}{K} \sum_{i=1}^{K} \text{sim}(\vec{q}, \vec{d_i})
这个式子是“证据强度”的计算:把检索到的 \(K\) 篇文献与查询的相似度求平均。分数越高,说明这段答案的地基越扎实;分数太低,系统就该警惕——这答案很可能是模型自己编的。
  1. 单篇证据分每篇被引用的文献都与查询算一次相似度,得到单篇证据分。
    sim(q⃗,di⃗)\text{sim}(\vec{q}, \vec{d_i})
  2. 累加求和把 \(K\) 篇文献的证据分加起来。
    ∑i=1Ksim(q⃗,di⃗)\sum_{i=1}^{K} \text{sim}(\vec{q}, \vec{d_i})
  3. 取平均值除以 \(K\) 得到平均水平,避免因为检索到一篇超高相关文献就过度自信。
    Scite=1K∑i=1Ksim(q⃗,di⃗)S_{\text{cite}} = \frac{1}{K} \sum_{i=1}^{K} \text{sim}(\vec{q}, \vec{d_i})

幻觉抑制

这天实习生单独坐诊,病人问了个冷门问题。他大脑一片空白,但嘴比脑子快:“这个……可能是罕见的 XXX 综合征。” 老中医在旁边听着,等他讲完,把人送走,语重心长:“不知道就说不知道。编一个病名,病人可能在回家的路上就吓坏了。”

大模型和实习生一个毛病:上下文缺乏时,它会“逻辑自洽地编造”。这种看似合理实则错误的内容,AI 圈叫“幻觉(hallucination)”。RAG 的检索环节已经大幅减少了幻觉,但还不够——幻觉抑制措施必须跟上。

第一道防线是置信度阈值:如果证据强度 \(S_{\text{cite}}\) 低于某个阈值 \(\tau\),模型必须选择“拒答”,比如回答“目前知识库中未找到充分依据,建议就诊线下门诊”。第二道防线是无据拒答:提示词里明确要求,参考材料里没有的信息,一律回答“不知道”。第三道防线是溯源核查:输出后用专门的校验模型,把每个关键句与参考文献做一次语义匹配,匹配不上的句子直接过滤掉。

老中医的教诲在系统里化作了代码:每个答案都带着“信心值”,信心不足就主动闭嘴。医学 AI 最可贵的不是“什么都能答”,而是“知道什么不该答”——拒答机制,是保护患者安全最后一道闸门。

Answer={withCite(q),if Scite≥τRefuse(q),otherwise\text{Answer} = \begin{cases} \text{withCite}(q), & \text{if } S_{\text{cite}} \ge \tau \\ \text{Refuse}(q), & \text{otherwise} \end{cases}
这是一个条件判断式:证据强度达到阈值 \(\tau\) 时,正常作答并附引用;否则坦诚拒答。在医学场景里,“拒绝回答”不是失败,而是负责任的表现——宁可少答一个题,也不误导一次诊断。
  1. 证据强度计算先算检索到的文献与问题的平均相似度,即证据强度。
    Scite=1K∑i=1Ksim(q⃗,di⃗)S_{\text{cite}} = \frac{1}{K} \sum_{i=1}^{K} \text{sim}(\vec{q}, \vec{d_i})
  2. 阈值判断\(\tau\) 是预先设定的门槛,像老中医定的规矩“没有九成把握不说断定的话”。
    Scite≥τS_{\text{cite}} \ge \tau
  3. 条件分支满足条件走正常回答分支,不满足走拒答分支。
    Answer={withCite(q),Scite≥τRefuse(q),otherwise\text{Answer} = \begin{cases} \text{withCite}(q), & S_{\text{cite}} \ge \tau \\ \text{Refuse}(q), & \text{otherwise} \end{cases}

性能调优

药柜越来越大,从一墙柜子变成了三间库房。实习生发现师傅翻书变慢了,皱着眉说:“师傅,您这书是越囤越多,病人可等不起啊。” 老中医一笑,转身让徒弟在柜门上加标签索引,把常用的药挪到前排。

RAG 系统的性能瓶颈,第一个就是检索延迟。知识库动辄几十万片段,逐一计算相似度太慢。工程上是给向量建索引——常见的 HNSW(分层可导航小世界图)算法像给书加目录,先粗翻目录再精读页面,检索从秒级降到几十毫秒。第二个瓶颈是答案质量,需要用指标持续评估:召回率衡量“该找到的相关文献找到了多少”,精确率衡量“找到的结果里真正相关的占多少”,两者综合成 F1 分数。

调优还有一层“保鲜”问题:医学知识更新快,指南每几年就修订一次。系统要有在线增量更新能力——新论文发布当天就能进入知识库,旧版本自动降权。老中医把常用药放在前排、定期上架新药,RAG 系统同样要把“快速、准确、常新”这三个目标同时伺候好。

F1=2×Precision×RecallPrecision+RecallF_1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}
\(F_1\) 是精确率(Precision)和召回率(Recall)的调和平均。召回率是“该捞的鱼捞上来几条”,精确率是“捞上来的鱼有几条真是目标鱼”。两个指标常常顾此失彼,F1 把两者拧成一股绳。
  1. 精确率检索返回的结果中,真正相关的比例。
    Precision=TPTP+FP\text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}}
  2. 召回率知识库中所有相关文献里,被成功检索出来的比例。
    Recall=TPTP+FN\text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}}
  3. 调和平均对两者取倒数平均后再取倒数,防止某一指标畸高掩盖另一指标很差。
    F1=2×Precision×RecallPrecision+RecallF_1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}

局限展望

再厉害的老中医也有力所不及之处。实习生问起一种从未见过的热带寄生虫病,老中医坦言:“我行医四十年,没见过这个病,你容我翻遍藏书,可能也是两眼一抹黑。” 实习生明白了:再丰富药柜,也有装不下的药材。

RAG 的局限首先在于知识库覆盖:如果源头文献本身缺失或质量低,检索再强也是“无米之炊”;某些罕见病的英文资料寥寥,中文资料更少,检索召回率天然受限。其次是资源开销:向量化需要 GPU/CPU 计算,海量向量的存储与索引需要内存,检索+生成的双阶段调用增加了每次问答的延迟与成本。第三是法规伦理:医疗决策责任划分、患者隐私保护(知识库里可能含病历数据)、以及“AI 给出的建议谁来承担法律责任”——这些问题远超技术范畴。

展望未来,RAG 正朝着多模态检索(不只查文字,还能查影像、心电图数据)和知识图谱增强(把药物相互作用、疾病分类层级建模成图结构)方向演进。可以想象,未来的 AI 医生不仅有医案柜,还有解剖图谱墙和影像胶片库,问诊时“图、文、数”三管齐下。

实习生合上那本泛黄的笔记,望着满墙的书柜,想起师傅第一天说的话:“医学的本质是敬畏。书是工具,心是根本。” 技术也一样——RAG 再强,也只是辅助医生决策的工具,永远替代不了医者的审慎与担当。

AI 应用场景

临床决策支持系统

阶段:知识库构建 + 检索策略 + 引用约束

解决的问题:传统临床决策支持系统(CDSS)依赖专家人工维护规则库,更新慢且覆盖有限。医生输入“发热伴血小板减少”,系统往往只能给出宽泛列表,无法定位到最新指南和具体证型。RAG 将最新循证指南、药物说明书、本院诊疗规范向量化入库,医生提问后实时检索并生成带引用的建议,每个结论可一键跳转原文。

具体案例:某三甲医院呼吸科接入 RAG 问答系统。医生问“慢阻肺急性加重期抗菌药物选用”,系统返回引用 2024 GOLD 指南的推荐方案、备选药物及禁忌说明,每句话标注指南章节号。医生阅读 30 秒即可判断,替代了过去翻阅 PDF 指南十分钟的工作。

罕见病辅助诊断问答

阶段:幻觉抑制 + 性能调优

解决的问题:罕见病种类繁多(全球约 7000 种),任何医生都难以全记。传统搜索返回大量良莠不齐的信息,难以判断可信度。RAG 系统只检索权威罕见病数据库(如 Orphanet、OMIM),且设置高置信阈值——检索证据不足时明确回答“未找到匹配证据”,而不是硬凑一个诊断方向,避免误导医生。

具体案例:一位患者长期乏力、反复发热,多位医生未确诊。AI 医生助手将患者症状与 Orphanet 数据库中数千种罕见病比对,检索到“成人斯蒂尔病”的临床特征高度吻合,并附上 5 篇相关文献。虽未直接确诊,但为医生提供了新的排查方向,最终经风湿免疫科会诊确认。

患者科普与导诊

阶段:检索策略 + 引用约束

解决的问题:患者上网查病真假难辨,百度一下“头疼”可能吓出脑瘤。医院面向患者的科普机器人使用 RAG,只从小范围审核过的科普库里检索,同时强制引用——“为什么我常反酸?”回答后附 [1][2] 指向医院消化科官方科普文章。超出知识库的个性化诊疗问题(如“我的 CT 片子有什么问题”)直接拒答并引导挂门诊。

具体案例:某互联网医院上线“AI 导诊助手”,3 个月内处理 12 万次咨询。95% 的常见病科普问题得到带引用的回答,患者对回答的信任度评分高达 4.6/5;所有涉及具体诊断的建议都被安全拦截,转人工服务。

Python 演示

python67 行
import math # 知识库:模拟经过清洗和切分的医学文献片段DOCUMENTS = [    {"id": "D001", "text": "Aspirin reduces fever and relieves pain but increases bleeding risk in elderly patients."},    {"id": "D002", "text": "Ibuprofen is effective for fever and pain but should be avoided in patients with kidney disease."},    {"id": "D003", "text": "Paracetamol is safe for most adults with fever, with a maximum daily dose of 3000 mg."},    {"id": "D004", "text": "Amoxicillin is a first-line antibiotic for bacterial pneumonia in adults."},    {"id": "D005", "text": "Cough persisting over three weeks requires chest imaging to rule out tuberculosis."}] STOP_WORDS = {"a", "an", "the", "for", "with", "in", "of", "on", "is", "and", "or",              "but", "to", "should", "be", "that", "this", "as", "by", "from", "it"} def tokenize(text: str) -> list:    return [w for w in text.lower().replace(",", "").replace(".", "").split()            if w not in STOP_WORDS] def vectorize(text: str) -> dict:    vec = {}    for w in tokenize(text):        vec[w] = vec.get(w, 0) + 1    return vec def cosine_sim(v1: dict, v2: dict) -> float:    dot = sum(v1.get(w, 0) * v2.get(w, 0) for w in set(v1) | set(v2))    n1 = math.sqrt(sum(v * v for v in v1.values()))    n2 = math.sqrt(sum(v * v for v in v2.values()))    if n1 == 0 or n2 == 0:        return 0.0    return dot / (n1 * n2) def bm25_overlap(query_vec: dict, doc_vec: dict) -> int:    return sum(doc_vec.get(w, 0) for w in query_vec) def retrieve(query: str, top_k: int = 2) -> list:    qv = vectorize(query)    scored = []    for doc in DOCUMENTS:        dv = vectorize(doc["text"])        semantic = cosine_sim(qv, dv)        keyword = bm25_overlap(qv, dv)        hybrid = 0.7 * semantic + 0.3 * keyword        scored.append({"doc": doc, "score": hybrid})    scored.sort(key=lambda x: x["score"], reverse=True)    return scored[:top_k] def generate_answer(query: str) -> str:    hits = retrieve(query)    if not hits or hits[0]["score"] < 0.05:        return "无法给出有据可依的答案,请咨询医生。" * 0  # 拒答分支    if len(hits) < 1:        return "抱歉,知识库中没有找到足够依据,请就医确诊。"    refs = " ".join('[' + str(i + 1) + ']' for i in range(len(hits)))    evidence = " ".join(d["doc"]["text"] + " [" + d["doc"]["id"] + "]"                        for d in hits)    answer = "根据知识库中的资料," + evidence + " 参考以上证据," + refs    return answer def main():    question = "fever and pain relief for elderly"    print("Q:", question)    print(hits_info := "检索到 {} 篇相关文献".format(len(retrieve(question))))    print("A:", generate_answer(question)) if __name__ == "__main__":    main()
目的:用纯 Python 实现一个极简 RAG 循环——文档向量化 → 混合检索(语义+关键字)→ 拼接证据生成带引用的答案,演示 RAG 的核心流程。
  1. def vectorize(text: str) -> dict:将文本转为词频字典,相当于把文献片段变成“数字向量”。
  2. def cosine_sim(v1, v2) -> float:计算两个向量的余弦相似度,判断语义接近程度。
  3. semantic = cosine_sim(qv, dv)语义检索部分,捕捉“意思相近但用词不同”的匹配。
  4. keyword = bm25_overlap(qv, dv)关键字检索部分,保证专有名词精确命中。
  5. hybrid = 0.7 * semantic + 0.3 * keyword混合加权合并两种检索得分。
  6. scored.sort(... reverse=True)按综合得分降序排列,取出 Top-K 作为证据。
  7. if hits[0]["score"] < 0.05:置信阈值判断,证据不足时走拒答分支。
  8. evidence = ... doc["text"] + " [" + doc["id"] + "]"生成答案时拼接原文和文献 ID,实现引用约束。

常见误区

误区我一开始以为 RAG 就是在模型前面放一个 Google 搜索框,搜到什么粘贴给模型就行。简单省事,哪需要什么知识库工程?搜索 API 一接,万事大吉。

正解把 RAG 等同于“网页搜索 + 喂提示词”,会踩三个坑:一是网页搜索返回的是整篇网页,噪音巨大,模型被无关信息带偏;二是公网搜索没有医学专业性,搜到的可能是养生号文章;三是没有引用约束,模型还是会编。真正的 RAG 需要对知识库做清洗、切分、向量化、重排序,并对答案做引用校验——这是一整套工程,而不是一个搜索 API。

为何常见:RAG 的流程图看起来就是“搜索→拼接→生成”三步,很多人看到这个简化图,就误以为实现起来也只是调三个接口。

误区库里的文献越多,模型能参考的证据就越多,答案一定更全面、更准确。所以我要把所有能爬到的论文全塞进去,几百万篇都不嫌多。

正解知识库并非越大越好,而是“越精越好”。检索 Top-K 通常只有 3-5 篇,如果库里混入大量低质量、重复、过时的文献,检索器可能把宝贵的名额分给“看似相关实则无用”的内容——这就像药柜塞满杂草,抓药时反而找不到真药材。更重要的是,向量索引的体积过大会拖慢检索速度、增加内存开销。正确的做法是:宁缺毋滥,只收录经过同行评议、时效性强的权威文献,并定期清理撤稿和旧版本。

为何常见:“数据越多 AI 越强”是深度学习时代的惯性思维,但 RAG 是“检索+生成”架构,检索质量的权重远大于数据量,规模不等于精度。

误区RAG 已经把相关文献片段给模型了,模型照着抄还不会吗?我觉得有了检索增强,幻觉问题就彻底解决了,不用再做任何防幻觉处理。

正解检索增强大幅减少幻觉,但不能完全消除。模型可能忽略证据去“自由发挥”;也可能检索结果本身相关但内容被断章取义;还可能证据之间相互矛盾,模型“挑顺眼的”说。2023 年 Meta 的研究显示,即使提供了正确上下文,LLM 仍可能产生约 10% 的事实错误。所以必须叠加幻觉抑制措施:强制引用、置信阈值、输出后校验。RAG 是“减少幻觉的必要不充分条件”,不是“充分必要条件”。

为何常见:人们容易把“有了参考资料”等同于“一定会参考资料”,忽略了模型自身生成机制的不确定性——实习生面前摆着书,也可能懒得翻。

误区系统给出的答案有文献引用,看起来和医生写的病历一样专业,那就可以直接拿来做诊断结论,患者自己也能照着抓药。

正解RAG 的输出本质是“信息检索 + 文本生成”的结果,只是参考信息,不是诊断结论。医学诊断需要结合患者完整病史、查体、检验检查结果,而检索片段只覆盖了知识库中的部分信息;且引用文献可能是过时的(指南几年一改),也可能与患者特殊情况冲突。合规的医疗 AI 系统必须声明“仅供参考,不构成诊疗建议”,对具体用药、剂量类问题必须拒答并引导线下就医。RAG 是医生的工具,不是医生的替代品。

为何常见:LLM 输出的语言流畅、结构完整,加上“引用”这种学术形式后,会产生一种“权威感”的错觉,让非专业人士高估其可靠性。

面试题

Q1. RAG 中的 "R" 代表什么?

单选题 · easy

  • A.检索(Retrieval)← 正确答案
  • B.重写(Rewrite)
  • C.推理(Reasoning)
  • D.强化(Reinforce)

答案:A。RAG 全称 Retrieval-Augmented Generation,R 是 Retrieval(检索),核心是“先检索再生成”。就像老中医先翻医案再开方,检索环节是 RAG 区别于普通提示词工程的本质特征。

Q2. 在 RAG 中,知识库里的长文献通常需要先做什么处理?

单选题 · easy

  • A.压缩成一段摘要
  • B.切分为短片段← 正确答案
  • C.翻译成英文
  • D.加密存储

答案:B。长文献必须切分为数百字的片段(chunking),因为大模型上下文窗口有限,且检索单元越小定位越精准。切分时还要设置重叠,防止语义被切断。压缩成摘要会丢失细节,翻译和加密与检索无关。

Q3. RAG 中“引用约束”的主要目的是什么?

单选题 · easy

  • A.让模型回答更流畅
  • B.让每个结论可溯源← 正确答案
  • C.减少计算资源
  • D.加快检索速度

答案:B。引用约束要求模型每句话标注所依据的文献编号,目的是让答案可溯源、可核查。在循证医学中,引用是“证据链”的体现,也是审核者判断结论可靠性的基础。它不是为了让回答更流畅,也不直接减少计算量。

Q4. 余弦相似度的取值范围是多少?

单选题 · mid

  • A.0 到 1
  • B.-1 到 1← 正确答案
  • C.0 到 100
  • D.1 到 10

答案:B。余弦相似度是两个向量方向夹角的余弦值,范围为 -1 到 1。1 表示方向完全一致,-1 表示完全相反。在文本检索中,文档向量各维度通常非负,实际值多在 0 到 1 之间,但数学定义允许负值,所以正确范围是 -1 到 1。

Q5. 混合检索(Hybrid Search)融合了哪两种检索方式?

单选题 · mid

  • A.向量检索和关键字检索← 正确答案
  • B.布尔检索和图检索
  • C.模糊检索和精确检索
  • D.顺序检索和二分检索

答案:A。混合检索通常融合向量检索(语义相似度,擅长“意思相近说法不同”)和关键字检索(如 BM25,擅长精确匹配专有名词)。向量抓语义,关键字抓精确,两者加权互补。其他选项不是 RAG 中主流的混合组合。

Q6. 当 RAG 检索到的证据强度低于设定阈值时,系统应该怎么做?

单选题 · mid

  • A.增大 Top-K 继续检索
  • B.直接返回“未找到依据”← 正确答案
  • C.让模型自由发挥回答
  • D.随机挑选一篇文献

答案:B。证据不足时应该触发“无据拒答”——坦承知识库中没有充分依据。医学场景中,拒答是保护患者安全的机制:与其误导,不如诚实地建议线下就诊。增大 Top-K 或自由发挥都会增加幻觉风险,随机挑选更是毫无根据。

Q7. RAG 中知识库质量控制包括哪些措施?

多选题 · mid

  • A.只收录权威期刊文献← 正确答案
  • B.定期清理撤稿和过时版本← 正确答案
  • C.无限制扩充数据量
  • D.对文献做去重和格式清洗← 正确答案

答案:ABD。质量控制的核心是“精”而非“多”:只收录权威来源(A)、定期清理撤稿/旧版(B)、做去重与格式清洗(D)。无限制扩充数据量(C)反而会引入噪音,降低检索精度,不是质量控制手段。

Q8. 下列哪些属于 RAG 幻觉抑制的手段?

多选题 · mid

  • A.设置置信度阈值← 正确答案
  • B.强制答案标注引用← 正确答案
  • C.增加模型参数量
  • D.输出后溯源核查← 正确答案

答案:ABD。置信度阈值(A)、强制引用(B)、输出后溯源核查(D)都是 RAG 系统中常用的幻觉抑制手段。增加模型参数量(C)与幻觉抑制没有直接关系,模型更大不代表更会“查证”,反而可能更自信地编造。

Q9. F1 分数是精确率(Precision)和召回率(Recall)的什么平均?

单选题 · hard

  • A.算术平均
  • B.几何平均
  • C.调和平均← 正确答案
  • D.加权平均

答案:C。F1 是精确率和召回率的调和平均,公式为 2PR/(P+R)。调和平均对两者中较小值更敏感,能防止一个指标畸高掩盖另一个指标失真。算术平均和几何平均没有这种惩罚作用,加权平均需另设权重系数。

Q10. RAG 在循证医学应用中面临哪些主要局限?

多选题 · hard

  • A.罕见病知识库覆盖不足← 正确答案
  • B.存储和计算资源开销大← 正确答案
  • C.不存在任何引用错误
  • D.医疗责任划分尚不明确← 正确答案

答案:ABD。局限包括:罕见病文献本身稀少导致覆盖不足(A);大规模向量索引需要大量内存与计算资源(B);法律上 AI 建议的责任归属尚未明确(D)。引用错误在复杂检索场景下仍会出现,C 说“不存在任何引用错误”过于绝对,是错误选项。