【SpringAI 12】对话机器人进阶
我们都前面知道了,简单的机器人有两种方式:流式调用和同步调用
importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importreactor.core.publisher.Flux;@RestControllerpublicclassChatController{privatefinalChatClientchatClient;// 注入配置好的 ChatClientpublicChatController(ChatClientchatClient){this.chatClient=chatClient;}/** * 同步调用:获取完整回复 */@GetMapping("/chat")publicStringchat(@RequestParam(value="message",defaultValue="你好!")Stringmessage){returnchatClient.prompt().user(message).call().content();}/** * 流式调用:实时返回生成内容(适合前端打字机效果) */@GetMapping("/chat/stream")publicFlux<String>chatStream(@RequestParam(value="message",defaultValue="你好!")Stringmessage){returnchatClient.prompt().user(message).stream().content();}}我们这里讲一点就是上一篇.defaultSystem(“…”): 设置全局默认的系统提示词。这意味着每次使用该 ChatClient 发起对话时,都会隐含地带上这条指令,让模型扮演“可爱的助手毛毛虫”。
packagecom.example.chatai.config;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.ai.ollama.OllamaChatModel;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@ConfigurationpublicclassChatClientConfig{@BeanpublicChatClientchatClient(OllamaChatModelmodel){returnChatClient.builder(model).defaultSystem("你是可爱的助手,名字叫毛毛虫").build();}}但是有个点要注意
A. 动态覆盖系统提示词
虽然配置中设置了默认 System Prompt,但在某些场景下可能需要临时修改。可以在调用时动态指定:
chatClient.prompt().system("你现在是一个专业的Java工程师")// 覆盖默认的“毛毛虫”设定.user("如何优化 Netty 的性能?").call().content();B. 添加记忆功能(Message History)
ChatClient 本身是无状态的。如果需要实现多轮对话记忆,需要手动维护 Message 列表或使用 Spring AI 提供的 ChatMemory 机制。
C. 异常处理与超时
在生产环境中,建议为 ChatClient 配置重试机制或超时控制,可以通过底层的 RestTemplate 或 WebClient 配置来实现,或者在 Service 层包裹调用逻辑。
总结
ChatClientConfig 是一个标准且简洁的 Spring AI 配置方式。它利用了 Spring 的依赖注入和 Spring AI 的构建者模式,将模型细节与业务逻辑解耦。只需确保 Ollama 服务正常运行且依赖配置正确,即可快速构建基于本地大模型的 AI 应用。
