跳到主要内容
📖 本章预览

本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。

第5章 驯服 AI 输出:结构化响应解析

5.1 为什么需要输出解析

LLM 返回的是自由文本,但业务代码需要的是结构化数据(Java 对象、JSON、列表)。StructuredOutputConverter 就是这座桥梁——它告诉模型"按什么格式输出",然后把模型的文本响应解析为 Java 对象。

注意: 早期版本(1.0.0-M1 之前)的类名是 BeanOutputParser / ListOutputParser / MapOutputParser, 在 Spring AI 1.0+ 中已统一重命名为 BeanOutputConverter / ListOutputConverter / MapOutputConverter, 包路径为 org.springframework.ai.converter.*。如果你在源码中搜不到 BeanOutputParser,就是这个原因。

用户问题 → Prompt(含格式指令)→ LLM → 文本响应 → OutputConverter → Java 对象

5.2 BeanOutputConverter:映射为 Java POJO

原理: BeanOutputConverter 会自动根据目标类的字段生成 JSON Schema 格式指令,注入到 Prompt 中,引导模型输出合规 JSON,然后反序列化为 Java 对象。

/** 目标 POJO */
public record BookInfo(
String title,
String author,
int publishYear,
List<String> tags,
String summary
) {}
@Service
public class StructuredOutputService {

@Autowired
private ChatModel chatModel;

/**
* 将 LLM 输出直接映射为 Java 对象
*/
public BookInfo extractBookInfo(String bookDescription) {
BeanOutputConverter<BookInfo> parser = new BeanOutputConverter<>(BookInfo.class);

// parser.getFormat() 会生成类似:
// "请用以下 JSON 格式回答:{title:string, author:string, ...}"
String formatInstruction = parser.getFormat();

PromptTemplate template = new PromptTemplate("""
从以下描述中提取书籍信息。
{format}

描述:{description}
""");

Prompt prompt = template.create(Map.of(
"format", formatInstruction,
"description", bookDescription
));

String response = chatModel.call(prompt).getResult().getOutput().getText();
return parser.parse(response);
}
}

5.3 ListOutputConverter 与 MapOutputConverter

/**
* ListOutputConverter:输出为字符串列表
*/
public List<String> generateKeywords(String article) {
ListOutputConverter parser = new ListOutputConverter(new DefaultConversionService());

PromptTemplate template = new PromptTemplate("""
提取以下文章的关键词,{format}

文章:{article}
""");

Prompt prompt = template.create(Map.of(
"format", parser.getFormat(),
"article", article
));

String response = chatModel.call(prompt).getResult().getOutput().getText();
return parser.parse(response);
}
/**
* MapOutputConverter:输出为 Map
*/
public Map<String, Object> analyzeCode(String code) {
MapOutputConverter parser = new MapOutputConverter();

PromptTemplate template = new PromptTemplate("""
分析以下代码的质量,输出包含 score(1-10)issues(问题列表)suggestion(改进建议) 的结果。
{format}



🔒 解锁完整内容

本章剩余内容需要解锁后查看

以上仅为本章部分预览内容,完整内容包含更多深度源码解析、实战代码和面试要点。

加入知识星球你将获得:

  • ✅ 全部 26 章完整内容 + 持续更新
  • ✅ 配套源码 + 实战项目
  • ✅ 一对一答疑 + 面试辅导
  • ✅ 简历优化 + 内推机会

📚 本章完整目录

以下为本章完整目录结构,加入知识星球即可解锁全部内容。

5.4 流式响应(Streaming)

5.5 SSE 流式响应进阶

5.5.1 结构化流式响应

5.5.2 前端对接 SSE

5.5.3 POST 请求的流式响应

5.6 异常处理与重试