在上一篇中,我们用几行代码跑通了 Hello World。今天我们深入挖掘 Spring AI 的核心组件——ChatClient。
如果你习惯了 Spring 的 WebClient 或者 JdbcTemplate,你会发现 ChatClient 的设计非常亲切。它采用了一套优雅的流式 API (Fluent API),让你像搭积木一样构建 AI 请求。
1. 为什么需要 ChatClient?
直接调用 AI 模型(Model)虽然可以,但 ChatClient 在此基础上这就好比你用 JDBC 还是用 Hibernate/MyBatis 的区别。ChatClient 帮你处理了:
- 请求构建(Prompt 拼装)
- 错误处理
- 结果映射(把 JSON 转成 Java 对象)
- 拦截器增强(Advisors)
2. 基础用法:构建提示词
最简单的用法我们已经见过了:
String response = chatClient.prompt()
.user("给我讲个笑话")
.call()
.content();
但它的能力远不止于此。你可以像这样构建复杂的上下文:
String response = chatClient.prompt()
.system("你是一个专业的 Java 面试官,性格严厉,只问高并发相关的问题。")
.user("我准备好了,请出题。")
.call()
.content();
通过 .system() 设定人设,通过 .user() 传入用户指令,清晰明了。
3. 杀手级功能:直接返回 Java 对象 (Entity)
这是 Java 开发者最喜欢的功能!
通常 AI 返回的是一堆文本,你需要自己解析 JSON。但在 Spring AI 里,你可以直接要求它返回一个 Java Bean。
假设我们要提取电影信息:
public record Movie(String title, String director, int year) {}
直接告诉 ChatClient 你要什么:
Movie movie = chatClient.prompt()
.user("告诉我《肖申克的救赎》的导演和年份")
.call()
.entity(Movie.class); // 自动转换!
或者返回一个列表:
List<Movie> movies = chatClient.prompt()
.user("推荐三部诺兰的电影")
.call()
.entity(new ParameterizedTypeReference<List<Movie>>() {});
Spring AI 会自动在提示词里注入格式要求,并把返回的 JSON 自动反序列化为对象。再也不用写正则去抠字符串了!
4. 流式响应 (Streaming)
大模型的生成速度通常比较慢。为了让用户体验更好,我们通常希望像 ChatGPT 那样“打字机”式地显示结果。
只需要把 .call() 换成 .stream():
Flux<String> stream = chatClient.prompt()
.user("写一篇关于 Spring Boot 的 500 字作文")
.stream()
.content();
// 在 Controller 中直接返回 Flux,前端就能看到实时效果
5. Advisors:给 AI 挂“外挂”
ChatClient 支持 Advisors(顾问/拦截器),可以在请求前后做各种增强。
记录日志 (SimpleLoggerAdvisor)
调试的时候不知道发了什么给 AI?
chatClient.prompt()
.advisors(new SimpleLoggerAdvisor())
.user("...")
.call();
带有记忆的对话 (Chat Memory)
默认情况下,AI 是记不住你刚才说了什么的。
通过添加 MessageChatMemoryAdvisor,Spring AI 会自动把历史聊天记录塞进新的请求里。
// 需要先配置 ChatMemory Bean (如 InMemoryChatMemory)
chatClient.prompt()
.advisors(new MessageChatMemoryAdvisor(chatMemory))
.user("我叫小明")
.call();
// 下一次请求
chatClient.prompt()
.advisors(new MessageChatMemoryAdvisor(chatMemory))
.user("我叫什么?") // AI 会回答:你叫小明
.call();
总结
ChatClient 是 Spring AI 中使用频率最高的接口。掌握了它的流式调用、对象映射和 Advisor 机制,你开发 AI 应用的效率会成倍提升。
下一篇,我们将进入更高级的话题:RAG(检索增强生成),看看如何让 AI 学会“查阅资料”。