从零实操 Spring AI 第 3 篇:流式输出、系统提示词和结构化返回
·
上一篇的聊天接口已经能用了。
但真实 AI 应用不能只停留在“输入一句话,返回一段文本”。
这一篇把三个很常用的能力一起补上:流式输出、系统提示词、结构化返回。
答案先说
这一篇只做一件事:让聊天接口更接近真实业务:能流式返回、能控制角色、能返回 Java 对象。
读完并跟着做完后,项目会有一个明确的新增能力,而不是只停留在概念介绍。
上一篇做到哪了
第 2 篇我们写出了第一个聊天接口,并用 ChatClient 做了重构。
这篇会在上一节的基础上继续往前走。
先看一张图

这张图就是本篇的主线。先把流程看清楚,再进入代码会轻松很多。
核心概念
这三个能力分别解决三个问题:
- 流式输出解决用户等待体验
- 系统提示词解决 AI 的角色和边界
- 结构化返回解决后端业务处理问题
它们都不复杂,但都很常用。
开始实操
1. 实现流式输出
@GetMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> stream(String message) {
return chatClient
.prompt()
.user(message)
.stream()
.content();
}
2. 添加系统提示词
private static final String SYSTEM_PROMPT = """
你是一个企业知识库问答助手。
请用简洁、准确的中文回答用户问题。
如果无法确定答案,请明确说明不知道,不要编造。
""";
调用时带上系统提示词:
return chatClient
.prompt()
.system(SYSTEM_PROMPT)
.user(message)
.call()
.content();
3. 返回 Java 对象
public record QuestionCategory(
String category,
String reason,
Integer confidence
) {
}
QuestionCategory result = chatClient
.prompt()
.user(message)
.call()
.entity(QuestionCategory.class);
运行效果
流式接口测试:
curl -N "http://localhost:8080/ai/chat/stream?message=介绍一下 Spring AI 的核心能力"
结构化返回这里后续补充真实 JSON 结果。
踩坑记录
这里先列出本篇最可能遇到的问题,后面实操时再补充真实截图和日志。
- curl 测试流式时忘记加
-N - 系统提示词写得太宽泛,模型仍然自由发挥
- 结构化返回字段类型不匹配
- 模型返回内容不是合法 JSON
- 把太多规则塞进系统提示词,导致维护困难
项目里怎么理解
这一篇开始让项目从 Demo 走向业务应用。AI 不只是能回答,还能被约束、能改善体验、能返回程序可处理的数据。
本篇小结
这一篇完成的不是一个孤立知识点,而是让项目继续向最终的“企业知识库问答助手”靠近了一步。
下一篇预告
下一篇我们会接入 Ollama 本地模型,降低后续学习和调试成本。
更多推荐

所有评论(0)