并行工作流
并行工作流 模式并行运行多个子任务来提升性能。
根据子任务是否返回结构相同的数据,并行工作流可以分成两类。
子任务返回不同类型的数据
此类并行工作流把一个大的任务,分解成若干个小的任务。把这些子任务的结果组装起来,得到了智能体的最终结果。
一个示例是编写报告。智能体创建不同的子任务。每个子任务负责收集不同领域的信息,最后把子任务的结果组装起来,得到最终的报告。
子任务返回相同类型的数据
此类并行工作流使用多个子任务来进行投票或确认。这些子任务对于同样的任务输入,给出不同的结果。智能体使用这些结果来确定最终的结果。
对于在 评估者-优化者 模式中介绍的代码生成的例子,智能体可以并行执行 3 个子任务来使用 3 个不同的模型评估代码。每个子任务返回评估是否通过的结果。智能体根据子任务结果中的多数值来判断评估是否通过。
实现
这个模式包含了一个主任务和若干个子任务。主任务和子任务都使用 任务执行 模式来实现。
下图给出了并行工作流模式的基本流程。
子任务的结果类型
子任务可以返回不同类型的结果,或是相同类型的结果。
不同类型
如果子任务返回不同类型的结果,它们通常需要不同类型的输入。在这种情况下,在执行子任务之前,需要把原始的任务输入转换成子任务需要的类型。
相同类型
如果所有的子任务返回相同类型的结果,原始的任务输入可以直接传递给子任务。
组装策略
当所有子任务都执行完成之后,有两种策略来组装结果。
第一种组装策略不使用大模型。把所有子任务的结果使用代码逻辑进行组装。
第二种组装策略使用大模型。子任务执行之后的结果被发送给大模型,来进行进一步的生成。
限流
当任务并行执行时,很容易达到 AI 服务的请求限制。可以限制同时并行执行的任务数量,以及一段时间内最多执行的任务数量。
示例
作为示例的智能体编写关于算法的文章。每篇文章包含了使用不同编程语言编写的代码示例。该并行工作流智能体执行并行任务来生成代码示例,再使用这些代码示例编写文章。
首先从该智能体的输入和输出开始。该智能体的输入如下所示。其中包含了两个字段:
algorithm
表示算法的名称。languages
表示编程语言的名称列表。
package com.javaaidev.agenticpatterns.examples.parallelizationworkflow;
import java.util.List;
public record AlgorithmArticleGenerationRequest(String algorithm, List<String> languages) {
}
输出中只包含 article
字段,表示生成的文章。
package com.javaaidev.agenticpatterns.examples.parallelizationworkflow;
public record AlgorithmArticleGenerationResponse(String article) {
}
这个智能体使用并行的子任务生成代码示例,每个任务负责生成一种编程语言的代码示例。下面给出了生成代码示例的提示模板。language
表示编程语言的名称,description
表示代码生成的要求。language
的每个值,对应于智能体输入中的 languages
列表中的每个元素。
Write {language} code to meet the requirement.
{description}
对于子任务的执行结果,使用大模型来进行组装,生成最终的文章。下面的代码是生成文章的提示模板。algorithm
表示算法的名称。sample_code
表示生成的代码示例,其值来自并行运行的子任务的结果。
Goal: Write an article about {algorithm}.
Requirements:
- Start with a brief introduction.
- Include only sample code listed below.
- Output the article in markdown.
{sample_code}
下面是智能体的输入,算法是“快速排序”,编程语言是 Java、Python 和 JavaScript。
{
"algorithm": "quick sort",
"languages": [
"java",
"python",
"javascript"
]
}
下图是该智能体执行时的 trace。最外层的 agent.execute
代表整个智能体的执行。内部的 3 个 agent.execute
对应于生成 3 种编程语言代码示例的子任务。子任务完成之后,再发送提示给大模型,完成最终文章的生成。
下图是使用 Swagger UI 测试的结果。输出是 Markdown 格式的文章。