排查及解决Dify通过API接口无法上传pptx格式文件问题

问题描述:

    当前使用Dify搭建WorkFlow工作流完成文档上传及解析工作时,发现,通过运行页面可正常上传并解析pptx文件,但是在使用API接口进行上传时,针对pptx格式却提示格式不支持,接口报错如下:

问题说明-2

很奇怪的报错。

排查原因:

    首先我们通过源码定位报错位置,如下

问题说明-3

    可以看出,当前要求严格进行类型校验,同时检测的文件类型与specified_type不一致导致报错,接着进去看一下_standardize_fule_type()内容:

问题说明-4

    看函数描述内容是根据后缀猜测文件类型,进去看一下:

问题说明-5

如果文档后缀是DOCUMENT_EXTENSIONS,就返回文档类型。

那这里的DOCUMENT_EXTENSIONS又是什么?

    我们在api/constants/__init__.py 这里找到了DOCUMENT_EXTENSIONS的定义:

    如果ETL_TYPE是‘Unstructured’,则文件扩展是上面的那些,否则就是下面这些类型。显然,pptx是不在下面的列表中的。

问题说明-6

    那这个ETL_TYPE又是什么呢?这个Unstructured又是什么?

    我们在api/configs/feature/__init__.py找到了ETL_TYPE的定义

问题说明-7

    好家伙,这里竟然藏着一个TODO,意思是说这个ETL_TYPE不仅用来控制RAG的ETL方式,也用来定义了file upload的文件类型,后面需要移到file upload的配置中。

    又查询了一下这个 Unstructured。这个是Dify支持的一种非结构化文档处理的服务,可以离线部署。根据ETL_TYPE的类型不同,知识库rag支持的文件类型是有差异的,主要是体现在非流水线类型知识库支持上传文档格式差异,默认是dify类型,dify类型支持的文件清单如下(不支持pptx):

问题说明-11

梳理一下整个逻辑:

    首先Dify在之前的非流水线知识库做RAG的时候,支持有两种ETL处理方式,一种是调用外部Unstructured服务的形式,一种是dify内置的形式,默认是dify形式(不支持pptx格式)。根据ETL_TYPE的类型不同,DOCUMENT_EXTENSIONS的范围也不同。

    问题出在file upload判断当前支持文档类型的时候,也简单粗暴地沿用了DOCUMENT_EXTENSIONS的定义,因此file upload支持的文件类型也就随之受到了限制。

解决方案:

    找到问题所在,处理起来就比较简单了,我这里选择在file uplod判断时手动对DOCUMENT_EXTENSIONS进行扩展,保证file upload的时候能够给识别到pptx格式即可。

问题说明-10

    重新打包dify-app镜像,上传,验证问题得到解决。

写在最后:

    这里只算是一种临时解决方案,正确的做法应该是给file_upload单独定义一套支持文档后缀。毕竟从业务逻辑上来说,非流水线知识库支持的文档类型,和工作流支持的工作流本来就是两码事。上面提到的TODO,将ETL_TYPE直接移动到upload file的配置中也多少有点问题,最好是能够分成两个配置分别来控制吧。这边目前只能算是个微创的手术,治标不治本。

    另外,当前验证的是1.9.0版本,看了一下最新的代码(1.10.0),这个TODO还在,最新版这个问题可能还是存在的,有条件的小伙伴可以验证一下。

图片

    如果你觉得这篇文章对你有所帮助,不妨点击右下角的点赞、分享、推荐,让更多朋友看到,也欢迎留言互动交流。

    关注公众号,定期更新AI落地实战干货。

    后台回复“手册”,领取《Dify官方手册》PDF版本

    后台回复“工具”,领取“GPU算力资源快速估算工具”

    后台点击“加入群聊”,一起聊聊AI路上踩过的坑。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值