🔍 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、Chroma
PineconeMilvusChroma
🔢
Embedding 模型
将文本转换为向量表示的模型,如 text-embedding-3、bge-m3、jina-embeddings-v3
OpenAIBGE-M3Jina
检索策略
包括语义检索、关键词检索、混合检索、图谱检索等多种策略
语义搜索RerankGraph

Embedding & Chunking
🔢 Embedding 模型与分块策略

Embedding 模型和分块策略是 RAG 系统的两大基石,直接决定检索质量的上限。

📊
2026 年主流 Embedding 模型对比
模型 维度 最大Token 多语言 适用场景
BGE-M3 1024 8192 ✅ 100+语言 中文首选,开源免费
text-embedding-3-large 3072 8191 ✅ 多语言 英文首选,精度高
Jina Embeddings v3 1024 8192 ✅ 多语言 支持任务特定微调
GTE-Qwen2 可变 32K ✅ 多语言 超长文本,阿里开源
Cohere embed-v4 1024 512 ✅ 100+语言 企业级,压缩检索
💡 选型建议:中文场景首选 BGE-M3(开源免费、中文效果最佳);英文场景选 text-embedding-3-large;超长文档选 GTE-Qwen2(32K 上下文)。
✂️ 分块策略对比
A
固定长度分块
按固定字符数/Token数切分,实现简单但可能切断语义。
简单可能切断语义
B
语义分块
基于语义相似度自动切分,保持段落完整性,效果更好。
智能保持语义
C
结构化分块
按文档结构(标题/章节/函数)切分,最适合代码和技术文档。
代码友好文档友好
D
父子分块(Parent-Child)
子块精准检索,父块提供上下文。召回率提升 35%+,生产环境首选。
生产首选高召回
📏 分块参数最佳实践
500-1000
Token/块(通用文档)
10-20%
重叠率(防止信息丢失)
200
Token/子块(父子模式)
8-10
Top K(召回数量)
⚠️ 代码文档特殊规则:
  • 不要用固定字符数切片,用结构化切片(按函数/类)
  • 每个代码块包含完整函数定义,不要切断
  • 添加函数签名和注释作为检索触发词

Evaluation
📈 RAG 系统评估体系

没有评估就没有优化。建立科学的 RAG 评估体系,才能持续迭代提升系统质量。

🎯 检索质量指标
Recall@K
Top K 结果中包含正确答案的比例
目标: > 85%
Precision@K
Top K 结果中真正相关的比例
目标: > 70%
MRR
平均倒数排名,衡量首个正确答案的位置
目标: > 0.7
NDCG
归一化折损累积增益,衡量排序质量
目标: > 0.75
🤖 生成质量指标
忠实度 (Faithfulness)
生成内容是否忠实于检索到的上下文,不编造信息
核心指标目标>90%
答案相关性 (Answer Relevancy)
生成的答案是否真正回答了用户的问题
核心指标目标>85%
上下文精确度 (Context Precision)
检索到的文档中真正对回答问题有用的比例
检索质量
💡 评估工具推荐:使用 RAGAS(开源 RAG 评估框架)自动化评估流程。Dify v1.15.0 的日志与标注功能也支持人工评估和迭代优化。建议每周做一次评估,建立质量趋势图。

Evolution
🚀 RAG 技术演进路线

从朴素 RAG 到混合增强 RAG,技术持续迭代。据 Gartner 2026 报告,68% 的传统 RAG 项目未跨越生产鸿沟,掌握演进方向至关重要。

Naive RAG Advanced RAG Agentic RAG GraphRAG Hybrid RAG
🤖
Agentic RAG — 智能检索代理
传统 RAG 是"检索一次就生成答案",而 Agentic RAG 引入了自主决策能力
  • 多轮检索:Agent 判断首次检索结果是否充分,不足则自动改写查询重新检索
  • 路由决策:根据问题类型自动选择不同知识源(向量库、SQL、API、搜索引擎)
  • 自我反思:对生成答案进行质量评估,不满意则迭代优化
  • 工具调用:可调用计算器、代码执行器等辅助验证答案准确性
多轮检索 自主决策 自我反思
🕸️
GraphRAG — 知识图谱增强
由 Microsoft Research 提出,将知识图谱引入 RAG 流程:
  • 实体关系建模:从文档中自动抽取实体(人、事、物)及其关系,构建知识图谱
  • 社区检测:对图谱进行聚类,生成不同粒度的摘要(全局/局部)
  • 全局理解:擅长回答"整体趋势是什么""有哪些关键主题"等宏观问题
  • 多跳推理:沿图谱边进行多步推理,解决复杂关联问题
知识图谱 社区检测 全局问答
🔀
Hybrid RAG — 混合增强
结合多种 RAG 范式的优势,是当前生产环境最佳实践
  • 向量 + 关键词 + 图谱:三路检索融合,兼顾语义、精确匹配和关系推理
  • 父子分段:子分段精准检索,父分段提供完整上下文
  • Rerank 重排序:使用 Cross-Encoder 对检索结果二次排序
  • 自适应策略:根据查询类型自动切换检索模式
三路融合 Rerank 自适应
📊 各范式对比
范式 适用场景 复杂度
Naive RAG 简单知识问答
Advanced RAG 企业知识库
Agentic RAG 复杂多步任务
GraphRAG 关联分析/全局问答
Hybrid RAG 生产环境首选 中高

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

Dify v1.15.0 提供了强大的知识库管理和 RAG 增强能力,支持 MCP 双向集成和 Agent Runtime 2.0,让你轻松构建生产级 RAG 应用。

🔢
核心调整点:向量配置
Dify v1.15.0 新增:MCP 双向支持、Human-in-the-Loop 审批、Agent Runtime 2.0
分块大小
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
📚 推荐学习资源