输出解析器

OutputParser 接口允许您获取结构化输出,例如将输出映射到 Java 类或从 AI 模型的基于字符串的输出中映射到值数组。

您可以将其类比于 Spring JDBC 的 RowMapperResultSetExtractor 概念。开发人员希望快速将 AI 模型的结果转换为可以传递到应用程序中的另一个函数或方法中的数据类型。 OutputParser有助于实现该目标。

API概述

本节介绍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 模型的用户输入的末尾。

可用实现

OutputParser接口有以下可用实现。

  • BeanOutputParser:指定 Java 类的 JSON 模式,并使用 JSON 模式规范的 DRAFT_2020_12,因为 OpenAI 表示这会产生最佳结果。然后将 AI 模型的 JSON 输出反序列化为Java对象,即 JavaBean

  • MapOutputParser:类似于BeanOutputParser,但将JSON有效载荷反序列化为 java.util.Map<String,Object>实例。

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

最近的 OpenAI 模型在不会影响返回结构化数据的情况下通过简单指定“以 JSON 格式返回”来改善模型返回 JSON 的能力,但并非所有模型都支持此类直接支持。

示例用法

您可以运行一个完全工作的示例,演示作为Spring AI Azure Workshop的一部分使用BeanOutputParser。以下是该研讨会代码的一部分。

示例的用例是使用 AI 模型为演员生成电影作品。

所使用的用户提示为

String userMessage = """
        为演员 {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 =
                """
                为演员{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;
    }