跳到主要内容

评估者-优化者

评估者-优化者 模式通过评估者的反馈来优化前一次生成的结果,从而提高最终生成结果的质量。这种“评估-优化”的循环可以执行多次。

实现

该模式的实现包含了 3 个子任务。每个子任务使用 任务执行 模式。

  • 一个任务生成初始的结果。
  • 一个任务对结果进行评估,并给出反馈。
  • 一个任务根据反馈来优化之前的结果。

下图给出了评估者-优化者模式的基本流程。

指南

下面是实现该模式的一些参考。

使用不同的模型

推荐使用不同的模型来进行生成和评估,以获得更好的结果。举例来说,我们可以使用 GPT-4o 进行生成,使用 DeepSeek V3 来进行评估。反过来也可以。

最大的评估次数

推荐设置“评估-优化”流程的最大执行次数。当达到了最大的执行次数之后,即便评估的结果是不通过,最后一次生成的结果仍然会被返回。这会减少响应时间,并降低成本。

评估的结果

对于评估的结果,可以是 boolean 类型,仅包含是否通过两个值;也可以是 0100 的数值类型。数值类型更灵活,因为我们可以设置不同的阈值,来把结果标记为是否通过。与并行工作流模式共同使用时,可以执行多个并行的评估,取这些评估值的平均值,作为最终的评估结果。

示例

该示例是使用多轮评估进行代码生成。

生成初始的结果

在生成初始的结果时,提示模板中仅包含任务的输入。模板的变量 input 表示任务的输入。生成的是 Java 代码。

生成初始结果的提示模板
Goal: Generate Java code to complete the task based on the input.

{input}

该任务的输出是生成的代码。

评估

生成了初始的结果之后,可以对生成的代码进行评估。模板变量 code 表示要评估的代码。模板中列出了评估代码的标准。

评估的提示模板
Goal: Evaluate this code implementation for correctness, time complexity, and best practices.

Requirements:
- Ensure the code have proper javadoc documentation.
- Ensure the code follows good naming conventions.
- The code is passed if all criteria are met with no improvements needed.

{code}

下面是评估结果的类型。这里使用的是 boolean 类型。如果评估不通过,feedback 中包含的是评估者的反馈。

评估结果
package com.javaaidev.agenticpatterns.evaluatoroptimizer;

import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import org.jspecify.annotations.Nullable;

/**
* Boolean evaluation result
*
* @param passed Passed or not passed
* @param feedback Feedback if not passed
*/
public record BooleanEvaluationResult(
@JsonPropertyDescription("If evaluation passed") boolean passed,
@JsonPropertyDescription("Feedback of evaluation") @Nullable String feedback) implements
EvaluationResult {

@Override
@Nullable
public String getFeedback() {
return feedback();
}
}

优化

如果评估的结果是不通过,代码可以基于评估的反馈进行优化。模板变量 code 表示需要优化的代码,feedback 表示评估者给出的反馈。

进行优化的提示模板
Goal: Improve existing code based on feedback.

Requirements:
- Address all concerns in the feedback.

Code:
{code}

Feedback:
{feedback}

输出的结果是优化之后的代码。优化之后的代码会被再次评估,直到通过评估,或者达到了最大的评估次数。

运行示例

下面是该示例智能体执行时的 trace。agent.execute 表示智能体的执行。最外层的 trace 代表整个代码生成过程。之下的另外 4 个 agent.execute 表示 4 个子任务,依次是:

  1. 生成初始的结果
  2. 第一次结果评估,不通过
  3. 第一次结果优化
  4. 第二次结果评估,通过

智能体执行的流程

评估通过之后的结果,就是最终的返回结果。下图是使用 Swagger UI 测试的结果。输入是 “quick sort”。输出是通过了评估的 Java 代码实现。

Swagger UI