【Spring AI】08. 输出解析器

ops/2024/11/14 3:02:43/

文章目录

  • Output Parsers
    • API 概述
      • OutputParser
    • 可用实现
    • 示例用法

Output Parsers

OutputParser接口允许您获取结构化输出,例如将输出映射到 Java 类或从 AI 模型的基于字符串的输出中获取值数组。
您可以将其类比为 Spring JDBC 概念中的RowMapper或ResultSetExtractor。开发人员希望快速将 AI 模型的结果转换为可以传递给应用程序中其他函数和方法的数据类型。OutputParser有助于实现这一目标。

API 概述


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

OutputParser

这里是 OutputParser 接口定义

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

它继承了 Parser 接口

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

示例用法


您可以运行一个完全可工作的示例 Spring AI Azure Workshop,其中的一部分演示了BeanOutputParser的使用。这个工程代码的一部分如下所示。
该示例的用例是使用 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;}


http://www.ppmy.cn/ops/29634.html

相关文章

【docker】maven 打包docker的插件学习

docker-maven-plugin GitHub地址&#xff1a;https://github.com/spotify/docker-maven-plugin 您可以使用此插件创建一个 Docker 映像&#xff0c;其中包含从 Maven 项目构建的工件。例如&#xff0c;Java 服务的构建过程可以输出运行该服务的 Docker 映像。 该插件是 Spot…

【区块链】共识算法简介

共识算法简介 区块链三要素&#xff1a; 去中心化共识算法智能合约 共识算法作为区块链三大核心技术之一&#xff0c;其重要性不言而喻。今天就来简单介绍共识算法的基本知识。 最简单的解释&#xff0c;共识算法就是要让所有节点达成共识&#xff0c;保证少数服从多数&#x…

PostgreSQL自带的命令行工具02- createdb

PostgreSQL自带的命令行工具02- createdb 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777createdb 是 Postgr…

区块链 | IPFS 工作原理入门

区块链和IPFS&#xff08;InterPlanetary File System&#xff09;是两种互补的技术&#xff0c;各自在分布式系统中扮演着重要的角色。虽然它们有不同的设计目标和应用场景&#xff0c;但结合起来使用可以提供更加强大和灵活的分布式解决方案。以下是区块链和IPFS工作原理的入…

【webrtc】MessageHandler 9: 基于线程的消息处理:执行Port销毁自己

Port::Port 构造的时候,就触发了一个异步操作,但是这个操作是要在 thread 里执行的,因此要通过post 消息 MSG_DESTROY_IF_DEAD 到thread跑:port的创建并米有要求在thread中 但是port的析构却在thread里 这是为啥呢?

【java超方便的导入导出工具类】SpringBoot操作Excel导入和导出

Excel导入和导出 一、前期准备 1、首先导入主要的依赖 <dependencies><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency><depende…

网盘——分享文件——逻辑设计

本文主要讲解关于网盘文件操作部分的分享文件的逻辑设计部分&#xff0c;主要步骤如下&#xff1a; 目录 1、实施步骤&#xff1a; 2、代码实现 2.1、添加分享文件协议 2.2、添加取消槽函数 2.3、关联取消选择的槽函数 2.4、添加取消槽函数的定义 2.5、添加全选函数槽函…

Tire 字典树、前缀树

字典树&#xff08;又称单词查找树或Trie树&#xff09;是一种树形结构&#xff0c;它是哈希树的变种&#xff0c;通常用于统计、排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;。字典树在搜索引擎系统中常用于文本词频统计。它的主要优点在于能够利用字符串…