Output Parsers

OutputParser 接口允许你获取结构化输出,例如,将输出映射到 Java 类或将 AI 模型的基于字符串的输出映射到一组值。 你可以从类似于 Spring JDBC 的 RowMapperResultSetExtractor 的概念的角度对其进行考虑。开发者希望快速地将 AI 模型的结果转换为可以传递给其应用程序中的其他函数和方法的数据类型。OutputParser 有助于实现此目标。

API Overview

此部分提供了有关 OutputParser 接口的指南。

OutputParser

以下是 OutputParser 接口定义

public interface OutputParser<T> extends Parser<T>, FormatProvider {

}

它结合了 Parser<T> 接口

@FunctionalInterface
public interface Parser<T> {
    T parse(String text);
}

FormatProvider 接口

public interface FormatProvider {

	String getFormat();

}

Parser 接口解析文本字符串以生成类型 T 的实例。

FormatProvider 为 AI 模型提供文本指令,以便格式化输出,使其能够通过 Parser 解析为类型 T。这些文本指令最常附加到 AI 模型的用户输入的末尾。

Available Implementations

OutputParser 接口具有以下可用的实现。

  • BeanOutputParser: 指定 Java 类的 JSON 架构,并使用 JSON 架构规范的 DRAFT_2020_12,因为 OpenAI 已指出这将得到最佳的效果。然后将 AI 模型的 JSON 输出反序列化为 Java 对象,即 JavaBean

  • MapOutputParser:与 BeanOutputParser 类似,但 JSON 有效载荷取消序列化为一个 java.util.Map&lt;String, Object&gt; 实例。

  • ListOutputParser:指定输出为逗号分隔列表。

最近 OpenAI 模型在通过简单指定“以 JSON 格式返回”来提高模型返回 JSON 的能力方面已经付出了大量努力,但并非所有模型都支持对返回结构化数据进行此类直接支持。

Example Usage

您可以运行一个完全可行示例,演示如何将 BeanOutputParser 用作 Spring AI Azure Workshop 的一部分。本文档中再现了此研讨会代码的一部分。

此示例的用例是使用 AI 模型生成某个演员的影视作品资料。

使用的用户提示是

String userMessage = """
        Generate the filmography for the actor {actor}.
        {format}
        """;

在下方显示的 ActorsFilms

public class ActorsFilms {

	private String actor;

	private List<String> movies;

    // getters and toString omitted
}

此处是一个控制器类,显示了使用这些类的用法

    @GetMapping("/ai/output")
    public ActorsFilms generate(@RequestParam(value = "actor", defaultValue = "Jeff Bridges") String actor) {
        var outputParser = new BeanOutputParser<>(ActorsFilms.class);

        String userMessage =
                """
                Generate the filmography for the actor {actor}.
                {format}
                """;

        PromptTemplate promptTemplate = new PromptTemplate(userMessage, Map.of("actor", actor, "format", outputParser.getFormat() ));
        Prompt prompt = promptTemplate.create();
        Generation generation = chatClient.call(prompt).getResult();

        ActorsFilms actorsFilms = outputParser.parse(generation.getOutput().getContent());
        return actorsFilms;
    }