编者按:
在工作流里,一些需要“稳定、按规则执行”的步骤不太适合交给大模型反复生成,比如格式转换、按固定规则提取信息、统一输出格式或做条件分支。Dify 的「代码执行」节点更像一个小型处理器:用 Python 把规则写清楚,便于复用。
本文围绕「代码执行」节点展开,介绍输入变量、代码区与输出变量的基本结构,以及必须遵循的返回格式。同时梳理非技术背景也能上手的 Python 基础,并结合法律文本处理的常见需求,示例说明如何用关键词/正则提取管辖或统一社会信用代码、解析 JSON 字段、汇总多段结果,以及如何借助 AI 辅助写代码。

Python 是一种简洁易读、语法友好的编程语言,被广泛用于数据分析、自动化任务、人工智能等领域。在 Dify 中,「代码执行」可以利用 Python 脚本来处理变量、逻辑判断、格式转换等任务,是搭建工作流不可或缺的一部分。
如下图所示,「代码执行」包括三个主要部分:输入变量,代码语法和输出变量。默认情况下,输入变量都会被冠以 arg1、arg2(以此类推)的名称。在代码语法中,将会以该显示名称代指各个输入变量。输出变量的默认名称是result。
Python运作的返回值一定要是一个字典 { "result": xxx },该结果会传给下一个节点。


「代码执行」节点要求使用者掌握基础的Python知识,对于非计算机背景的人而言,掌握这部分基础知识也是可行的。
Python 会自动识别用户存入变量的数据类型,比如:
JSON 和 Python 中的数据类型有对应之处,这也是为什么JSON的数据特别适合用于代码当中。

(点击图片可放大查看)
每个变量指向一个值。变量名只能包含字母、数字和下划线,但不能以数字开头(如123name的变量名是无效的),不能使用空格,也不能以 Python 的保留字(如if、for、break等)作为变量名。
在 Python 中,保留字(keywords),是具有特殊含义和用途的单词,不能被用作变量名、函数名或标识符。
Python
contract_name = "劳动合同"
year = 2025
在上面的例子中,“contract_name”是变量名,值是“劳动合同”(一个字符串);“year”是变量名,值是“2025”(一个整数)。
字符串就是用英文引号(单引号或双引号)括起来的文本:
Python
text = "甲方:北京A公司\n乙方:上海B公司"
在字符串中可以添加换行符:
Python
text = "甲方:北京A公司\n乙方:上海B公司"
多个字符串可以拼接:
Python
title = "附则"
description = '本合同一式两份。经双方签字或盖章后生效。'
full_text = title + ": " + description
多个字符串的拼接也可以通过 f 字符串(formatted string)实现:
Python
title = "附则" description = '本合同一式两份。经双方签字或盖章后生效。' full_text = f"{title}: {description}"
f 字符串是一种在 Python 的字符串中内嵌变量或表达式的简洁格式化语法。使用 f 字符串时,可以在字符串前加 f 或 F,并用英文的单引号、双引号或三引号包裹字符串内容。在字符串中,花括号 {} 内可以直接嵌入变量或任意表达式,Python 会在运行时将其求值并替换为结果。又比如:
Python
plaintiff = "张三"
defendant = "李四"
full_text = f"{plaintiff}诉{defendant}租赁合同纠纷案起诉状"
可以用 in 来判断某个字符串是否在指定字符串中:
Python
text = "因本合同以及本合同项下订单/附件/补充协议等(如有)引起或有关的任何争议,由合同各方协商解决,也可由有关部门调解。协商或调解不成的,应向甲方所在地有管辖权的人民法院起诉。"
if "仲裁" in text:
print("该合同约定了仲裁管辖条款")
else:
print("该合同未约定仲裁管辖条款")
常见字符串方法对比一览

(点击图片可放大查看)
• 数
Python 支持整数和浮点数的数学运算:
Python
amount = 3000
rate = 0.05
total_number = amount * (1 + rate)
注释用 # 表示,井号后面的内容都会被 Python 解释器忽略。比如前面的例子加上注释后如下:
Python
amount = 3000 # 这里是整数 int
rate = 0.05 # 这里是浮点数 float
total_number = amount * (1 + rate) # 这里进行数学运算
列表是一种有序的元素集合,用方括号表示 []:
Python
parties = ["甲方", "乙方"]
years = [2024, 2025]
可以访问其中的元素,但需注意,索引从 0 而不是从 1 开始:
Python
parties = ["甲方", "乙方"]
print(parties[0]) # 输出 "甲方"
遍历列表(for 循环)
Python
parties = ["甲方", "乙方"]for party in parties: print(party) # 依次输出合同各方:甲方、乙方
你也可以添加、删除元素,常见的是 append 和 remove 语法:
Python
parties = ["甲方", "乙方"]parties.append("丙方") # 将元素“丙方”添加到变量 parties 的末尾parties.remove("乙方") # 删除列表中的“乙方”
Python
if 条件:
执行语句
elif 条件:
执行语句
else:
其他情况
例如前面的例子:
Python
contract_text = "……本合同如有争议,提交仲裁机构处理……"
if "仲裁" in contract_text:
print("本合同含有仲裁条款")
else:
print("本合同不含仲裁条款")
字典是由“键值对”组成的集合,用于存储结构化数据。每个键(key)都对应一个值(value),用大括号 {} 表示:
Python
contract = { "title": "劳动合同", "party_a": "法天使公司", "party_b": "法小天"}
可以用键来访问值,比如上例中,如果需要获取合同标题,可以
Python
print(contract["title"]) # 输出 "劳动合同"
但如果键不存在的时候,就会报错。更安全的方式是用 .get(),.get()方法的第一个参数用于指定键,第二个参数为指定键不存在时返回的值,如未填写,默认为 None:
Python
print(contract.get("sign_date")) # 签订日期不存在时将返回Noneprint(contract.get("sign_date", "No sign date")) # 签订日期不存在时将返回“No sign date”
Python
for key, value in contract.items():
print(f"{key}: {value}")
6.函数
函数是一个可以重复使用的代码块。用 def 定义。
• 函数的基本语法:
Python
def greet(name): # 定义一个名为 greet 的函数,它接收一个参数 name
print("你好," + name) # 函数的任务是打印问候语
greet("小明") # 调用函数,输出 "你好, 小明"
此时 def greet():后面的所有缩进行构成了函数体。
可以在函数内部第一行使用一对三个单引号 ''' 或一对三个双引号 """ 撰写说明文档,这种注释方式被称为文档字符串:
Python
def greet(name):
"""打印问候语"""
print("你好," + name)
Python
def greet(name = "朋友"): # 定义一个名为 greet 的函数,它接收一个参数 name,name 的默认值为“朋友”
print("你好," + name) # 函数的任务是打印问候语
greet("法小天") # 输出:你好,法小天
greet() # 输出:你好,朋友
函数可以通过 return 把计算结果“返回”出去,供后续使用:
Python
def add(a, b): # 定义一个名为 add 的函数
return a + b # 函数返回 a 与 b 之和
result = add(3, 4) # 调用 add 函数,计算并返回结果,并赋值给 result
print(result) # 输出 7
return 不仅能返回结果,还会立刻结束函数,执行return 后,后面的代码不会运行,比如:
Python
def check_contract(contract_year):
if contract_year < 2020:
return "合同已过期" # 满足条件时,返回结果并终止函数
print("检查合同有效性...") # 这行代码不会运行(因为上面 return 已经执行)
return "合同在有效期内"
result = check_contract(2019)
print(result) # 输出:合同已过期(后面的代码没执行)
正则表达式(Regular Expression,简称 regex)是一种用于匹配、搜索和提取字符串中符合特定规则的文本的语法工具。它不像关键词匹配那样死板,也不需要调用大模型,可以在合同、法律文书、模型输出中精准提取结构化信息。
正则符号含义与示例

(点击图片可放大查看)
正则表达式在 Python 中通过 re 模块使用,主要方法有:

(点击图片可放大查看)
以下是一个抽取合同日期的例子:
Python
text = "本合同于2025年7月15日签署。"
date_match = re.search(r"\d{4}年\d{1,2}月\d{1,2}日", text) # 需要注意,由于 re.search() 语法只会返回第一个匹配项,所以如果文本中有多个日期,只有第一个匹配项会被提取到。
print (date_match.group()) # 输出为2025年7月15日

「代码执行」中的代码语法,其默认格式如下:
Python
def main(arg1: str, arg2: str) -> dict: return { "result": arg1 + arg2, }

Python
def main(arg1: str) -> dict:
jurisdiction_keywords = ["管辖", "仲裁", "诉讼", "起诉"]
if any(keyword in arg1 for keyword in jurisdiction_keywords):
result = "该合同约定了管辖条款。"
else:
result = "该合同未约定管辖。"
return {"result": result}
在上述代码示例中:
jurisdiction_keywords 是一个关键词列表,用于存储待匹配的字词;
any(keyword in arg1 for keyword in jurisdiction_keywords) 表示只要关键词中任意一个出现在合同文本中,条件就成立;
if ... else 语句用来做二元判断,并将结果赋值给 result 变量;
最终返回一个字典: { "result": ... },符合「代码执行」的规范。
如果使用正则表达式的话:
Python
import re
def main(arg1: str) -> dict:
if re.search(r"管辖|诉讼|仲裁|起诉", arg1):
result = "该合同约定了管辖条款"
else:
result = "该合同未约定管辖"
return {"result": result}
Python
def main(arg1: str, arg2: str, arg3: str,arg4: str) -> dict:
analysis_text = f"""### 增值税分析:\n{arg4}\n### 印花税分析:\n{arg1}\n### 契税分析:\n{arg2}\n### 土地增值税分析:\n{arg3}"""
return {
"result": {
"text":analysis_text
}
}
Python
analysis_text = f"""### 增值税分析:
Python
import re
Python
{
Python
import json

即便我们不具备从零开始撰写一段代码的能力,也可以借助 AI 工具辅助撰写符合语法规范的代码。
1.熟悉 AI 平台特有的代码语法要求
为了确保代码在 AI 应用开发平台中顺利运行,必须先了解并遵循所使用的平台的特定语法规范。由于 AI 可能并不熟悉这些平台的规则,因此在撰写代码提示词时,明确提供这些格式要求至关重要。
以 Dify 平台为例:
输入参数默认命名为 arg1、arg2 (可以修改)等,请确保代码中的输入变量的名称与此一致。
输出变量默认命名为 result(可以修改,可以是一个或多个),请确保代码中的输出变量的名称与此一致。
主函数必须定义为 main,且其参数必须与输入参数相匹配。
函数返回值必须是一个字典(dict)类型。
若未满足上述任一要求,节点在运行时都可能报错。
2.掌握基础编程知识,高效定位并修复问题
掌握基本的编程语法有助于在调试阶段快速识别和解决问题。
例如:
参数匹配:若函数只接收一个参数,但在定义时却包含了如 arg2: str 这样的多余参数,将导致运行时因参数不匹配而报错,应及时移除不必要的参数。
返回值格式:函数的 return 语句必须返回一个字典结构。直接使用 return output 将导致运行失败,而正确的格式应为 return {"result": output}。
数据类型:输入和输出变量的数据类型必须与代码中声明的类型保持一致,否则也会引发错误。

假设用户上传了一个服务合同,合同包括如下内容:
甲方应向乙方支付服务费人民币3000元,费用应在签署后五日内结清。
若甲方逾期付款,应支付违约金人民币5000元。
请提取服务费和违约金,需求是在提到“服务费人民币”、“服务费为人民币”、“违约金人民币”、“违约金为人民币”的字样的时候,能提取后面的数字。
篇幅所限,本文不继续展开代码部分。完整示例与配套讲解已收录在
总觉得大模型不够聪明?这篇教法律人怎么给AI带小抄(知识库与RAG)
如果你希望在本文的基础上,进一步系统了解“大模型 + 工作流 + 知识库”如何结合起来服务法律业务,可以参考书籍:。
如果你想从实操出发,从0到1学会如何搭建一个能帮到自己的法律智能体,欢迎报名1月16-17日北京、1月30-31日深圳开课的「法律智能体设计师(LAD)实训营」,可添加课程负责人咨询报名⬇️
