Dify工作流中的LLM节点:Dify中LLM结构化输出功能检查

本文使用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工程化)

发表评论