Spring AI 结构化输出

结构化输出转换器

LLM 生成结构化输出的能力对于依赖可靠解析输出值的下游应用程序非常重要。 开发人员希望将 AI 模型的结果快速转换为数据类型,例如 JSON、XML 或 Java 类,这些数据类型可以传递给其他应用程序函数和方法。

Spring AI 有助于将 LLM 输出转换为结构化格式。 如下图所示,此方法围绕 LLM 文本完成端点运行:Structured Output Converters
在这里插入图片描述
使用通用完成 API 从大型语言模型 (LLM) 生成结构化输出需要仔细处理输入和输出。结构化输出转换器在 LLM 调用之前和之后起着至关重要的作用,确保实现所需的输出结构。

在 LLM 调用之前,转换器会将格式说明附加到提示符中,为模型生成所需的输出结构提供明确的指导。这些指令充当蓝图,调整模型的响应以符合指定的格式。

在 LLM 调用之后,转换器获取模型的输出文本并将其转换为结构化类型的实例。此转换过程包括解析原始文本输出并将其映射到相应的结构化数据表示形式,例如 JSON、XML 或特定于域的数据结构。

结构化输出 API

该接口允许您获取结构化输出,例如将输出映射到 Java 类或基于文本的 AI 模型输出中的值数组。 接口定义为:StructuredOutputConverter

public interface StructuredOutputConverter<T> extends Converter<String, T>, FormatProvider {
   

}

它结合了 Spring Converter<String、T> 接口和FormatProvider

public interface FormatProvider {
   
	String getFormat();
}

下图显示了使用结构化输出 API 时的数据流。
在这里插入图片描述

为 AI 模型提供特定的格式设置准则,使其能够生成可使用 .以下是此类格式设置说明的示例:FormatProviderTConverter

  Your response should be in JSON format.
  The data structure for the JSON should match this Java class: java.util.HashMap
  Do not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation.

格式说明通常使用 PromptTemplate 附加到用户输入的末尾,如下所示:

    StructuredOutputConverter outputConverter = ...
    String userInputTemplate = """
        ... user text input ....
        {format}
        """; // user input with a "format" placeholder.
    Prompt prompt = new Prompt(
       new PromptTemplate(
			   this.userInputTemplate,
          Map.of(..., "format", outputConverter.getFormat()) // replace the "format" placeholder with the converter's format.
       ).createMessage());

Converter<String T> 负责将模型的输出文本转换为指定类型的实例。T

可用转换器

目前,Spring AI 提供了 、 、 和 implementations:AbstractConversionServiceOutputConverter AbstractMessageOutputConverter BeanOutputConverterMapOutputConverter ListOutputConverter
在这里插入图片描述

结构化输出类层次结构

  • AbstractConversionServiceOutputConverter<T>- 提供预配置的 GenericConversionService,用于将 LLM 输出转换为所需的格式。未提供默认实现。FormatProvider

  • AbstractMessageOutputConverter<T>- 提供预配置的 MessageConverter,用于将 LLM 输出转换为所需的格式。未提供默认实现。FormatProvider

  • BeanOutputConverter<T>- 此转换器配置了指定的 Java 类(例如 Bean)或 ParameterizedTypeReference,它采用一种实现,该实现指示 AI 模型生成符合从指定 Java 类派生的 的 JSON 响应。随后,它利用 an 将 JSON 输出反序列化为目标类的 Java 对象实例。FormatProviderDRAFT_2020_12JSON SchemaObjectMapper

  • MapOutputConverter- 使用指导 AI 模型生成符合 RFC8259 的 JSON 响应的实现来扩展 的功能。此外,它还包含一个转换器实现,该实现利用提供的将 JSON 有效负载转换为实例。AbstractMessageOutputConverterFormatProviderMessageConverterjava.util.Map<String, Object>

  • ListOutputConverter- 扩展 并包含为逗号分隔的列表输出量身定制的实施。转换器实现使用提供的 将模型文本输出转换为 .AbstractConversionServiceOutputConverterFormatProviderConversionServicejava.util.List

使用转换器

以下部分提供了如何使用可用转换器生成结构化输出的指南。

Bean 输出转换器

以下示例演示如何使用 为 actor 生成 filmography。BeanOutputConverter

表示演员电影作品的目标记录:

record ActorsFilms(String actor, List<String> movies) {
   
}

以下是如何使用高级、流畅的 API 来应用 BeanOutputConverter:ChatClient

ActorsFilms actorsFilms = ChatClient.create(chatModel)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王小工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值