你手上已经有一份 RAGFlow 知识库,也想让智能体在对话里直接查它,但卡在「MCP 工具怎么写、检索结果怎么塞回模型、调不通怎么查」这几步。这篇不重复讲协议和原理,只给一条可执行的接入路径:先确认 RAGFlow 侧的调用入口能用,再把它包成一个描述清楚的工具,最后补上超时、降级、日志和评测,让这条链路在真实流量下不飘。
你手上有一份 RAGFlow 知识库,也想让智能体在对话里直接查它,但真正动手时容易卡在三件事上:工具怎么描述模型才肯调、检索回来的长文怎么塞回上下文、调不通的时候从哪儿查起。这篇不讲协议原理,只给一条能落地的接入路径。
整体顺序是反着来的:先把 RAGFlow 侧的调用入口跑通,再把检索包成一个模型看得懂的工具,最后补超时、降级、日志和一组小评测。少任何一环,都会在真实流量下露馅。
先让 RAGFlow 那边能被稳定调用
别急着写工具层。先在 RAGFlow 界面里用你熟悉的几条问题跑一遍,确认召回的内容确实是你想要的那几段。检索质量本身就不行的库,包成工具只会把问题藏得更深。
- 界面里先验收知识库拿几条业务上真实会问的问题去问,看命中的文档和片段对不对。命中率明显不对就先调切分和召回参数,别往下走。
- 拿到三样东西知识库标识、调用凭证、请求地址。具体字段名和调用路径到 /stacks/agent-apis 对照当时的官方口径,不要凭记忆写,字段名差一个字母就是 401 或者空结果。
- 用最小请求打通一次写一段十几行的脚本或者一条 curl,只要能把一条查询打过去、拿到返回就行。把返回的 JSON 原样存成一个文件,后面写字段映射全靠它。
- 给返回结果瘦身检索原文通常带大量元数据、整段长文本、重复片段。工具返回给模型前先截断单条长度、去掉重复、限制总条数,否则一次调用就把上下文吃干净了。
把检索包成一个模型能看懂的工具
工具描述就是提示词。模型是靠描述判断「这轮要不要调、调哪个」的,写「查询知识库」等于没写。要写清它管哪类资料、什么情况下该用、参数是什么意思。
| 工具要素 | 推荐做法 | 常见坑 |
|---|---|---|
| 工具名 | 短、动词开头、体现资料范围 | 名字太泛,多个工具抢同一个场景 |
| 描述 | 写清查什么资料、什么时候用、返回什么 | 只写一句「查询知识库」,模型不调 |
| 参数 | 一个必填查询语句加少量可选项 | 参数堆到五六个,模型填错率高 |
| 返回值 | 纯文本或结构化片段,带出处标识 | 返回原始 JSON,模型读不动 |
| 空结果 | 明确返回一句「未命中」 | 返回空字符串,模型开始硬编 |
- 参数设计要窄:一个必填的查询语句,加可选的知识库标识或条数上限就够了,能省就省
- 返回里带上出处:文档名加片段编号,模型可以在回答里标来源,你事后也能核对
- 空结果要显式:检索没命中就返回「未命中相关资料」,不要给空字符串,否则模型容易顺着上下文编
- 工具描述里点明不适用场景:比如跨库汇总、实时数据查询这类它做不到的事,写清楚反而减少误调
超时、降级和日志这三件事必须提前埋
本地调通不代表线上能用。检索是外部依赖,慢和挂都是常态,所以这三件事要在写工具的时候就放进代码,而不是等出事故再补。
- 超时按两档设:单次检索给一个不算长的上限,整轮对话再给一个总预算,防止工具反复重试把会话拖死
- 降级路径先定一条:检索失败是回退到关键词搜索,还是让模型直答并声明未查到资料,二选一写死在代码里
- 日志至少四列:查询语句、命中条数、耗时、是否降级。有这四列,慢和错才分得开
- 给同轮工具调用设步数上限:同一个检索工具被反复调用,通常是描述含糊或者库没命中,要能中断
日志字段怎么设计、监控看哪些维度,可以参考 /tools/quality-monitor 里的监控思路,按你自己的链路裁剪,不用照搬。
排查顺序
# 出问题时按这个顺序看,别一上来就改工具描述
# 1. 用同样的查询直接打 RAGFlow 接口,看有没有返回
# 2. 有返回但模型没调工具 -> 看工具描述和参数名
# 3. 调了但答案没变好 -> 看返回给模型的内容是不是被截没了
# 4. 偶发失败 -> 看日志里的耗时列和降级列上线前跑一遍小评测,别靠感觉
不需要一开始就搭复杂评测流水线。准备一组固定问题,覆盖三种情况:能命中的、只能部分命中的、完全查不到的。改一次工具描述就重跑一遍,对比两次结果。
- 该调有没有调
- 该查资料的问题模型有没有触发检索工具,没触发就是描述不够明确
- 调了有没有更好
- 跟不让它调工具时的回答比,事实性明显提升还是只是变长了
- 描述版本管理
- 把工具描述当提示词管理,改一版记一版,出问题能回退到上一个能用的版本
也要想清楚不适用的场景。如果知识库更新极频繁、或者用户的问题本身不需要查资料,硬套检索工具只会增加延迟和成本,这种情况让模型直答更合适;接口价格和调用成本的变化,可以去 /price-watch 看当时的数字再决定要不要压调用次数。
工具描述写不清,模型不是不调,而是乱调;日志不记全,你不是修不好,是不知道从哪修。下一步接入方案定了之后,选哪家中转、怎么确认它稳不稳会直接影响这条链路的可用性,可以到 /sites 对照各家当前状态和检测结果再决定。→
常见问题
RAGFlow 知识库一定要包成 MCP 工具吗?直接调它的检索接口不行吗?
两者都能用。MCP 的价值是让智能体自己决定什么时候去查,适合对话式、问题类型不固定的场景;如果你的流程是固定的「先查再答」,直接在代码里调检索接口更简单、延迟也更可控。判断标准就是:调用时机要不要交给模型决定。
工具接上了但模型从来不调用,一般是什么原因?
九成出在工具描述上。描述里没写清「什么情况下该用」,模型就倾向于自己答。先补上使用场景和触发条件,再看参数是不是太多、返回是不是太长。还有一种情况是知识库检索质量本身不行,模型试过一次没用就不试了。
检索工具经常超时怎么办?
先量基线再改配置:用 /tools/speed-test 量一下这条链路本身的延迟,区分是 RAGFlow 慢还是网络慢。如果是检索重、返回大,就先减返回条数和截断长度;如果是偶发超时,就设一个较短的单次上限加一次重试,再不行直接走降级分支,不要让用户干等。