跳到主要内容

任务执行

任务执行 是最特殊的模式。从技术上来说,所有的智能体模式都属于任务执行模式。因为所有这些模式,都是为了完成某类任务。只不过任务的粒度可大可小。粒度大的任务可以被分解成粒度较小的任务。智能体的开发模式,本质上是任务的不同组织方式。

实现

这里介绍的任务执行模式是狭义上的概念,也是最小的任务单元。任务在执行时,发送请求给大模型,以大模型的结构化输出作为任务的执行结果。任务执行模式在实现上,使用提示模板和结构化输出。

提示模板中包含了一些变量。在执行任务时,智能体会准备这些变量的值,填充到模板之后,得到实际的提示内容。在提示中还会包含与结构化输出相关的指令。大模型接收到发送的提示之后,生成满足提示中要求的结构化输出。结构化输出的内容,直接作为任务的返回结果。

下图给出了任务执行模式的基本流程。

实现指南

任务执行模式的实现很直观。下面是一些注意事项。

任务的粒度

过大或过小的任务都不是好的选择。如果粒度过大,大模型无法总是生成有意义的结果。如果粒度过小,那可能会需要创建太多的智能体来完成这些小任务。

实际上,现在的大模型的能力很强,可以执行很复杂的任务。可以从较大的任务粒度开始尝试。当大模型无法生成有意义的结果时,把任务分解成较小的子任务。

大模型的选项

在执行任务时,我们希望大模型的输出是可预期和可重复的。因此大模型的选项 temperature 的值,通常设置为 0

如果预期的大模型输出有相对固定的长度,可以设置大模型的输出 token 的数量上限。

模型

对于任务执行智能体,在选择大模型时,应该选择普通的模型,而不是推理模型。推理模型很强大,但是任务执行智能体所执行的任务,应该是简单和直接的。这使得任务执行智能体的实现和测试更简单,也更有利于这些智能体的复用和组合。

对于 OpenAI 来说,应该使用 GPT-4o 或 GPT-4o mini。对于 DeepSeek 来说,应该使用 DeepSeek V3。

提示模板

需要执行的任务被定义在提示模板中。为了确保智能体可以产生有意义的结果,提示模板需要被仔细地编写。我们的目标是让大模型执行一个任务,因此只需要把任务描述清楚即可。

  • 简单的列出来全部的需求。
  • 需求应该尽可能的具体。
  • 如果完成任务有具体的步骤,列出来这些步骤。

下面的提示模板列出了在模板中可能包含的内容。

示例提示模板
Background: // background information for complicate tasks

Goal: // Short summary of the task objective

Requirements: // Constraints of the output
- Requirement 1
- Requirement 2
- ....

Thinking steps: // Steps to execute the task
- Step 1
- Step 2
- ....

示例

下面看一个具体的例子。需要大模型执行的任务是生成测试用户。系统中已经有了关于用户的内部模型。使用大模型生成的用户必须满足这个内部模型。

下面是用户的定义 User 类。它是一个记录类型,使用内嵌的记录来描述一个复杂的结构。

User 模型
package com.javaaidev.agenticpatterns.examples.taskexecution;

import java.util.List;

public record User(String id,
String name,
String email,
String mobilePhone,
List<Address> addresses) {

public enum AddressType {
HOME,
OFFICE,
OTHER,
}

public record Address(
String id,
AddressType addressType,
String countryOrRegion,
String provinceOrState,
String city,
String addressLine,
String zipCode) {

}
}

下面是生成测试用户的提示模板。其中 count 是模板变量,表明要生成的用户的数量。模板中对生成的用户进行了清晰的限制,给出了 User 中的每个字段的要求。

生成用户的提示模板
Goal: Generate {count} users

Requirements:
- Id should be a version 4 random UUID.
- Name should be using the format "$firstName $lastName".
- Email address should be using the format "$firstName.$lastName@$domain".
- For an address,
- Country or region must use ISO 3166 alpha-2 code.
- For province/state/city, they should be generated based on the country or region.
- Address line can be fake.
- Zip code should use the format based on the country or region.
- When generating multiple users, choose different countries or regions for those users.
- For a user, generate 1 to 3 addresses. At least one address has the type HOME.

在执行该任务时,大模型的输出如下所示。从结果中可以看到,大模型生成的 User 满足了提示模板中给出的所有要求。

[
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "John Doe",
"email": "john.doe@example.com",
"mobilePhone": "+1234567890",
"addresses": [
{
"id": "c9bf9e57-1685-4c89-bafb-ff5af830be8a",
"addressType": "HOME",
"countryOrRegion": "US",
"provinceOrState": "NY",
"city": "New York",
"addressLine": "123 Fake Street",
"zipCode": "10001"
}
]
}
]