多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

【RAG常见面试题 · 01】面试官问RAG怎么解决大模型幻觉,别只回答外挂知识库

【RAG常见面试题 · 01】面试官问RAG怎么解决大模型幻觉,别只回答外挂知识库 前言在面试中聊到大模型幻觉不少同学脱口而出就是“做个 RAG 外挂知识库就行”。但如果追问一句为什么纯生成模型一定会胡编RAG 具体靠什么机制把模型按在事实里这篇文章把这套链条彻底拆开。文章目录前言一、大模型为什么总爱一本正经胡说八道1.1 纯生成模型的参数记忆缺陷1.2 为什么只靠微调解决不了幻觉二、RAG 是怎么把模型按在事实里的2.1 事实锚定与边界约束2.2 在代码中实现防幻觉上下文装配三、动态按需检索与幻觉检测3.1 观察 Token 不确定性来触发二次检索3.2 忠实度评估与输出守门四、RAG 会带来两类新问题4.1 切片断章取义引发的新幻觉4.2 检索延迟与系统复杂度的代价写在最后一、大模型为什么总爱一本正经胡说八道很多人把大模型当成一个无所不知的超级数据库这从一开始就理解错了。大模型本质上是一个基于概率的文本续写器。它并没有真正理解客观世界它的全部知识都压缩在成百上千亿的参数权重里Parametric Memory。1.1 纯生成模型的参数记忆缺陷当你在对话框里向 GPT 提问时模型在底层做的事情只有一件根据前面的文字计算词表中几万个 Token 里哪一个出现的条件概率最高。这里有一个非常典型的翻车案例。如果你问纯生成模型“爱因斯坦为什么能拿到诺贝尔物理学奖”很多模型在没有外挂知识库的情况下会脱口而出“因为爱因斯坦提出了相对论。”稍微了解物理学史的人都知道爱因斯坦 1921 年获得诺贝尔物理学奖的真正颁奖理由是“发现了光电效应定律”根本不是相对论。但大模型为什么会说错原因很简单在互联网的海量公开语料里“爱因斯坦”和“相对论”两个词绑定的频率实在太高了。在模型的参数权重里它们的关联概率断层式领先。当模型内部缺乏精确的事实记忆时为了保证语言的通顺度它就会自然而然地按照最高概率顺着往下编。RAG 模式外部非参数记忆锚定用户输入爱因斯坦因何获诺贝尔奖检索外部权威事实库检索出明确证据1921年因光电效应获奖证据注入上下文 严格事实约束模型仅充当阅读理解与总结引擎输出准确答案因光电效应获奖事实可溯源纯生成模型参数化记忆用户输入爱因斯坦因何获诺贝尔奖模型内部参数权重概率预测高共现概率诱导爱因斯坦 ➔ 相对论极高权重输出错误事实因相对论获奖产生幻觉这种仅靠参数记忆的生成机制直接带来了两个致命短板时效性滞后模型的知识完全定格在训练数据切断的那一刻昨天刚刚发布的政策或财报它不可能凭空知道。细分领域弱通识预训练语料往往很宽泛面对企业内部的私有业务规范、冷门医学药理或精密工业参数模型内部根本没有对应的深层记忆。1.2 为什么只靠微调解决不了幻觉有人可能会想既然它记不住那我用自己的领域数据对模型做微调Fine-Tuning不就行了吗在真实工程落地里微调更多是用来教会模型“说话的风格、输出的格式或推理的步骤”而不是用来给它灌输硬性事实。用微调来更新事实知识不仅训练成本极高、周期极长而且极易引发模型的“灾难性遗忘”Catastrophic Forgetting——学会了新的产品手册可能把原有的基础编程能力或者逻辑推理能力给搞坏了。想让模型说真话最靠谱的做法不是强行篡改它的参数脑区而是直接把证据摆到它面前。二、RAG 是怎么把模型按在事实里的RAGRetrieval-Augmented Generation检索增强生成的核心思想就是打破纯生成模型完全依赖参数记忆的死穴把外部权威知识库与生成模型做深度结合。它把原本要求模型“凭空背诵”的闭卷考试变成了“带着资料抄答案”的开卷考试。具体到治幻觉上主要靠两道防线。2.1 事实锚定与边界约束在 RAG 流程里用户的提问不再直接扔给大模型而是先走一套严密的检索链路。提示词边界约束机制1. 用户发起提问2. 向量/全文检索召回 Top-K 相关文本块3. Rerank 交叉重排模型精选 Top-3 核心证据4. 上下文拼装与注入Prompt Engineering【证据注入】注入带有文档切片编号的事实片段【严控推理】要求答案必须 100% 能在材料中找到支撑【拒答门禁】材料中未提及的信息直接回答未知严禁猜测5. 大模型输出答案并附带引用来源角标第一道防线是检索召回与重排Rerank。系统会把外部知识库切分成几十到几百字不等的文本切块Chunk预先建立向量索引与倒排索引。当用户发起提问时系统从知识库中召回语义最相近的切片再通过交叉编码的 Rerank 模型计算精确相关度挑选出最硬核的几条证据。第二道防线是Prompt 强约束与拒答机制。很多大模型之所以出现幻觉是因为它的指令对齐让它有一种强烈的“迎合倾向”——哪怕它心里没底也拼命想凑出一个看起来像那么回事的答案。在 RAG 的提示词模板里必须给模型立下严格规矩。告诉它你现在的唯一身份是一个严谨的资料分析员你的回答必须完全基于后面给出的参考资料如果参考资料里没有直接提到请老老实实回答“根据现有参考资料无法回答”绝对不允许凭空推测。当证据链被摆在上下文里且推测的退路被提示词堵死后模型的自由联想空间被大幅压缩幻觉自然就下来了。2.2 在代码中实现防幻觉上下文装配在实际开发中我们可以利用 Spring AI 来清晰地实现这套检索与提示词防御装配。环境基准JDK 21 / Spring Boot 3.3.x / Spring AI 1.0.0-M1下面这段代码展示了如何把检索到的文档片段安全地组装进系统提示词中并带上防幻觉的拒答规则packagecom.crayontech.rag.service;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.ai.document.Document;importorg.springframework.ai.vectorstore.SearchRequest;importorg.springframework.ai.vectorstore.VectorStore;importorg.springframework.stereotype.Service;importjava.util.List;importjava.util.stream.Collectors;ServicepublicclassFactGroundedRagService{privatefinalVectorStorevectorStore;privatefinalChatClientchatClient;publicFactGroundedRagService(VectorStorevectorStore,ChatClient.BuilderchatClientBuilder){this.vectorStorevectorStore;this.chatClientchatClientBuilder.build();}publicStringgenerateFactBasedAnswer(StringuserQuery){// 1. 检索召回与过滤获取 Top-4 且相似度高于 0.75 的真实切片SearchRequestsearchRequestSearchRequest.builder().query(userQuery).topK(4).similarityThreshold(0.75).build();ListDocumentmatchedDocsvectorStore.similaritySearch(searchRequest);// 如果检索不到任何支撑证据直接触发系统级拒答不浪费 Token也不给大模型编造的机会if(matchedDocs.isEmpty()){return根据内部知识库未找到与该问题相关的权威材料无法作答。;}// 2. 格式化拼接带来源锚点的上下文内容StringcontextContentmatchedDocs.stream().map(doc-String.format([来源: %s] %s,doc.getMetadata().getOrDefault(source,知识库文档),doc.getText())).collect(Collectors.joining(\n\n));// 3. 构建强事实约束 Prompt划定证据红线与拒答要求StringsystemPrompt 你是一名严谨的技术支持助手。请严格根据下面提供的【参考证据】回答用户问题。 规则红线 1. 答案必须严格源自【参考证据】不得掺杂任何外部未经证实的推论。 2. 若【参考证据】不足以得出结论请直接回复现有材料暂未覆盖该问题无法作答。 3. 回答中凡是引用的数据或结论必须在句末标注对应的 [来源: xxx] 角标。 【参考证据】: %s .formatted(contextContent);// 4. 调用大模型基于上下文完成证据整合输出returnchatClient.prompt().system(systemPrompt).user(userQuery).call().content();}}这段代码里有两个细节直接影响抗幻觉表现第一在调用大模型之前先做相似度阈值检查。如果召回的分数很低说明知识库里根本没有这件事直接在代码层就拦截并返回根本不让大模型接手。第二每个切片都打上元数据来源标记并在提示词里强制要求模型在回答时标明角标让最终生成的每一句话都具备可追溯性。三、动态按需检索与幻觉检测单次“检索一次 生成一次”的朴素 RAGNaive RAG能解决大部分简单问答但在处理复杂业务时依然会有漏洞。现代 RAG 架构通常还会引入更深入的动态监测机制。3.1 观察 Token 不确定性来触发二次检索大模型在吐字Generate Token的时候每个词都有一个置信度得分即 Softmax 输出的概率值。如果模型输出一系列词时的置信度都接近 99%说明它根据上下文答得非常笃定。但如果遇到某个专有名词或参数时几个候选 Token 的概率非常分散比如都在 15%~20% 上下徘徊说明模型此时处于高度不确定的盲猜状态。在一些前沿的主动检索机制如 FLARE 框架中系统会实时监控生成 Token 的不确定性置信度高概率 85%置信度低概率分散在 10%~25%大模型逐 Token 生成回答检测当前句子中 Token 的置信度继续平稳生成下一个 Token判定进入模型知识盲区产生幻觉苗头将当前低置信度短句提炼为精准子 Query触发在途二次动态检索获取补充证据把新证据缝合进当前上下文重新修正并生成该短句一旦发现模型在某句话上的置信度断崖式下跌系统立即暂停生成把这句话转换成检索关键词从外部知识库拉取更详细的材料补充进去然后再让模型继续回答。这种动态按需检索把防幻觉的粒度从“单次问答”细化到了“句子甚至词语级”。3.2 忠实度评估与输出守门除了在生成前和生成中做约束在生成后还可以挂载一道轻量级的自动化审查门禁其中最常用的指标就是忠实度Faithfulness。像 Ragas 这类专业的 RAG 评测框架其核心逻辑就是校验答案对检索上下文的忠实程度提取原子事实把大模型输出的一长段回答拆解成若干句互不相干的简单陈述句Atomic Claims。上下文求证针对每一句陈述逐字核对它是否能在检索出来的文档切片里找到因果或直接证据。计算忠实度得分如果在检索材料里完全找不到依据说明这一句是大模型自己脑补出来的幻觉。当无支撑断言的比例超过安全水位时系统判定答案存在幻觉风险直接退回给模型重写或者给出降级回复。四、RAG 会带来两类新问题很多工程师刚接触 RAG 时容易走入另一个极端以为把 RAG 搭好了就万事大吉幻觉彻底清零了。现实情况是RAG 虽然压制了纯模型的自由编造但它同时也引入了新的工程难题。如果处理不当甚至会引发由检索本身导致的新幻觉。4.1 切片断章取义引发的新幻觉大模型本身没编造但如果你喂给它的资料本身就是断裂的它就会得出完全错误的结论。假设你的企业知识库里有一份规范文档“在双十一等超高并发大促期间为了保障核心结算链路可以临时关闭积分抵扣服务但是在日常平峰运行期积分抵扣功能必须保持全天候开启严禁擅自关停。”如果你在做文本切块Chunking时机械地按照 50 个字切一刀刚好把前半句切进了Chunk_A后半句切进了Chunk_B被错误单独召回完整文档规范大促时可关闭积分抵扣但日常平峰必须全天开启Chunk_A在双十一超高并发期间可以临时关闭积分抵扣服务Chunk_B但是在日常平峰运行期积分抵扣功能必须保持全天候开启。大模型读取 Chunk_A 作为依据回答当前可以直接关闭积分抵扣服务因断章取义得出错误结论当运营人员在平峰期询问“现在可以关掉积分抵扣吗”向量检索很可能只把包含“关闭积分抵扣服务”的Chunk_A送进了大模型的上下文。大模型严格遵守了提示词规矩基于参考资料得出结论“可以关闭。”这在大模型评测里叫检索引入型幻觉Retrieval-induced Hallucination。大模型没有胡说但它被残缺的上下文带进了沟里。要解决这个问题就不能依赖死板的固定字数切块而应该采用父子文档检索Parent-Document Retriever或按自然段落与语义切分——检索时用细粒度的子切片匹配精准度喂给大模型时替换为保留完整上下文的父文档段落。4.2 检索延迟与系统复杂度的代价引入 RAG 解决幻觉在架构上付出的直接代价就是调用延迟的激增。纯生成模型只需要一次网络往返就能开始流式输出而一套完整的 RAG 链路至少要经历Query 改写 ➔ 向量 Embedding 计算 ➔ 向量数据库检索 ➔ Rerank 重排 ➔ Prompt 拼装 ➔ 模型生成。如果中间再加上前面提到的 Token 不确定性检查或动态二次检索端到端的延迟很容易从原本的 500 毫秒飙升到 2 秒甚至更高。在生产系统里必须要配合语义缓存对高频重复提问直接命中缓存结果、向量索引量化如 HNSW 结合 IVFPQ以及异步并发召回等手段才能在控制幻觉的同时把接口性能拉回可用范围。写在最后回到最开始的那个面试题RAG 是怎么解决大模型幻觉的千万不要只轻描淡写地回答一句“外挂个知识库”。真正能打动面试官的回答是讲清楚知识固化在参数里的局限讲清楚从“检索召回、Rerank 提纯、提示词边界死守”的三层防御再讲清主动检索与忠实度校验的进阶手段最后客观指出切片断章取义可能带来的检索型幻觉与延迟代价。当你把这一整套工程取舍与防御机制讲完整对方就知道你不是背八股文而是真的亲手在业务里踩过坑、调过优。如果你觉得这篇文章帮你把 RAG 治幻觉的这套思路理顺了记得点个关注后续我还会继续拆解大模型实战与高频面试题里的硬核知识我们下期见。
返回列表