前言

工作流(Workflow) 是鸿蒙智能体平台最强大的能力之一,它允许开发者通过可视化编排的方式,将大模型、代码逻辑、外部API、知识库等多工作流节点组合成自动化的处理链路。理解每种节点的特性和适用场景,是构建高质量智能体的关键。

本文是 「鸿蒙智能体开发实战」 系列的第四十三篇,系统剖析鸿蒙智能体工作流中所有节点类型,涵盖配置方法、使用场景和实战技巧,帮助开发者从入门到精通工作流编排。

适用读者:已完成智能体基础开发,希望深入掌握工作流进阶能力的开发者。建议先阅读本系列第12篇《工作流开发基础》和第13篇《智能体开发进阶》。

一、工作流节点体系总览

1.1 节点分类与架构

鸿蒙智能体工作流的节点按功能可分为以下六大类:

分类 节点类型 核心作用
入口/出口 开始节点、结束节点 定义工作流入参和返回结果
逻辑控制 选择器节点、意图分类节点、循环节点、批处理节点 控制流程分支和重复执行
AI处理 大模型节点、代码节点、文本处理节点 实现文本生成、代码执行、字符串处理
能力扩展 插件节点、知识库节点、子工作流节点 对接外部API和私有数据
交互收集 提问器节点、变量节点 收集用户输入、管理状态
高级特性 长期记忆节点、配额管理节点、输出节点 个性化记忆、资源管控、中间输出

鸿蒙智能体工作流节点类型总览

上图展示了工作流中所有节点类型的分类关系,涵盖入口/出口、逻辑控制、AI处理、能力扩展、交互收集和高级特性六大类别。

1.2 工作流生命周期

一个典型的工作流从创建到上线包含以下阶段:

  1. 创建与编排:在小艺开放平台工作空间中选择「工作流」,通过拖拽方式添加节点并连线
  2. 节点配置:逐一配置每个节点的输入、输出和参数
  3. 试运行调试:在平台内输入模拟参数进行测试
  4. 上架发布:通过审核后发布到智能体中使用
  5. 版本管理:支持版本迭代和回滚

提示:工作流一旦被智能体引用,更新后需重新发布并在智能体中「升级」到新版本才能生效。

二、开始节点 - 工作流入口

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 输出格式

大模型节点支持三种输出格式:

  1. 文本:纯文本格式,适合简单回复
  2. Markdown:Markdown格式,支持富文本展示
  3. 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.systemsubprocess.Popenevalexec等危险函数。

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 意图分类节点 - 自然语言路由

意图分类节点能够自动识别用户输入的自然语言意图,并将不同的意图分流到不同的处理分支:

场景 意图类别 处理分支
客户服务 产品咨询/订单查询/投诉 分别流转到对应的知识库
医疗咨询 症状咨询/用药建议/预约 分别路由到不同专业领域
智能客服 查询天气/设定提醒/播放音乐 触发不同的工具调用

意图分类节点的配置流程:

  1. 在工作流中添加意图分类节点
  2. 定义每个分类的名称和描述(帮助大模型识别)
  3. 为每个分类连接后续处理节点
  4. 配置兜底策略:当意图不匹配任何分类时的处理路径

最佳实践:意图分类建议控制在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 结束节点

结束节点是工作流的最终节点,支持两种返回方式:

  1. 返回变量:以JSON格式输出,适用于绑定卡片或作为子工作流
  2. 返回文本:直接以文本回复用户,适用于工作流模式智能体
# 返回文本模式 - 引用输出参数
已为您查询到 ${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. 字符串分隔:按分隔符拆分字符串为数组
# 字符串拼接示例
输入1:晴天
输入2:三级
输出:"今天天气晴天,风力三级"

# 字符串分隔示例
输入:"小刚,28岁,南京人,喜欢篮球、看书"
输出:["小刚", "28岁", "南京人", "篮球、看书"]

十、提问器与变量节点

10.1 三种问答模式

提问器节点用于在对话中主动收集用户信息,支持三种模式:

  1. 直接回答:用户自由输入,节点提取关键信息
  2. 选项回答:用户从预设选项中选择,支持固定内容和动态内容
  3. 动态生成槽位:通过代码节点动态定义需要收集的字段

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 常见编排模式

核心编排模式包括:

  1. 串行处理模式:节点逐一执行,前一节点的输出是后一节点的输入
  2. 分支选择模式:通过选择器或意图分类节点分流到不同处理路径
  3. 循环处理模式:对数组数据逐条处理
  4. 并行批处理模式:同时处理多条数据,提高效率
  5. 人机协同模式:通过提问器节点收集用户输入后继续处理
智能客服工作流编排示例:
开始节点 → 意图分类节点
    ├──→ 产品咨询 → 知识库节点 → 大模型节点 → 结束节点
    ├──→ 订单查询 → 插件节点(订单API) → 大模型节点 → 结束节点
    └──→ 投诉 → 提问器节点(收集信息) → 插件节点 → 结束节点

12.2 性能优化技巧

  1. 合理使用批处理:批量数据优先使用批处理节点而非循环节点
  2. 减少大模型调用:能用代码节点处理的逻辑,尽量不用大模型节点
  3. 技能配置优化:大模型节点配置技能时,精准定义技能描述,减少不必要的调用
  4. 并行执行:互不依赖的节点尽量使用并行执行
  5. 缓存策略:对稳定的数据查询使用缓存减少重复计算

总结

本文深入剖析了鸿蒙智能体工作流的所有节点类型,从开始节点到结束节点,从基础的逻辑控制到高级的长期记忆和配额管理。掌握每种节点的特性和最佳编排模式,可以让智能体的处理能力提升数倍,从简单的问答演变为复杂的自动化任务处理系统

关键要点:

  • 工作流节点是智能体能力的基础组件,每个节点都有其独特的适用场景
  • 合理的节点编排直接影响智能体的响应速度和处理效果
  • 大模型节点+代码节点+插件节点是工作流的核心三件套,能覆盖大多数业务场景

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

  • 小艺开放平台工作流文档:链接
  • 大模型节点配置指南:链接
  • 代码节点开发文档:链接
  • 插件节点使用说明:链接
  • 输出节点配置指南:链接
  • 循环节点使用说明:链接
  • 鸿蒙智能体开发实战系列:链接
  • MCP协议官方文档:链接
  • HarmonyOS开发文档:链接
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐