结构化输出转换器
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)