截至 2024 年 2 月 5 日,旧的
OutputParser
、BeanOutputParser
、ListOutputParser
和 MapOutputParser
类已被弃用,取而代之的是新的 StructuredOutputConverter
、BeanOutputConverter
、ListOutputConverter
和 MapOutputConverter
实现。
后者是前者的直接替代品,提供相同的功能。更改的原因主要是命名,因为没有进行任何解析,同时也与 Spring org.springframework.core.convert.converter
包保持一致,带来了一些改进的功能。Structured Output Converters
帮助将 LLM 输出转换为结构化格式。
如下图所示,这种方法围绕 LLM 文本完成端点运行:

结构化输出转换器架构
StructuredOutputConverter
是尽最大努力将模型输出转换为结构化输出。
AI 模型不能保证按照请求返回结构化输出。
模型可能不理解提示或无法生成请求的结构化输出。
考虑实现验证机制以确保模型输出符合预期。StructuredOutputConverter
不用于 LLM 工具调用,因为此功能默认提供结构化输出。结构化输出 API
StructuredOutputConverter
接口允许您获取结构化输出,例如将输出映射到 Java 类或从基于文本的 AI 模型输出中获取值数组。
接口定义如下:

结构化输出 API
FormatProvider
为 AI 模型提供特定的格式指南,使其能够生成可以转换为指定目标类型 T
的文本输出。以下是此类格式指令的示例:
T
的实例。
可用的转换器
目前,Spring AI 提供了AbstractConversionServiceOutputConverter
、AbstractMessageOutputConverter
、BeanOutputConverter
、MapOutputConverter
和 ListOutputConverter
实现:

结构化输出类层次结构
AbstractConversionServiceOutputConverter<T>
AbstractConversionServiceOutputConverter<T>
提供预配置的 GenericConversionService 用于将 LLM 输出转换为所需格式。不提供默认的
FormatProvider
实现。AbstractMessageOutputConverter<T>
AbstractMessageOutputConverter<T>
提供预配置的 MessageConverter 用于将 LLM 输出转换为所需格式。不提供默认的
FormatProvider
实现。BeanOutputConverter<T>
BeanOutputConverter<T>
配置有指定的 Java 类(例如,Bean)或 ParameterizedTypeReference,此转换器使用
FormatProvider
实现,指导 AI 模型生成符合从指定 Java 类派生的 DRAFT_2020_12
、JSON Schema
的 JSON 响应。随后,它使用 ObjectMapper
将 JSON 输出反序列化为目标类的 Java 对象实例。MapOutputConverter
MapOutputConverter
扩展
AbstractMessageOutputConverter
的功能,提供 FormatProvider
实现,指导 AI 模型生成符合 RFC8259 的 JSON 响应。此外,它还包含一个转换器实现,使用提供的 MessageConverter
将 JSON 负载转换为 java.util.Map<String, Object>
实例。ListOutputConverter
ListOutputConverter
扩展
AbstractConversionServiceOutputConverter
并包含一个 FormatProvider
实现,专为逗号分隔的列表输出而设计。转换器实现使用提供的 ConversionService
将模型文本输出转换为 java.util.List
。使用转换器
以下部分提供了如何使用可用转换器生成结构化输出的指南。Bean 输出转换器
以下示例显示如何使用BeanOutputConverter
生成演员的电影作品。
表示演员电影作品的目标记录:
ChatClient
API 应用 BeanOutputConverter 的方法:
ChatModel
API:
生成模式中的属性排序
BeanOutputConverter
通过 @JsonPropertyOrder
注解支持在生成的 JSON 模式中进行自定义属性排序。
此注解允许您指定属性在模式中出现的确切顺序,无论它们在类或记录中的声明顺序如何。
例如,要确保 ActorsFilms
记录中的属性特定排序:
泛型 Bean 类型
使用ParameterizedTypeReference
构造函数指定更复杂的目标类结构。
例如,要表示演员及其电影作品列表:
ChatModel
API:
Map 输出转换器
以下代码片段显示如何使用MapOutputConverter
将模型输出转换为地图中的数字列表。
ChatModel
API:
List 输出转换器
以下代码片段显示如何使用ListOutputConverter
将模型输出转换为冰淇淋口味列表。
ChatModel API
:
支持的 AI 模型
以下 AI 模型已经过测试,支持 List、Map 和 Bean 结构化输出。内置 JSON 模式
一些 AI 模型提供专门的配置选项来生成结构化(通常是 JSON)输出。OpenAI
OpenAI
OpenAI 结构化输出 可以确保您的模型生成严格符合您提供的 JSON Schema 的响应。您可以选择
JSON_OBJECT
,它保证模型生成的消息是有效的 JSON,或者选择 JSON_SCHEMA
并提供模式,保证模型将生成与您提供的模式匹配的响应(spring.ai.openai.chat.options.responseFormat
选项)。Azure OpenAI
Azure OpenAI
Azure OpenAI 提供
spring.ai.azure.openai.chat.options.responseFormat
选项,指定模型必须输出的格式。设置为 { "type": "json_object" }
启用 JSON 模式,它保证模型生成的消息是有效的 JSON。Ollama
Ollama
Ollama 提供
spring.ai.ollama.chat.options.format
选项来指定返回响应的格式。目前,唯一接受的值是 json
。Mistral AI
Mistral AI
Mistral AI 提供
spring.ai.mistralai.chat.options.responseFormat
选项来指定返回响应的格式。设置为 { "type": "json_object" }
启用 JSON 模式,它保证模型生成的消息是有效的 JSON。文档有误?请协助编辑
发现文档问题?点击此处直接在 GitHub 上编辑并提交 PR,帮助我们改进文档!