当前位置: 首页 > news >正文

【第 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 表,两套持久化各有分工,我梳理清楚了它们的关系。

http://www.gsyq.cn/news/1450825.html

相关文章:

  • 算盘科技深度解析:定制智慧城市解决方案的顶层设计“珠算”逻辑
  • Linux视频教程之高级运维企业实战(高级版)【共24课时】_Linux课程-51CTO学堂
  • 手把手教你用VMware虚拟机搭建Linux版DNF私服(附一键安装包下载)
  • 从沐神的‘动手学深度学习’到Kaggle提交:一个数据科学新人的完整复盘与避坑指南
  • ALTER TABLE:MySQL 增强表结构的最佳实践与避坑指南
  • 如何用qmc-decoder轻松解密QQ音乐加密音频文件?
  • 3步搞定:抖音无水印下载工具高效解决方案
  • 大数据毕业设计-基于python的农产品销售系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 【2027最新】基于SpringBoot+Vue的医院资源管理系统管理系统源码+MyBatis+MySQL
  • STC89C52三路抢答器全套开发资料:Keil工程+Proteus仿真+可烧录hex文件(共阳数码管)
  • 成都大型储水桶水塔:成都塑料圆盆水箱水塔/成都塑料方水塔/成都塑料水塔/成都工业塑料水塔/成都工地储水塔/选型 - 优质品牌商家
  • 你的聊天数据,你真正做主:WeChatMsg微信聊天记录永久保存完全指南
  • 告别复杂调参:用Google的FixMatch算法,5行代码搞定你的半监督图像分类项目
  • 分层 B 帧(Hierarchical B-frames)详解
  • 多分辨率神经网络在流体模拟中的应用与优化
  • STM32H743ZI Nucleo板裸机LwIP以太网工程,已实测通Ping和UDP
  • 三分钟搞定黑苹果:OpCore-Simplify智能OpenCore EFI配置终极指南
  • 异构计算技术
  • NCM解密工具:3步解锁网易云音乐,实现跨平台自由播放
  • 如何永久保存微信聊天记录?WeChatMsg工具完全指南
  • 618好用的灭蚊灯有哪些种类?吸入式灭蚊灯哪个牌子好一点?优选希亦、锐舞等十大品牌灭蚊灯排名
  • 洛雪音乐音源项目终极指南:一站式解锁全网高品质音乐资源
  • LeetCode 高频数组三题详解:53 最大子数组和|189 轮转数组|56 合并区间
  • 艺术数据可视化与交互设计的技术实践
  • NETcore项目使用交互窗口
  • AI日报|2026年6月2日:智能体狂飙、架构革新与物理AI崛起——AI产业进入新拐点
  • 别先问 Codex 值不值:我用一张任务分级表判断,哪些开发任务该交给 AI,哪些绝对不该
  • CANopen EDS文件可视化编辑工具集(含DS301/DS401/DSP302模板)
  • 老笔记本焕新记:手把手教你给惠普光影精灵2加装三星970 EVO Plus固态和内存条
  • 别再只用AUC了!用Python手写DeLong检验,科学比较两个机器学习模型的性能差异