犀牛鸟 2026 研究笔记 estelledc.github.io

Agent 与 RAG 平台集成

调研日期:2025-06-22 未实测,以源码/docs 为准

一句话定位

Agent 和 RAG 的结合不是简单的”拼在一起”——而是三种截然不同的集成模式(RAG-as-Tool / RAG-in-Loop / RAG-as-Agent),对应不同的工程复杂度和检索质量天花板。选错模式,要么能力受限,要么成本失控。


RAG 管线段标注

本篇关注 Retrieve 段的暴露与集成——RAG 平台如何以 API / MCP / SDK 形式被 Agent 调用,以及 Agent 如何在更高层面编排检索策略。


1. Agent + RAG 为什么要结合

单独 RAG 的局限

日常类比:RAG 系统像一个只听指令的图书管理员——你说”帮我找关于 RRF 的资料”,他就去书架上翻一遍,把找到的书全丢给你。他不会主动思考”你可能还需要看排名融合的论文”或”这个结果看起来不太相关,要不要换个关键词再找一次”。

具体来说,单独的 RAG 管线有三类无法自身解决的问题:

问题一:查询理解不足。用户问”为什么我的检索结果很差”,RAG 系统会直接拿这句话去检索,返回一堆讨论”检索质量”的文档。但用户的真实意图可能是”我的 RAG 系统召回率不够,怎么调参”——查询改写(Query Rewriting)是 RAG 管线自身做不到的,它需要 Agent 在检索前做意图理解和查询分解。

问题二:结果验证缺失。RAG 管线返回 top-K 结果后直接送入 LLM 生成答案,没有”结果够不够好”的判断。如果检索结果完全不相关,LLM 会基于错误上下文生成一个自信但错误的答案——这比”我不知道”更危险。Agent 可以在检索后加一步验证:”这些结果是否与问题相关?不够则重新检索。”

问题三:多步推理能力为零。复杂问题如”RAGFlow 的 DeepDoc 和 WeKnora 的 IMA 在表格解析上的区别”需要先分别检索两个系统的文档,再对比。传统 RAG 管线只能做单轮检索,无法拆解多步问题。这需要 Agent 做查询分解、并行检索、结果合成。

Agent 如何增强检索

Agent 为 RAG 带来的核心价值是决策循环——让检索不再是”一锤子买卖”,而是一个可以根据结果动态调整的迭代过程。

Agent 能力 对 RAG 的增强 具体场景
意图识别 检索前判断是否需要检索 闲聊跳过 RAG,事实查询走 RAG
查询改写 优化检索 query “怎么加快” → “性能优化方法 / 加速技巧 / 提升运行速度”
查询分解 拆解复杂问题为子查询 “对比 A 和 B” → 分别查 A 和 B
结果验证 判断检索质量 相关度低则重新检索或改写 query
多轮迭代 逐步精化检索结果 第一次检索的线索作为第二次的输入
工具选择 动态选择数据源 内部文档走 WeKnora,网络搜索走 Bing
结果合成 合并多个数据源的结果 WeKnora + Dify 各返回一部分,Agent 合成

这些能力不是 RAG 管线自身能具备的——它们需要 LLM 在更高层面做推理和决策,而这正是 Agent 的本质。

详细模式分类见 Agentic RAG 模式 中六种 RAG 编排模式


2. 集成模式分类

Agent 和 RAG 的结合不是非此即彼,而是一个从”浅集成”到”深度融合”的光谱。按 Agent 对检索过程的控制权从低到高,可以分为三种模式。

模式一:RAG-as-Tool

定义:RAG 检索被包装成 Agent 的一个工具(Tool),Agent 可以选择调用或不调用,但调用后对检索过程没有控制——不能改写 query、不能指定检索策略、不能做二次检索。

flowchart LR
    U[用户] --> A[Agent]
    A -->|选择调用| RAG[RAG 工具]
    RAG -->|返回 chunks| A
    A -->|可能还调用| T1[Web 搜索]
    A -->|可能还调用| T2[代码执行]
    A --> U

日常类比:你是一个项目经理(Agent),手下的图书管理员(RAG Tool)只会按你说的关键词去书架上翻书。你问他”帮我找 RRF 的资料”,他翻完就回来了。如果你觉得结果不满意,你得重新给他一个不同的关键词再派他去翻一次。

优点

缺点

代表项目

模式二:RAG-in-Loop

定义:Agent 拥有对检索过程的迭代控制权——可以改写 query、指定检索参数、判断结果是否充分、决定是否重新检索。检索不再是”调用-返回”的单步操作,而是一个 Agent 主导的迭代循环。

flowchart TD
    U[用户] --> A[Agent]
    A -->|1. 原始查询| RAG[RAG 检索]
    RAG -->|2. 返回 chunks| A
    A -->|3. 结果不够?| RW[查询改写]
    RW -->|4. 新查询| RAG
    RAG -->|5. 新 chunks| A
    A -->|6. 结果充分| GEN[生成答案]
    GEN --> U

日常类比:你是一个经验丰富的研究员(Agent),不是简单地把关键词丢给图书管理员,而是和他一起工作。第一轮检索后你觉得”这些书太泛了,我需要更具体的”,于是你精化关键词再找一次。或者你发现”这本书提到了另一个相关主题”,于是顺着线索找第二本书。你一直在”检索→评估→调整”的循环中,直到满意为止。

优点

缺点

代表项目

关键设计决策——迭代终止条件

终止条件 实现方式 适用场景
最大迭代次数 计数器,默认 5-10 次 通用
相关度阈值 LLM 判断”结果是否充分” 高精度需求
token 预算 累计消耗 token 达到上限 成本敏感
时间限制 总耗时超过阈值 延迟敏感
收敛检测 连续两轮检索结果高度重叠 效率优先

模式三:RAG-as-Agent

定义:RAG 管线本身就是一个 Agent——检索的每一步(查询理解、数据源选择、检索策略、结果验证、答案生成)都由 LLM 自主决策。没有固定的管线结构,只有 LLM 的推理循环。

flowchart TD
    U[用户] --> A[RAG Agent]
    A -->|自主决策| Q1[理解查询意图]
    Q1 -->|自主决策| Q2{需要检索?}
    Q2 -->|否| GEN[直接生成]
    Q2 -->|是| Q3[选择数据源和策略]
    Q3 --> Q4[执行检索]
    Q4 --> Q5{结果评估}
    Q5 -->|不够| Q3
    Q5 -->|够了| Q6[合成答案]
    Q6 --> Q7{答案可信?}
    Q7 -->|否| Q3
    Q7 -->|是| GEN
    GEN --> U

日常类比:你不再有一个图书管理员——你把自己变成了一个全栈研究员。你不仅决定找什么书,还决定先去哪个图书馆找、用什么检索策略、找到后如何交叉验证、最后怎么组织成报告。你不受任何固定流程的约束,完全靠自己的判断力驱动整个过程。

优点

缺点

代表项目

三种模式的选择决策树

flowchart TD
    START[选择集成模式] --> Q1{查询复杂度?}
    Q1 -->|简单查询<br>单关键词/单意图| T1[RAG-as-Tool]
    Q1 -->|中等复杂<br>需要改写或对比| Q2{延迟/成本容忍度?}
    Q1 -->|极复杂<br>多步推理/多数据源| Q3{是否需要极致质量?}
    Q2 -->|低| T1
    Q2 -->|中| T2[RAG-in-Loop]
    Q3 -->|否| T2
    Q3 -->|是| T3[RAG-as-Agent]
选择因素 RAG-as-Tool RAG-in-Loop RAG-as-Agent
查询复杂度
延迟容忍 <2s <10s <60s
成本容忍
检索质量要求 够用就行 较高 极高
工程复杂度
可靠性要求
代表场景 FAQ 问答 技术文档检索 研究型深度检索

3. 集成拓扑

flowchart LR
    subgraph agents["Coding Agents"]
        CC[Claude Code]
        CX[Codex]
        LC[LangChain Agent]
    end
    subgraph rag["RAG 平台"]
        WK[WeKnora API]
        DF[Dify API]
        RF[RAGFlow API]
        AG[AnythingLLM]
        FG[FastGPT]
    end
    subgraph bridge["集成桥"]
        MCP[MCP Protocol]
        REST[REST API]
        SDK[Python/Go SDK]
    end
    CC -->|MCP / 手动| MCP
    CX -->|BM25 内建 vs 外接| REST
    LC -->|Retriever 接口| SDK
    MCP --> WK
    REST --> WK
    REST --> DF
    REST --> RF
    SDK --> WK
    SDK --> DF
    SDK --> FG

4. 各 Agent 的 RAG 现状

4.1 Codex(OpenAI)

4.2 Claude Code(Anthropic)

MCP 在 Claude Code 中的完整实现见 MCP 集成对比

4.3 LangChain / LangGraph Agent


5. 各项目的 Agent 能力对比

5.1 WeKnora:EventManager + Plugin(尚未 Agentic,但机会明确)

现状:WeKnora 本身是固定管线——EventManager 派发 QueryReceived 事件,BM25 / 向量 / 图谱三路并行检索,RRF 融合 + 复合 Rerank,一次出结果。没有 Agent 编排层,没有迭代检索能力。

类比:WeKnora 像一台自动售货机——你投入硬币(query),机器自动走完所有内部步骤,吐出商品(检索结果)。你无法在过程中干预”这罐可乐换成雪碧”或”再找找有没有更冰的”。

机会区域(为什么说”尚未 Agentic”是一个机会而非缺陷):

  1. WeKnora 的 Plugin 管线天然支持 Agentic 扩展——写一个 AgentPlugin 监听 RerankCompleted 事件,判断结果是否充分,不充分则触发新查询
  2. mcp-server/ 目录已经把 WeKnora 暴露为 MCP 工具——任何 Agent 框架(Claude Code / LangChain)都可以把 WeKnora 当作一个 RAG Tool 调用
  3. 三路检索 + RRF + 复合 Rerank 的固定管线在 80% 场景下已经足够——只在复杂查询时才需要 Agent 编排

关键洞察:WeKnora 定位是”检索引擎”而非”Agent 平台”。把检索做到极致,然后通过 MCP/API 让 Agent 框架来编排——这是比在 WeKnora 内部重造 Agent 轮子更务实的路径。

WeKnora 架构精读见 精读: WeKnora

5.2 Dify:ReAct + Function Calling + Workflow

现状:Dify 是五项目中 Agent 能力最完整的——同时支持 ReAct 和 Function Calling 两种模式,且可以在 Workflow 的任意节点嵌入 Agent。

ReAct 模式:Agent 在”思考→行动→观察”循环中自主决策调用哪些工具。知识库检索是工具之一。Agent 可以选择不检索(闲聊场景)、检索一次、或多次检索不同知识库。

Function Calling 模式:LLM 通过结构化 JSON 返回 tool_calls,系统自动执行工具。比 ReAct 更可靠(JSON 格式由模型保证),但只支持 Function Calling 兼容的模型。

Workflow + Agent 组合:这是 Dify 最强大的能力——在可视化 Workflow 的某个节点上”放手”让 Agent 自主决策,然后在下一个节点重新”接管”控制。例如:

  1. 知识检索节点 → 返回结果
  2. 条件判断节点 → “相关度 > 0.7?”
  3. 是 → 直接生成答案
  4. 否 → Agent 节点(自主决定是否追问 / 改写 / 换知识库再检索)

与 WeKnora 对比:Dify 的 RAG 深度不如 WeKnora(双路混合 vs 三路 + RRF + 复合 Rerank),但 Agent 编排能力远超 WeKnora。两者组合——Dify 做前端 Agent 编排,WeKnora 做底层检索引擎——取两者之长。

Dify 架构精读见 精读: Dify

5.3 RAGFlow:Chat-based Agent with Citation

现状:RAGFlow 的 Agent 能力相对简单——基于 Chat 的对话式 Agent,核心亮点是引用追踪(Citation)。Agent 编排采用 Graph 定义,节点类型较少(检索 / LLM / 条件 / 改写),但与 RAG 的集成最紧密。

引用追踪的价值:答案中每个断言都标注来源 chunk,用户可以点击跳转原文验证。这对企业场景(财务数据、法律条文)特别重要——可验证性比高召回率更有价值。

Agent Graph 编排:RAGFlow 的 Agent Graph 比 Dify 的 Workflow 更轻量,但更适合 RAG 专用的推理流程:

  1. 检索节点 → 获取初始结果
  2. LLM 节点 → 评估结果质量
  3. 条件节点 → 不充分则走改写分支
  4. 改写节点 → 重写 query
  5. 回到检索节点

与 WeKnora 的互补:RAGFlow 的 DeepDoc 文档解析 + WeKnora 的三路检索是理想组合——前者保证输入质量,后者保证检索质量。参见 精读: RAGFlow 中的组合评估方向。

RAGFlow 架构精读见 精读: RAGFlow

5.4 AnythingLLM:@agent Commands

现状:AnythingLLM 的 Agent 能力是五项目中最简单的——通过 @agent 命令激活 Agent 模式,Agent 可以调用向量检索工具和少数内置工具。没有迭代检索、没有查询改写、没有结果验证。

设计哲学的合理性:AnythingLLM 定位是个人知识库——查询模式以简单语义检索为主,复杂查询的频率很低。在这种场景下,RAG-as-Tool(一次调用拿结果)已经够用,强行做 RAG-in-Loop 只会增加延迟和复杂度。

@agent 的具体行为:当用户在对话中输入 @agent 前缀时,系统切换到 Agent 模式——LLM 可以调用 document-search 工具检索知识库,也可以调用 web-scrape 工具抓取网页。但 Agent 不会做查询改写或二次检索——这是设计取舍,不是缺陷。

适用场景:个人笔记检索、小型团队文档问答、隐私敏感场景的本地部署。不适合需要高召回率的企业知识库。

AnythingLLM 架构精读见 精读: AnythingLLM

5.5 FastGPT:Workflow-based Agent

现状:FastGPT 的 Agent 能力通过可视化 Workflow 实现——工作流中的 datasetNode(知识库检索)可以和其他节点(LLM / 条件分支 / HTTP 请求)自由组合,实现 RAG-in-Loop 的效果。

Workflow 作为 Agent 的优势:可视化编排让 RAG-in-Loop 变得可预测——迭代次数、查询改写策略、结果验证逻辑都由工作流定义,而不是依赖 LLM 的自主决策。这比纯 Agent 编排更可控、成本更可预测。

多查询扩展:FastGPT 的知识库检索节点内置了多查询扩展——LLM 自动将用户查询改写为多个子查询,分别检索后合并。这是 RAG-in-Loop 的简化版本——虽然是自动的,但不支持 Agent 评估结果后自主决定是否需要重新检索。

QA 对拆分 + Agent 的组合:FastGPT 的 QA 对拆分策略让检索粒度更细——Agent 可以在 Q 字段上做精确匹配,在 A 字段上做语义检索。这是 FastGPT 在 Agent-RAG 集成上的独特优势。

FastGPT 架构精读见 精读: FastGPT

五项目 Agent 能力汇总

维度 WeKnora Dify RAGFlow AnythingLLM FastGPT
Agent 模式 无内建(通过 API/MCP 被调用) ReAct + Function Calling Graph-based Agent @agent 命令 Workflow-based
集成模式 RAG-as-Tool(被外部调用) RAG-as-Tool + RAG-in-Loop RAG-in-Loop RAG-as-Tool RAG-in-Loop
迭代检索 不支持 支持(Agent 节点 + 条件分支) 支持(Graph 循环) 不支持 支持(循环节点)
查询改写 不支持 支持(Agent 自主改写) 支持(改写节点) 不支持 支持(多查询扩展)
结果验证 复合 Rerank 兜底 支持(条件判断节点) 支持(LLM 评估) 不支持 支持(条件分支)
引用追踪 无原生支持 有(核心亮点) 基础
多数据源 无(单知识库) 支持(多工具选择) 支持(多知识库) 支持(web-scrape) 支持(多知识库节点)
可视化编排 有(Workflow DAG) 有(Agent Graph) 有(Workflow)

6. MCP(Model Context Protocol)集成

MCP 是什么

MCP 是 Anthropic 提出的标准化 Agent-工具通信协议。日常类比:MCP 之于 Agent,就像 USB 之于电脑——一个标准化的接口,让任何设备(工具)都能即插即用,不需要为每种设备写专门的驱动程序。

在 RAG 场景下,MCP 的核心价值是让 RAG 平台成为 Agent 的即插即用工具——Agent 不需要知道 RAG 平台的 API 格式、认证方式、参数结构,只需要通过 MCP 协议发现和调用工具。

MCP 协议核心概念

概念 说明 RAG 场景下的对应
Tool Agent 可调用的操作 search_knowledge_base(query, kb_id)
Resource Agent 可读取的数据 知识库文档、chunk 列表
Prompt 预定义的提示模板 “基于以下检索结果回答问题”
Server 提供工具/资源的服务 WeKnora MCP Server
Transport 通信方式 stdio(本地)/ Streamable HTTP(远程)

MCP 在 RAG 集成中的三种角色

角色一:RAG 平台暴露为 MCP Server

WeKnora 的 mcp-server/ 目录就是这种模式——WeKnora 把检索、文档管理、对话等能力暴露为 MCP 工具,Claude Code 等支持 MCP 的客户端可以直接发现和调用。

{
  "mcpServers": {
    "weknora": {
      "command": "node",
      "args": ["path/to/weknora-mcp-server/dist/index.js"],
      "env": {
        "WEKNORA_API_URL": "http://localhost:8080",
        "WEKNORA_API_KEY": "your-key"
      }
    }
  }
}

角色二:Agent 作为 MCP Client 调用多个 RAG 平台

一个 Agent 可以同时连接多个 MCP Server——WeKnora 做内部文档检索,Dify 做外部知识检索,RAGFlow 做深度文档解析。Agent 根据查询类型自主选择调用哪个平台。

角色三:RAG 平台通过 MCP 调用外部工具

RAG 平台本身也可以是 MCP Client——在生成阶段调用外部工具(Web 搜索、数据库查询、API 调用)来补充 RAG 检索不足的信息。Dify 的 HTTP Request 节点就是这种模式。

MCP vs REST API:为什么 MCP 更适合 RAG-Agent 集成

维度 MCP 方式 REST API 方式
协议 JSON-RPC over stdio/SSE HTTP REST
发现 自动工具描述(Tool Schema) 需读 API 文档
状态 可维持会话 无状态
认证 OAuth 2.0 内建 需自行实现
适合 Claude Code / CatDesk 等原生支持 MCP 的客户端 通用集成
工具搜索 延迟加载(Tool Search) 无此机制
双向通信 支持(Elicitation) 不支持

MCP 的 Tool Search 机制对 RAG 集成特别有价值:当 RAG 平台暴露大量工具(检索不同知识库、不同检索策略、文档管理等)时,MCP Client 不需要把所有工具描述塞进 system prompt——而是维护工具元数据索引,LLM 按需匹配加载相关工具。这解决了”工具过多撑爆 prompt”的问题。

MCP 在 Claude Code 和 Codex 中的完整对比见 MCP 集成对比

WeKnora MCP 能力(基于源码目录推断,未实测)


7. 多 Agent 协作检索

为什么需要多 Agent

日常类比:你问一个全科医生”我肚子疼是怎么回事”,他可能给你一个大概方向。但如果你同时让消化科医生、泌尿科医生、神经科医生一起会诊,每个医生从自己专长出发给出判断,最后汇总——诊断准确率会高得多。

多 Agent 协作检索的思路一样:不同 Agent 专长于不同领域或不同数据源,复杂查询时多个 Agent 并行检索,最后合成结果。

三种协作模式

模式一:路由式(Router)

一个主 Agent(Router)接收用户查询,判断应该分配给哪个专业 Agent,然后汇总结果。

用户: "RAGFlow 和 WeKnora 在表格解析上的区别"
  → Router Agent: 判断需要同时查两个知识库
  → 派发给 Agent A: 查 RAGFlow 知识库(检索 DeepDoc 表格识别)
  → 派发给 Agent B: 查 WeKnora 知识库(检索 IMA 表格解析)
  → 汇总: 合成对比答案

模式二:辩论式(Debate)

多个 Agent 对同一问题独立检索和回答,然后互相”辩论”——A 的答案被 B 质疑,B 的答案被 C 补充,最终收敛到一个更准确的答案。

用户: "RRF 和分数加权哪个融合策略更好?"
  → Agent A: 检索后回答"RRF 更好,因为量纲归一化"
  → Agent B: 检索后回答"分数加权更简单可解释"
  → 辩论: A 质疑 B"简单但不鲁棒",B 补充"在大多数场景下差异不大"
  → 收敛: "RRF 理论更优,分数加权实践更简单,差距在 5% 以内"

模式三:层级式(Hierarchical)

一个”管理者” Agent 负责查询分解和结果合成,多个”执行者” Agent 负责具体的检索任务。

用户: "帮我做一个 RAG 系统的技术选型报告"
  → Manager Agent: 分解为三个子任务
    → Worker 1: 检索"RAG 检索策略对比"
    → Worker 2: 检索"向量数据库选型"
    → Worker 3: 检索"Rerank 策略对比"
  → Manager Agent: 合成三份报告为最终技术选型文档

多 Agent 的工程挑战

挑战 说明 应对策略
通信开销 Agent 间传递大量检索结果 压缩摘要后再传递
一致性 多个 Agent 可能给出矛盾结论 投票 / 交叉验证 / 信任权重
调试困难 多 Agent 链路长,出错难定位 全链路 trace / 结构化日志
成本叠加 每个 Agent 都消耗 LLM token 简单查询走单 Agent,复杂查询才启动多 Agent
死锁 Agent 互相等待对方结果 设置超时 / 降级为单 Agent

各框架的多 Agent 支持情况

框架 多 Agent 支持 协作模式
Dify 支持(Workflow 中嵌套 Agent 节点) 层级式
LangGraph 支持(多图组合) 路由式 / 辩论式 / 层级式
CrewAI 原生支持 角色式(类似辩论式)
WeKnora 不支持(单 Agent 外接) 需在外部 Agent 框架中实现
FastGPT 部分(工作流子图) 层级式

多 Agent 框架对比见 Agent 框架全景


8. Tool 设计模式

好的 RAG Tool 长什么样

Agent 调用 RAG 工具和人类使用工具有相同的逻辑——一把锤子如果手柄太粗、锤头太重、没有磁性,工匠就不会用它。RAG Tool 的设计决定了 Agent 能否有效使用检索能力。

模式一:原子工具

每个工具只做一件事,参数简单,输出明确。

# 原子工具示例
tools = [
    {
        "name": "search_knowledge_base",
        "description": "在指定知识库中检索相关文档片段",
        "parameters": {
            "query": "检索查询文本",
            "kb_id": "知识库 ID",
            "top_k": "返回结果数量(默认 5)"
        },
        "returns": "相关文档片段列表,每个包含文本和元数据"
    }
]

优点:Agent 容易理解工具用途,调用决策简单 缺点:复杂查询需要多次调用

模式二:组合工具

一个工具内部组合多个操作,减少 Agent 的编排负担。

# 组合工具示例
tools = [
    {
        "name": "research_topic",
        "description": "深度研究指定主题:自动分解查询、多知识库检索、结果合成",
        "parameters": {
            "topic": "研究主题",
            "depth": "研究深度(quick/deep/exhaustive)",
            "kb_ids": "知识库 ID 列表"
        },
        "returns": "结构化研究报告,包含来源引用"
    }
]

优点:Agent 一次调用即可完成复杂操作 缺点:工具描述复杂,Agent 可能误用参数

模式三:策略选择工具

工具内部封装多种检索策略,Agent 通过参数选择。

# 策略选择工具示例
tools = [
    {
        "name": "retrieve",
        "description": "从知识库检索相关内容,支持多种检索策略",
        "parameters": {
            "query": "检索查询文本",
            "kb_id": "知识库 ID",
            "strategy": "检索策略:semantic(语义)/ keyword(关键词)/ hybrid(混合)/ graph(图谱推理)",
            "top_k": "返回结果数量"
        },
        "returns": "按策略检索的文档片段列表"
    }
]

优点:Agent 可以根据查询类型选择最优策略 缺点:Agent 需要理解不同策略的适用场景

Tool 描述的最佳实践

原则 说明 反例
描述要具体 “检索 WeKnora 企业知识库” 而非 “搜索文档” “搜索”
参数要有限制 top_k 范围 [1, 20] 而非任意整数 top_k: int
输出要可预测 “返回文本片段列表” 而非 “返回结果” “返回数据”
要说明适用场景 “适合精确关键词匹配” 而非只说功能 “检索”
要说明局限 “不支持多跳推理” 让 Agent 知道何时换策略 隐瞒局限

Tool 设计的反模式

反模式一:上帝工具(God Tool)

一个工具做所有事——检索、摘要、翻译、生成全塞在一个工具里。Agent 无法细粒度控制,调试困难。

反模式二:参数爆炸

一个工具有 20 个参数,Agent 需要理解每个参数的含义才能正确调用。大部分参数应该有合理默认值,只暴露关键参数。

反模式三:隐式副作用

工具描述说”检索文档”,但实际会修改知识库(如自动添加新文档)。Agent 不期望这种副作用,可能导致数据损坏。


9. 安全与权限

为什么 RAG-Agent 集成需要安全控制

日常类比:你请了一个研究助理(Agent)帮你查资料。如果他可以访问你所有的文件柜——包括薪酬档案、商业机密、客户隐私——风险显而易见。你需要给他一个受限的访问范围:只能看公开资料区,不能看机密区。

在 RAG-Agent 集成中,Agent 代表用户执行检索操作。如果没有权限控制,Agent 可能:

四层安全模型

第 1 层:知识库级访问控制
  └─ Agent 只能访问被授权的知识库
  └─ 不同租户/团队的知识库严格隔离

第 2 层:文档级访问控制
  └─ Agent 只能检索有权限的文档
  └─ 敏感文档(如薪酬数据)对 Agent 不可见

第 3 层:操作级访问控制
  └─ Agent 只能执行被允许的操作
  └─ 检索(读)vs 管理(写)权限分离
  └─ 沙箱内 Agent 不应修改知识库

第 4 层:查询级安全防护
  └─ 检测和防御 prompt injection
  └─ 过滤敏感信息(PII)出现在检索结果中
  └─ 限制单次查询的检索范围和频率

各项目的安全能力

维度 WeKnora Dify RAGFlow AnythingLLM FastGPT
多租户隔离 无内建 有(租户级) 有(teamId 隔离)
RBAC 权限 无内建 简单认证 有(4 级角色)
API Key 管理 支持 支持 支持 支持 支持(用量配额)
Prompt Injection 防护 基础
PII 过滤
只读模式 MCP 暴露时可选

WeKnora MCP 安全考量

WeKnora 的 mcp-server/ 在暴露给 Agent 时,需要考虑:

  1. 只读检索模式:默认只暴露 search_knowledge_base 工具,不暴露文档上传/删除/修改工具
  2. 知识库白名单:Agent 只能检索配置中指定的知识库 ID
  3. 结果过滤:检索结果在返回 Agent 前过滤敏感字段(如文档内部 ID、其他用户信息)
  4. 频率限制:单次会话内检索调用次数上限(防止 Agent 陷入无限循环时消耗过多资源)

CubeSandbox 集成安全边界见 Sandbox 研究


10. 实际集成代码示例

10.1 LangChain Retriever 包装 WeKnora

from langchain.schema import BaseRetriever, Document
import requests

class WeKnoraRetriever(BaseRetriever):
    """将 WeKnora 检索 API 包装为 LangChain Retriever"""
    api_url: str
    kb_id: str
    top_k: int = 5

    def _get_relevant_documents(self, query: str):
        resp = requests.post(
            f"{self.api_url}/api/v1/retrieve",
            json={"query": query, "kb_id": self.kb_id, "top_k": self.top_k}
        )
        chunks = resp.json()["chunks"]
        return [Document(page_content=c["text"], metadata=c) for c in chunks]

10.2 RAG-in-Loop 实现(LangGraph)

from langgraph.graph import StateGraph, END
from typing import TypedDict, List

class RAGState(TypedDict):
    query: str
    rewritten_query: str
    documents: List[dict]
    relevance_score: float
    iteration: int
    max_iterations: int

def retrieve(state: RAGState) -> RAGState:
    """调用 WeKnora 检索"""
    query = state.get("rewritten_query", state["query"])
    docs = weknora_retriever.invoke(query)
    state["documents"] = docs
    state["iteration"] = state.get("iteration", 0) + 1
    return state

def evaluate(state: RAGState) -> RAGState:
    """LLM 评估检索结果质量"""
    score = llm.evaluate_relevance(state["query"], state["documents"])
    state["relevance_score"] = score
    return state

def rewrite_query(state: RAGState) -> RAGState:
    """改写查询以提升检索质量"""
    new_query = llm.rewrite_query(state["query"], state["documents"])
    state["rewritten_query"] = new_query
    return state

def should_continue(state: RAGState) -> str:
    """判断是否继续迭代"""
    if state["relevance_score"] > 0.7:
        return "generate"
    if state["iteration"] >= state["max_iterations"]:
        return "generate"
    return "rewrite"

# 构建迭代检索图
graph = StateGraph(RAGState)
graph.add_node("retrieve", retrieve)
graph.add_node("evaluate", evaluate)
graph.add_node("rewrite", rewrite_query)

graph.add_edge("retrieve", "evaluate")
graph.add_conditional_edges("evaluate", should_continue, {
    "rewrite": "rewrite",
    "generate": END
})
graph.add_edge("rewrite", "retrieve")

app = graph.compile()

10.3 MCP 配置(Claude Code / CatDesk)

{
  "mcpServers": {
    "weknora": {
      "command": "node",
      "args": ["path/to/weknora-mcp-server/dist/index.js"],
      "env": {
        "WEKNORA_API_URL": "http://localhost:8080",
        "WEKNORA_API_KEY": "your-key"
      }
    }
  }
}

10.4 Dify Workflow 中嵌入 Agent 的 DSL 片段

{
  "id": "agent_fallback",
  "type": "agent",
  "data": {
    "title": "智能检索补充",
    "model": {"provider": "openai", "name": "gpt-4"},
    "strategy": "react",
    "tools": ["knowledge_search", "web_search"],
    "prompt": "如果知识库检索结果不充分,你可以改写查询重新检索,或搜索互联网补充信息。最多迭代3次。",
    "max_iterations": 3
  }
}

10.5 多 Agent 协作检索伪代码

class MultiAgentRAG:
    """多 Agent 协作检索系统"""

    def __init__(self):
        self.router = Agent(role="router")
        self.specialists = {
            "tech_docs": Agent(role="tech_doc_specialist",
                             retriever=WeKnoraRetriever(kb_id="tech")),
            "product_docs": Agent(role="product_specialist",
                                 retriever=DifyRetriever(kb_id="product")),
            "legal_docs": Agent(role="legal_specialist",
                               retriever=RAGFlowRetriever(kb_id="legal")),
        }
        self.synthesizer = Agent(role="synthesizer")

    def query(self, question: str) -> str:
        # 1. Router 判断需要哪些专业 Agent
        assignments = self.router.decide(question, self.specialists.keys())

        # 2. 并行检索
        results = {}
        for domain in assignments:
            results[domain] = self.specialists[domain].retrieve(question)

        # 3. Synthesizer 合成答案
        answer = self.synthesizer.synthesize(question, results)
        return answer

11. 对犀牛鸟竞赛的启示

高价值贡献方向

  1. WeKnora MCP Server 完善mcp-server/ 是高价值贡献方向,让更多 Agent 框架能即插即用。当前实现可能只覆盖基础检索,可以扩展为完整的 RAG Tool 集合(多知识库并行检索、检索策略选择、结果格式化等)

  2. LangChain / LlamaIndex Retriever 包装 — 写 WeKnoraRetrieverWeKnoraVectorStore 适配器,降低集成门槛,增加项目生态。这是”小投入大回报”的贡献方向

  3. Agentic RAG 评估基准 — 对比”Agent + WeKnora RAG-as-Tool” vs “Agent + Dify RAG-in-Loop” vs “Agent 无 RAG”的效果差异,用量化数据证明集成模式的价值

  4. WeKnora AgentPlugin — 在 EventManager 中引入 AgentPlugin,监听 RerankCompleted 事件,判断结果是否充分,不充分则触发查询改写和重新检索。这是 WeKnora 从”固定管线”向”Agentic 检索”演进的关键一步

  5. 安全层实现 — 为 WeKnora MCP Server 实现只读模式、知识库白名单、结果过滤等安全控制,让企业场景可以放心接入

贡献路径详见 竞赛指南: WeKnora 贡献 Agentic RAG 编排模式详见 Agentic RAG 模式


12. 与 Memory 的关系

Agent 同时需要 RAG(查外部文档)和 Memory(记对话历史)。两者在 Agent 架构中的位置:

flowchart LR
    U[用户] --> A[Agent]
    A -->|"这个问题需要查资料"| RAG[RAG 平台<br>WeKnora]
    A -->|"用户之前说过..."| MEM[Memory<br>DB-Agent-Memory]
    A -->|"我记得上次查到..."| BOTH[重叠区:<br>缓存检索结果]
    RAG --> A
    MEM --> A

重叠区的处理原则

Memory vs RAG 决策树见 B 线 - Memory 与 RAG 边界


13. 集成模式选择速查表

你的场景 推荐模式 RAG 平台 Agent 框架
简单 FAQ 问答,延迟 <2s RAG-as-Tool AnythingLLM Claude Code MCP
企业知识库检索,需要引用 RAG-as-Tool WeKnora / RAGFlow LangChain Retriever
技术文档检索,查询可能需要改写 RAG-in-Loop Dify Agent Dify Workflow
多知识库对比查询 RAG-in-Loop WeKnora + Dify LangGraph
研究型深度检索,成本不敏感 RAG-as-Agent 任意 LangGraph / CrewAI
企业多租户场景 RAG-as-Tool FastGPT FastGPT Workflow
本地隐私优先 RAG-as-Tool AnythingLLM @agent 命令
需要引用溯源的合规场景 RAG-in-Loop RAGFlow RAGFlow Agent

14. 未来趋势

趋势一:RAG 平台 Agent 原生化

当前大多数 RAG 平台的 Agent 能力是”外挂”的——在固定管线之外加一个 Agent 层。未来趋势是 Agent 原生融入 RAG 管线——每个环节(查询理解、检索、融合、Rerank、生成)都可以由 Agent 自主决策,而不是固定流程。

WeKnora 的 EventManager + Plugin 架构天然支持这种演进——只需将现有 Plugin 从”固定响应”升级为”Agent 决策”,就能实现从固定管线到 Agentic 管线的渐进式迁移。

趋势二:MCP 成为 RAG 暴露的事实标准

MCP 协议正在成为 Agent-工具通信的事实标准。未来 RAG 平台如果不提供 MCP Server,将难以被主流 Agent 框架集成。WeKnora 的 mcp-server/ 已经走在这条路上,完善 MCP 工具集是高价值贡献方向。

趋势三:多模态 RAG-Agent 集成

当前 RAG-Agent 集成主要处理文本检索。随着多模态模型(GPT-4o / Claude 3.5 Sonnet)的普及,Agent 需要检索图片、表格、公式等多模态内容。RAGFlow 的 DeepDoc 已经在文档解析层面支持多模态,但 Agent 层面的多模态检索编排(如何同时检索文本和图片、如何合并结果)仍是开放问题。

趋势四:安全与隐私成为一等公民

随着 RAG-Agent 集成进入企业场景,安全控制从”可选”变成”必须”。未来的 RAG 平台需要内置细粒度的访问控制、prompt injection 防护、PII 过滤、审计日志。WeKnora 目前缺少这些能力,这是竞赛贡献的机会区域。


交叉引用

相关页面 关系
Agentic RAG 模式 六种 RAG 编排模式的详细分析
精读: WeKnora WeKnora 三路检索 + EventManager 架构精读
精读: Dify Dify ReAct + Function Calling + Workflow 精读
精读: RAGFlow RAGFlow Chat Agent + Citation 精读
精读: AnythingLLM AnythingLLM @agent 命令精读
精读: FastGPT FastGPT Workflow-based Agent 精读
WeKnora 竞赛贡献指南 具体贡献路径
RAG 知识库全景 五项目横评
RAG 评估方法论 RAGAS 四维评估
技术挑战 RAG 通用挑战
选型决策树 什么场景选什么平台
MCP 集成对比 Claude Code vs Codex 的 MCP 实现
Memory vs RAG 边界 D 线(RAG)与 B 线(Memory)的分工
腾讯记忆生态 WeKnora 在腾讯 DB-Agent-Memory 生态中的位置
Sandbox 研究 CubeSandbox 集成安全边界
Agent 框架全景 多 Agent 框架对比

证据等级

来源 标签
WeKnora mcp-server/ 目录 [源码]
Codex 无 embedding RAG (codex-vs-frameworks) [已有]
LangChain Retriever 接口文档 [文档]
Dify API 文档 [文档]
CubeSandbox #244 [Issue]
MCP 规范(2025-11-25) [文档]
Self-RAG / CRAG 论文 [社区]
RAGFlow Agent Graph 文档 [文档]
未实测 以源码/docs 为准