跳到主要内容

并行工作流

并行工作流 模式并行运行多个子任务来提升性能。

根据子任务是否返回结构相同的数据,并行工作流可以分成两类。

子任务返回不同类型的数据

此类并行工作流把一个大的任务,分解成若干个小的任务。把这些子任务的结果组装起来,得到了智能体的最终结果。

一个示例是编写报告。智能体创建不同的子任务。每个子任务负责收集不同领域的信息,最后把子任务的结果组装起来,得到最终的报告。

子任务返回相同类型的数据

此类并行工作流使用多个子任务来进行投票或确认。这些子任务对于同样的任务输入,给出不同的结果。智能体使用这些结果来确定最终的结果。

对于在 评估者-优化者 模式中介绍的代码生成的例子,智能体可以并行执行 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 格式的文章。

Swagger UI