Koog(5) —— Strategy 详解:工作流编排、并行执行与状态传递 - SharpCJ

Koog(5) —— Strategy 详解:工作流编排、并行执行与状态传递 - SharpCJ

💡 原文中文,约36300字,阅读约需87分钟。
📝

内容提要

本文介绍 Koog 1.3.0 图式策略的组成与运行机制:策略图由节点和边构成,从 nodeStart 到 nodeFinish,节点决定做什么,边决定下一步去哪,条件挂在边上。内容涵盖预定义节点、自定义节点、子图、预定义策略、并行执行及 AIAgentStorage 数据传递,并提供排错建议。

🔎

延伸解读

图式策略的连通性约束

策略图必须从 nodeStart 连通到 nodeFinish,否则执行流会在中间节点中断。如果某个节点没有任何路径能到达 nodeFinish,运行时会抛出 AIAgentStuckInTheNodeException。设计图时,应确保每个节点都有出边指向可达 nodeFinish 的节点,尤其是分支和循环结构,需要为所有可能的状态提供出口。

条件边的评估顺序与分支设计

同一个源节点的多条出边按定义顺序依次评估条件,第一条满足的边生效。因此,宽泛的条件应放在后面,具体条件放在前面,避免“截胡”。如果所有条件都不满足且没有兜底边,会抛出 AIAgentStuckInTheNodeException。对于布尔状态,应使用互补条件(如 isRainy 和 !isRainy)确保总有边可走。

并行执行的合并策略与开销

parallel 节点并发执行多个分支,然后通过合并策略(selectBy、selectByMax、selectByIndex、fold)将结果合并为一个输出。selectBy 会等待所有分支完成,再按节点顺序选择第一个满足条件的结果,若无匹配则抛出 NoSuchElementException。并行会带来协程、fork 上下文和资源竞争的开销,只适合相互独立、执行时间长且不共享可变状态的操作。

AIAgentStorage 的键与并行上下文

AIAgentStorage 通过 createStorageKey<T>(name) 创建类型化键,键的相等性基于 name 而非对象实例。并行分支会 fork 上下文并复制 storage,分支内的写入不会影响其他分支或下游。需要汇总多分支数据时,应让分支显式返回结果,在合并步骤聚合后再写入 storage,避免依赖共享可变状态。

❓

Q&A

Koog 的图式策略(strategy)由哪些基本组件构成?

图式策略由节点(Node)和边(Edge)组成,从内置的 nodeStart 开始,到 nodeFinish 结束。节点决定“做什么”,边决定“接下来去哪”,条件挂在边上。

在 Koog 中,节点和边分别负责什么?

节点代表一个特定操作,回答“做什么”;边连接节点并定义执行流程,回答“接下来去哪”。条件挂在边上,决定何时沿某条边继续执行。

Koog 的并行执行 parallel 支持哪些结果合并策略?

Koog 提供四种合并策略:selectBy 按条件挑选、selectByMax 选最大值、selectByIndex 让 LLM 当评委选择、fold 聚合全部结果。

Koog 中 AIAgentStorage 的作用是什么?

AIAgentStorage 用于在节点间传递数据,保存上下文内的辅助状态。通过 createStorageKey<T>(name) 创建类型化键,用 set/get 存取。注意并行分支会复制 storage,需要显式合并。

Koog 提供了哪些预定义策略?分别适用于什么场景?

预定义策略包括:chatAgentStrategy 适用于带工具使用反馈的聊天交互;reActStrategy 适用于推理-行动循环的多步任务;singleRunStrategy 适用于单次运行的非交互场景。

在 Koog 中如何自定义一个节点?

可以用 node 函数直接定义,例如 val nodeLength by node<String, Int> { input -> input.length }。也可以提取为扩展函数跨图复用,或为节点工厂增加配置参数、通过闭包保存局部状态。

Koog 的 subgraph 有什么作用?如何限制子图可用的工具?

子图是策略内自包含的处理单元,拥有自己的工具集和上下文,用于拆分复杂工作流。限制工具的方式有三种:定义时直接指定 tools 列表、从工具注册表获取、或在运行时通过 llm.writeSession 动态过滤。

Koog 图式策略中,边的条件是如何评估的?

同一个源节点的多条出边按代码中定义的顺序逐条检查条件,第一条满足的生效。因此宽泛的条件不要放在前面,否则会截胡后面的具体条件。

🏷️

标签

➡️

继续阅读