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工程化)
Dify工作流中的LLM节点总结最先出现在每时AI。
扫描二维码,在手机上阅读