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

很奇怪的报错。
排查原因:
首先我们通过源码定位报错位置,如下

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

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

如果文档后缀是DOCUMENT_EXTENSIONS,就返回文档类型。
那这里的DOCUMENT_EXTENSIONS又是什么?
我们在api/constants/__init__.py 这里找到了DOCUMENT_EXTENSIONS的定义:
如果ETL_TYPE是‘Unstructured’,则文件扩展是上面的那些,否则就是下面这些类型。显然,pptx是不在下面的列表中的。

那这个ETL_TYPE又是什么呢?这个Unstructured又是什么?
我们在api/configs/feature/__init__.py找到了ETL_TYPE的定义

好家伙,这里竟然藏着一个TODO,意思是说这个ETL_TYPE不仅用来控制RAG的ETL方式,也用来定义了file upload的文件类型,后面需要移到file upload的配置中。
又查询了一下这个 Unstructured。这个是Dify支持的一种非结构化文档处理的服务,可以离线部署。根据ETL_TYPE的类型不同,知识库rag支持的文件类型是有差异的,主要是体现在非流水线类型知识库支持上传文档格式差异,默认是dify类型,dify类型支持的文件清单如下(不支持pptx):

梳理一下整个逻辑:
首先Dify在之前的非流水线知识库做RAG的时候,支持有两种ETL处理方式,一种是调用外部Unstructured服务的形式,一种是dify内置的形式,默认是dify形式(不支持pptx格式)。根据ETL_TYPE的类型不同,DOCUMENT_EXTENSIONS的范围也不同。
问题出在file upload判断当前支持文档类型的时候,也简单粗暴地沿用了DOCUMENT_EXTENSIONS的定义,因此file upload支持的文件类型也就随之受到了限制。
解决方案:
找到问题所在,处理起来就比较简单了,我这里选择在file uplod判断时手动对DOCUMENT_EXTENSIONS进行扩展,保证file upload的时候能够给识别到pptx格式即可。

重新打包dify-app镜像,上传,验证问题得到解决。
写在最后:
这里只算是一种临时解决方案,正确的做法应该是给file_upload单独定义一套支持文档后缀。毕竟从业务逻辑上来说,非流水线知识库支持的文档类型,和工作流支持的工作流本来就是两码事。上面提到的TODO,将ETL_TYPE直接移动到upload file的配置中也多少有点问题,最好是能够分成两个配置分别来控制吧。这边目前只能算是个微创的手术,治标不治本。
另外,当前验证的是1.9.0版本,看了一下最新的代码(1.10.0),这个TODO还在,最新版这个问题可能还是存在的,有条件的小伙伴可以验证一下。
![]()
如果你觉得这篇文章对你有所帮助,不妨点击右下角的点赞、分享、推荐,让更多朋友看到,也欢迎留言互动交流。
关注公众号,定期更新AI落地实战干货。
后台回复“手册”,领取《Dify官方手册》PDF版本
后台回复“工具”,领取“GPU算力资源快速估算工具”
后台点击“加入群聊”,一起聊聊AI路上踩过的坑。
5004

被折叠的 条评论
为什么被折叠?



