当前位置: 首页 > 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.jsqmd.com/news/939422/

相关文章:

  • 大模型又把星期几算错了?一行Python代码彻底杜绝“幻觉”
  • IAR环境下HT1621B驱动笔段式LCD的可烧录工程包(含调试脚本与硬件验证)
  • Linux视频教程之高级运维企业实战(高级版)【共24课时】_Linux课程-51CTO学堂
  • swagger全集通+mock(prism)
  • 手把手教你用VMware虚拟机搭建Linux版DNF私服(附一键安装包下载)
  • 从沐神的‘动手学深度学习’到Kaggle提交:一个数据科学新人的完整复盘与避坑指南
  • 计算基底与涌现现象:从细胞自动机到机器意识
  • 从文本到架构:vscode-plantuml如何重构开发者的UML工作流
  • 2026年阿里云OpenClaw/Hermes Agent配置Token Plan安装建议收藏
  • 手把手教你将DOTA遥感数据集标注转为COCO格式(附完整Python代码)
  • 2026年高考复读学校价格揭秘,学有方性价比高 - mypinpai
  • 别再死记硬背了!用Python手撸一个ID3决策树,从信息熵到分类预测保姆级教程
  • 告别重复点击:用AI视觉语言模型UI-TARS-desktop实现自然语言控制电脑的终极指南
  • GraphQL与RESTful API接口全面对比:选型指南
  • ALTER TABLE:MySQL 增强表结构的最佳实践与避坑指南
  • 如何用qmc-decoder轻松解密QQ音乐加密音频文件?
  • 3步搞定:抖音无水印下载工具高效解决方案
  • 告别依赖地狱:在Ubuntu 20.04 LTS上优雅部署Pylith与ParaView的避坑全指南
  • 民俗活动记录正面临淘汰危机:Sora 2上线后,3类传统工作流已失效(附迁移 checklist)
  • 2026年深圳装修公司排行榜:靠谱且拒绝恶意增项的有哪些? - mypinpai
  • 大数据毕业设计-基于python的农产品销售系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 【Redis | 第六篇】Redisson
  • ComfyUI-VideoHelperSuite视频处理模块零除错误深度解析与技术方案
  • 618选游戏本不知道怎么选?这5款覆盖不同需求,附详细选购建议
  • AI工具≠深度学习加速器!3小时重构你的训练-推理-监控流水线(附GitHub万星整合模板)
  • 5分钟掌握微信好友检测:快速发现谁删除了你
  • 【2027最新】基于SpringBoot+Vue的医院资源管理系统管理系统源码+MyBatis+MySQL
  • 2026年浙江正规钻井服务评测:四家企业核心维度对比 - 优质品牌商家
  • ## 南山罗湖福田龙华宝安装修必看:ENF定制套餐挑选的核心判断标准 - 产品测评官
  • 视觉语言模型量化与剪枝技术解析