条件判断节点¶
条件判断节点允许用户通过配置条件表达式来实现工作流的分支逻辑。TongAgents 提供了安全的条件判断功能,支持多种比较操作和逻辑运算,让您能够灵活地控制工作流的执行路径。
节点配置¶
基本配置项¶
条件判断节点的配置包含以下核心参数:
| 配置项 | 功能说明 |
|---|---|
| 输入参数 | 定义条件判断时需要的输入变量。每个输入参数包含参数名称和对应的值,值可以是固定常量或引用上游节点的输出结果。 使用方式:在条件表达式中通过 {{#参数名#}} 的方式访问输入参数。 |
| 条件表达式 | 定义需要评估的条件逻辑,支持多种比较操作和逻辑运算。 语法:使用Python表达式语法,支持变量引用、比较操作、逻辑运算等。 |
| 真值分支 | 当条件表达式评估为真时,工作流将转移到的目标节点。 配置方式:指定目标节点的名称。 |
| 假值分支 | 当条件表达式评估为假时,工作流将转移到的目标节点。 配置方式:指定目标节点的名称。 |
支持的表达式类型¶
条件判断节点支持以下类型的表达式:
比较操作¶
| 操作符 | 说明 | 示例 |
|---|---|---|
== |
等于 | {{#a#}} == "123" |
!= |
不等于 | {{#b#}} != 0 |
< |
小于 | {{#age#}} < 18 |
<= |
小于等于 | {{#score#}} <= 100 |
> |
大于 | {{#price#}} > 100 |
>= |
大于等于 | {{#count#}} >= 5 |
is |
身份比较 | {{#status#}} is None |
is not |
身份不相等 | {{#result#}} is not True |
in |
包含于 | {{#city#}} in ["北京", "上海"] |
not in |
不包含于 | {{#type#}} not in ["A", "B"] |
逻辑运算¶
| 操作符 | 说明 | 示例 |
|---|---|---|
and |
逻辑与 | {{#age#}} >= 18 and {{#score#}} >= 60 |
or |
逻辑或 | {{#status#}} == "active" or {{#vip#}} == True |
not |
逻辑非 | not {{#empty#}} |
算术运算¶
| 操作符 | 说明 | 示例 |
|---|---|---|
+ |
加法 | {{#a#}} + {{#b#}} > 100 |
- |
减法 | {{#total#}} - {{#discount#}} >= 0 |
* |
乘法 | {{#price#}} * {{#quantity#}} > 1000 |
/ |
除法 | {{#sum#}} / {{#count#}} > 50 |
// |
整除 | {{#total#}} // {{#batch#}} > 0 |
% |
取模 | {{#number#}} % 2 == 0 |
** |
幂运算 | {{#base#}} ** 2 > 100 |
内置函数¶
条件判断节点支持以下安全的内置函数:
| 函数 | 说明 | 示例 |
|---|---|---|
len() |
获取长度 | len({{#list#}}) > 0 |
str() |
转换为字符串 | str({{#number#}}) == "123" |
int() |
转换为整数 | int({{#string#}}) > 100 |
float() |
转换为浮点数 | float({{#string#}}) > 10.5 |
bool() |
转换为布尔值 | bool({{#value#}}) == True |
type() |
获取类型 | type({{#value#}}) == str |
abs() |
绝对值 | abs({{#number#}}) > 10 |
max() |
最大值 | max({{#list#}}) > 50 |
min() |
最小值 | min({{#list#}}) < 10 |
sum() |
求和 | sum({{#list#}}) > 100 |
round() |
四舍五入 | round({{#float#}}) == 5 |
sorted() |
排序 | len(sorted({{#list#}})) > 0 |
工作流程¶
判断流程¶
- 变量替换:系统将条件表达式中的占位符变量替换为实际值
- 表达式解析:将条件表达式解析为抽象语法树(AST)
- 安全评估:在受限环境中安全地评估表达式
- 分支转移:根据评估结果转移到相应的目标节点
变量引用格式¶
条件表达式中使用以下格式引用变量:
示例:
{{#input.query#}}- 引用输入节点的query参数{{#llm_node.text#}}- 引用LLM节点的text参数{{#information_extractor.city#}}- 引用信息提取节点的city参数
使用示例¶
基础条件判断¶
配置示例:
- 输入参数:
a对应{{#sys.query#}} - 条件表达式:
{{#a#}} == "123" - 真值分支:
output_true - 假值分支:
output_false
执行结果:
- 当输入为 "123" 时,转移到
output_true节点 - 当输入为其他值时,转移到
output_false节点
复杂条件判断¶
配置示例:
- 输入参数:
age对应{{#user_info.age#}}score对应{{#exam_result.score#}}city对应{{#user_info.city#}}- 条件表达式:
{{#age#}} >= 18 and {{#score#}} >= 60 and {{#city#}} in ["北京", "上海", "广州"] - 真值分支:
approve - 假值分支:
reject
执行结果:
- 当用户年龄≥18、分数≥60且在指定城市时,转移到
approve节点 - 否则转移到
reject节点
数值计算判断¶
配置示例:
- 输入参数:
price对应{{#product.price#}}quantity对应{{#order.quantity#}}discount对应{{#coupon.discount#}}- 条件表达式:
({{#price#}} * {{#quantity#}} - {{#discount#}}) > 1000 - 真值分支:
premium_service - 假值分支:
standard_service
执行结果:
- 当订单总金额(价格×数量-折扣)>1000时,转移到 premium_service 节点
- 否则转移到 standard_service 节点
安全机制¶
表达式安全¶
条件判断节点采用严格的安全机制:
- 白名单函数:只允许使用预定义的安全函数
- AST解析:通过抽象语法树解析,避免代码注入
- 操作符限制:只支持安全的操作符
- 变量隔离:变量访问受到严格控制
错误处理¶
当条件表达式出现错误时:
- 语法错误:记录错误日志并抛出异常
- 未定义变量:记录警告并抛出
UserOperationError - 不支持的操作:记录错误并抛出异常
- 函数调用错误:记录错误并抛出异常
最佳实践¶
条件表达式编写建议¶
- 简洁明了:使用简单、清晰的表达式
- 避免复杂嵌套:避免过深的逻辑嵌套
- 合理使用括号:使用括号明确运算优先级
- 变量命名规范:使用有意义的变量名
性能优化¶
- 减少函数调用:避免在条件表达式中使用复杂的函数调用
- 合理使用比较:优先使用简单的比较操作
- 避免重复计算:避免在表达式中重复引用同一变量
调试技巧¶
- 日志查看:通过日志查看条件表达式的评估结果
- 变量检查:确保引用的变量存在且有正确的值
- 表达式测试:在配置前测试条件表达式的正确性
常见问题解答¶
条件表达式评估失败怎么办?¶
- 检查变量名:确保引用的变量名正确且存在
- 检查语法:确保表达式语法正确
- 检查数据类型:确保比较的数据类型匹配
- 查看日志:查看详细的错误日志信息
如何调试条件判断?¶
- 查看评估日志:系统会记录条件表达式的评估结果
- 检查变量值:确认变量的实际值是否符合预期
- 简化表达式:将复杂表达式拆分为简单部分进行测试
支持哪些数据类型?¶
条件判断节点支持以下数据类型:
- 字符串(str)
- 数字(int、float)
- 布尔值(bool)
- 列表(list)
- 字典(dict)
- 空值(None)
如何处理空值?¶
- 空值检查:使用
is None或is not None检查空值 - 默认值处理:在表达式中提供默认值
- 安全访问:使用安全的函数调用避免空值错误
可以嵌套使用条件判断吗?¶
是的,可以通过多个条件判断节点实现复杂的嵌套逻辑。建议将复杂的条件逻辑拆分为多个简单的条件判断节点,以提高可读性和可维护性。