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. 数字先锋 | SaaS服务“拎包入住”?央企数字化转型体验感拉满!

    数字化转型已成为企业生存和发展的"必修课".作为国民经济的"压舱石""顶梁柱",国资央企正加快"上云用数赋智"步伐,引领 ...

  2. 深度学习中CUDA环境安装教程

    首先说明,本人是小白,一次安装,可能有不对的地方,望包含. 安装CUDA 因为我们是深度学习,很多时候要用到gpu进行训练,所以我们需要一种方式加快训练速度. 通俗地说,CUDA是一种协助" ...

  3. 用python做时间序列预测十:时间序列实践-航司乘客数预测

    本文以航司乘客数预测的例子来组织相关时间序列预测的代码,通过了解本文中的代码,当遇到其它场景的时间序列预测亦可套用. 航司乘客数序列 预测步骤 # 加载时间序列数据 _ts = load_data() ...

  4. [BZOJ3771] Triple 题解

    <关于贫穷的樵夫拥有 40000 把斧头这件事>. 相当于是多项式乘法,但是得带容斥,具体自己看代码吧. #include<bits/stdc++.h> using names ...

  5. CF1837E Play Fixing 题解

    首先来考虑什么情况方案数为 \(0\): 可以确定,在某一层中,两个原本都能晋级的队伍比赛: 可以确定,在某一层中,两个原本都不能晋级的队伍比赛. 发现假如写出每一场比赛及其胜者,可以形成一棵树形结构 ...

  6. ABB机器人伺服电机维修有脉冲输出时不工作怎么处理

    1.ABB机器人伺服电机维修有脉冲输出时不工作怎么处理? 监督操控器的脉冲输出当时值以及脉冲输出灯是否闪烁,承认指令脉冲现已履行并现已正常输出脉冲:查看操控器到驱动器的操控电缆,动力电缆,编码器电缆是 ...

  7. Week09_day05(Hbase的介绍和工作原理)

    HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文"Bigtable:一个结构化数据的分布式存储系统".就像Bigtable利 ...

  8. 在 Mac 上解决 LM Studio 无法下载模型的问题(国内镜像替换教程)

    如果你在使用 LM Studio 时遇到类似 There was an error fetching results from Hugging Face 或 Model details error: ...

  9. netcore后台服务慎用BackgroundService

    在 .NET Core 开发中,BackgroundService 是一个非常方便的后台任务运行方式,但它并不适用于所有场景. BackgroundService 一时爽,并发火葬场. Backgro ...

  10. **Selenium IDE、Selenium RC 和 WebDriver 之间有什么区别?**