Dify 的核心功能详解:代码执行节点的变量引用技巧
在低代码/无代码平台中,自动化工作流是提升效率的核心。Dify 作为一款强大的 LLM 应用开发平台,其工作流中的 “代码执行”节点 是将 AI 的智能与程序化逻辑能力结合的桥梁。它允许你使用 Python 代码来处理数据、调用 API 或执行复杂计算,从而极大地扩展了应用的能力边界。
然而,要让这座桥梁畅通无阻,关键在于掌握如何在不同节点间准确地传递数据。本文将深入详解 Dify 代码执行节点的变量引用技巧,帮助你高效地构建更强大、更可靠的 AI 应用。
一、代码执行节点:工作流中的“瑞士军刀”
代码执行节点允许你在工作流中嵌入自定义的 Python 脚本。它的核心作用包括:
- 数据清洗与转换:将大模型输出的非结构化文本(如 JSON 字符串)转换为结构化数据。
- 调用外部 API:获取实时信息(如天气、股价)、与数据库交互或触发其他系统操作。
- 复杂计算:执行超出大模型能力范围的精密数学运算或逻辑判断。
- 文件处理:生成或解析文本、CSV 等文件。
而实现所有这些功能的第一步,就是学会如何将上游节点的数据“拿过来”使用。
二、变量的来源:认识上下文 (Context)
在 Dify 工作流中,变量来自于整个工作流的执行上下文。主要分为两类:
- 初始输入变量:在 workflow 开始时,由用户输入或外部调用传入的参数。例如,一个“翻译助手”工作流的初始输入变量可能是
original_text
。 - 上游节点输出变量:工作流中,每个节点都会将其执行结果输出到上下文中。例如,“提示词编排”节点可能会输出一个
translated_result
变量。
你的代码执行节点可以引用这些已经存在于上下文中的所有变量。
三、核心技巧:如何引用变量
在代码执行节点中引用变量非常简单,只需使用 ${variable_name}
的语法。Dify 会在执行你的代码前,自动将这些占位符替换为变量的实际值。
1. 引用系统/上游变量
假设你的工作流如下:
- 用户输入:节点输出变量
user_query
(值为 “今天的新闻”) - 提示词编排:节点输出变量
llm_result
(值为一段生成的新闻摘要)
现在,在代码执行节点中,你想获取用户的问题和 LLM 的生成结果:
# 在代码执行节点的“输入变量”映射中,你可以这样设置:
# input_var_1 -> ${user_query}
# input_var_2 -> ${llm_result}
# 然后,在你的代码中,就可以通过你定义的参数名来使用了:
user_question = input_var_1
ai_generated_content = input_var_2
print(f"用户的问题是:{user_question}")
print(f"AI生成的内容是:{ai_generated_content}")
# 接下来你可以对 ai_generated_content 进行进一步处理,
# 比如情感分析、关键词提取等。
关键步骤:
- 在代码执行节点的配置面板中,找到“输入变量”或“变量映射”区域。
- 为你想要引入的每个上游变量定义一个在本节点内部使用的参数名(如
input_var_1
)。 - 在该参数名的值字段中,填入
${上游变量名}
。 - 在下方的代码编辑器中,使用你定义的参数名(
input_var_1
)来操作变量值。
2. 定义输出变量供下游使用
代码执行节点处理完数据后,需要将结果输出,以便后续的节点(如另一个提示词节点或邮件发送节点)使用。
这需要通过 Python 字典的 return
语句来实现。字典的键(key) 将成为新的变量名,供下游节点引用。
# 接上例,我们对 ai_generated_content 进行一个简单的字数统计
def count_words(text):
return len(text.split())
word_count = count_words(ai_generated_content)
# 通过 return 语句输出变量
# 下游节点将能引用两个新变量:processed_text 和 word_count
return {
"processed_text": ai_generated_content.upper(), # 示例:将文本转为大写
"word_count": word_count
}
重要:return
语句是代码执行节点输出变量的唯一方式。如果没有 return,下游节点将无法获取该节点的任何结果。
四、实战技巧与最佳实践
技巧一:处理 JSON 字符串
LLM 常常被要求返回 JSON 格式的数据,但其输出本质上是字符串。代码执行节点可以轻松将其反序列化为 Python 对象。
# 假设上游 LLM 节点输出一个变量 ${api_response},其值是字符串:
# '{"temperature": 25, "city": "Beijing", "conditions": "Sunny"}'
# 在输入变量映射中:json_string -> ${api_response}
import json
# 将字符串解析为 Python 字典
weather_data = json.loads(json_string)
# 现在可以轻松访问其中的字段
city = weather_data['city']
temp = weather_data['temperature']
print(f"{city}的温度是{temp}摄氏度。")
# 输出新的结构化变量
return {
"weather_city": city,
"weather_temp": temp
}
技巧二:优雅的错误处理
在引用变量或执行代码时,总是可能存在潜在错误(如变量不存在、API 调用失败)。使用 try-except 可以增强工作流的鲁棒性。
# 输入变量映射:some_input -> ${might_not_exist_variable}
try:
# 尝试处理变量
value = some_input
processed_value = value * 2
except (NameError, TypeError) as e:
# 如果变量未定义或类型错误,则提供一个降级值
print(f"处理输入时出错:{e}")
processed_value = "默认值"
return {
"safe_output": processed_value
}
技巧三:多步骤处理与中间变量
你可以在代码执行节点内定义多个中间变量来进行复杂的分步计算,最后只返回需要的结果。
# 输入变量:numbers -> ${some_array}
# 步骤 1: 计算平均值
average = sum(numbers) / len(numbers)
# 步骤 2: 计算方差
variance = sum((x - average) ** 2 for x in numbers) / len(numbers)
# 步骤 3: 准备最终输出
result = {
"avg": average,
"var": variance,
"max": max(numbers),
"min": min(numbers)
}
return result
五、常见问题与注意事项
- 变量不存在:如果引用了
${non_existent_var}
,工作流会在运行到此节点时报错并中断。务必确保变量名拼写正确,且上游节点已成功输出该变量。 - 变量类型:注意上游变量传递过来的类型(字符串、数字、列表、字典)。在代码中进行操作时,要使用匹配的方法。例如,对字符串使用
split()
,对列表使用append()
。 - 代码安全:虽然代码执行节点功能强大,但执行不受信任的代码存在风险。请确保你是工作流的创建者或拥有者,了解代码的具体内容。
- 返回值限制:
return
的数据必须是可 JSON 序列化的(如基本类型、列表、字典)。无法返回文件对象或自定义类的实例。
结语
熟练掌握 Dify 代码执行节点的变量引用技巧,就如同为你 AI 应用的工作流装上了强大的引擎。它打破了纯提示词工程的限制,让你能够将大模型的感知与判断能力与确定性的程序逻辑完美融合。
从简单的数据格式转换到复杂的多系统联动,这一切都始于正确地从上下文中 ${get_the_variable}
并 return
出新的价值。现在,就打开你的 Dify 工作流,开始实践这些技巧,构建更智能、更可靠的 AI 应用吧!