0. 前言

在介绍该问题的解决方法前,先谈一谈最近一段时间使用Dify和RAGFlow的一些感受,希望可以给有需要的人提供一些思路或帮助。需要解决方法的可以直接跳到第4部分。

最近在摸索基于知识库的问答助手,开始的时候没有仔细了解过大名鼎鼎的RAGFlow,而是先上手了Dify,Dify自带的知识库只是个能用的程度,所以又找到了RAGFlow。

1. 使用感受

RAGFlow自带了多种文档的解析和切片方法(针对手册类型的PDF、书籍类PDF,Excel表格等等),大大减少了文档整理的工作量。即便如此,如果想要很好的召回效果,还是需要尽可能的去整理知识文档,调整内容和格式。

在召回不是很好的内容块上,RAGFlow也支持添加关键词,在搜索时可以结合关键词来匹配内容块(但并不支持作为外部知识库时使用,非常可惜),能够显著提高搜索精度。

由于事先体验在Dify上体验了大模型的对话以及工作流的编排,在这些方面RAGFlow就像个新兵蛋子,同样的大模型,在RAGFlow上创建的助手回答问题很僵硬(可能是默认提示词的区别),对于对话相关的功能支持不是很好(在最新的0.18版本才增加了中断模型输出)。

在我看来,Dify拥有的标注功能对于问答助手的开发非常重要,通过这个功能可以管理由用户标注的高质量回答,也可以主动批量导入。

除此之外,Dify的插件商店发展的也越来越好,支持非常多的优秀插件,而RAGFlow在0.18版本支持了MCP功能,在易用性上远不如Dify。

于是乎,我打算将RAGFlow作为Dify的外部知识库来使用,对于问答助手的相关开发则在Dify上进行

2. 将RAGFlow接入Dify

这一部分的操作可以参考博客 RAGFlow安装,dify对接RAGFlow - 博客园一文读懂 RAGFlow 知识库接入 Dify 的全流程 - CSDN ,对于步骤都介绍的非常清楚,也介绍了一些原理。

需要注意的是,如果你和博主一样,需要在同一个服务器上通过Docker搭建Dify和RAGFlow,那么就要在启动时最好用以下命令启动:

docker-compose -p dify up -d
docker-compose -p ragflow up -d 此处 -p name 参数的作用是命名隔离,具体可以看第一个参考博客

接下来就要着重介绍我遇到的坑了。起初,我的Dify端口使用的默认的80端口,顺手我就把RAGFlow的端口设置为了82(为什么不是81,因为81还有一个图床),按照博客中的操作步骤,添加RAGFlow作为外部知识库API,此时提示成功。

3. 配置API成功但召回失败

但是,当我在Dify上创建好外部知识库,并在知识库内进行召回测试时,并无返回结果,查看Dify的log如下:

2025-04-25 08:56:41.116 INFO [Dummy-29] [_client.py:1038] - HTTP Request: POST http://x.x.x.x:82/api/v1/dify/retrieval "HTTP/1.1 200 OK"
2025-04-25 08:58:22.779 INFO [Dummy-30] [_client.py:1038] - HTTP Request: POST http://x.x.x.x:82/api/v1/dify/retrieval "HTTP/1.1 403 Forbidden"
2025-04-25 09:01:37.618 INFO [Thread-34 (_retriever)] [_client.py:1038] - HTTP Request: POST http://x.x.x.x:82/api/v1/dify/retrieval "HTTP/1.1 403 Forbidden"

第一条log就是配置外部知识库API时的请求,第二条是我做召回测试时的请求,返回 403 Forbidden ,我百思不得其解,百度也没有找到答案,最后在GitHub中我找到了答案。

dify 1.0.1 integration with external knowledge base ragflow recall is invalid. #15926 - Github ,在这个issue中我发现了遇到同样问题的小伙伴,他也是配置API成功但召回无响应。

4. 解决方法

每一个问题的下边必然会有一个大佬,大佬扒出代码一顿分析,给出了问题的原因(感兴趣的可以看看,我是没太看懂)。

最后得出一个看似离谱的解决方法:将RAGFlow的端口设置为8080。是的没错,我改了一下,它就好了。。。

RAGFlow的端口在 docker-compose.yml 中进行修改,修改后重新启动Docker Compose即可

以上就是本次问题的全部内容,希望可以帮到大家,感谢阅读!

参考

RAGFlow安装,dify对接RAGFlow - 博客园

一文读懂 RAGFlow 知识库接入 Dify 的全流程 - CSDN

dify 1.0.1 integration with external knowledge base ragflow recall is invalid. #15926 - Github

Dify接入RAGFlow无返回结果的更多相关文章

  1. VS2012 Unit Test(Void, Action, Func) —— 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试

    [提示] 1. 阅读文本前希望您具备如下知识:了解单元测试,了解Dynamic,熟悉泛型(协变与逆变)和Lambda,熟悉.NET Framework提供的 Action与Func委托.2.如果您对单 ...

  2. 慕课网-Java入门第一季-7-2 Java 中无参无返回值方法的使用

    来源:http://www.imooc.com/code/1578 如果方法不包含参数,且没有返回值,我们称为无参无返回值的方法. 方法的使用分两步: 第一步,定义方法 例如:下面代码定义了一个方法名 ...

  3. Android——关于Activity跳转的返回(无返回值和有返回值)——有返回值

    说明: 跳转页面,并将第一页的Edittext输入的数据通过按钮Button传到第二页用Edittext显示,点击第二页的 返回按钮Button返回第一页(改变第二页的Edittext的内容会传至第一 ...

  4. Java 中无参无返回值方法的使用

    如果方法不包含参数,且没有返回值,我们称为无参无返回值的方法. 方法的使用分两步: 第一步,定义方法 例如:下面代码定义了一个方法名为 show ,没有参数,且没有返回值的方法,执行的操作为输出 “ ...

  5. 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试

    VS2012 Unit Test(Void, Action, Func) —— 对无返回值.使用Action或Func作为参数.多重载的方法进行单元测试 [提示] 1. 阅读文本前希望您具备如下知识: ...

  6. 面试题----入参两个Integer,无返回值,然后使这个两个值在调用函数后交换

    我最近看到过一个比较好玩的面试题. 写个方法,入参两个Integer,无返回值,然后使这个两个值在调用函数后交换 很有意思的一个题目,引发我的深思,根据一路的学习过来,下面把实现代码贴出来,方便学习. ...

  7. 无返回值的异步方法能否不用await

    1.无返回值的异步方法能否不用await? 如果你不需要等待加一的操作完成,那就可以直接执行后面的操作.那要看你的需求了,如果你后面的操作必须在加一的操作后执行,那就要await了 2.请问C#中如何 ...

  8. RhinoMock中无参数方法和无返回值方法的使用

    无返回值方法,RhinoMock的例子是这么做的: demo.VoidThreeArgs(, "", 0f); LastCall.On(demo).Callback<int, ...

  9. Java_无参数无返回类型方法及练习

    无参数无返回类型方法语法格式: public static void 方法名称(){ 方法体; } class Method03{ /*练习3:输出1-100中的每个数,要求使用无参无返回类型的方法完 ...

  10. ForkJoin有参无返回值、有参有返回值实例

    介绍: a . Fork/Join为JKD1.7引入,适用于对大量数据进行拆分成多个小任务进行计算的框架,最后把所有小任务的结果汇总合并得到最终的结果 b . 相关类 public abstract ...

随机推荐

  1. GDAL矢量数据集相关接口的资源控制问题

    1. 引言 笔者在<使用GDAL读写矢量文件>这篇文章中总结了通过GDAL读写矢量的具体实现.不过这篇文章中并没有谈到涉及到矢量数据集相关接口的资源控制问题.具体来说,GDAL/OGR诞生 ...

  2. 天翼云云电脑:IAAS基础设施带来的计算革新

    本文分享自天翼云开发者社区<天翼云云电脑:IAAS基础设施带来的计算革新>,作者:不知不觉 在当今这个数字化快速发展的时代,云计算作为一种新兴的信息技术,已经逐渐成为企业和个人日常运营的重 ...

  3. 一文详解 Sa-Token 中的 SaSession 对象

    Sa-Token 是一个轻量级 java 权限认证框架,主要解决登录认证.权限认证.单点登录.OAuth2.微服务网关鉴权 等一系列权限相关问题. Gitee 开源地址:https://gitee.c ...

  4. SQL注入之联合查询注入

    SQL注入之联合查询注入 一.联合查询注入原理 联合查询注入是一种常见的SQL注入攻击手法,其核心原理是利用SQL中的UNION操作符将多个SELECT语句的结果集合并,从而返回一个统一的结果集.在使 ...

  5. 对外提供API,通过appId、appSecret、sign秘钥对接口做鉴权

    一.背景 在接口开发过程中,我们通常不能暴露一个接口给第三方随便调用,要对第三方发来参数进行校验,看是不是具有访问权限. 名词介绍: 1.appId: 应用id,用户自定义命名,如:*-access- ...

  6. Calcite 获取jdbc连接流程

    一.类调用 简介:calcite可以连接各数据源,做查询.可以收口查询权限,查询多引擎需求 二. 获取Connection发送的请求 请求介绍文档:https://calcite.apache.org ...

  7. Linux驱动---LED

    目录 一.pinctrl子系统 二.GPIO子系统 三.GPIO操作步骤 3.1.获取GPIO描述符 3.2.设置方向 3.3.读写值 四.编写LED驱动 4.1.硬件原理图 4.2.修改设备树 4. ...

  8. Net跨平台硬件信息查询库 Hardware.Info:全面获取系统硬件详情

    Hardware.Info 是一个基于 .NET Standard 2.0 的跨平台库,提供了硬件信息查询的功能,支持 Windows.Linux 和 macOS 操作系统.该库通过不同平台下的系统接 ...

  9. SpringCloud自定义loadbalancer实现标签路由

    一.背景 最近前端反应开发环境有时候调接口会很慢,原因是有开发图方便将本地服务注册到开发环境,请求路由到开发本地导致, 为了解决该问题想到可以通过标签路由的方式避免该问题,实现前端联调和开发自测互不干 ...

  10. 解决Webstorm Nodejs console.log("这是中文") 控制台乱码

    设置文件编码 自定义vm选项文件 添加 文件最后一行添加 -Dfile.encoding=UTF-8 3.修改注册表 Windows+R --> regedit --> 计算机\HKEY_ ...