鸿蒙智能体开发实战:43.工作流节点深度剖析与实战
前言
工作流(Workflow) 是鸿蒙智能体平台最强大的能力之一,它允许开发者通过可视化编排的方式,将大模型、代码逻辑、外部API、知识库等多工作流节点组合成自动化的处理链路。理解每种节点的特性和适用场景,是构建高质量智能体的关键。
本文是 「鸿蒙智能体开发实战」 系列的第四十三篇,系统剖析鸿蒙智能体工作流中所有节点类型,涵盖配置方法、使用场景和实战技巧,帮助开发者从入门到精通工作流编排。
适用读者:已完成智能体基础开发,希望深入掌握工作流进阶能力的开发者。建议先阅读本系列第12篇《工作流开发基础》和第13篇《智能体开发进阶》。
一、工作流节点体系总览
1.1 节点分类与架构
鸿蒙智能体工作流的节点按功能可分为以下六大类:
| 分类 | 节点类型 | 核心作用 |
|---|---|---|
| 入口/出口 | 开始节点、结束节点 | 定义工作流入参和返回结果 |
| 逻辑控制 | 选择器节点、意图分类节点、循环节点、批处理节点 | 控制流程分支和重复执行 |
| AI处理 | 大模型节点、代码节点、文本处理节点 | 实现文本生成、代码执行、字符串处理 |
| 能力扩展 | 插件节点、知识库节点、子工作流节点 | 对接外部API和私有数据 |
| 交互收集 | 提问器节点、变量节点 | 收集用户输入、管理状态 |
| 高级特性 | 长期记忆节点、配额管理节点、输出节点 | 个性化记忆、资源管控、中间输出 |

上图展示了工作流中所有节点类型的分类关系,涵盖入口/出口、逻辑控制、AI处理、能力扩展、交互收集和高级特性六大类别。
1.2 工作流生命周期
一个典型的工作流从创建到上线包含以下阶段:
- 创建与编排:在小艺开放平台工作空间中选择「工作流」,通过拖拽方式添加节点并连线
- 节点配置:逐一配置每个节点的输入、输出和参数
- 试运行调试:在平台内输入模拟参数进行测试
- 上架发布:通过审核后发布到智能体中使用
- 版本管理:支持版本迭代和回滚
提示:工作流一旦被智能体引用,更新后需重新发布并在智能体中「升级」到新版本才能生效。
二、开始节点 - 工作流入口
2.1 输入参数体系
开始节点是每个工作流的必需入口节点,用于定义启动工作流所需的输入信息。它包含三个默认参数和一组自定义参数:
- USER_INPUT:接收用户在对话中发送的文本内容
- FILES_INPUT:接收用户上传的图片或文件(Array<string>类型)
- EVENT_INPUT:接收触发智能体的事件消息
- 自定义参数:支持String、Boolean、Integer、Time、Object类型
# 开始节点输入参数的Python类型示例
class StartNodeInput:
"""开始节点输入参数定义"""
USER_INPUT: str # 用户对话文本
FILES_INPUT: list[str] # 上传文件URL列表
EVENT_INPUT: dict | None # 事件消息体
# 自定义参数示例
user_id: str
query_type: str
max_results: int
2.2 非文本请求处理
当工作流需要处理用户上传的文件时,FILES_INPUT接收的是一个数组,可以通过文本处理节点从中提取所需的文件URL:
# 从FILES_INPUT中提取第一个图片链接
# 在代码节点中实现
def extract_first_file(files_input):
"""提取用户上传的第一个文件URL"""
if not files_input:
return None
return files_input[0] # 返回第一个文件URL
开始节点的自定义参数需要注意:包含自定义参数的工作流不支持在工作流模式的智能体中使用,仅支持试运行调试。
三、大模型节点 - 智能核心
3.1 模型选择与超参调优
大模型节点是工作流中调用大语言模型(LLM) 的核心节点,支持灵活选择模型和调整超参数:
| 超参 | 作用 | 推荐范围 |
|---|---|---|
| Top-K | 限制候选词为概率最高的K个 | 1-256,步长1 |
| Top-P | 累积概率达到P的候选词集合 | 0-1,步长0.01 |
| Temperature | 控制输出随机性,越高越创新 | 0-1,步长0.01 |
{
"model_config": {
"model_name": "Pangu-5X-Plus",
"parameters": {
"temperature": 0.7,
"top_p": 0.9,
"top_k": 50
},
"system_prompt": "你是一个专业的技术顾问,请用简洁的语言回答问题。"
}
}
最佳实践:对于需要确定性结果的场景(如数据提取),建议将Temperature设为0.1-0.3;对于创意生成场景,建议设为0.7-0.9。
3.2 技能配置
大模型节点支持配置插件和工作流技能,使其具备调用外部工具的能力,变得更像一个独立运行的智能体:
# 大模型节点技能配置YAML示例
skills:
- type: plugin
plugin_id: "weather-query"
tool_id: "get-weather-by-city"
- type: workflow
workflow_id: "travel-planning"
version: "1.2.0"
配置技能后,大模型节点可以自动进行意图识别并判断调用时机,大幅度提高节点的文本处理能力和生成效果。
3.3 提示词工程
大模型节点的提示词分为系统提示词和用户提示词两部分:
# 系统提示词示例
你是一个友好且专业的健康咨询助手,专注于为用户提供基于科学和医学知识的健康建议。
在回答用户问题时,请遵循以下原则:
1. 回答应既专业又易于理解
2. 保持语言的温和和鼓励性
3. 基于最新的健康指南
4. 避免提供具体的医疗诊断
# 用户提示词示例
${user_query}
请结合以下健康知识库内容进行回答:
${knowledge_base_result}
提示词中支持引用输入参数的变量,语法如下:
${variable_name}:直接引用变量${variable_name.sub_field}:引用JSON子变量${variable_name[0]}:引用数组中的元素
3.4 输出格式
大模型节点支持三种输出格式:
- 文本:纯文本格式,适合简单回复
- Markdown:Markdown格式,支持富文本展示
- JSON:JSON格式,可自定义结构化输出,层级嵌套最大三层
// JSON输出格式示例 - 旅游推荐
{
"destination": "杭州",
"attractions": [
{"name": "西湖", "rating": 4.9},
{"name": "灵隐寺", "rating": 4.7}
],
"best_season": "春秋季"
}
四、代码节点 - 自定义逻辑处理
4.1 Python沙箱环境
代码节点允许开发者通过编写Python代码实现自定义逻辑。平台提供安全的沙箱环境,基于Python 3.11.4标准库,同时预置了常用三方库。
# 代码节点示例:数据清洗与转换
def clean_and_transform(raw_data: list[dict]) -> dict:
"""清洗原始数据并返回结构化结果"""
result = {
"total": len(raw_data),
"valid": 0,
"invalid": 0,
"items": []
}
for item in raw_data:
if item.get("status") == "valid" and item.get("value") is not None:
result["valid"] += 1
result["items"].append({
"id": item["id"],
"processed_value": item["value"] * 100
})
else:
result["invalid"] += 1
return result
安全限制:代码节点禁止网络请求和文件系统操作,平台有函数黑名单机制,禁用了
os.system、subprocess.Popen、eval、exec等危险函数。
4.2 IDE调试
平台提供了网页版代码IDE,开发者无需考虑部署问题,只需关注代码逻辑:
# 代码节点 - JSON数据聚合示例
def aggregate_plugin_results(cloud_result: dict, device_result: dict) -> dict:
"""聚合云插件和端插件的返回结果"""
final_result = {
"status": "success",
"data": [],
"errors": []
}
if cloud_result.get("code") == 0:
final_result["data"].extend(cloud_result.get("result", []))
else:
final_result["errors"].append(f"Cloud plugin error: {cloud_result.get('message')}")
if device_result.get("code") == 0:
final_result["data"].extend(device_result.get("result", []))
else:
final_result["errors"].append(f"Device plugin error: {device_result.get('message')}")
return final_result
提示:代码节点的输出参数名和类型需要在节点配置面板中预先声明,然后才能在代码中赋值。点击「测试代码」填写输入参数即可在IDE中运行和验证。
五、选择器与意图分类节点
5.1 选择器节点 - IF-ELSE分支
选择器节点是工作流中的条件判断节点,相当于编程语言中的if-else语句,用于根据输入参数的值决定执行哪个分支:
// 选择器节点配置示例
{
"conditions": [
{
"branch_name": "高优先级",
"rules": [
{
"field": "${urgency_level}",
"operator": "greater_than",
"value": "7"
}
],
"logic": "and"
},
{
"branch_name": "中优先级",
"rules": [
{
"field": "${urgency_level}",
"operator": "between",
"min": "4",
"max": "7"
}
],
"logic": "and"
}
],
"fallback_branch": "低优先级"
}
每个分支条件支持添加多个判断条件(且/或关系),同时支持通过拖拽配置面板来设定分支条件的优先级。
5.2 意图分类节点 - 自然语言路由
意图分类节点能够自动识别用户输入的自然语言意图,并将不同的意图分流到不同的处理分支:
| 场景 | 意图类别 | 处理分支 |
|---|---|---|
| 客户服务 | 产品咨询/订单查询/投诉 | 分别流转到对应的知识库 |
| 医疗咨询 | 症状咨询/用药建议/预约 | 分别路由到不同专业领域 |
| 智能客服 | 查询天气/设定提醒/播放音乐 | 触发不同的工具调用 |
意图分类节点的配置流程:
- 在工作流中添加意图分类节点
- 定义每个分类的名称和描述(帮助大模型识别)
- 为每个分类连接后续处理节点
- 配置兜底策略:当意图不匹配任何分类时的处理路径
最佳实践:意图分类建议控制在5-10个类别之间,过多的类别会降低分类准确率。每个类别的描述应清晰、具体,使用关键词帮助模型理解。
六、插件节点 - 能力无限扩展
6.1 云插件节点
云插件节点用于在工作流中调用云端API工具,连接外部服务。插件是工具的集合,每个工具对应一个可调用的API接口:
// 云插件节点输入示例 - 天气预报工具
{
"city": "${user_query_city}",
"days": 3,
"units": "metric",
"language": "zh-CN"
}
// 云插件节点输出示例
{
"code": 0,
"message": "success",
"result": {
"city": "北京",
"forecast": [
{"date": "2026-05-13", "weather": "晴", "temp": "22-30°C"},
{"date": "2026-05-14", "weather": "多云", "temp": "20-28°C"}
]
}
}
6.2 端插件节点
端插件节点连接HarmonyOS设备侧应用能力,支持多版本配置以兼容不同端侧版本。端插件需要在工作流中配合代码组件处理返回结果:
# 代码节点聚合多版本端插件结果
def aggregate_device_plugins(version_1_result: dict, version_2_result: dict) -> dict:
"""聚合不同版本的端插件返回结果"""
# 判断哪个版本命中了
if version_1_result.get("code") == 0:
return {
"source": "version_1",
"data": version_1_result.get("result", {})
}
elif version_2_result.get("code") == 0:
return {
"source": "version_2",
"data": version_2_result.get("result", {})
}
else:
return {
"source": "none",
"data": None,
"error": "All plugin versions failed"
}
6.3 模拟集与单节点调试
插件节点支持Mock数据进行调试,无需依赖真实接口:
// 插件模拟集配置
{
"mock_data": {
"weather_query": {
"input": {"city": "深圳", "days": 1},
"output": {
"code": 0,
"result": {
"city": "深圳",
"temperature": 28,
"humidity": "75%",
"condition": "多云有阵雨"
}
}
}
}
}
提示:云插件支持单节点调试,无需连线完整即可测试;端插件不支持单节点调试,需在真机上进行端到端验证。
七、输出与结束节点
7.1 输出模式
输出节点用于在工作流中间过程输出内容,支持三种模式:
| 模式 | 适用场景 | 绑定卡片 |
|---|---|---|
| 输出模式 | 输出中间结果给用户 | 支持 |
| 思考模式 | 展示思考过程和状态 | 不支持 |
| 暂态模式 | 长耗时操作的等待提示语 | 不支持 |
7.2 思考模式
思考模式用于输出大模型的思考过程,通常与输出模式节点配合使用,实现"先展示思考过程,再输出最终答案"的交互效果:
// 思考模式节点输出示例
{
"stepInfo": "思考中",
"streamingTextId": "stream-session-001",
"reasoningText": "用户询问的是北京到上海的航班,我需要先查询航班信息,然后根据用户偏好排序..."
}
注意:思考节点的输出流id需要与输出模式节点的输出流id保持一致,才能实现流畅的流式输出体验。
7.3 暂态模式
当工作流中的部分节点执行时间较长时,暂态模式可以先向用户展示一段预设的提示语,缓解等待焦虑:
// 暂态模式配置
{
"transientText": "正在为您查询最新的航班信息,请稍候...",
"displayDuration": "until_response"
}
当真实返回结果开始输出后,该固定话术自动消失,实现自然流畅的交互体验。
7.4 结束节点
结束节点是工作流的最终节点,支持两种返回方式:
- 返回变量:以JSON格式输出,适用于绑定卡片或作为子工作流
- 返回文本:直接以文本回复用户,适用于工作流模式智能体
# 返回文本模式 - 引用输出参数
已为您查询到 ${city} 未来3天的天气情况:
${weather_summary}
温馨提示:${weather_tip}
注意:工作流模式智能体如果使用「返回变量」且未绑定卡片,用户将看不到任何响应内容。建议工作流模式优先使用「返回文本」。
八、循环与批处理节点
8.1 数组循环
循环节点支持三种循环模式,数组循环类似编程中的for语法,用于遍历数组中的每个元素:
// 数组循环节点输入
{
"loop_array": [
{"city": "北京", "date": "2026-05-13"},
{"city": "上海", "date": "2026-05-13"},
{"city": "深圳", "date": "2026-05-13"}
]
}
数组循环的次数取决于循环数组的长度,支持引用多个数组时取最短数组的长度决定循环次数。
8.2 指定次数循环
适用于批量、顺序处理数据的场景,支持设置1-1000次循环:
# 指定次数循环应用场景 - 批量生成报告
def generate_reports(count: int) -> list:
"""批量生成报告(循环体内调用大模型节点)"""
reports = []
for i in range(count):
report = {
"id": i + 1,
"title": f"报告 #{(i+1):03d}",
"status": "pending"
}
# 大模型节点在此处理
reports.append(report)
return reports
8.3 无限循环
无限循环类似编程中的while语法,需要通过终止循环节点来停止。通常与条件判断节点关联使用:
循环结构示例:
循环节点 → [循环体处理] → 选择器节点
↑ ↓ (条件满足)
└──────── 继续循环 ← 终止循环节点
↓ (跳出循环)
后续节点
循环体中的特殊节点:
- 终止循环:相当于
break,强制中断循环 - 继续循环:相当于
continue,跳过当前循环进入下一次 - 设置变量:在每次循环结束后更新中间变量
8.4 批处理并行执行
批处理节点用于同时并行处理多个任务,适合一次性查询多个城市的天气、批量翻译等场景:
// 批处理节点配置
{
"parallel_count": 10, // 并行数量,最大20
"batch_limit": 100, // 批处理次数上限,最大200
"input_array": "${cities_to_query}"
}
| 参数 | 说明 | 默认值 | 最大值 |
|---|---|---|---|
| 并行运行数量 | 每批并行执行的任务数 | 10 | 20 |
| 批处理次数上限 | 总执行次数上限 | 100 | 200 |
提示:批处理节点中不支持嵌套批处理和循环节点。批处理完成后输出结果为数组,路径选择时注意不要有父子关系。
九、知识库与文本处理节点
9.1 知识库节点
知识库节点用于从智能体关联的知识库中召回最匹配的信息片段。核心配置参数如下:
// 知识库节点配置示例
{
"knowledge_base_ids": ["kb_product_manual", "kb_faq"],
"query": "${user_question}",
"retrieval_config": {
"relevance_threshold": 0.5, // 检索文本相关阈值
"max_segments": 3, // 最大召回分段数
"max_chars_per_segment": 2000,// 单条片段最大字符数
"query_rewrite": true // 开启查询改写
}
}
# 代码节点处理知识库召回结果
def process_knowledge_results(knowledge_segments: list[dict]) -> str:
"""处理知识库召回结果,合并为上下文"""
context_parts = []
for i, segment in enumerate(knowledge_segments):
source = segment.get("source", "unknown")
content = segment.get("content", "")
score = segment.get("relevance_score", 0)
context_parts.append(
f"[来源{source} | 相关度{score:.2f}]\n{content}"
)
return "\n---\n".join(context_parts)
查询改写功能在多轮对话中尤为重要:它能根据对话历史优化用户Query,提升检索效率。
9.2 文本处理节点
文本处理节点提供两种字符串操作:
- 字符串拼接:将多个输入合并为一个字符串
- 字符串分隔:按分隔符拆分字符串为数组
# 字符串拼接示例
输入1:晴天
输入2:三级
输出:"今天天气晴天,风力三级"
# 字符串分隔示例
输入:"小刚,28岁,南京人,喜欢篮球、看书"
输出:["小刚", "28岁", "南京人", "篮球、看书"]
十、提问器与变量节点
10.1 三种问答模式
提问器节点用于在对话中主动收集用户信息,支持三种模式:
- 直接回答:用户自由输入,节点提取关键信息
- 选项回答:用户从预设选项中选择,支持固定内容和动态内容
- 动态生成槽位:通过代码节点动态定义需要收集的字段
10.2 动态槽位生成
动态槽位模式允许上游代码节点定义提取字段,实现灵活的对话信息收集:
// 代码节点输出的槽位定义
{
"extractedFields": [
{
"fieldName": "depart_city",
"description": "出发城市",
"cnFieldName": "出发城市",
"fieldType": "String",
"required": true
},
{
"fieldName": "arrive_city",
"description": "目的城市",
"cnFieldName": "目的城市",
"fieldType": "String",
"required": true
},
{
"fieldName": "depart_date",
"description": "出发日期",
"cnFieldName": "出发日期",
"fieldType": "String",
"required": true,
"defaultValue": "2026-05-20"
}
]
}
10.3 变量节点应用
变量节点用于修改和存储用户变量值,实现数据的动态更新和传递:
# 变量节点的典型应用场景
# 1. 存储中间结果:将代码节点计算结果存入变量
# 2. 记录用户输入:在对话过程中保存用户偏好
# 3. 获取系统变量:提取系统自动产生的数据
# 4. 控制流程分支:根据变量值决定后续流程
变量节点使用流程:
1. 在智能体设置中创建变量(如 "user_preference")
2. 在工作流中添加变量节点
3. 将变量节点与具体值关联
4. 后续节点通过 ${variable_name} 引用
十一、高级节点
11.1 长期记忆节点
长期记忆节点用于召回智能体存储的用户个性化信息,实现千人千面的智能体体验:
# 长期记忆节点召回结果的Python处理
def process_user_memory(memory_data: dict) -> dict:
"""处理长期记忆召回结果"""
return {
"user_name": memory_data.get("user_name", "用户"),
"preferences": memory_data.get("preferences", []),
"history_topics": memory_data.get("recent_topics", []),
"last_interaction": memory_data.get("last_visit_time")
}
前提条件:使用长期记忆节点前,必须在智能体设置中开启长期记忆功能,否则工作流执行会报错。
11.2 配额管理节点
配额管理节点用于对计数变量进行原子化赋值操作,适用于资源扣减和调用管控场景:
// 配额管理节点配置
{
"counter_variable": "daily_api_calls",
"operation": "decrement",
"amount": 1,
"min_value": 0,
"on_exhausted": "return_error"
}
11.3 子工作流节点
工作流支持嵌套调用其他工作流,实现功能复用和模块化设计。子工作流节点可以引用已发布的工作流,支持参数传递和结果返回。
十二、节点编排最佳实践
12.1 常见编排模式
核心编排模式包括:
- 串行处理模式:节点逐一执行,前一节点的输出是后一节点的输入
- 分支选择模式:通过选择器或意图分类节点分流到不同处理路径
- 循环处理模式:对数组数据逐条处理
- 并行批处理模式:同时处理多条数据,提高效率
- 人机协同模式:通过提问器节点收集用户输入后继续处理
智能客服工作流编排示例:
开始节点 → 意图分类节点
├──→ 产品咨询 → 知识库节点 → 大模型节点 → 结束节点
├──→ 订单查询 → 插件节点(订单API) → 大模型节点 → 结束节点
└──→ 投诉 → 提问器节点(收集信息) → 插件节点 → 结束节点
12.2 性能优化技巧
- 合理使用批处理:批量数据优先使用批处理节点而非循环节点
- 减少大模型调用:能用代码节点处理的逻辑,尽量不用大模型节点
- 技能配置优化:大模型节点配置技能时,精准定义技能描述,减少不必要的调用
- 并行执行:互不依赖的节点尽量使用并行执行
- 缓存策略:对稳定的数据查询使用缓存减少重复计算
总结
本文深入剖析了鸿蒙智能体工作流的所有节点类型,从开始节点到结束节点,从基础的逻辑控制到高级的长期记忆和配额管理。掌握每种节点的特性和最佳编排模式,可以让智能体的处理能力提升数倍,从简单的问答演变为复杂的自动化任务处理系统。
关键要点:
- 工作流节点是智能体能力的基础组件,每个节点都有其独特的适用场景
- 合理的节点编排直接影响智能体的响应速度和处理效果
- 大模型节点+代码节点+插件节点是工作流的核心三件套,能覆盖大多数业务场景
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!
相关资源:
更多推荐





所有评论(0)