LangChain CRAG 深度剖析:检索纠错到底怎么纠的?幻觉检测每次都查吗?
LangChain CRAG 深度剖析检索纠错到底怎么纠的幻觉检测每次都查吗普通 RAG 是检索 → 生成一条路走到底——检索回来的文档可能根本不相关模型照样硬着头皮编答案。Corrective RAGCRAG号称能自我纠错但纠错到底纠的是什么是改答案还是改检索幻觉检测是不是每次都调 LLM本文拆开 langchainrust 的 CRAG 实现逐行讲清楚整条纠错链路。一、CRAG 全流程6 步状态机CRAG 的核心逻辑是一个状态机6 步走完1. 检索(retrieve) → 向量检索拿回 N 篇文档 2. 评分(grade_documents) → LLM 给每篇文档打相关度分 3. 纠错(correct) → 平均分低于阈值? 触发纠错 4. 过滤(filter) → 扔掉低于阈值的文档 5. 生成(generate) → 基于过滤后的文档生成答案 6. 幻觉检测(hallucination) → LLM 检查答案有没有依据下面逐步拆解。二、评分LLM 怎么判断文档相不相关评分不是算余弦相似度是让 LLM 读文档后判断。评分 PromptYou are a document relevance grader. Given a user query and a document, determine if the document is relevant. Query: {query} Document: {document_content} Respond in this exact format: Relevance: [relevant/irrelevant] Score: [0.0 to 1.0] Reasoning: [brief explanation]LLM 返回类似Relevance: relevant, Score: 0.9, Reasoning: 文档直接描述了...代码再解析。解析规则4 种情况LLM 回了什么得分说明有明确数字Score: 0.750.75直接取最可靠含relevant不含irrelevant0.8默认相关分含irrelevant0.2默认不相关分啥都没有模糊响应0.4故意低于阈值标记is_ambiguous这里有个坑模糊响应给 0.4 是 v0.5.1 才调的。早期版本给 0.5恰好等于旧阈值也是 0.5导致 LLM 说不清时——纠不纠全看运气。改成 0.4 后模糊就触发纠错保守策略宁多纠不漏纠。评分是并行的4 篇文档不是串行评是用join_all并行调 4 次 LLMletfutures:Vec_documents.iter().map(|doc|self.grade(query,doc)).collect();letresultsjoin_all(futures).await;// 4 次同时发出延迟 ≈ 1 次 LLM 调用的时间不是 4 倍。三、纠错纠的不是答案是检索这是 CRAG 最核心的设计。当平均分低于阈值默认 0.6触发correct()ifstate.avg_scoreself.grade_threshold{// 默认 0.6self.correct(mutstate).await?;}纠错不是改答案是换一种方式重新检索。correct()做四件事3.1 生成 3 个备选查询让 LLM 把原问题换个问法生成 3 个变体Generate 3 alternative versions of the following query to improve retrieval coverage. Original query: {query} Each alternative should approach the information need from a different angle.比如原问题Rust 和 Go 的区别LLM 可能生成Rust 与 Go 语言特性对比Go 和 Rust 性能差异分析Rust Go 适用场景选择为什么要换问法向量检索有角度偏差——同一个意思换个说法可能检索不到。多角度提问能提高召回。3.2 用备选查询并行检索 去重3 个查询各检索 4 篇 → 最多 12 篇 → 按前 200 字符判重合并letretrieve_futures:Vec_alternatives.iter().map(|q|self.retriever.retrieve(q,self.retrieve_k)).collect();letall_resultsjoin_all(retrieve_futures).await;// 3 路并行letmutseen_contentHashSet::new();fordocinall_results{ifseen_content.insert(doc.content[..200]){// 按内容去重merged_docs.push(doc);}}3.3 联网搜索兜底可选如果配了 web 搜索工具还会去网上搜一次补料ifletSome(tool)self.web_fallback{letweb_resulttool.run(state.current_query.clone()).await?;state.web_resultsSome(web_result);}3.4 重新评分纠错后还会再评一轮分确保新文档的质量self.grade_documents(state).await?;// 对新文档重新打分不是换回来就直接用要验证新检索的文档确实更好。四、过滤宁可没文档不留烂文档纠错后低于阈值的文档直接扔掉letfiltered:Vec(Document,f64)state.documents.iter().zip(state.grade_scores.iter()).filter(|(_,score)|scoreself.grade_threshold).collect();// 全不达标 → 宁可空也不留烂文档误导生成letsource_docsiffiltered.is_empty(){Vec::new()}else{filtered};这是个重要设计宁可没文档生成我不知道也不要用烂文档生成看似合理实则胡编的答案。五、生成评分理由也喂给模型生成答案时不只喂文档还把评分时 LLM 说的为什么这篇相关也塞进 promptletcontextbuild_context(source_docs,state.web_results,...);letreasoning_textformat_reasoning(source_docs,reasoning);// 评分理由letuser_messagebuild_generate_prompt(context,reasoning_text,state.query);这样生成模型能理解每篇文档的价值更好地组织答案。另外有个Token 预算截断build_context()按分数从高到低排超预算的低分文档直接丢letmutsorted:Vec_docs.iter().collect();sorted.sort_by(|a,b|b.1.partial_cmp(a.1)...);// 按分降序for(doc,_score)insorted{iftoken_countentry_tokensmax{continue;// 超预算直接跳过}...}六、幻觉检测每次都查且最好用另一个模型生成答案后最后一步是幻觉检测——检查答案是不是编的。什么是幻觉LLM 没有可靠资料时会一本正经地胡编。问张三的生日文档没写它可能编一个1985 年 3 月 12 日。这就是幻觉。怎么检测把文档 答案一起喂给 LLM让它以怀疑态度核查You are a skeptical fact-checking assistant. Be skeptical. Is the above answer fully grounded in and supported by the provided context? - grounded if every claim is directly supported - not grounded if any information is not found in or contradicted by the context解析 LLM 回复ifwords 包含not grounded或unsupported{state.groundedfalse;// 判定编的}elseifwords 包含grounded或yes{state.groundedtrue;// 判定有据}else{state.groundedfalse;// 模糊 → 默认当编的保守}三个关键设计点① 为什么用独立 LLM生成答案和检测幻觉默认用同一个 LLM。问题是模型倾向于认同自己的输出——自己写的自己看当然觉得对这就是自检偏差。所以可以注入独立 LLM 做检测letagentCorrectiveRAGAgent::new(main_llm,retriever).with_grader_llm(checker_llm);// 用另一个模型检测代码里letgrader_llmself.grader_llm.unwrap_or(self.llm);// 优先独立 LLM没配就用主 LLM向后兼容。② 检测失败不中断检测本身调用失败网络断了、限流了不会让整个流程崩而是降级标记grounded falsematchgrader_llm.chat_with_system(...).await{Ok(r)r,Err(_){state.groundedfalse;// 标记未验证不报错returnOk(());}}答案照常返回只是标了未验证。③ 结果怎么用CRAGResult.grounded告诉调用方答案有没有经过验证letresult:CRAGResultagent.invoke(问题).await?;if!result.grounded{// 答案可能不靠谱提示用户或走别的策略}七、灵魂拷问每次都调 LLM 吗调几次这是性能和成本的核心问题。数一下invoke()一次的 LLM 调用步骤调 LLM次数1. 检索❌向量检索不调 LLM2. 评分✅每篇文档 1 次4 篇 4 次并行3. 纠错触发时✅生成备选查询 1 次 重评分 ~4 次并行 web 1 次4. 过滤❌纯逻辑5. 生成✅1 次6. 幻觉检测✅1 次如果开启最少几次文档质量好不纠错评分 4 次 生成 1 次 幻觉检测 1 次 6 次最多几次触发纠错 联网搜索评分 4 次 生成备选查询 1 次 重评分 4 次 web 1 次 生成 1 次 幻觉检测 1 次 ≈ 12 次没有缓存代码里没有上次评分过就跳过的缓存机制每次invoke()都完整跑一遍。但有两个优化评分并行join_all4 次同时发不是串行等备选查询检索并行3 路同时搜所以实际延迟 ≈ 几个 LLM 往返不是十几次串行相加。八、完整链路一图流用户提问 │ ▼ [1] 检索 ─── 向量检索 N 篇文档 │ ▼ [2] 评分 ─── LLM 并行给每篇打分4 次并行调用 │ ▼ 平均分 0.6? ├─ 否 ───────────────────────────────────┐ │ │ ├─ 是 → [3] 纠错 │ │ ├─ 生成 3 个备选查询1 次 LLM │ │ ├─ 并行检索 去重3 路并行 │ │ ├─ 联网搜索兜底可选1 次 │ │ └─ 重新评分~4 次 LLM 并行 │ │ │ ▼ ▼ [4] 过滤 ─── 扔掉低分文档宁可空不留烂 │ ▼ [5] 生成 ─── 文档 评分理由 → LLM 生成答案1 次 │ ▼ [6] 幻觉检测 ── 文档 答案 → LLM 怀疑式核查1 次 │ └─ 优先用独立 LLM避免自检偏差 │ └─ 失败不中断标记 groundedfalse │ ▼ 输出 CRAGResult ├─ answer: 答案 ├─ grounded: 是否有据幻觉检测结论 ├─ sources: 来源文档 ├─ grade_scores: 各文档评分 └─ grade_reasoning: 评分理由九、一句话总结CRAG 的纠错不是改答案是改检索——评分发现检索回来的文档不行就换个问法重新搜、去网上搜搜到更好的文档后再生成。最后还用最好独立的LLM 验一遍答案是不是胡编的。代价是 LLM 调用次数多6~12 次但换来了可观测的质量信号grounded字段和更高的答案可靠性。十、什么时候该用 CRAG适合对答案准确性要求高、容忍延迟的场景客服质检、医疗法律咨询检索质量不稳定文档库杂、向量模型一般需要质量信号做后续决策groundedfalse时转人工不适合实时聊天6~12 次 LLM 调用延迟太高成本敏感的大规模批处理调用量翻倍简单 FAQ普通 RAG 足够CRAG 是杀鸡用牛刀仓库github.com/atliliw/langchainrust

相关新闻

Ryujinx终极指南:如何快速配置高性能Switch模拟器

Ryujinx终极指南:如何快速配置高性能Switch模拟器

Ryujinx终极指南:如何快速配置高性能Switch模拟器 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx是一款用C#编写的高性能Nintendo Switch模拟器,让你在…

2026/7/29 19:14:08 阅读更多 →
基于机器学习的网络安全拓扑可视化分析系统 —— Cluster Intelligence

基于机器学习的网络安全拓扑可视化分析系统 —— Cluster Intelligence

**摘要**:本文介绍了一款基于 Next.js D3.js 构建的网络流量安全分析可视化系统。该系统通过 **Louvain 社区发现算法**自动划分网络安全域,利用 **Isolation Forest(隔离森林)算法**实现无监督异常检测,并以力导向图…

2026/7/29 19:14:08 阅读更多 →
校园讲解设备按功率选错了,声场适配才是隐形分水岭

校园讲解设备按功率选错了,声场适配才是隐形分水岭

【文章概述】之前做过几个学校的项目,都是看起来很简单但落地翻车的类型。需求一句话:参观的时候前面的人讲,后面的人听。校方立项的时候关注的都是续航、音量、覆盖范围,这些在招标参数表上能对比的东西。设备到了现场实地跑一趟…

2026/7/29 19:14:08 阅读更多 →

最新新闻

Kubernetes Internals控制平面深度剖析:API请求的生命周期全记录

Kubernetes Internals控制平面深度剖析:API请求的生命周期全记录

Kubernetes Internals控制平面深度剖析:API请求的生命周期全记录 【免费下载链接】kubernetes-internals This is a collection of resources that shed light on the inner workings of Kubernetes 项目地址: https://gitcode.com/gh_mirrors/ku/kubernetes-inte…

2026/7/29 19:34:25 阅读更多 →
Windows热键冲突终极解决方案:如何快速定位占用快捷键的罪魁祸首

Windows热键冲突终极解决方案:如何快速定位占用快捷键的罪魁祸首

Windows热键冲突终极解决方案:如何快速定位占用快捷键的罪魁祸首 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective …

2026/7/29 19:34:25 阅读更多 →
【面试题-算法】----面试经典算法题|7升、5升水杯,如何量出6升水?两种解法全过程图解

【面试题-算法】----面试经典算法题|7升、5升水杯,如何量出6升水?两种解法全过程图解

一、题目描述 📝 题目:现有两个无刻度水杯,容量分别为 7L 和 5L,水源无限供应。 允许操作: 装满杯子倒空杯子A杯倒水至B杯(B满则停止) 目标:精确量出 6L 的水。先抛出结论&#xff1…

2026/7/29 19:34:25 阅读更多 →
从Excel到全自动:电商利润计算的四次进化

从Excel到全自动:电商利润计算的四次进化

一、利润核算能力不是“有”或“没有”,而是一个进化过程 跟很多电商创业者聊过之后发现,一个团队的利润核算能力不是突然“从无到有”的,而是随着业务增长逐步进化的。每个阶段都有它的“当时最优解”,但业务规模跨过某个临界点…

2026/7/29 19:34:25 阅读更多 →
AI教材生成技术:降低查重率的实用方法

AI教材生成技术:降低查重率的实用方法

1. AI教材生成技术现状与痛点分析最近两年,AI内容生成技术在教育领域的应用呈现爆发式增长。特别是在教材编写方面,基于大语言模型的智能写作工具已经能够辅助教育工作者快速生成教学大纲、知识点讲解和习题等内容。但随之而来的查重问题却让许多使用者头…

2026/7/29 19:34:25 阅读更多 →
2027北京具身智能机器人技术展六大同期活动板块揭晓

2027北京具身智能机器人技术展六大同期活动板块揭晓

2027年6月26日至28日,2027北京具身智能机器人技术展落地北京亦庄,组委会正式揭晓六大同期活动完整板块,分别为开幕主论坛、新品首发路演、全球供需商贸对接会、科创投融资专场、天地一体化实景体验、亦庄产业园区参访,六大板块贯穿…

2026/7/29 19:33:25 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻