📖 本章预览
本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。
第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 章完整内容 + 持续更新
- ✅ 配套源码 + 实战项目
- ✅ 一对一答疑 + 面试辅导
- ✅ 简历优化 + 内推机会
📚 本章完整目录
以下为本章完整目录结构,加入知识星球即可解锁全部内容。