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. PHP简介与开发环境搭建

    PHP简介与开发环境搭建 一.PHP简介 PHP,全称PHP: Hypertext Preprocessor(超文本预处理器),是一种广泛使用的开源服务器端脚本语言,尤其适合Web开发.PHP由Ras ...

  2. [BZOJ3600] 没有人的算术 题解

    妙不可言!妙绝人寰! 单点修,区间查,包是线段树的.考虑如何比较两节点大小. 考虑二叉搜索树,我们只要再给每个节点附一个权值,就可以比较了! 注意力相当惊人的注意到,假如给每个点一个区间 \([l_x ...

  3. [ABC227E] Swap 题解

    考试一道题题解. 30pts:枚举所有串,\(check\) 是否可行. 60pts:做 \(bfs\),暴力推演变化过程,用 \(map\) 去重,时间复杂度 \(O(nC_{n}^{n/3}C_{ ...

  4. Android开发之定时任务(AlarmManager、WorkManager)

    Android 程序的定时任务主要有AlarmManager.WorkManager两种. 一.AlarmManager AlarmManager,又称闹钟,可以设置一次性任务,周期重复任务,定时重复 ...

  5. 植物大战僵尸杂交版,最新安装包(PC+手机+苹果)+ 修改器+高清工具

    植物大战僵尸杂交版:全新游戏体验与创意碰撞 游戏简介 <植物大战僵尸杂交版>是由B站知名UP主潜艇伟伟迷基于经典游戏<植物大战僵尸>进行的一次大胆且富有创意的二次创作.这款游戏 ...

  6. Hadoop - [04] 分布式部署

    Zookeeper的分布式部署 >> Hadoop的分布式部署 一.集群规划 主机名 node01 node02 node03 JDK ○ ○ ○ Zookeeper ○ ○ ○ Name ...

  7. Vulnhub-DC-9靶机-SQL注入拿到账户+利用端口敲门连接ssh+信息泄露利用root脚本追加提权

    一.环境搭建 选择扫描虚拟机 选择靶机路径 如果出现以下信息 如下修改,修改和虚拟机一样的版本 二.信息收集 扫ip nmap -sn 192.168.108.0/24 得到靶机ip:192.168. ...

  8. springboot接入方式对接股票数据源API接口

    为了创建一个Java项目来对接StockTV的API接口,我们可以使用HttpURLConnection或第三方库如OkHttp来发送HTTP请求,并使用Java-WebSocket库来处理WebSo ...

  9. 【刚度矩阵推导】2d frame 单元

    2d frame 单元是x-y平面上的单元,每个节点上有2个平移自由度的和一个转动自由度.局部坐标系下,单元位移向量为: \( u=[ u_1 ,u_2 ,u_3, u_4, u_5, u_6]^{T ...

  10. PPT-嵌入字体提示不可嵌入怎么办

    直接将不可嵌入的字体替换为可以嵌入的字体 开始->替换->替换字体