Output Parsers

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

您可以将其视为类似于 Spring JDBC 的 RowMapper 或 ResultSetExtractor。开发人员希望快速将人工智能模型的结果转换为可以传递给应用程序中其他函数和方法的数据类型。这 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 的实例。

为 AI 模型提供FormatProvider文本指令来格式化输出,以便将其解析为类型ParserT。这些文本指令通常附加到 AI 模型的用户输入的末尾。

可用的实现

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

  • BeanOutputParser:指定 Java 类的 JSON 模式并使用 DRAFT_2020_12JSON 模式规范,正如 OpenAI 所表明的那样,这将给出最佳结果。然后,AI 模型的 JSON 输出被反序列化为 Java 对象,即JavaBean.

  • MapOutputParser:与 JSON 负载类似BeanOutputParser,但 JSON 负载被反序列化为实例java.util.Map<String, Object>

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

最近的 OpenAI 模型做出了相当大的努力,通过简单地指定“以 JSON 格式返回”来提高模型返回 JSON 的能力,但并非所有模型都支持这种对返回结构化数据的直接支持。

用法示例

您可以运行一个完整的工作示例来演示如何使用 Spring AI Azure WorkshopBeanOutputParser 的一部分。下面复制了该研讨会代码的一部分。

该示例的用例是使用 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;
    }
作者:Jeebiz  创建时间:2024-04-05 22:34
最后编辑:Jeebiz  更新时间:2024-07-06 19:00