踩坑 2 个月后,我找到了钉钉 DEAP 知识库工作流的另一种方案

Hermes 多 Agent 方案

  • [一、破局思路:放弃"搬运数据",拥抱"LLM 关键词预处理 + 动态实时检索"](#一、破局思路:放弃"搬运数据",拥抱"LLM 关键词预处理 + 动态实时检索")
    • [1.1 那个让我们方向性转折的认知](#1.1 那个让我们方向性转折的认知)
    • [1.2 传统做法 vs Hermes 做法](#1.2 传统做法 vs Hermes 做法)
    • [1.3 为什么这条路走得通?](#1.3 为什么这条路走得通?)
  • [二、硬核实战:如何让 Hermes 拥有钉钉企业知识检索能力?(基于 MCP)](#二、硬核实战:如何让 Hermes 拥有钉钉企业知识检索能力?(基于 MCP))
  • [三、核心架构:为什么 Hermes 的 ReAct 范式比钉钉工作流更香?](#三、核心架构:为什么 Hermes 的 ReAct 范式比钉钉工作流更香?)
    • [3.1 线性工作流的死穴](#3.1 线性工作流的死穴)
    • [3.2 ReAct:让 AI 自己思考、自己修正](#3.2 ReAct:让 AI 自己思考、自己修正)
    • [3.3 一个完整的 ReAct 推理链条实例](#3.3 一个完整的 ReAct 推理链条实例)
    • [3.4 Agent 的核心价值不是"更聪明"](#3.4 Agent 的核心价值不是"更聪明")
  • [四、官方 DEAP 的坑:我们踩过的真实痛点](#四、官方 DEAP 的坑:我们踩过的真实痛点)
    • [4.1 官方搜索排序不可控](#4.1 官方搜索排序不可控)
    • [4.2 召回策略无法干预](#4.2 召回策略无法干预)
    • [4.3 企业知识治理问题被无限放大](#4.3 企业知识治理问题被无限放大)
  • [五、RAG 的隐形成本:很少有人讲的事](#五、RAG 的隐形成本:很少有人讲的事)
    • [5.1 谁来做数据同步?](#5.1 谁来做数据同步?)
    • [5.2 我们不是在反对 RAG](#5.2 我们不是在反对 RAG)
  • [六、和传统 RAG 的本质区别:我们到底做的是什么?](#六、和传统 RAG 的本质区别:我们到底做的是什么?)
  • 七、必须正视的局限性:官方搜索的天花板在哪里?
    • [7.1 分词与倒排索引的硬伤](#7.1 分词与倒排索引的硬伤)
    • [7.2 跨语言检索的极限](#7.2 跨语言检索的极限)
    • [7.3 大流量下的 API 频率限制](#7.3 大流量下的 API 频率限制)
    • [7.4 适用场景总结](#7.4 适用场景总结)
  • 八、退路方案:当官方搜索满足不了你,如何转向"深度路线"?
    • [8.1 基础设施选型](#8.1 基础设施选型)
    • [8.2 数据抽取逻辑](#8.2 数据抽取逻辑)
    • [8.3 混合检索 + Rerank(杀手锏)](#8.3 混合检索 + Rerank(杀手锏))
  • 九、总结与架构建议
    • [9.1 这篇文章不是在讲什么](#9.1 这篇文章不是在讲什么)
    • [9.2 这篇文章真正在讲什么](#9.2 这篇文章真正在讲什么)
    • [9.3 分阶段落地建议](#9.3 分阶段落地建议)
    • [9.4 最想传递的一句话](#9.4 最想传递的一句话)

踩坑两个月后,我放弃了钉钉 DEAP 知识库工作流,改用 Agentic Search------不是 RAG 不好,是数据已经在那里了,为什么还要再搬一次?


引言:在钉钉生态下做 AI Agent 的"绝望瞬间"

作为企业内部落地 AI 应用的开发者,全公司成千上万份核心制度、业务规范与航司政策全部沉淀在钉钉知识库(云文档)中,搭建一个好用的智能体成为了当务之急。

为了离用户最近,我们最开始的选择一定是直接使用钉钉官方的 AI 智能体平台------DEAP。毕竟官方平台,权限天然打通、数据就地取材,怎么看都是最优解。

然而,实际投入生产后,用户反馈让我们大跌眼镜:

用户痛点反馈:「执行状态虽然显示成功,但内容不完整或结构混乱。明明有完整的数据,但是回复不完整,只有个别航司......」

针对这些问题,我尝试了官方提供的几乎所有解法:赋能专属 Skill、疯狂配置工作流(Workflow)、甚至调整切片策略。结果只有两个字:难用

钉钉智能体自带的线性工作流非常死板(提问 → 检索 → 总结),传统的黑盒 RAG 在面对复杂的企业长文档和多源表格时,经常出现断章取义、漏召回的情况,导致最终喂给大模型的上下文本身就是残缺的。

今天,我想把我们团队彻底摆脱这个困境的解耦方案------基于开源/自研框架 Hermes,利用 MCP 协议对接钉钉,并通过 ReAct 动态实时检索的架构分享给大家。


一、破局思路:放弃"搬运数据",拥抱"LLM 关键词预处理 + 动态实时检索"

1.1 那个让我们方向性转折的认知

既然数据在钉钉里成千上万导不出来,那我们就把钉钉只当成**"数据源"和"交互视窗",把我们的框架 Hermes 当作"大脑"**。

我们核心解决语义召回问题的秘诀只有一句话:

在调用钉钉检索之前,先让大模型进行"关键词膨胀与意图重写"!

1.2 传统做法 vs Hermes 做法

#mermaid-svg-UKI7AuQd0qM5sGaY{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-UKI7AuQd0qM5sGaY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UKI7AuQd0qM5sGaY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UKI7AuQd0qM5sGaY .error-icon{fill:#552222;}#mermaid-svg-UKI7AuQd0qM5sGaY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UKI7AuQd0qM5sGaY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UKI7AuQd0qM5sGaY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UKI7AuQd0qM5sGaY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UKI7AuQd0qM5sGaY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UKI7AuQd0qM5sGaY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UKI7AuQd0qM5sGaY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UKI7AuQd0qM5sGaY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UKI7AuQd0qM5sGaY .marker.cross{stroke:#333333;}#mermaid-svg-UKI7AuQd0qM5sGaY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UKI7AuQd0qM5sGaY p{margin:0;}#mermaid-svg-UKI7AuQd0qM5sGaY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-UKI7AuQd0qM5sGaY .cluster-label text{fill:#333;}#mermaid-svg-UKI7AuQd0qM5sGaY .cluster-label span{color:#333;}#mermaid-svg-UKI7AuQd0qM5sGaY .cluster-label span p{background-color:transparent;}#mermaid-svg-UKI7AuQd0qM5sGaY .label text,#mermaid-svg-UKI7AuQd0qM5sGaY span{fill:#333;color:#333;}#mermaid-svg-UKI7AuQd0qM5sGaY .node rect,#mermaid-svg-UKI7AuQd0qM5sGaY .node circle,#mermaid-svg-UKI7AuQd0qM5sGaY .node ellipse,#mermaid-svg-UKI7AuQd0qM5sGaY .node polygon,#mermaid-svg-UKI7AuQd0qM5sGaY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-UKI7AuQd0qM5sGaY .rough-node .label text,#mermaid-svg-UKI7AuQd0qM5sGaY .node .label text,#mermaid-svg-UKI7AuQd0qM5sGaY .image-shape .label,#mermaid-svg-UKI7AuQd0qM5sGaY .icon-shape .label{text-anchor:middle;}#mermaid-svg-UKI7AuQd0qM5sGaY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-UKI7AuQd0qM5sGaY .rough-node .label,#mermaid-svg-UKI7AuQd0qM5sGaY .node .label,#mermaid-svg-UKI7AuQd0qM5sGaY .image-shape .label,#mermaid-svg-UKI7AuQd0qM5sGaY .icon-shape .label{text-align:center;}#mermaid-svg-UKI7AuQd0qM5sGaY .node.clickable{cursor:pointer;}#mermaid-svg-UKI7AuQd0qM5sGaY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-UKI7AuQd0qM5sGaY .arrowheadPath{fill:#333333;}#mermaid-svg-UKI7AuQd0qM5sGaY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-UKI7AuQd0qM5sGaY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-UKI7AuQd0qM5sGaY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UKI7AuQd0qM5sGaY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-UKI7AuQd0qM5sGaY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UKI7AuQd0qM5sGaY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-UKI7AuQd0qM5sGaY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-UKI7AuQd0qM5sGaY .cluster text{fill:#333;}#mermaid-svg-UKI7AuQd0qM5sGaY .cluster span{color:#333;}#mermaid-svg-UKI7AuQd0qM5sGaY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-UKI7AuQd0qM5sGaY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-UKI7AuQd0qM5sGaY rect.text{fill:none;stroke-width:0;}#mermaid-svg-UKI7AuQd0qM5sGaY .icon-shape,#mermaid-svg-UKI7AuQd0qM5sGaY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UKI7AuQd0qM5sGaY .icon-shape p,#mermaid-svg-UKI7AuQd0qM5sGaY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-UKI7AuQd0qM5sGaY .icon-shape .label rect,#mermaid-svg-UKI7AuQd0qM5sGaY .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UKI7AuQd0qM5sGaY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-UKI7AuQd0qM5sGaY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-UKI7AuQd0qM5sGaY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ✅ Hermes Agentic Search 做法
用户提问:

我想查各大航司退改签
🔑 LLM 关键词扩写

提取:东航、国航、南航、

退票标准、改签手续费...
分批精准调用

钉钉 MCP 检索
实时捞出

最完整文档
LLM 整合

生成完整回复
❌ 传统钉钉智能体做法
用户提问:

我想查各大航司退改签政策
直接丢给钉钉搜索

(字面匹配)
钉钉字面匹配

不到精确词
选出文档残缺
大模型只能回复

'个别航司'

关键差异 :传统做法是一步到位丢给搜索引擎,搜到什么算什么;Hermes 做法是先让 LLM 理解意图、扩写关键词,再分批精准检索

1.3 为什么这条路走得通?

我们面对的现实是:

  • 10000+ 钉钉文档
  • 500+ 知识库
  • 多年沉淀的企业知识

如果走传统 RAG 路线------全部导出来、切片、Embedding、建向量库、搭同步链路------这个成本比想象中大得多。而且最关键的问题是:

我们的问题从来不是"没有知识库",而是"知识库已经存在于钉钉中"。

既然知识已经在钉钉里,权限体系也在钉钉里,文档的实时更新也在钉钉里------那不如直接在原地搜索。不搬数据,直接搜。


二、硬核实战:如何让 Hermes 拥有钉钉企业知识检索能力?(基于 MCP)

以前做第三方框架对接钉钉最头疼的就是接口和权限。现在有一个绝妙的官方通道:钉钉 AI 能力中心已经支持了由 Anthropic 推出的全球通用 MCP(Model Context Protocol,模型上下文协议)

通过这个通道,我们可以把钉钉文档的能力无缝接入到 Hermes 中。
#mermaid-svg-Fn1AuaJawjBKcQjm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Fn1AuaJawjBKcQjm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Fn1AuaJawjBKcQjm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Fn1AuaJawjBKcQjm .error-icon{fill:#552222;}#mermaid-svg-Fn1AuaJawjBKcQjm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Fn1AuaJawjBKcQjm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Fn1AuaJawjBKcQjm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Fn1AuaJawjBKcQjm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Fn1AuaJawjBKcQjm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Fn1AuaJawjBKcQjm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Fn1AuaJawjBKcQjm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Fn1AuaJawjBKcQjm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Fn1AuaJawjBKcQjm .marker.cross{stroke:#333333;}#mermaid-svg-Fn1AuaJawjBKcQjm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Fn1AuaJawjBKcQjm p{margin:0;}#mermaid-svg-Fn1AuaJawjBKcQjm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Fn1AuaJawjBKcQjm .cluster-label text{fill:#333;}#mermaid-svg-Fn1AuaJawjBKcQjm .cluster-label span{color:#333;}#mermaid-svg-Fn1AuaJawjBKcQjm .cluster-label span p{background-color:transparent;}#mermaid-svg-Fn1AuaJawjBKcQjm .label text,#mermaid-svg-Fn1AuaJawjBKcQjm span{fill:#333;color:#333;}#mermaid-svg-Fn1AuaJawjBKcQjm .node rect,#mermaid-svg-Fn1AuaJawjBKcQjm .node circle,#mermaid-svg-Fn1AuaJawjBKcQjm .node ellipse,#mermaid-svg-Fn1AuaJawjBKcQjm .node polygon,#mermaid-svg-Fn1AuaJawjBKcQjm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Fn1AuaJawjBKcQjm .rough-node .label text,#mermaid-svg-Fn1AuaJawjBKcQjm .node .label text,#mermaid-svg-Fn1AuaJawjBKcQjm .image-shape .label,#mermaid-svg-Fn1AuaJawjBKcQjm .icon-shape .label{text-anchor:middle;}#mermaid-svg-Fn1AuaJawjBKcQjm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Fn1AuaJawjBKcQjm .rough-node .label,#mermaid-svg-Fn1AuaJawjBKcQjm .node .label,#mermaid-svg-Fn1AuaJawjBKcQjm .image-shape .label,#mermaid-svg-Fn1AuaJawjBKcQjm .icon-shape .label{text-align:center;}#mermaid-svg-Fn1AuaJawjBKcQjm .node.clickable{cursor:pointer;}#mermaid-svg-Fn1AuaJawjBKcQjm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Fn1AuaJawjBKcQjm .arrowheadPath{fill:#333333;}#mermaid-svg-Fn1AuaJawjBKcQjm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Fn1AuaJawjBKcQjm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Fn1AuaJawjBKcQjm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Fn1AuaJawjBKcQjm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Fn1AuaJawjBKcQjm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Fn1AuaJawjBKcQjm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Fn1AuaJawjBKcQjm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Fn1AuaJawjBKcQjm .cluster text{fill:#333;}#mermaid-svg-Fn1AuaJawjBKcQjm .cluster span{color:#333;}#mermaid-svg-Fn1AuaJawjBKcQjm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Fn1AuaJawjBKcQjm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Fn1AuaJawjBKcQjm rect.text{fill:none;stroke-width:0;}#mermaid-svg-Fn1AuaJawjBKcQjm .icon-shape,#mermaid-svg-Fn1AuaJawjBKcQjm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Fn1AuaJawjBKcQjm .icon-shape p,#mermaid-svg-Fn1AuaJawjBKcQjm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Fn1AuaJawjBKcQjm .icon-shape .label rect,#mermaid-svg-Fn1AuaJawjBKcQjm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Fn1AuaJawjBKcQjm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Fn1AuaJawjBKcQjm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Fn1AuaJawjBKcQjm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Hermes Agent 框架
钉钉 AI 能力中心
标准 MCP 协议

HTTP / Streamable HTTP
带上用户身份 Token
MCP Server

(钉钉官方提供)
钉钉知识库

(云文档 / 团队空间)
权限体系

(组织架构 / 文档权限)
MCP Client

(标准协议接入)
Agent Tool 注册

DingTalk_Search
ReAct 推理引擎

实战配置三步走

第一步:寻找官方 MCP Server

登录钉钉 AI 能力中心,直接访问开发者专区。在 MCP 服务列表中定位到"钉钉文档"或"钉钉知识库"相关的官方 Server。

第二步:配置钉钉文档权限

在 MCP 配置后台绑定你的企业应用。在这里你可以显式勾选并配置该 MCP 服务能够访问的钉钉文档/知识库范围------哪些知识库可见、哪些部门文档可搜,全部显式声明。

第三步:接入 Hermes(MCP Client)

在 Hermes 的配置文件中,将钉钉提供的 MCP Server 地址和鉴权 Token 配置进去。由于 MCP 是标准协议,Hermes 可以像调用本地 Tool 一样,直接把钉钉的文档检索能力变成一个标准的 Agent Tool。

yaml 复制代码
# Hermes 中挂载钉钉 MCP 的配置示例
mcp_servers:
  - name: dingtalk_knowledge
    url: "https://dingtalk-mcp.dingtalk.com/mcp"
    headers:
      Authorization: "Bearer <your-token>"
    timeout: 30

这样做最大的绝杀优势:完美继承官方权限!

过去自研 RAG 最怕员工"越权查文档"。现在通过 MCP 协议,当 Hermes 触发检索时,会动态带上当前员工的身份。员工在钉钉里没权限看的保密文档,Hermes 的 AI 也绝对搜不出来,天然合规!


三、核心架构:为什么 Hermes 的 ReAct 范式比钉钉工作流更香?

3.1 线性工作流的死穴

钉钉 DEAP 的工作流是线性的:
#mermaid-svg-TMagWLWNt4Eo79gI{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-TMagWLWNt4Eo79gI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-TMagWLWNt4Eo79gI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-TMagWLWNt4Eo79gI .error-icon{fill:#552222;}#mermaid-svg-TMagWLWNt4Eo79gI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TMagWLWNt4Eo79gI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-TMagWLWNt4Eo79gI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TMagWLWNt4Eo79gI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TMagWLWNt4Eo79gI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-TMagWLWNt4Eo79gI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TMagWLWNt4Eo79gI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TMagWLWNt4Eo79gI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TMagWLWNt4Eo79gI .marker.cross{stroke:#333333;}#mermaid-svg-TMagWLWNt4Eo79gI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TMagWLWNt4Eo79gI p{margin:0;}#mermaid-svg-TMagWLWNt4Eo79gI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-TMagWLWNt4Eo79gI .cluster-label text{fill:#333;}#mermaid-svg-TMagWLWNt4Eo79gI .cluster-label span{color:#333;}#mermaid-svg-TMagWLWNt4Eo79gI .cluster-label span p{background-color:transparent;}#mermaid-svg-TMagWLWNt4Eo79gI .label text,#mermaid-svg-TMagWLWNt4Eo79gI span{fill:#333;color:#333;}#mermaid-svg-TMagWLWNt4Eo79gI .node rect,#mermaid-svg-TMagWLWNt4Eo79gI .node circle,#mermaid-svg-TMagWLWNt4Eo79gI .node ellipse,#mermaid-svg-TMagWLWNt4Eo79gI .node polygon,#mermaid-svg-TMagWLWNt4Eo79gI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-TMagWLWNt4Eo79gI .rough-node .label text,#mermaid-svg-TMagWLWNt4Eo79gI .node .label text,#mermaid-svg-TMagWLWNt4Eo79gI .image-shape .label,#mermaid-svg-TMagWLWNt4Eo79gI .icon-shape .label{text-anchor:middle;}#mermaid-svg-TMagWLWNt4Eo79gI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-TMagWLWNt4Eo79gI .rough-node .label,#mermaid-svg-TMagWLWNt4Eo79gI .node .label,#mermaid-svg-TMagWLWNt4Eo79gI .image-shape .label,#mermaid-svg-TMagWLWNt4Eo79gI .icon-shape .label{text-align:center;}#mermaid-svg-TMagWLWNt4Eo79gI .node.clickable{cursor:pointer;}#mermaid-svg-TMagWLWNt4Eo79gI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-TMagWLWNt4Eo79gI .arrowheadPath{fill:#333333;}#mermaid-svg-TMagWLWNt4Eo79gI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-TMagWLWNt4Eo79gI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-TMagWLWNt4Eo79gI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TMagWLWNt4Eo79gI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-TMagWLWNt4Eo79gI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TMagWLWNt4Eo79gI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-TMagWLWNt4Eo79gI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-TMagWLWNt4Eo79gI .cluster text{fill:#333;}#mermaid-svg-TMagWLWNt4Eo79gI .cluster span{color:#333;}#mermaid-svg-TMagWLWNt4Eo79gI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-TMagWLWNt4Eo79gI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-TMagWLWNt4Eo79gI rect.text{fill:none;stroke-width:0;}#mermaid-svg-TMagWLWNt4Eo79gI .icon-shape,#mermaid-svg-TMagWLWNt4Eo79gI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TMagWLWNt4Eo79gI .icon-shape p,#mermaid-svg-TMagWLWNt4Eo79gI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-TMagWLWNt4Eo79gI .icon-shape .label rect,#mermaid-svg-TMagWLWNt4Eo79gI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TMagWLWNt4Eo79gI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-TMagWLWNt4Eo79gI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-TMagWLWNt4Eo79gI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 搜不准 / 漏召回
导致
用户提问
知识库检索

(仅一次机会)
大模型总结
输出
❌ 上下文残缺
❌ 答案不完整

这条链路的问题在于:检索只有一次机会。第一次搜不到、搜不准,后面的大模型总结再强也无济于事。输入的是残缺上下文,输出的必然是不完整答案。

3.2 ReAct:让 AI 自己思考、自己修正

而 Hermes 框架的 ReAct(Reasoning and Acting,推理与行动) 机制起到了决定性的作用。它可以让大模型自己思考、自己决定要调用几次检索、怎么修正关键词
#mermaid-svg-qE836GVRN8NNaEhe{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qE836GVRN8NNaEhe .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qE836GVRN8NNaEhe .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qE836GVRN8NNaEhe .error-icon{fill:#552222;}#mermaid-svg-qE836GVRN8NNaEhe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qE836GVRN8NNaEhe .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qE836GVRN8NNaEhe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qE836GVRN8NNaEhe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qE836GVRN8NNaEhe .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qE836GVRN8NNaEhe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qE836GVRN8NNaEhe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qE836GVRN8NNaEhe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qE836GVRN8NNaEhe .marker.cross{stroke:#333333;}#mermaid-svg-qE836GVRN8NNaEhe svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qE836GVRN8NNaEhe p{margin:0;}#mermaid-svg-qE836GVRN8NNaEhe .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qE836GVRN8NNaEhe .cluster-label text{fill:#333;}#mermaid-svg-qE836GVRN8NNaEhe .cluster-label span{color:#333;}#mermaid-svg-qE836GVRN8NNaEhe .cluster-label span p{background-color:transparent;}#mermaid-svg-qE836GVRN8NNaEhe .label text,#mermaid-svg-qE836GVRN8NNaEhe span{fill:#333;color:#333;}#mermaid-svg-qE836GVRN8NNaEhe .node rect,#mermaid-svg-qE836GVRN8NNaEhe .node circle,#mermaid-svg-qE836GVRN8NNaEhe .node ellipse,#mermaid-svg-qE836GVRN8NNaEhe .node polygon,#mermaid-svg-qE836GVRN8NNaEhe .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qE836GVRN8NNaEhe .rough-node .label text,#mermaid-svg-qE836GVRN8NNaEhe .node .label text,#mermaid-svg-qE836GVRN8NNaEhe .image-shape .label,#mermaid-svg-qE836GVRN8NNaEhe .icon-shape .label{text-anchor:middle;}#mermaid-svg-qE836GVRN8NNaEhe .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qE836GVRN8NNaEhe .rough-node .label,#mermaid-svg-qE836GVRN8NNaEhe .node .label,#mermaid-svg-qE836GVRN8NNaEhe .image-shape .label,#mermaid-svg-qE836GVRN8NNaEhe .icon-shape .label{text-align:center;}#mermaid-svg-qE836GVRN8NNaEhe .node.clickable{cursor:pointer;}#mermaid-svg-qE836GVRN8NNaEhe .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qE836GVRN8NNaEhe .arrowheadPath{fill:#333333;}#mermaid-svg-qE836GVRN8NNaEhe .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qE836GVRN8NNaEhe .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qE836GVRN8NNaEhe .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qE836GVRN8NNaEhe .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qE836GVRN8NNaEhe .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qE836GVRN8NNaEhe .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qE836GVRN8NNaEhe .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qE836GVRN8NNaEhe .cluster text{fill:#333;}#mermaid-svg-qE836GVRN8NNaEhe .cluster span{color:#333;}#mermaid-svg-qE836GVRN8NNaEhe div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qE836GVRN8NNaEhe .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qE836GVRN8NNaEhe rect.text{fill:none;stroke-width:0;}#mermaid-svg-qE836GVRN8NNaEhe .icon-shape,#mermaid-svg-qE836GVRN8NNaEhe .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qE836GVRN8NNaEhe .icon-shape p,#mermaid-svg-qE836GVRN8NNaEhe .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qE836GVRN8NNaEhe .icon-shape .label rect,#mermaid-svg-qE836GVRN8NNaEhe .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qE836GVRN8NNaEhe .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qE836GVRN8NNaEhe .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qE836GVRN8NNaEhe :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 不够,换策略再搜
否,继续
是,或已足够
足够完整
用户提问
💭 Thought(推理)

分析意图,规划检索策略
🔧 Action(行动)

调用工具:搜索 / 扩写关键词
👁️ Observation(观察)

获取搜索结果,评估质量
结果是否

足够完整?
💭 Thought(调整)

换关键词 / 扩大范围
🔧 Action(再行动)
👁️ Observation
是否达到

最大迭代次数?
📝 Final Answer

整合结果,输出回复

关键设计:最多 5 轮迭代,连续 3 轮未调用工具时自动注入提醒,内置工具调用护栏防止死循环。

3.3 一个完整的 ReAct 推理链条实例

下面以真实场景「查询各大航司孕妇乘机规定」为例,展示完整的推理链路:
📚 钉钉知识库 🔌 钉钉 MCP Search Tool 🧠 Hermes Agent (ReAct 引擎) 📚 钉钉知识库 🔌 钉钉 MCP Search Tool 🧠 Hermes Agent (ReAct 引擎) #mermaid-svg-IIlRUVR9Ob15jgQy{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IIlRUVR9Ob15jgQy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IIlRUVR9Ob15jgQy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IIlRUVR9Ob15jgQy .error-icon{fill:#552222;}#mermaid-svg-IIlRUVR9Ob15jgQy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IIlRUVR9Ob15jgQy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IIlRUVR9Ob15jgQy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IIlRUVR9Ob15jgQy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IIlRUVR9Ob15jgQy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IIlRUVR9Ob15jgQy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IIlRUVR9Ob15jgQy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IIlRUVR9Ob15jgQy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IIlRUVR9Ob15jgQy .marker.cross{stroke:#333333;}#mermaid-svg-IIlRUVR9Ob15jgQy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IIlRUVR9Ob15jgQy p{margin:0;}#mermaid-svg-IIlRUVR9Ob15jgQy .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-IIlRUVR9Ob15jgQy text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-IIlRUVR9Ob15jgQy .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-IIlRUVR9Ob15jgQy .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-IIlRUVR9Ob15jgQy .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-IIlRUVR9Ob15jgQy .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-IIlRUVR9Ob15jgQy #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-IIlRUVR9Ob15jgQy .sequenceNumber{fill:white;}#mermaid-svg-IIlRUVR9Ob15jgQy #sequencenumber{fill:#333;}#mermaid-svg-IIlRUVR9Ob15jgQy #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-IIlRUVR9Ob15jgQy .messageText{fill:#333;stroke:none;}#mermaid-svg-IIlRUVR9Ob15jgQy .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-IIlRUVR9Ob15jgQy .labelText,#mermaid-svg-IIlRUVR9Ob15jgQy .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-IIlRUVR9Ob15jgQy .loopText,#mermaid-svg-IIlRUVR9Ob15jgQy .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-IIlRUVR9Ob15jgQy .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-IIlRUVR9Ob15jgQy .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-IIlRUVR9Ob15jgQy .noteText,#mermaid-svg-IIlRUVR9Ob15jgQy .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-IIlRUVR9Ob15jgQy .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-IIlRUVR9Ob15jgQy .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-IIlRUVR9Ob15jgQy .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-IIlRUVR9Ob15jgQy .actorPopupMenu{position:absolute;}#mermaid-svg-IIlRUVR9Ob15jgQy .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-IIlRUVR9Ob15jgQy .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-IIlRUVR9Ob15jgQy .actor-man circle,#mermaid-svg-IIlRUVR9Ob15jgQy line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-IIlRUVR9Ob15jgQy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 💭 Thought 1 不能直接搜"孕妇乘机", 需要先提取并膨胀关键词 🔧 Action 1 调用关键词提取,分析用户意图 👁️ Observation 1 提取到:国航、东航、南航、 海航、孕妇限制、乘机孕周 💭 Thought 2 有关键词了,分批检索, 每个航司单独搜,确保覆盖 👁️ Observation 2 三份文档覆盖国航、东航、南航 完整政策,数据齐全 💭 Thought 3 东航提到"32周以上需医疗证明", 需核对其他航司差异,补搜海航 💭 Thought 4 五家航司数据齐全, 结构化整合,按航司分列 👤 用户 "帮我查各大航司关于 孕妇乘机的规定,要完整" Search("国航 孕妇 乘机 孕周") 实时检索 返回文档 国航政策完整数据 Search("东航 孕妇 乘机 孕周") 实时检索 返回文档 东航政策完整数据 Search("南航 孕妇 乘机 孕周") 实时检索 返回文档 南航政策完整数据 Search("海航 春秋 孕妇 乘机") 实时检索 返回文档 海航、春秋政策数据 📝 完整回复: 国航 / 东航 / 南航 / 海航 / 春秋 每家孕周限制、所需证明、特殊说明 👤 用户

3.4 Agent 的核心价值不是"更聪明"

Agent 比 Workflow 更适合企业知识库场景的核心原因不是它更聪明,而是Agent 能不断修正检索过程

  • 搜不准 → 换词重搜
  • 搜不够 → 扩大范围再搜
  • 搜到矛盾 → 追加核实

这种自我纠错能力,是固定流程的 Workflow 做不到的。这也是为什么同样的钉钉搜索底层,配上 Agent 调度后效果天差地别。


四、官方 DEAP 的坑:我们踩过的真实痛点

4.1 官方搜索排序不可控

同一个制度,企业里可能同时存在 N 个版本:
#mermaid-svg-8GYIZzFSRm97LybO{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8GYIZzFSRm97LybO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8GYIZzFSRm97LybO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8GYIZzFSRm97LybO .error-icon{fill:#552222;}#mermaid-svg-8GYIZzFSRm97LybO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8GYIZzFSRm97LybO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8GYIZzFSRm97LybO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8GYIZzFSRm97LybO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8GYIZzFSRm97LybO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8GYIZzFSRm97LybO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8GYIZzFSRm97LybO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8GYIZzFSRm97LybO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8GYIZzFSRm97LybO .marker.cross{stroke:#333333;}#mermaid-svg-8GYIZzFSRm97LybO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8GYIZzFSRm97LybO p{margin:0;}#mermaid-svg-8GYIZzFSRm97LybO .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8GYIZzFSRm97LybO .cluster-label text{fill:#333;}#mermaid-svg-8GYIZzFSRm97LybO .cluster-label span{color:#333;}#mermaid-svg-8GYIZzFSRm97LybO .cluster-label span p{background-color:transparent;}#mermaid-svg-8GYIZzFSRm97LybO .label text,#mermaid-svg-8GYIZzFSRm97LybO span{fill:#333;color:#333;}#mermaid-svg-8GYIZzFSRm97LybO .node rect,#mermaid-svg-8GYIZzFSRm97LybO .node circle,#mermaid-svg-8GYIZzFSRm97LybO .node ellipse,#mermaid-svg-8GYIZzFSRm97LybO .node polygon,#mermaid-svg-8GYIZzFSRm97LybO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8GYIZzFSRm97LybO .rough-node .label text,#mermaid-svg-8GYIZzFSRm97LybO .node .label text,#mermaid-svg-8GYIZzFSRm97LybO .image-shape .label,#mermaid-svg-8GYIZzFSRm97LybO .icon-shape .label{text-anchor:middle;}#mermaid-svg-8GYIZzFSRm97LybO .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8GYIZzFSRm97LybO .rough-node .label,#mermaid-svg-8GYIZzFSRm97LybO .node .label,#mermaid-svg-8GYIZzFSRm97LybO .image-shape .label,#mermaid-svg-8GYIZzFSRm97LybO .icon-shape .label{text-align:center;}#mermaid-svg-8GYIZzFSRm97LybO .node.clickable{cursor:pointer;}#mermaid-svg-8GYIZzFSRm97LybO .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8GYIZzFSRm97LybO .arrowheadPath{fill:#333333;}#mermaid-svg-8GYIZzFSRm97LybO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8GYIZzFSRm97LybO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8GYIZzFSRm97LybO .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8GYIZzFSRm97LybO .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8GYIZzFSRm97LybO .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8GYIZzFSRm97LybO .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8GYIZzFSRm97LybO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8GYIZzFSRm97LybO .cluster text{fill:#333;}#mermaid-svg-8GYIZzFSRm97LybO .cluster span{color:#333;}#mermaid-svg-8GYIZzFSRm97LybO div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8GYIZzFSRm97LybO .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8GYIZzFSRm97LybO rect.text{fill:none;stroke-width:0;}#mermaid-svg-8GYIZzFSRm97LybO .icon-shape,#mermaid-svg-8GYIZzFSRm97LybO .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8GYIZzFSRm97LybO .icon-shape p,#mermaid-svg-8GYIZzFSRm97LybO .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8GYIZzFSRm97LybO .icon-shape .label rect,#mermaid-svg-8GYIZzFSRm97LybO .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8GYIZzFSRm97LybO .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8GYIZzFSRm97LybO .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8GYIZzFSRm97LybO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 钉钉搜索返回
❌ 排在第1位的是旧版!
✅ 真正的最新版

却被排在第3位
📄 差旅报销制度
2023版
2024版
最终版
最终版V2
最终版V2-修订
正式发布版
🙋 用户问:

最新差旅报销制度
💥 AI 基于旧版回答

答案完全错误

对于员工来说,他们知道应该看最新版本。但对于 AI 来说,这些文件标题极其相似,而官方搜索引擎是否把最新文档排在最前面,开发者完全无法控制

用户问「最新孕妇乘机政策」,历史版本反而排在第一位,最新文档排在第三位------这种情况经常出现。

4.2 召回策略无法干预

如果使用 Dify、RAGFlow、WeKnora 等自建方案,我们可以:

可控项 自建 RAG 钉钉 DEAP
召回数量 ✅ 可配置 ❌ 不可控
Chunk 策略 ✅ 可配置 ❌ 黑盒
Metadata 过滤 ✅ 可配置 ❌ 不支持
文档权重 ✅ 可配置 ❌ 不可控
Rerank ✅ 可配置 ❌ 不支持
更新时间加权 ✅ 可配置 ❌ 不可控
旧文档降权/删除 ✅ 可操作 ❌ 无法干预

在钉钉官方搜索体系下,开发者几乎无法介入底层召回逻辑。搜索返回什么结果,Agent 就只能消费什么结果。

4.3 企业知识治理问题被无限放大

AI 项目上线后暴露出来的很多问题,本质上不是 AI 问题,而是企业文档治理问题
#mermaid-svg-Jtp1BYQ5ulBLtDns{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Jtp1BYQ5ulBLtDns .error-icon{fill:#552222;}#mermaid-svg-Jtp1BYQ5ulBLtDns .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Jtp1BYQ5ulBLtDns .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Jtp1BYQ5ulBLtDns .marker.cross{stroke:#333333;}#mermaid-svg-Jtp1BYQ5ulBLtDns svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Jtp1BYQ5ulBLtDns p{margin:0;}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge{stroke-width:3;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section--1 rect,#mermaid-svg-Jtp1BYQ5ulBLtDns .section--1 path,#mermaid-svg-Jtp1BYQ5ulBLtDns .section--1 circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .section--1 polygon,#mermaid-svg-Jtp1BYQ5ulBLtDns .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .section--1 text{fill:#ffffff;}#mermaid-svg-Jtp1BYQ5ulBLtDns .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-depth--1{stroke-width:17;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:lightgray;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:#efefef;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-0 rect,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-0 path,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-0 circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-0 polygon,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-0 text{fill:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .node-icon-0{font-size:40px;color:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-depth-0{stroke-width:14;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:lightgray;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:#efefef;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-1 rect,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-1 path,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-1 circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-1 polygon,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-1 text{fill:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .node-icon-1{font-size:40px;color:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-depth-1{stroke-width:11;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:lightgray;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:#efefef;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-2 rect,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-2 path,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-2 circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-2 polygon,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-2 text{fill:#ffffff;}#mermaid-svg-Jtp1BYQ5ulBLtDns .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-depth-2{stroke-width:8;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:lightgray;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:#efefef;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-3 rect,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-3 path,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-3 circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-3 polygon,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-3 text{fill:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .node-icon-3{font-size:40px;color:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-depth-3{stroke-width:5;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:lightgray;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:#efefef;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-4 rect,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-4 path,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-4 circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-4 polygon,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-4 text{fill:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .node-icon-4{font-size:40px;color:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-depth-4{stroke-width:2;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:lightgray;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:#efefef;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-5 rect,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-5 path,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-5 circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-5 polygon,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-5 text{fill:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .node-icon-5{font-size:40px;color:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-depth-5{stroke-width:-1;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:lightgray;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:#efefef;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-6 rect,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-6 path,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-6 circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-6 polygon,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-6 text{fill:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .node-icon-6{font-size:40px;color:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-depth-6{stroke-width:-4;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:lightgray;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:#efefef;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-7 rect,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-7 path,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-7 circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-7 polygon,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-7 text{fill:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .node-icon-7{font-size:40px;color:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-depth-7{stroke-width:-7;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:lightgray;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:#efefef;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-8 rect,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-8 path,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-8 circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-8 polygon,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-8 text{fill:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .node-icon-8{font-size:40px;color:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-depth-8{stroke-width:-10;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:lightgray;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:#efefef;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-9 rect,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-9 path,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-9 circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-9 polygon,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-9 text{fill:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .node-icon-9{font-size:40px;color:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-depth-9{stroke-width:-13;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:lightgray;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:#efefef;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-10 rect,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-10 path,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-10 circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-10 polygon,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-10 text{fill:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .node-icon-10{font-size:40px;color:black;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge-depth-10{stroke-width:-16;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:lightgray;}#mermaid-svg-Jtp1BYQ5ulBLtDns .disabled text{fill:#efefef;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-root rect,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-root path,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-root circle,#mermaid-svg-Jtp1BYQ5ulBLtDns .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-root text{fill:#ffffff;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-root span{color:#ffffff;}#mermaid-svg-Jtp1BYQ5ulBLtDns .section-2 span{color:#ffffff;}#mermaid-svg-Jtp1BYQ5ulBLtDns .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-Jtp1BYQ5ulBLtDns .edge{fill:none;}#mermaid-svg-Jtp1BYQ5ulBLtDns .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-Jtp1BYQ5ulBLtDns :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 企业知识治理

常见问题
文件命名混乱
最终版有3个
新旧版本混存
无命名规范
历史版本未归档
2019年制度仍在
已废止未标记
无生命周期管理
目录结构混乱
相同内容多处存储
分类标准不统一
层级过深或过浅
失效文档长期存在
过期通知未清理
临时文件未删除
草稿未发布或下线

以前员工还能靠经验判断"这个应该是旧的,忽略它"。AI 检索时,这些噪声会被无限放大,因为没有"经验"来过滤。


五、RAG 的隐形成本:很少有人讲的事

5.1 谁来做数据同步?

很多文章都在讲向量检索多厉害、Rerank 多厉害,但很少有人讲:谁来同步数据?
#mermaid-svg-BmSpfX5e9I9Zp9AR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BmSpfX5e9I9Zp9AR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BmSpfX5e9I9Zp9AR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BmSpfX5e9I9Zp9AR .error-icon{fill:#552222;}#mermaid-svg-BmSpfX5e9I9Zp9AR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BmSpfX5e9I9Zp9AR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BmSpfX5e9I9Zp9AR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BmSpfX5e9I9Zp9AR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BmSpfX5e9I9Zp9AR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BmSpfX5e9I9Zp9AR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BmSpfX5e9I9Zp9AR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BmSpfX5e9I9Zp9AR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BmSpfX5e9I9Zp9AR .marker.cross{stroke:#333333;}#mermaid-svg-BmSpfX5e9I9Zp9AR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BmSpfX5e9I9Zp9AR p{margin:0;}#mermaid-svg-BmSpfX5e9I9Zp9AR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BmSpfX5e9I9Zp9AR .cluster-label text{fill:#333;}#mermaid-svg-BmSpfX5e9I9Zp9AR .cluster-label span{color:#333;}#mermaid-svg-BmSpfX5e9I9Zp9AR .cluster-label span p{background-color:transparent;}#mermaid-svg-BmSpfX5e9I9Zp9AR .label text,#mermaid-svg-BmSpfX5e9I9Zp9AR span{fill:#333;color:#333;}#mermaid-svg-BmSpfX5e9I9Zp9AR .node rect,#mermaid-svg-BmSpfX5e9I9Zp9AR .node circle,#mermaid-svg-BmSpfX5e9I9Zp9AR .node ellipse,#mermaid-svg-BmSpfX5e9I9Zp9AR .node polygon,#mermaid-svg-BmSpfX5e9I9Zp9AR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BmSpfX5e9I9Zp9AR .rough-node .label text,#mermaid-svg-BmSpfX5e9I9Zp9AR .node .label text,#mermaid-svg-BmSpfX5e9I9Zp9AR .image-shape .label,#mermaid-svg-BmSpfX5e9I9Zp9AR .icon-shape .label{text-anchor:middle;}#mermaid-svg-BmSpfX5e9I9Zp9AR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BmSpfX5e9I9Zp9AR .rough-node .label,#mermaid-svg-BmSpfX5e9I9Zp9AR .node .label,#mermaid-svg-BmSpfX5e9I9Zp9AR .image-shape .label,#mermaid-svg-BmSpfX5e9I9Zp9AR .icon-shape .label{text-align:center;}#mermaid-svg-BmSpfX5e9I9Zp9AR .node.clickable{cursor:pointer;}#mermaid-svg-BmSpfX5e9I9Zp9AR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BmSpfX5e9I9Zp9AR .arrowheadPath{fill:#333333;}#mermaid-svg-BmSpfX5e9I9Zp9AR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BmSpfX5e9I9Zp9AR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BmSpfX5e9I9Zp9AR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BmSpfX5e9I9Zp9AR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BmSpfX5e9I9Zp9AR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BmSpfX5e9I9Zp9AR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BmSpfX5e9I9Zp9AR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BmSpfX5e9I9Zp9AR .cluster text{fill:#333;}#mermaid-svg-BmSpfX5e9I9Zp9AR .cluster span{color:#333;}#mermaid-svg-BmSpfX5e9I9Zp9AR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BmSpfX5e9I9Zp9AR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BmSpfX5e9I9Zp9AR rect.text{fill:none;stroke-width:0;}#mermaid-svg-BmSpfX5e9I9Zp9AR .icon-shape,#mermaid-svg-BmSpfX5e9I9Zp9AR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BmSpfX5e9I9Zp9AR .icon-shape p,#mermaid-svg-BmSpfX5e9I9Zp9AR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BmSpfX5e9I9Zp9AR .icon-shape .label rect,#mermaid-svg-BmSpfX5e9I9Zp9AR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BmSpfX5e9I9Zp9AR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BmSpfX5e9I9Zp9AR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BmSpfX5e9I9Zp9AR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ✅ MCP 方案(零同步)
钉钉文档修改
结束。

下次查询自动读取最新
❌ 传统 RAG 同步链路(永不停止)
文档又改了
钉钉文档修改
Webhook 回调接收
同步服务处理
重新切片

(Chunking)
重新 Embedding

(嵌入向量化)
更新向量库

(Milvus / Qdrant / ...)

传统 RAG 的同步管线是一条永远不会停止的链路 。而且任何一个环节断了(Webhook 漏发、切片策略变了、Embedding 模型升级了),都会导致知识库与源文档不同步。每次维护都是人力和算力的持续消耗。

而 MCP 方案:文档改了就是改了,下一次查询自然拿到最新内容------零同步成本

5.2 我们不是在反对 RAG

这一点非常重要,必须在文章里明确:

RAG 没有问题。如果是从零开始建设 AI 系统,我依然会选择 Dify + 向量库 + Rerank 的标准路线。

但问题在于:企业已经有知识库了 ,已经在钉钉里沉淀了好几年。这时候再做一次导出、切片、Embedding、同步,其实是在重复建设


六、和传统 RAG 的本质区别:我们到底做的是什么?

严格来说,我们做的不是经典 RAG,而是 Agentic Search(基于工具的智能检索)
#mermaid-svg-Js6fvjVeVVkLeYJ3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Js6fvjVeVVkLeYJ3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Js6fvjVeVVkLeYJ3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Js6fvjVeVVkLeYJ3 .error-icon{fill:#552222;}#mermaid-svg-Js6fvjVeVVkLeYJ3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Js6fvjVeVVkLeYJ3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Js6fvjVeVVkLeYJ3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Js6fvjVeVVkLeYJ3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Js6fvjVeVVkLeYJ3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Js6fvjVeVVkLeYJ3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Js6fvjVeVVkLeYJ3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Js6fvjVeVVkLeYJ3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Js6fvjVeVVkLeYJ3 .marker.cross{stroke:#333333;}#mermaid-svg-Js6fvjVeVVkLeYJ3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Js6fvjVeVVkLeYJ3 p{margin:0;}#mermaid-svg-Js6fvjVeVVkLeYJ3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 深度方案<br>(WeKnora/Dify 本地 RAG) 重复建设区 Agentic Search + MCP<br>(本文方案) 纯钉钉 DEAP<br>(零控制力) 深度方案 传统自建 RAG 纯钉钉 DEAP Agentic Search + MCP 检索控制力 低 检索控制力 高 维护成本 低 维护成本 高 方案定位矩阵

维度 传统 RAG Agentic Search(我们的方案)
数据存储 导出文档 → 向量库 留在钉钉,实时搜索
检索方式 Embedding 语义相似度 MCP 实时关键词搜索
同步成本 需要持续同步链路,永不停止 零同步
权限控制 需要自己实现全套权限 继承钉钉原生权限
召回控制 完全可控(Chunk/Rerank/权重) 受限于官方搜索
多轮检索 通常单次检索 Agent 自主多轮 + 关键词修正
数据实时性 依赖同步频率(分钟~小时级延迟) 实时(查即所得)
维护成本 高(向量库 + 同步管道 + Embedding) 低(只维护 Agent 逻辑)

七、必须正视的局限性:官方搜索的天花板在哪里?

虽然"Hermes 预处理 + 钉钉 MCP 动态检索"在绝大多数场景下表现惊艳,且具备数据绝对实时、零同步成本、自带权限隔离的巨大优势,但在实际深度测评中,我们也撞到了原生 SaaS 搜索引擎的天花板。

7.1 分词与倒排索引的硬伤

钉钉/飞书的官方搜索底层本质上还是传统的关键词检索(BM25 类算法)。哪怕大模型在前置阶段把关键词扩写得再漂亮,如果底层文档里存在大量的特殊缩写、生僻行业术语,或者完全没有字面重合的纯语义表达,官方搜索引擎依然会漏掉很多关键文档。
#mermaid-svg-V2d8LsbIbGhubqVc{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-V2d8LsbIbGhubqVc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-V2d8LsbIbGhubqVc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-V2d8LsbIbGhubqVc .error-icon{fill:#552222;}#mermaid-svg-V2d8LsbIbGhubqVc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-V2d8LsbIbGhubqVc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-V2d8LsbIbGhubqVc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-V2d8LsbIbGhubqVc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-V2d8LsbIbGhubqVc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-V2d8LsbIbGhubqVc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-V2d8LsbIbGhubqVc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-V2d8LsbIbGhubqVc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-V2d8LsbIbGhubqVc .marker.cross{stroke:#333333;}#mermaid-svg-V2d8LsbIbGhubqVc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-V2d8LsbIbGhubqVc p{margin:0;}#mermaid-svg-V2d8LsbIbGhubqVc .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-V2d8LsbIbGhubqVc .cluster-label text{fill:#333;}#mermaid-svg-V2d8LsbIbGhubqVc .cluster-label span{color:#333;}#mermaid-svg-V2d8LsbIbGhubqVc .cluster-label span p{background-color:transparent;}#mermaid-svg-V2d8LsbIbGhubqVc .label text,#mermaid-svg-V2d8LsbIbGhubqVc span{fill:#333;color:#333;}#mermaid-svg-V2d8LsbIbGhubqVc .node rect,#mermaid-svg-V2d8LsbIbGhubqVc .node circle,#mermaid-svg-V2d8LsbIbGhubqVc .node ellipse,#mermaid-svg-V2d8LsbIbGhubqVc .node polygon,#mermaid-svg-V2d8LsbIbGhubqVc .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-V2d8LsbIbGhubqVc .rough-node .label text,#mermaid-svg-V2d8LsbIbGhubqVc .node .label text,#mermaid-svg-V2d8LsbIbGhubqVc .image-shape .label,#mermaid-svg-V2d8LsbIbGhubqVc .icon-shape .label{text-anchor:middle;}#mermaid-svg-V2d8LsbIbGhubqVc .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-V2d8LsbIbGhubqVc .rough-node .label,#mermaid-svg-V2d8LsbIbGhubqVc .node .label,#mermaid-svg-V2d8LsbIbGhubqVc .image-shape .label,#mermaid-svg-V2d8LsbIbGhubqVc .icon-shape .label{text-align:center;}#mermaid-svg-V2d8LsbIbGhubqVc .node.clickable{cursor:pointer;}#mermaid-svg-V2d8LsbIbGhubqVc .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-V2d8LsbIbGhubqVc .arrowheadPath{fill:#333333;}#mermaid-svg-V2d8LsbIbGhubqVc .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-V2d8LsbIbGhubqVc .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-V2d8LsbIbGhubqVc .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-V2d8LsbIbGhubqVc .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-V2d8LsbIbGhubqVc .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-V2d8LsbIbGhubqVc .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-V2d8LsbIbGhubqVc .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-V2d8LsbIbGhubqVc .cluster text{fill:#333;}#mermaid-svg-V2d8LsbIbGhubqVc .cluster span{color:#333;}#mermaid-svg-V2d8LsbIbGhubqVc div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-V2d8LsbIbGhubqVc .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-V2d8LsbIbGhubqVc rect.text{fill:none;stroke-width:0;}#mermaid-svg-V2d8LsbIbGhubqVc .icon-shape,#mermaid-svg-V2d8LsbIbGhubqVc .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-V2d8LsbIbGhubqVc .icon-shape p,#mermaid-svg-V2d8LsbIbGhubqVc .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-V2d8LsbIbGhubqVc .icon-shape .label rect,#mermaid-svg-V2d8LsbIbGhubqVc .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-V2d8LsbIbGhubqVc .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-V2d8LsbIbGhubqVc .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-V2d8LsbIbGhubqVc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 本地向量检索
Query: '孕妇乘机规定'
Embedding 语义匹配
结果:5 条

(包含《特殊旅客承运指南》

因为语义向量捕捉到了

'孕产妇运输'的关联)
官方关键词搜索
Query: '孕妇乘机规定'
BM25 分词匹配
结果:2 条

(漏了《特殊旅客承运指南》

因为文档里用的是

'孕产妇运输'而非'孕妇乘机')

7.2 跨语言检索的极限

如果用户输入纯英文或日文,即使大模型将其翻译并膨胀为中文关键词去搜中文文档,官方搜索引擎对多语言混合分词的支持也经常捉襟见肘。

7.3 大流量下的 API 频率限制

高频并发提问时,频繁调用官方搜索和读取接口,容易触发平台高负载限速(Rate Limit)。

7.4 适用场景总结

#mermaid-svg-V3lGJTstCwPYGDJN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-V3lGJTstCwPYGDJN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-V3lGJTstCwPYGDJN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-V3lGJTstCwPYGDJN .error-icon{fill:#552222;}#mermaid-svg-V3lGJTstCwPYGDJN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-V3lGJTstCwPYGDJN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-V3lGJTstCwPYGDJN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-V3lGJTstCwPYGDJN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-V3lGJTstCwPYGDJN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-V3lGJTstCwPYGDJN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-V3lGJTstCwPYGDJN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-V3lGJTstCwPYGDJN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-V3lGJTstCwPYGDJN .marker.cross{stroke:#333333;}#mermaid-svg-V3lGJTstCwPYGDJN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-V3lGJTstCwPYGDJN p{margin:0;}#mermaid-svg-V3lGJTstCwPYGDJN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-V3lGJTstCwPYGDJN .cluster-label text{fill:#333;}#mermaid-svg-V3lGJTstCwPYGDJN .cluster-label span{color:#333;}#mermaid-svg-V3lGJTstCwPYGDJN .cluster-label span p{background-color:transparent;}#mermaid-svg-V3lGJTstCwPYGDJN .label text,#mermaid-svg-V3lGJTstCwPYGDJN span{fill:#333;color:#333;}#mermaid-svg-V3lGJTstCwPYGDJN .node rect,#mermaid-svg-V3lGJTstCwPYGDJN .node circle,#mermaid-svg-V3lGJTstCwPYGDJN .node ellipse,#mermaid-svg-V3lGJTstCwPYGDJN .node polygon,#mermaid-svg-V3lGJTstCwPYGDJN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-V3lGJTstCwPYGDJN .rough-node .label text,#mermaid-svg-V3lGJTstCwPYGDJN .node .label text,#mermaid-svg-V3lGJTstCwPYGDJN .image-shape .label,#mermaid-svg-V3lGJTstCwPYGDJN .icon-shape .label{text-anchor:middle;}#mermaid-svg-V3lGJTstCwPYGDJN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-V3lGJTstCwPYGDJN .rough-node .label,#mermaid-svg-V3lGJTstCwPYGDJN .node .label,#mermaid-svg-V3lGJTstCwPYGDJN .image-shape .label,#mermaid-svg-V3lGJTstCwPYGDJN .icon-shape .label{text-align:center;}#mermaid-svg-V3lGJTstCwPYGDJN .node.clickable{cursor:pointer;}#mermaid-svg-V3lGJTstCwPYGDJN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-V3lGJTstCwPYGDJN .arrowheadPath{fill:#333333;}#mermaid-svg-V3lGJTstCwPYGDJN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-V3lGJTstCwPYGDJN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-V3lGJTstCwPYGDJN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-V3lGJTstCwPYGDJN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-V3lGJTstCwPYGDJN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-V3lGJTstCwPYGDJN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-V3lGJTstCwPYGDJN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-V3lGJTstCwPYGDJN .cluster text{fill:#333;}#mermaid-svg-V3lGJTstCwPYGDJN .cluster span{color:#333;}#mermaid-svg-V3lGJTstCwPYGDJN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-V3lGJTstCwPYGDJN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-V3lGJTstCwPYGDJN rect.text{fill:none;stroke-width:0;}#mermaid-svg-V3lGJTstCwPYGDJN .icon-shape,#mermaid-svg-V3lGJTstCwPYGDJN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-V3lGJTstCwPYGDJN .icon-shape p,#mermaid-svg-V3lGJTstCwPYGDJN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-V3lGJTstCwPYGDJN .icon-shape .label rect,#mermaid-svg-V3lGJTstCwPYGDJN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-V3lGJTstCwPYGDJN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-V3lGJTstCwPYGDJN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-V3lGJTstCwPYGDJN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 海量文档 / 频繁更新
少量静态文档
复杂权限体系
权限简单
数据不能落地
可以落地
极高(金融/审计/法务)
一般(日常办公问答)
你的场景是什么?
文档数量

与更新频率?
权限复杂度?
建议:传统 RAG

Dify + 向量库即可
数据合规要求?
准确率要求?
✅ Agentic Search + MCP

(本文方案)
建议:混合架构

钉钉数据源 + 本地向量库


八、退路方案:当官方搜索满足不了你,如何转向"深度路线"?

架构设计永远要准备好 Plan B。如果在经过严格的线上测试后,你发现大模型扩写关键词后,钉钉的搜索引擎依然漏掉很多关键文档,那说明官方搜索的底层算力确实无法支撑你们复杂的业务场景。

此时不要犹豫,果断放弃动态检索,老老实实走**"本地混合检索(本地向量库 + 本地全文检索)"**的深度路线。
#mermaid-svg-NwqP9Y7wlyXm6SlU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NwqP9Y7wlyXm6SlU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NwqP9Y7wlyXm6SlU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NwqP9Y7wlyXm6SlU .error-icon{fill:#552222;}#mermaid-svg-NwqP9Y7wlyXm6SlU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NwqP9Y7wlyXm6SlU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NwqP9Y7wlyXm6SlU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NwqP9Y7wlyXm6SlU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NwqP9Y7wlyXm6SlU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NwqP9Y7wlyXm6SlU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NwqP9Y7wlyXm6SlU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NwqP9Y7wlyXm6SlU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NwqP9Y7wlyXm6SlU .marker.cross{stroke:#333333;}#mermaid-svg-NwqP9Y7wlyXm6SlU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NwqP9Y7wlyXm6SlU p{margin:0;}#mermaid-svg-NwqP9Y7wlyXm6SlU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NwqP9Y7wlyXm6SlU .cluster-label text{fill:#333;}#mermaid-svg-NwqP9Y7wlyXm6SlU .cluster-label span{color:#333;}#mermaid-svg-NwqP9Y7wlyXm6SlU .cluster-label span p{background-color:transparent;}#mermaid-svg-NwqP9Y7wlyXm6SlU .label text,#mermaid-svg-NwqP9Y7wlyXm6SlU span{fill:#333;color:#333;}#mermaid-svg-NwqP9Y7wlyXm6SlU .node rect,#mermaid-svg-NwqP9Y7wlyXm6SlU .node circle,#mermaid-svg-NwqP9Y7wlyXm6SlU .node ellipse,#mermaid-svg-NwqP9Y7wlyXm6SlU .node polygon,#mermaid-svg-NwqP9Y7wlyXm6SlU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NwqP9Y7wlyXm6SlU .rough-node .label text,#mermaid-svg-NwqP9Y7wlyXm6SlU .node .label text,#mermaid-svg-NwqP9Y7wlyXm6SlU .image-shape .label,#mermaid-svg-NwqP9Y7wlyXm6SlU .icon-shape .label{text-anchor:middle;}#mermaid-svg-NwqP9Y7wlyXm6SlU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-NwqP9Y7wlyXm6SlU .rough-node .label,#mermaid-svg-NwqP9Y7wlyXm6SlU .node .label,#mermaid-svg-NwqP9Y7wlyXm6SlU .image-shape .label,#mermaid-svg-NwqP9Y7wlyXm6SlU .icon-shape .label{text-align:center;}#mermaid-svg-NwqP9Y7wlyXm6SlU .node.clickable{cursor:pointer;}#mermaid-svg-NwqP9Y7wlyXm6SlU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-NwqP9Y7wlyXm6SlU .arrowheadPath{fill:#333333;}#mermaid-svg-NwqP9Y7wlyXm6SlU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NwqP9Y7wlyXm6SlU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NwqP9Y7wlyXm6SlU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NwqP9Y7wlyXm6SlU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-NwqP9Y7wlyXm6SlU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NwqP9Y7wlyXm6SlU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-NwqP9Y7wlyXm6SlU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NwqP9Y7wlyXm6SlU .cluster text{fill:#333;}#mermaid-svg-NwqP9Y7wlyXm6SlU .cluster span{color:#333;}#mermaid-svg-NwqP9Y7wlyXm6SlU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NwqP9Y7wlyXm6SlU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-NwqP9Y7wlyXm6SlU rect.text{fill:none;stroke-width:0;}#mermaid-svg-NwqP9Y7wlyXm6SlU .icon-shape,#mermaid-svg-NwqP9Y7wlyXm6SlU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NwqP9Y7wlyXm6SlU .icon-shape p,#mermaid-svg-NwqP9Y7wlyXm6SlU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-NwqP9Y7wlyXm6SlU .icon-shape .label rect,#mermaid-svg-NwqP9Y7wlyXm6SlU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NwqP9Y7wlyXm6SlU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-NwqP9Y7wlyXm6SlU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-NwqP9Y7wlyXm6SlU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 智能调度层
数据同步层
数据源层
最终回复
精准召回
本地检索引擎(WeKnora / Dify)
🔵 向量检索

BGE-M3 Embedding
🟠 Rerank 重排

BGE-Reranker
🟢 全文检索

BM25 倒排索引
钉钉知识库

(云文档 / 团队空间)
API 导出 / Webhook 监听
数据抽取 & 前置解析

(Layout / 表格 / 图片)
Hermes Agent

ReAct 推理 + 工具调度
👤 用户

8.1 基础设施选型

推荐使用 WeKnora (一站式高性能知识库框架)或 Dify(最流行的 LLM 应用搭建平台)。

8.2 数据抽取逻辑

通过编写 Python 脚本调用钉钉/飞书的文档导出接口,配合 Webhook 监听文档变更事件,做到增量同步,把数据彻底搬到本地。

8.3 混合检索 + Rerank(杀手锏)

在本地通过 BGE-M3 等支持多语言的 Embedding 模型建立向量索引,同时挂载 BGE-Reranker(重排模型)。这样,无论用户怎么换同义词、错别字或换语言,本地的向量库都能实现物理级别的"语义对齐",彻底解决漏召回的问题


九、总结与架构建议

9.1 这篇文章不是在讲什么

  • 不是在讲"Hermes 比钉钉强"
  • 不是在讲"MCP 是银弹"
  • 不是在讲"RAG 不行了"

9.2 这篇文章真正在讲什么

当企业已经深度使用钉钉生态时,如何在「不导出知识库、不维护向量库、不重新建设知识体系」的前提下,通过 Agentic Search + MCP 提高企业知识问答的效果。
#mermaid-svg-chzj3ndKmYKQhgX1{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-chzj3ndKmYKQhgX1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-chzj3ndKmYKQhgX1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-chzj3ndKmYKQhgX1 .error-icon{fill:#552222;}#mermaid-svg-chzj3ndKmYKQhgX1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-chzj3ndKmYKQhgX1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-chzj3ndKmYKQhgX1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-chzj3ndKmYKQhgX1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-chzj3ndKmYKQhgX1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-chzj3ndKmYKQhgX1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-chzj3ndKmYKQhgX1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-chzj3ndKmYKQhgX1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-chzj3ndKmYKQhgX1 .marker.cross{stroke:#333333;}#mermaid-svg-chzj3ndKmYKQhgX1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-chzj3ndKmYKQhgX1 p{margin:0;}#mermaid-svg-chzj3ndKmYKQhgX1 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-chzj3ndKmYKQhgX1 .cluster-label text{fill:#333;}#mermaid-svg-chzj3ndKmYKQhgX1 .cluster-label span{color:#333;}#mermaid-svg-chzj3ndKmYKQhgX1 .cluster-label span p{background-color:transparent;}#mermaid-svg-chzj3ndKmYKQhgX1 .label text,#mermaid-svg-chzj3ndKmYKQhgX1 span{fill:#333;color:#333;}#mermaid-svg-chzj3ndKmYKQhgX1 .node rect,#mermaid-svg-chzj3ndKmYKQhgX1 .node circle,#mermaid-svg-chzj3ndKmYKQhgX1 .node ellipse,#mermaid-svg-chzj3ndKmYKQhgX1 .node polygon,#mermaid-svg-chzj3ndKmYKQhgX1 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-chzj3ndKmYKQhgX1 .rough-node .label text,#mermaid-svg-chzj3ndKmYKQhgX1 .node .label text,#mermaid-svg-chzj3ndKmYKQhgX1 .image-shape .label,#mermaid-svg-chzj3ndKmYKQhgX1 .icon-shape .label{text-anchor:middle;}#mermaid-svg-chzj3ndKmYKQhgX1 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-chzj3ndKmYKQhgX1 .rough-node .label,#mermaid-svg-chzj3ndKmYKQhgX1 .node .label,#mermaid-svg-chzj3ndKmYKQhgX1 .image-shape .label,#mermaid-svg-chzj3ndKmYKQhgX1 .icon-shape .label{text-align:center;}#mermaid-svg-chzj3ndKmYKQhgX1 .node.clickable{cursor:pointer;}#mermaid-svg-chzj3ndKmYKQhgX1 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-chzj3ndKmYKQhgX1 .arrowheadPath{fill:#333333;}#mermaid-svg-chzj3ndKmYKQhgX1 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-chzj3ndKmYKQhgX1 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-chzj3ndKmYKQhgX1 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-chzj3ndKmYKQhgX1 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-chzj3ndKmYKQhgX1 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-chzj3ndKmYKQhgX1 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-chzj3ndKmYKQhgX1 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-chzj3ndKmYKQhgX1 .cluster text{fill:#333;}#mermaid-svg-chzj3ndKmYKQhgX1 .cluster span{color:#333;}#mermaid-svg-chzj3ndKmYKQhgX1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-chzj3ndKmYKQhgX1 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-chzj3ndKmYKQhgX1 rect.text{fill:none;stroke-width:0;}#mermaid-svg-chzj3ndKmYKQhgX1 .icon-shape,#mermaid-svg-chzj3ndKmYKQhgX1 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-chzj3ndKmYKQhgX1 .icon-shape p,#mermaid-svg-chzj3ndKmYKQhgX1 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-chzj3ndKmYKQhgX1 .icon-shape .label rect,#mermaid-svg-chzj3ndKmYKQhgX1 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-chzj3ndKmYKQhgX1 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-chzj3ndKmYKQhgX1 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-chzj3ndKmYKQhgX1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 中间路线
高精度场景
钉钉原生知识库

(DEAP 工作流)
Agentic Search + MCP

🔼 本文方案
本地混合检索

(WeKnora / Dify)

9.3 分阶段落地建议

阶段 方案 适用场景
第一阶段(轻量快捷) Hermes + 钉钉 MCP 动态实时检索 用极低的研发成本,利用大模型前置干预,验证 80% 的日常办公场景
第二阶段(深水区硬核) WeKnora / Dify 本地混合检索 + Rerank 业务涉及严苛的法规审计、财报对比、或官方搜索频繁漏单时启用

9.4 最想传递的一句话

企业知识问答最大的瓶颈,往往不在模型,而在检索。Agent 不是比 Workflow 更聪明,而是 Agent 能不断修正检索过程。


本文基于真实生产环境踩坑经验撰写。大家在钉钉 AI 或 MCP 落地过程中还遇到过哪些坑?欢迎在评论区一起交流探讨!