在Dify中实现多模态能力,并非仅靠上传文件就能自动识别。您需要明确创建Workflow(工作流)并启用多模态输入,随后正确配置Image或File字段——变量名必须遵循小写下划线的命名规则。经过Document Extractor或Multimodal Processor节点的解析后,这些多媒体数据才能被送入Qwen-VL等多模态模型进行理解。

核心前提是:您必须显式配置支持多模态的节点和数据结构;否则系统只会将上传的图片或语音当作普通附件,直接忽略其内容。
确认工作流类型与基础设置
打开Dify Studio,从空白开始创建。这里有一个关键选择:务必选择Workflow,而非Chatflow。只有Workflow原生支持多模态输入节点和文件元信息的解析。Chatflow仅处理纯文本消息流,您上传的图片或语音,它只会保留文件名,内容会被丢弃。
创建完工作流后,立即点击画布空白处打开全局设置,在“Input Schema”中勾选【Enable multi-modal input】。这一步不可跳过,否则后续添加的任何文件输入字段都无法触发payload的解析流程。
添加用户输入节点并配置多媒体字段
从左侧节点栏拖入一个User Input节点,然后打开配置面板。根据您的业务需求,可以添加以下几种字段:
方法一:单图输入(推荐用于图像理解类任务)
字段类型选择Image,变量名设为
方法二:语音文件输入(适用于ASR转文字)
字段类型选择File list,变量名设为
方法三:图文混合输入(如图文问答)
同时添加两个字段:一个Image类型(变量名
⚠️这里有一个关键提醒:变量名必须全小写加下划线,不能包含空格或中文,否则下游的LLM节点无法通过{{$input.img_input}}这样的语法正确引用。Dify对变量名大小写敏感,并且不识别驼峰命名。
配置文档提取器或专用处理器节点
多模态文件不能直接喂给LLM,必须先经过解析节点,将它们转换成结构化文本或特征向量。
第一步:拖入一个Document Extractor节点,输入参数选择刚才定义的
第二步:在Document Extractor的配置中,关闭“Extract text only”开关。这个选项默认是开启的,容易被忽视。一旦开启,图片只会被OCR提取文字,语音只会被ASR转写,原始的图像像素和音频波形特征会彻底丢失。这样一来,视觉理解模型如CLIP、Qwen-VL就无法调用了。
第三步:如果您希望保留原始二进制数据供视觉模型使用,可以改用Multimodal Processor节点(需要提前从插件市场安装)。配置时选择对应的模态编码器,例如图片用“vision.clip-vit-base-patch32”,语音用“speech.whisper-large-v3”。
连接LLM节点并构造多模态提示词
拖入一个LLM节点,将上游Document Extractor或Multimodal Processor的输出连接到它的输入端口。
在LLM的系统提示词中,必须明确声明多模态能力。例如:
“你是一个多模态AI助手,能同时理解图像内容和语音转录文本。当前输入包含:
— 图像描述:{{$input.img_input.description}}
— 语音转录:{{$input.audio_input.transcript}}
请结合二者信息回答问题。”
⚠️需要特别注意:不要在提示词里直接使用{{$input.img_input}}作为变量,因为它返回的是Base64字符串或URI,LLM根本无法解析。必须依赖前序节点已经生成的description、transcript等语义字段。
模型选择方面,优先启用原生支持多模态的模型,比如Qwen-VL、LLaVA-1.6、deepseek-vl。像GPT-4-turbo这样的纯文本模型,即使收到了图像URL也无法理解画面内容。
调试与验证输出结构
在LLM节点后面加一个Direct Reply节点,然后运行测试。上传一张带明显文字的海报图,再加一段相关语音。
观察输出日志中的input部分,确认是否呈现类似这样的结构:
{
"img_input": {
"type": "image/jpeg",
"content": "data:image/jpeg;base64,/9jAB...",
"metadata": {"width": 1200, "height": 800}
},
"audio_input": {
"type": "audio/mpeg",
"content": "https://dify-storage/xxx.mp3",
"metadata": {"duration_sec": 42.7}
}
}
如果content字段为空或显示为null,说明Document Extractor没有正常解析。如果metadata中缺少width、height或duration,则文件上传时可能被截断,或者格式不被识别。
遇到这种情况,返回User Input节点,检查字段类型是否与实际上传文件严格匹配。Dify对MIME类型的校验非常严格,如果您上传的是PNG文件,但只设置了JPEG为可接受类型,payload就会被清空。
