🔍 Stage 03

RAG 检索增强
与幻觉消减

大模型的"幻觉"问题是实际应用中最大的挑战之一。通过 RAG(检索增强生成)技术,可以让模型基于真实知识回答问题,大幅降低幻觉风险。这是我们"调整向量"的核心操作对象。


Understanding Hallucination
🎭 什么是 AI 幻觉

幻觉是大模型生成看似合理但实际上完全错误信息的现象,是我们在实际应用中必须面对和解决的核心问题。

⚠️ 幻觉的常见表现
  • 虚构事实:编造不存在的人名、事件、数据
  • 错误引用:引用不存在的论文、书籍或研究
  • 逻辑错误:推导过程看似合理但结论错误
  • 自信胡说:用非常肯定的语气输出错误信息
  • 事实混淆:将不同来源的信息错误地组合在一起
🧐 幻觉高发场景
知识盲区
模型训练数据中没有或很少的领域知识
时效性要求
需要最新信息,但模型训练数据过时
细节追问
对具体细节的深入追问容易触发幻觉
创造性任务
写作、创作等任务中模型会"自由发挥"

RAG Fundamentals
🔗 RAG 检索增强生成原理

RAG 是一种将外部知识检索与语言模型生成相结合的技术,让模型"有依据地说话"。

🔄 RAG 工作流程
Step 01
文档预处理
将文档分割成合适大小的片段(Chunk),进行向量化处理
Step 02
存储到向量数据库
将向量化后的文档片段存储到向量数据库中,建立索引
Step 03
用户查询检索
将用户问题向量化,在向量数据库中检索相关文档片段
Step 04
生成回答
将检索到的文档作为上下文传递给大模型,生成基于事实的回答
📊 RAG 的核心组件
📚
向量数据库
存储和检索向量数据的专用数据库,如 Pinecone、Milvus、Weaviate
PineconeMilvus
🔢
Embedding 模型
将文本转换为向量表示的模型,如 text-embedding-ada-002、bge-large-zh
OpenAIBGE
检索策略
包括语义检索、关键词检索、混合检索等多种策略
语义搜索Rerank

Practice in Dify
🗂️ 在 Dify 中构建知识库

Dify 提供了可视化的知识库管理功能,让你轻松构建和管理 RAG 应用。

🔢
核心调整点:向量配置
调整向量数据库和检索参数,优化知识库召回效果
分块大小
500-1000 token
重叠率
10-20%
检索策略
混合检索
Rerank
启用重排序
📤
上传文档
支持 PDF、Word、Markdown、网页等多种格式的文档上传,Dify 会自动进行预处理和向量化。
PDF Word URL
⚙️
分块策略
配置文档分割的块大小和重叠率,找到最适合你场景的分块策略,平衡检索精度和上下文长度。
Chunk Size Overlap
🧪
检索测试
使用"测试检索"功能验证检索效果,查看哪些文档片段被召回,优化检索配置。
召回率 相关性
💡 Dify 知识库最佳实践
选择合适的分块大小
一般建议 500-1000 token,过小会丢失上下文,过大会降低检索精度
设置适当的重叠率
10-20% 的重叠率可以避免关键信息被分割到两个块中
使用 Rerank 提升精度
启用 Rerank 功能可以在语义检索基础上进一步优化结果排序
定期更新知识库
确保知识库内容及时更新,避免使用过时信息回答问题

Mitigation Strategies
🛡️ 幻觉消减策略

除了 RAG,还有多种策略可以帮助我们减少模型产生幻觉的可能性。

🔍 知识接地 (Knowledge Grounding)

原理:让模型的回答基于明确的、可验证的知识源。


实现方式:

  • 使用 RAG 技术,让回答基于检索到的文档
  • 在提示词中要求模型引用具体来源
  • 提供参考文档作为回答依据
🔒 精确约束 (Precise Constraints)

原理:通过精确的提示词约束模型的输出行为。


实践技巧:

  • "对于不确定的内容,直接说'我不确定'"
  • "只基于提供的参考文档回答,不要添加外部知识"
  • "如果问题超出你的知识范围,请说明无法回答"
🔄 多模型交叉验证

原理:使用多个不同的模型对同一问题进行回答,对比结果的一致性。


适用场景:对于关键决策、重要信息输出等需要高可靠性的场景。


实现方式:可以在 Dify 中创建多个模型的集成应用,自动对比输出结果。

📝 事实核查机制

原理:在输出前对模型回答进行事实核查。


实现方式:

  • 使用搜索引擎进行关键信息验证
  • 调用专门的事实核查 API
  • 在提示词中加入"自我验证"步骤

Battle-Tested
🔧 RAG 实战调试经验

从真实故障中总结的 RAG 调试方法论,帮你快速定位和解决知识库检索失效问题。

📐 调试心法公式

AI 回答错误 = 检查输入(Prompt/Context) + 检查检索(Recall/Rank)

1️⃣ 先看输入:别盲目调 Prompt,先看 LLM 节点到底收到了什么脏数据
2️⃣ 再看检索:如果输入没问题但 AI 还是瞎编或说不知道,那就是知识库没捞对数据
3️⃣ 最后看模型:只有前两步都完美,AI 还在胡说八道,才是模型能力或 Prompt 逻辑的问题
⚠️ 真实故障案例

故障现象:用户问"找下 ZeroCloud 里面的 getTagText",AI 回复"未找到相关信息"

关键线索:AI 在拒绝时补充了一句——"(注:您提供的 context 内容仅包含 ZcFileUtils.download... 并未提及 getTagText)"

初步判断:这不仅是模型能力问题,而是数据链路(Data Pipeline)出了问题。模型很诚实,它确实没收到正确的数据。

🔍 四阶段排查流程
1️⃣ 第一阶段:验证输入端(Input Validation)

关键动作:检查 LLM 节点的 Input 变量,查看其接收到的上下文(Context)。


发现异常:Token 数显示有 155 tokens,但实际内容是 ZeroCloud.config.title、客户端网页标题文字等元数据字段,而不是代码正文。


诊断结论:模板配置错误——Jinja2 语法引用了错误的字段,系统把数据库的"表头/元数据"当成了"文章内容"喂给了模型。


修正方案:修改模板语法,确保遍历并输出的是检索结果中的 content 字段(例如 {{ item.content }})。

2️⃣ 第二阶段:模板修正后依然失败

故障现象:AI 终于能读到文章了,但依然回答"未找到 getTagText,但我看到了 ZcFileUtils..."


深度归因——向量检索为什么会"张冠李戴"?

  • 语义空间的"近邻陷阱":getTagText 和 ZcFileUtils 都属于"Java/JS 工具方法",如果原文档中这两个函数定义挨得很近,向量切片可能把它们切在了一起,或者 ZcFileUtils 的代码特征更明显(注释更多),导致它的向量权重更高,挤掉了 getTagText
  • Top-K 截断效应:检索通常只取前 3-5 个片段。getTagText 可能排在第 6 名(相似度 0.65),而 ZcFileUtils 排在第 1 名(相似度 0.85)。前 5 名里没有目标答案,AI 拿着错误的上下文自然无法回答
3️⃣ 第三阶段:验证"命中情况"

关键动作:使用"测试检索"或"命中测试"功能,不要只看最终对话,直接去知识库管理界面测试检索。


测试结果(输入关键词:getTagText):

  • 第一条:ZcFileUtils.java (Score: 0.88)
  • 第二条:FilePreviewService (Score: 0.82)
  • ...直到第 8 条才看到包含 getTagText 定义的代码块 (Score: 0.61)

确诊结论:问题本质是检索召回率(Recall)不足。并不是模型不懂,而是"书"没翻对页。纯向量检索在处理"精确代码函数名"时,容易受周围代码语义干扰。

4️⃣ 第四阶段:文档转换后的曲折经历

背景:将文档转换为 Markdown 格式上传,期待结构化切片能改善召回效果——但依然失败


尝试:添加 System Prompt 约束

"请严格基于提供的 Context 回答。如果 Context 中包含 ZcFileUtils 但不包含 getTagText,请不要强行关联,直接告知用户当前上下文缺失该函数定义。"


效果:AI 不再胡编乱造,而是诚实地说"我看到了 ZcFileUtils 但没看到 getTagText"。但这只是让 AI 更诚实地表达不知道,并没有真正解决问题。


🎯 关键突破:知识库分段摘要(触发词机制)

  • 打开知识库中该 Markdown 文档的管理界面,找到包含 getTagText 定义的分段(Chunk)
  • 手动为该分段添加摘要/关键词触发词:getTagText, 获取标签文本, 标签处理函数
  • 设置规则:只要用户问到包含触发词的问题,就将该分段作为首选上下文抛出

✅ 最终结果:配置生效后,再问"找下 ZeroCloud 里面的 getTagText",AI 终于能准确返回 getTagText 的代码定义了。

💡 给后续开发的经验清单
不要盲信 Token 数
Token 多不代表内容对,必须人工抽检 LLM 的 Input 变量
重视 AI 的"拒绝理由"
当 AI 说"我没找到 X,但我看到了 Y"时,Y 就是破案的关键线索
代码函数名检索需用混合模式
纯向量检索对精确代码符号(Symbol)的匹配能力较弱,务必开启关键词检索或混合检索
切片策略决定上限
对于代码文档,尽量不要用固定字符数切片,优先使用结构化切片(按标题、按函数块)
分段摘要触发词机制
对于重要但容易被向量检索忽略的内容,可以手动添加触发词摘要,确保精准召回
调试闭环
每次修改配置后,都要用同一个测试用例跑一遍全流程,对比 Input 变量的变化

Architecture
🏗️ Dify + Hermes 精准知识库架构

基于现有技术栈(Dify + Hermes + 低代码平台)构建完整的私有知识库体系,实现"精准召回、可靠生成、安全输出"。

📐 架构总览
👤
用户层
低代码平台
IT/HR/财务 不同权限
🤖
执行层
Hermes Agent
任务分解 + API 调用
📚
RAG 层
Dify 知识库
混合检索 + 父子分段
📂 三阶段核心
1️⃣ 第一阶段:知识库的清洗与搭建(Dify)

❌ 错误做法:直接把一堆杂乱的 Word、PDF、Markdown 文档扔进知识库


✅ 正确步骤:

  • 知识标准化:去除营销废话、过滤过期信息、确保每条知识都是干货
  • 父子分段模式:
    子分段 ~200字,负责精准检索 如:"保修期是多久" → 保修期限
    父分段 500-800字,提供完整上下文 如:保修范围、例外条款、申请流程
    实测召回率提升 35%+
  • 混合检索(Hybrid Search):
    向量检索
    理解语义
    "积分怎么用"
    全文检索
    精准匹配
    错误代码/政策条款
    混合检索 ✅
    兼得两者优势
2️⃣ 第二阶段:Hermes 成为知识"执行者"

Hermes 的角色定位:不是去"背诵"知识库,而是充当调用知识库的专家员工。


工作流程:

用户提问Hermes 接收识别需要查资料调用 Dify API获取精准答案整理回复

集成步骤:

  1. 在 Dify 中将知识库应用发布为 API
  2. 在 Hermes 中注册 Dify API 工具
  3. 配置触发规则:当用户询问相关领域时,优先调用知识库
3️⃣ 第三阶段:嵌入低代码平台

两种对接方案:

方案 A:纯问答场景
低代码平台 → Dify Chat API
适用:简单知识问答
方案 B:复杂自动化
低代码平台 → Hermes API
适用:需要多步骤操作的任务

权限隔离:利用 Dify 的元数据标签功能,给不同部门的知识打上标签(department: it/hr/finance),配合低代码平台的账号体系,实现"不同人查到的内容不一样"。

💡 两个让回答"极度精准"的实战技巧
🔒 提示词上锁

在 Dify 的 System Prompt 中加入强制约束:

"你必须严格根据检索到的上下文内容回答用户问题。如果上下文中没有相关信息,请直接告知不知道,严禁自行编造。"

效果:最大限度杜绝幻觉

🔄 持续优化闭环

利用 Dify 后台的"日志与标注"功能:

  1. 定期查看用户问了什么、AI 回了什么
  2. 发现问题直接在 Dify 里修改分段
  3. 添加同义问法让知识点能被多种方式触发
  4. 知识库越用越聪明
🚀 最小可行性版本(MVP)实施路径
1
选择试点
IT手册或产品FAQ
(20-50页)
2
按步骤搭建
清洗→分段→混合检索
→触发词优化
3
验证效果
同一批测试问题
对比上线前后准确率
逐步扩展
验证有效后
扩展到其他知识领域
预期收益: 问答准确率 40-50% → 85%+ | 幻觉几乎杜绝

Resources
📚 推荐学习资源