【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;
    }

相关推荐
墨染天姬几秒前
【AI】Hermes的GEPA算法
人工智能·算法
小超同学你好2 分钟前
OpenClaw 深度解析系列 · 第8篇:Learning & Adaptation(学习与自适应)
人工智能·语言模型·chatgpt
紫微AI11 分钟前
前端文本测量成了卡死一切创新的最后瓶颈,pretext实现突破了
前端·人工智能·typescript
码途漫谈20 分钟前
Easy-Vibe开发篇阅读笔记(四)——前端开发之结合 Agent Skills 美化界面
人工智能·笔记·ai·开源·ai编程
smj2302_7968265223 分钟前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
易连EDI—EasyLink26 分钟前
易连EDI–EasyLink实现OCR智能数据采集
网络·人工智能·安全·汽车·ocr·edi
冬奇Lab38 分钟前
RAG 系列(二):用 LangChain 搭建你的第一个 RAG Pipeline
人工智能·langchain·llm
学习论之费曼学习法1 小时前
多模态大模型实战:用 GPT-4o API 打造 AI 助手,能看、能听、能说!
人工智能
阿正呀1 小时前
Redis怎样实现本地缓存的高效失效通知
jvm·数据库·python
昨夜见军贴06161 小时前
IACheck与AI报告审核,开启供应商资质核验报告审核新篇章
人工智能