news 2026/6/3 1:59:08

【第 4 篇:RAG 知识库问答——检索只是第一步】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【第 4 篇:RAG 知识库问答——检索只是第一步】

第 4 篇:RAG 知识库问答——检索只是第一步

系列记录:《从零搭建企业级 LLM 应用》,这是第 4 篇
上一篇:Dify——低代码开发平台,快速搭建一个智能体
下一篇:记忆系统——长短期记忆与混合记忆


知识库调通了,但答不对

第 3 篇里我把 Dify 知识库接好了,搜文档这个动作已经能跑通。接下来就是 RAG 最核心的部分——拿到检索结果,让 LLM 生成回答。

一开始的想法很简单:用户提问 → Dify 检索文档 → 把检索结果拼到 prompt 里 → 让 LLM 回答。大概就是:

用户:"公司的年假政策是什么?" → Dify 检索:返回文档片段 → 拼 prompt:"根据以下资料回答:{文档内容} 问题:年假政策?" → LLM 生成答案

跑了几轮就发现不对劲了。有几个问题反复出现:

  1. 检索结果质量差,LLM 基于不相关内容硬编了一个答案
  2. 同一个问题换种问法,检索结果完全不一样
  3. LLM 偶尔编造文档里根本没有的数据

第一步:查询改写——不同问法,搜出来的应该一样 ——《扩写问题》

同一个意图,用户可能有三种表达:

"年假怎么休?" "我想请年假,HR 流程是什么?" "关于带薪年假的规定"

直接用原话去搜,语义匹配效果参差不齐。尤其短的问法,向量包含的信息很少。

所以我加了查询改写这一环:在送入检索之前,先让 LLM 把用户的口语化问题转换成更适合语义搜索的表达,同时输出关键词和子问题:

输入:"年假怎么休?" 输出:{ "rewritten_query": "企业员工带薪年假的申请流程和使用规定", "keywords": ["年假", "带薪休假", "申请流程"], "sub_questions": ["年假天数如何计算", "年假申请流程是什么"] }

两个保护措施:

  • 短问题跳过改写。10 字以内的问题改写后容易偏离原意,直接搜原文更靠谱。
  • 改写失败回退。改写后的 query 搜不到结果时,自动用原始问题再搜一次。有时候 LLM 改写的措辞跟文档原文差距太大,反而匹配不上。

第二步:答案验证——给回答装一个"质检员" ——《自检回答》

检索质量提升后,还是会碰到 LLM 基于不够相关的文档片段硬编答案的情况。

我的解法:在生成答案之后,再加一步验证。用另一个 LLM 调用判断答案是否靠谱:

  • GOOD:有明确的文档依据,内容具体 → 通过
  • HALLUCINATION:出现了文档没提到的内容,或编造了数据 → 需要重来
  • NO_CONTEXT:文档里确实没有相关信息,答案已说明 → 直接告知用户
  • INSUFFICIENT:文档与问题关联度不够 → 换表达重试

验证 prompt 的设计原则:

  1. 不要太严格。只要文档与问题有相关性就判 GOOD,不因"不够全面"打回——那是生成质量的问题,不是幻觉。
  2. 异常默认通过。验证 LLM 调用失败(网络超时等),不阻断正常流程。
  3. HALLUCINATION 和 INSUFFICIENT 处理不同。幻觉需要换表达重搜,上下文不足则尝试更宽泛检索。

第三步:重试循环——一次不行换种方式再试 ——《自检未通过时,重试:换种表达问题的方式重新检索回答》

验证不通过时,给一次重试机会。策略是换一种表达方式重新检索。

重试上限设为 1 次,原因:

  • 幻觉重试有意义:第一次是看到了似是而非的内容然后编造答案,换表达可能命中更精准的文档。
  • 不相关重试意义不大:第一次检索结果就跟问题无关,换表达大概率还是不行。重试后仍不行就返回部分答案加"可能不够完整"的提示,不无限循环。
  • 之前踩过坑:Data Agent 开发时没限制重试次数,Agent 反复执行耗时暴涨。同一类问题不能犯两次。

第四步:规则引擎兜底

答案生成和验证之后,最后过一道规则引擎——防止"技术错误信息暴露",比如答案里不小心包含了 API 异常信息、代码报错。检测到就用兜底回复替换。

这个检查与业务逻辑解耦,规则写在 YAML 配置文件里,不改代码就能调整。


整条链路的全貌

用户提问 │ ├─ 查询改写(长问题结构化,短问题跳过) │ ├─ 首次检索(用改写 query 搜 Dify) │ └─ 无结果 → 回退检索(用原始 query) │ ├─ LLM 生成答案(基于检索上下文) │ ├─ 答案验证 │ ├─ GOOD → 继续 │ ├─ HALLUCINATION / INSUFFICIENT → 换表达重搜(最多 1 次) │ └─ NO_CONTEXT → 直接返回 │ └─ 规则引擎后校验 → 返回最终答案

做完 RAG 的几点感受

① RAG 不是"检索+生成"两件事,是六件事。

开始以为 RAG 就是搜一下然后让 LLM 回答。实际做下来发现,真正让 RAG 可靠的,是查不到怎么办(回退)、答对了没有(验证)、答错了怎么补救(重试)、有没有暴露不该暴露的信息(规则引擎)。

② 查询改写是性价比最高的优化。

只加了一个 LLM 调用把用户问题标准化,检索准确率就提升了一大截。改写的本质是补全信息——用户问得短,帮他把隐含意图补上。

③ 重试次数要严格控制。

一开始没限制,Agent 反复重试导致 token 消耗和等待时间都失控。硬性限制为 1 次,大部分情况够用,特殊情况直接告知"没找到"比一直转圈强。

④ 验证不能太严格。

如果要求"完全准确、覆盖全面"才给 GOOD,大部分回答都会被判定不合格,重试反而引入更多问题。验证的目标是拦截明显的幻觉,不是追求完美答案。


下一篇记录:多轮对话是怎么记住上下文的?SqliteSaver 和 SQLite messages 表,两套持久化各有分工,我梳理清楚了它们的关系。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/3 1:58:01

基于树莓派的智能闹钟DIY:从传感器到Web控制全流程解析

1. 项目概述:一个能“看见”环境的智能闹钟你有没有想过,你的闹钟不仅仅是个“报时器”?它能不能告诉你房间是冷是暖,会不会在叫醒你时用柔和的光线模拟日出,甚至让你躺在床上用手机就能设置明天的起床时间&#xff1f…

作者头像 李华
网站建设 2026/6/3 1:57:59

Windows批处理(.bat)文件趣味玩法:从黑客代码到窗口美化全攻略

Windows批处理(.bat)文件趣味玩法:从黑客代码到窗口美化全攻略 你是否曾觉得Windows批处理文件(.bat)只是枯燥的命令行工具?实际上,这个看似简单的脚本语言能创造出令人惊叹的视觉效果和实用功能…

作者头像 李华
网站建设 2026/6/3 1:56:02

大模型漏洞扫描神器 garak 越狱攻击深度设计原理解析

DAN越狱攻击探针测试用例深度原理剖析 GARAK DAN探针家族全解析 — 面向安全初学者的进阶教学文档 基于 GARAK v0.10.3.1 源码 + Qwen3:8b 真实测试数据 每个探针从攻击原理 → 源码分析 → 测试用例 → 检测机制 → 实验结果完整拆解 目录 前置知识:LLM越狱攻击的基本原理 前…

作者头像 李华
网站建设 2026/6/3 1:56:01

保姆级教程:黑群晖DSM 7.x下解锁NVMe硬盘,从缓存到存储盘一步到位

深度解锁黑群晖DSM 7.x的NVMe潜能:从缓存到存储池的全流程实战最近在折腾黑群晖的朋友们可能已经发现,升级到DSM 7.x后,系统对NVMe硬盘的限制变得更加严格了。这确实让人头疼——手头明明有高性能的NVMe固态硬盘,却只能当缓存用&a…

作者头像 李华
网站建设 2026/6/3 1:51:40

AI知识管理播客化不是趋势,是生存刚需:2024年Q2起,未完成播客化改造的知识中台将失去审计准入资格

更多请点击: https://codechina.net 第一章:AI知识管理文档播客化的本质与战略不可逆性 AI知识管理文档播客化并非简单地将文本转为音频,而是知识结构、消费场景与认知路径的系统性重构。其本质在于将静态、线性、高门槛的文档资产&#xff…

作者头像 李华