---
myst:
  html_meta:
    "moi:status": "paper-verified"
---

# 工作流算子

工作流由算子组成。每个算子都是可独立配置的加工单元。本页说明算子如何与引擎衔接，并列出系统提供的算子类别与一个完整示例。

每个算子向引擎声明三件事：一个算子 ID、输入（需要哪些字段）、输出（产生哪些字段）。引擎按 ID 找到对应算子、按声明取值与回收，不关心算子内部如何实现——无论内部是解析、向量化还是执行 SQL，对引擎而言都是同一种带契约的执行单元。

正因如此，算子之间靠输出字段与输入字段的对应衔接：上游输出的字段与下游声明的输入一致时，数据才接得上；二者不一致，下游算子在运行时失败（见[运行与调试](run-debug.md)）。

## 算子类别

系统算子按用途分为以下类别。这是当前的划分，完整清单以实时接口为准。

| 类别 | 用途 |
|---|---|
| 数据 IO | 读取数据源、写出文件、写入 Catalog |
| 智能处理 | 解析、分块、向量化等模型相关加工 |
| 检索与知识索引 | 构建知识库索引 |
| 代码处理 | 执行 SQL：查询、聚合、Join、窗口、CTE（见 [SQL 编辑器](sql-editor.md)） |
| 治理 | 登记数据血缘 |
| 流程控制 | 子工作流，仅引用同一工作流定义内声明的子网 |
| 流程结构 | 并行、条件分支、重复执行（并行与条件分支内置汇合） |

## 示例：文档知识库准备

“文档知识库准备”模板将一批源文件加工为知识库，由七个算子串联。各算子的输入取自变量（vars）、状态（state）或上一算子的输出（data），输出以 `save` 写入状态，供后续算子引用：

| 算子名称 | 算子 ID | 主要输入 | 输出 |
|---|---|---|---|
| read_source | `moi:catalog.source.read.v2` | 源引用（vars） | 源文件 ID |
| parse_documents | `moi:parse` | 源（data） | 解析后的文档 |
| split_chunks | `moi:parser.split.documents.length` | 解析后的文档（state） | 分块后的文档 |
| build_index | `moi:knowledge.index.build` | 分块、目标表、嵌入模型 | 索引结果 |
| write_parsed_docset | `moi:files.write_documents` | 分块 | 解析文件 ID |
| save_output | `moi:catalog.sink.write` | 目标引用、分块 | 输出文件 ID |
| register_lineage | `moi:data.lineage.register` | 源文件 ID、解析文件 ID、向量表 | 资产 ID |

这条链的形状——读取、解析、分块、建索引、写出、落库、登记血缘——是文档类知识库的标准加工路径。

## 算子名称以实时接口为准

同一类加工可能存在多个算子名称（例如解析存在 `moi:parse` 与 `moi:document.parse` 并存）。选择算子时，以工作区实时接口 `GET /workspaces/:id/workitems` 返回的算子 ID 与输入输出约定为准，不要依据静态清单或示例中的名称。
