【Spring AI】08. 输出解析器

文章目录

Output Parsers

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

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

API 概述


本节提供了OutputParser接口的指南。

OutputParser

这里是 OutputParser 接口定义

java 复制代码
public interface OutputParser<T> extends Parser<T>, FormatProvider {

}

它继承了 Parser 接口

java 复制代码
@FunctionalInterface
public interface Parser<T> {
    T parse(String text);
}

和 FormatProvider 接口

java 复制代码
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 返回"的能力,但并非所有模型都支持直接支持返回结构化数据。

示例用法


您可以运行一个完全可工作的示例 Spring AI Azure Workshop,其中的一部分演示了BeanOutputParser的使用。这个工程代码的一部分如下所示。

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

使用的用户提示词是

java 复制代码
String userMessage = """
        Generate the filmography for the actor {actor}.
        {format}
        """;

下面显示的类 ActorsFilms

java 复制代码
public class ActorsFilms {

	private String actor;

	private List<String> movies;

    // getters and toString omitted
}

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

java 复制代码
    @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;
    }

相关推荐
大刚测试开发实战3 小时前
TestHub V0.2.2版本发布,附更新指南
人工智能
冬奇Lab4 小时前
Agent 系列(21):Harness 测试工程——45 个测试怎么设计,以及它发现了什么 bug
人工智能·llm·agent
冬奇Lab4 小时前
每日一个开源项目(第133篇):EchoBird - 把 AI 工具的安装和部署做成傻瓜操作
人工智能·开源·资讯
程序员龙叔4 小时前
编写高质量 Skill 系列 -- 如何设计需求分析与用例生成的 SKILL
自动化测试·软件测试·python·软件测试工程师·接口测试·性能测试·skill·ai测试
IT_陈寒5 小时前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
用户5191495848457 小时前
Windows 渗透测试载荷加载器 POC 工具集
人工智能·aigc
大树887 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
用户8356290780517 小时前
使用 Python 操作 Word 内容控件
后端·python
通信小呆呆7 小时前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
施小赞7 小时前
普通 RAG vs GraphRAG 核心对比
人工智能·ai