Dify工作流中的LLM节点总结

本文使用Dify v1.4.0版本,主要对LLMNode类的方法,以及方法执行流程进行了总结。

一.LLMNode类的方法总结

函数名称
功能
输入参数和类型
输出参数和类型
__init__
初始化LLM节点
id: str, config: Mapping[str, Any], graph_init_params: GraphInitParams, graph: Graph, graph_runtime_state: GraphRuntimeState, previous_node_id: Optional[str], thread_pool_id: Optional[str], llm_file_saver: LLMFileSaver | None
None
_run
运行LLM节点的主要逻辑
Generator[NodeEvent | InNodeEvent, None, None]
_invoke_llm
调用LLM模型
node_data_model: ModelConfig, model_instance: ModelInstance, prompt_messages: Sequence[PromptMessage], stop: Optional[Sequence[str]]
Generator[NodeEvent, None, None]
_handle_invoke_result
处理LLM调用结果
invoke_result: LLMResult | Generator[LLMResultChunk, None, None]
Generator[NodeEvent, None, None]
_image_file_to_markdown
将图像文件转换为Markdown格式
file: File
str
_transform_chat_messages
转换聊天消息格式
messages: Sequence[LLMNodeChatModelMessage] | LLMNodeCompletionModelPromptTemplate
Sequence[LLMNodeChatModelMessage] | LLMNodeCompletionModelPromptTemplate
_fetch_jinja_inputs
获取Jinja模板输入
node_data: LLMNodeData
dict[str, str]
_fetch_inputs
获取节点输入变量
node_data: LLMNodeData
dict[str, Any]
_fetch_files
获取文件输入
selector: Sequence[str]
Sequence[File]
_fetch_context
获取上下文内容
node_data: LLMNodeData
Generator
_convert_to_original_retriever_resource
转换上下文字典为原始检索资源
context_dict: dict
Optional[dict]
_fetch_model_config
获取模型配置
node_data_model: ModelConfig
tuple[ModelInstance, ModelConfigWithCredentialsEntity]
_fetch_memory
获取内存实例
node_data_memory: Optional[MemoryConfig], model_instance: ModelInstance
Optional[TokenBufferMemory]
_fetch_prompt_messages
获取提示消息
多个参数(sys_query, sys_files, context等)
tuple[Sequence[PromptMessage], Optional[Sequence[str]]]
_parse_structured_output
解析结构化输出
result_text: str
dict[str, Any]
deduct_llm_quota
扣除LLM配额(类方法)
tenant_id: str, model_instance: ModelInstance, usage: LLMUsage
None
_extract_variable_selector_to_variable_mapping
提取变量选择器到变量映射(类方法)
graph_config: Mapping[str, Any], node_id: str, node_data: LLMNodeData
Mapping[str, Sequence[str]]
get_default_config
获取默认配置(类方法)
filters: Optional[dict]
dict
_handle_list_messages
处理消息列表
messages, context, jinja2_variables, variable_pool等
Sequence[PromptMessage]
_handle_blocking_result
处理阻塞式调用结果
invoke_result: LLMResult
ModelInvokeCompletedEvent
_save_multimodal_image_output
保存多模态图像输出
content: ImagePromptMessageContent
File
_handle_native_json_schema
处理原生JSON Schema
model_parameters: dict, rules: list[ParameterRule]
dict
_handle_prompt_based_schema
处理基于提示的Schema
prompt_messages: Sequence[PromptMessage]
list[PromptMessage]
_set_response_format
设置响应格式
model_parameters: dict, rules: list
None
_prepare_schema_for_model
为模型准备Schema
schema: dict
dict
_fetch_model_schema
获取模型Schema
provider: str
AIModelEntity | None
_fetch_structured_output_schema
获取结构化输出Schema
dict[str, Any]
_check_model_structured_output_support
检查模型结构化输出支持状态
SupportStructuredOutputStatus
_save_multimodal_output_and_convert_result_to_markdown
保存多模态输出并转换为Markdown
contents: str | list[PromptMessageContentUnionTypes] | None
Generator[str, None, None]

二.LLMNode类的方法的执行流程

方法名称
执行流程
__init__
初始化LLM节点,设置文件输出列表和文件保存器
_run
主执行流程:转换提示模板 → 获取变量输入 → 获取文件和上下文 → 配置模型 → 创建提示消息 → 调用LLM → 处理结果 → 返回运行完成事件
_invoke_llm
调用LLM模型:关闭数据库会话 → 使用模型实例调用LLM → 处理调用结果
_handle_invoke_result
处理LLM结果:区分阻塞模式和流式模式 → 处理结果块 → 收集完整文本和元数据 → 返回事件
_image_file_to_markdown
将图像文件链接转换为Markdown格式
_transform_chat_messages
转换聊天消息格式:处理Jinja2模板 → 应用模板文本 → 返回转换后的消息
_fetch_jinja_inputs
获取Jinja模板变量:从变量池获取值 → 处理不同类型变量(数组、对象等) → 返回变量字典
_fetch_inputs
获取提示模板变量:提取变量选择器 → 从变量池获取值 → 处理内存和查询变量 → 返回输入字典
_fetch_files
获取文件输入:根据选择器从变量池获取 → 处理单个文件或文件数组 → 返回文件序列
_fetch_context
获取上下文数据:检查是否启用 → 获取变量值 → 处理字符串或数组类型 → 生成检索资源事件
_convert_to_original_retriever_resource
转换上下文字典为检索资源:检查元数据结构 → 提取字段 → 返回资源字典
_fetch_model_config
获取模型配置:获取模型实例 → 验证模型状态 → 处理参数 → 返回模型实例和配置
_fetch_memory
获取对话内存:获取会话ID → 获取会话实例 → 创建令牌缓冲内存 → 返回内存对象
_fetch_prompt_messages
构建提示消息:处理不同模型类型 → 获取内存消息 → 添加系统查询 → 处理文件和上下文 → 过滤不支持内容 → 返回最终消息
_parse_structured_output
解析结构化输出:尝试JSON解析 → 处理解析错误 → 尝试修复无效JSON → 返回结构化数据
_handle_blocking_result
处理阻塞调用结果:保存多模态输出 → 转换为Markdown → 返回完成事件
_save_multimodal_image_output
保存多模态图像:处理URL或Base64数据 → 保存到存储 → 返回文件对象
_handle_native_json_schema
处理原生JSON Schema:获取Schema → 准备模型特定格式 → 设置响应格式 → 返回更新参数
_handle_prompt_based_schema
处理基于提示的Schema:获取Schema字符串 → 合并到系统提示 → 重组提示消息序列
_set_response_format
设置响应格式:检查模型规则 → 选择合适的JSON格式类型
_prepare_schema_for_model
为模型准备Schema:复制并处理Schema → 根据模型类型应用特定转换 → 返回处理后的Schema
_fetch_model_schema
获取模型Schema:获取模型实例 → 获取模型类型实例 → 返回模型Schema
_fetch_structured_output_schema
获取结构化输出Schema:验证Schema存在性 → 解析JSON → 验证格式 → 返回Schema字典
_check_model_structured_output_support
检查模型结构化输出支持:检查节点配置 → 获取模型Schema → 检查特性支持 → 返回支持状态
_save_multimodal_output_and_convert_result_to_markdown
保存多模态输出并转换:处理文本或内容列表 → 保存非文本内容 → 生成Markdown表示 → 逐步生成结果
_handle_list_messages
处理消息列表:处理Jinja2模板 → 处理基本模板 → 提取文件内容 → 生成提示消息
deduct_llm_quota
扣除配额:获取配额单位 → 计算使用量 → 更新数据库 → 提交事务
_extract_variable_selector_to_variable_mapping
提取变量映射:解析提示模板 → 提取变量选择器 → 添加系统变量 → 返回变量映射
get_default_config
获取默认配置:返回包含默认聊天模型和完成模型配置的字典

参考文献

[1] Dify工作流中的LLM节点总结:https://z0yrmerhgi8.feishu.cn/wiki/BZiowAjCXi4ahPkwmtocqzn8nqO

[2] LLMNode类:https://github.com/langgenius/dify/blob/1.4.0/api/core/workflow/nodes/llm/node.py


知识星球服务内容:Dify源码剖析及答疑,Dify对话系统源码,NLP电子书籍报告下载,公众号所有付费资料。加微信buxingtianxia21进NLP工程化资料群

(文:NLP工程化)

发表评论