workflow字段映射

1. 基础字段映射 MapFields

这是最常用、最直观的映射方式,适用于简单的字段对接。

// 假设节点A输出类型为 SourceOutput { TaskID string; Query string }
// 假设节点B输入类型为 DestInput { JobID string; Question string }

wf.AddLambdaNode("nodeB", processor).
   AddInput("nodeA", compose.MapFields("TaskID", "JobID"), 
                         compose.MapFields("Query", "Question"))
// 这会将 nodeA 输出的 TaskID 映射到 nodeB 输入的 JobID,Query 映射到 Question。

2. 整体到局部的映射 ToField

当你需要将上一个节点的全部输出结果,作为当前节点输入的一部分时,这个功能非常有用。它体现了Workflow控制流与数据流分离的特点:一个节点的输入可以灵活地从多个前驱节点的输出中抽取不同部分组合而成。

// 假设我们需要组合来自不同节点的数据
// 节点A输出:用户资料 UserProfile { Name string }
// 节点B输出:当前时间 CurrentTime { Timestamp string }
// 节点C输入:需要组合信息 FullInput { UserInfo UserProfile; Context string; TimeInfo string }

wf.AddLambdaNode("nodeC", complexProcessor).
   AddInput("nodeA", compose.ToField("UserInfo")). // 将整个UserProfile对象放入UserInfo字段
   AddInput("nodeB", compose.ToField("TimeInfo"))  // 将整个CurrentTime对象放入TimeInfo字段
// 至于 Context 字段,可以从START节点或其他节点映射,或使用默认值。

3. 局部到整体的映射 FromField

这个API常用于从上游的一个复杂结果中,只抽取某个关键字段给下游节点处理。

4. 处理嵌套结构的 MapFieldPaths

对于复杂嵌套结构,你需要使用 FieldPath来指定路径。Eino 内部使用 Unit Separator 字符 (\x1F) 作为路径分隔符,以高效且安全地处理任意深度的嵌套字段。

ToFieldPathFromFieldPath是上述功能的自然延伸,分别用于将整个输出映射到嵌套字段,以及从嵌套字段中提取值作为整体输入。

5. 最简单的直接传递 AddInput

当上下游节点的输入输出类型完全一致,或者你希望传递整个对象时,这是最直接的方式。

映射目标
核心 API
功能描述
适用场景举例

字段 → 字段

MapFields("源字段", "目标字段")

将前驱节点输出对象的某个顶层字段映射到后继节点输入对象的某个顶层字段

User对象的 Name字段映射到 Request对象的 UserName字段。

整体输出 → 字段

ToField("目标字段")

整个前驱节点的输出作为后继节点输入对象的一个字段的值。

将上一个节点的完整结果(如一条AI回复)存入当前节点输入对象的 context字段。

字段 → 整体输入

FromField("源字段")

将前驱节点输出对象的某个特定字段作为整个后继节点的输入

从一个复杂配置对象中仅提取 query字段的值,作为问答模型的输入问题。

嵌套字段 → 嵌套字段

MapFieldPaths(FieldPath{...}, FieldPath{...})

复杂的嵌套结构之间进行深度映射,支持任意层级的字段访问。

映射 response.data.user.profile.nameoutput.userName

整体输出 → 嵌套字段

ToFieldPath(FieldPath{...})

整个前驱节点的输出映射到后继节点输入对象的一个嵌套字段中。

将检索到的文档列表,整体放入输入对象的 context.documents嵌套字段里。

嵌套字段 → 整体输入

FromFieldPath(FieldPath{...})

从前驱节点的输出中提取一个嵌套字段的值,并将其作为整个后继节点的输入

从 API 响应的多层结构中提取最内部的 result字段,直接传递给下一个处理器。

整体输出 → 整体输入

AddInput(前驱节点名)

将前驱节点的整个输出直接传递给后继节点作为其完整输入

简单的线性链式调用,节点间传递完整的数据结构,无需拆分或重组。

最后更新于