上一篇的聊天接口已经能用了。

但真实 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 本地模型,降低后续学习和调试成本。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐