在低代码/无代码平台中,自动化工作流是提升效率的核心。Dify 作为一款强大的 LLM 应用开发平台,其工作流中的 “代码执行”节点 是将 AI 的智能与程序化逻辑能力结合的桥梁。它允许你使用 Python 代码来处理数据、调用 API 或执行复杂计算,从而极大地扩展了应用的能力边界。

然而,要让这座桥梁畅通无阻,关键在于掌握如何在不同节点间准确地传递数据。本文将深入详解 Dify 代码执行节点的变量引用技巧,帮助你高效地构建更强大、更可靠的 AI 应用。

一、代码执行节点:工作流中的“瑞士军刀”

代码执行节点允许你在工作流中嵌入自定义的 Python 脚本。它的核心作用包括:

  • 数据清洗与转换:将大模型输出的非结构化文本(如 JSON 字符串)转换为结构化数据。
  • 调用外部 API:获取实时信息(如天气、股价)、与数据库交互或触发其他系统操作。
  • 复杂计算:执行超出大模型能力范围的精密数学运算或逻辑判断。
  • 文件处理:生成或解析文本、CSV 等文件。

而实现所有这些功能的第一步,就是学会如何将上游节点的数据“拿过来”使用。

二、变量的来源:认识上下文 (Context)

在 Dify 工作流中,变量来自于整个工作流的执行上下文。主要分为两类:

  1. 初始输入变量:在 workflow 开始时,由用户输入或外部调用传入的参数。例如,一个“翻译助手”工作流的初始输入变量可能是 original_text
  2. 上游节点输出变量:工作流中,每个节点都会将其执行结果输出到上下文中。例如,“提示词编排”节点可能会输出一个 translated_result 变量。

你的代码执行节点可以引用这些已经存在于上下文中的所有变量。

三、核心技巧:如何引用变量

在代码执行节点中引用变量非常简单,只需使用 ${variable_name} 的语法。Dify 会在执行你的代码前,自动将这些占位符替换为变量的实际值。

1. 引用系统/上游变量

假设你的工作流如下:

  1. 用户输入:节点输出变量 user_query (值为 “今天的新闻”)
  2. 提示词编排:节点输出变量 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 进行进一步处理,
# 比如情感分析、关键词提取等。

关键步骤

  1. 在代码执行节点的配置面板中,找到“输入变量”或“变量映射”区域。
  2. 为你想要引入的每个上游变量定义一个在本节点内部使用的参数名(如 input_var_1)。
  3. 在该参数名的值字段中,填入 ${上游变量名}
  4. 在下方的代码编辑器中,使用你定义的参数名(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

五、常见问题与注意事项

  1. 变量不存在:如果引用了 ${non_existent_var},工作流会在运行到此节点时报错并中断。务必确保变量名拼写正确,且上游节点已成功输出该变量。
  2. 变量类型:注意上游变量传递过来的类型(字符串、数字、列表、字典)。在代码中进行操作时,要使用匹配的方法。例如,对字符串使用 split(),对列表使用 append()
  3. 代码安全:虽然代码执行节点功能强大,但执行不受信任的代码存在风险。请确保你是工作流的创建者或拥有者,了解代码的具体内容。
  4. 返回值限制return 的数据必须是可 JSON 序列化的(如基本类型、列表、字典)。无法返回文件对象或自定义类的实例。

结语

熟练掌握 Dify 代码执行节点的变量引用技巧,就如同为你 AI 应用的工作流装上了强大的引擎。它打破了纯提示词工程的限制,让你能够将大模型的感知与判断能力与确定性的程序逻辑完美融合。

从简单的数据格式转换到复杂的多系统联动,这一切都始于正确地从上下文中 ${get_the_variable}return 出新的价值。现在,就打开你的 Dify 工作流,开始实践这些技巧,构建更智能、更可靠的 AI 应用吧!

标签: none

添加新评论