本文使用Dify v1.4.0版本,使用qwen-vl-max-latest
作为多模态大模型,主要介绍了Dify中LLM结构化输出功能检查的执行流程。
一.Chatflow流程例子

SYSTEM:
执行指令{{#sys.query#}}。
USER:
{{#sys.query#}}
{{#sys.files#}}
比如,用户在对话的时候,上传了一张图像,并且配上文字:一句话描述图像

二._check_model_structured_output_support
源码位置:dify\api\core\workflow\nodes\llm\node.py
这个_check_model_structured_output_support
方法用于检查当前语言模型是否支持结构化输出功能。这个方法的结果将影响后续处理逻辑,决定是使用模型的原生JSON能力还是通过特殊提示来引导模型生成符合结构的输出。
def_check_model_structured_output_support(self) -> SupportStructuredOutputStatus:
"""
Check if the current model supports structured output.
Returns:
SupportStructuredOutput: The support status of structured output
"""
# Early return if structured output is disabled
if (
not isinstance(self.node_data, LLMNodeData)
ornot self.node_data.structured_output_enabled
ornot self.node_data.structured_output
):
return SupportStructuredOutputStatus.DISABLED
# Get model schema and check if it exists
model_schema = self._fetch_model_schema(self.node_data.model.provider)
ifnot model_schema:
return SupportStructuredOutputStatus.DISABLED
# Check if model supports structured output feature
return (
SupportStructuredOutputStatus.SUPPORTED
if bool(model_schema.features and ModelFeature.STRUCTURED_OUTPUT in model_schema.features)
else SupportStructuredOutputStatus.UNSUPPORTED
)
1. 基本流程
方法返回一个SupportStructuredOutputStatus
枚举值,表示模型的结构化输出支持状态。
2.提前退出检查
首先检查三个条件,如果任一条件不满足,立即返回DISABLED
状态:
-
self.node_data
必须是LLMNodeData
类型 -
structured_output_enabled
必须为True
-
structured_output
必须有值(不为空)
这表示用户没有启用或配置结构化输出功能。
3. 获取模型信息
调用_fetch_model_schema
方法获取模型的schema信息,传入提供商标识。如果无法获取schema(返回None
),同样返回DISABLED
状态。
4. 检查模型能力
最后检查模型是否原生支持结构化输出功能:
-
验证
model_schema.features
存在且包含ModelFeature.STRUCTURED_OUTPUT
-
如果满足条件,返回
SUPPORTED
状态 -
否则返回
UNSUPPORTED
状态
5. 返回值意义
-
DISABLED
:结构化输出功能被禁用(用户配置) -
SUPPORTED
:模型原生支持结构化输出(如OpenAI的JSON模式) -
UNSUPPORTED
:模型不支持原生结构化输出(需要通过提示工程实现)
三._fetch_model_schema
源码位置:dify\api\core\workflow\nodes\llm\node.py
这个_fetch_model_schema
方法负责获取AI模型的架构信息。该方法主要用于后续处理,如检查模型是否支持结构化输出、获取模型参数规则等功能。
def_fetch_model_schema(self, provider: str) -> AIModelEntity | None:
"""
Fetch model schema
"""
model_name = self.node_data.model.name
model_manager = ModelManager()
model_instance = model_manager.get_model_instance(
tenant_id=self.tenant_id, model_type=ModelType.LLM, provider=provider, model=model_name
)
model_type_instance = model_instance.model_type_instance
model_type_instance = cast(LargeLanguageModel, model_type_instance)
model_credentials = model_instance.credentials
model_schema = model_type_instance.get_model_schema(model_name, model_credentials)
return model_schema
1.方法入口
接收模型提供商(provider
)参数,返回AIModelEntity
对象或None
。
2.获取模型信息
从self.node_data.model.name
获取当前配置的模型名称。
3.初始化模型管理器
创建ModelManager
实例,负责模型实例的获取和管理。
4.获取模型实例
-
调用
get_model_instance
方法获取特定模型实例 -
传入参数包括:租户ID、模型类型(LLM)、提供商名称和模型名称
5.获取模型类型实例
-
从模型实例中获取
model_type_instance
-
使用
cast
函数将其转换为LargeLanguageModel
类型以确保类型安全
6.获取凭据
提取模型实例中的凭据信息,用于API认证。
7.获取模型架构
-
调用
get_model_schema
方法,传入模型名称和凭据 -
获取包含模型功能、参数规则和属性的架构信息
8.返回结果
返回模型架构对象,包含如上下文大小、支持的特性等信息。
参考文献
[1] Dify工作流中的LLM节点:Dify中LLM结构化输出功能检查:https://z0yrmerhgi8.feishu.cn/wiki/WwS8wta6xinanGk3AjUckMZWnVc
[2] LLMNode类:https://github.com/langgenius/dify/blob/1.4.0/api/core/workflow/nodes/llm/node.py
知识星球服务内容:Dify源码剖析及答疑,Dify对话系统源码,NLP电子书籍报告下载,公众号所有付费资料。加微信buxingtianxia21进NLP工程化资料群。
(文:NLP工程化)