
结合之前我们讨论过的低延迟大模型推理网关、Netty高性能网络通信的技术背景以下是SpringAI对话机器人的快速入门全流程适配Spring Boot生态可快速搭建出具备上下文记忆的可用对话机器人一、前置环境准备基础依赖JDK 17、Spring Boot 3.x 版本适配Spring AI的自动配置特性。大模型服务提前部署Ollama本地大模型或准备好OpenAI、DeepSeek等大模型的API密钥。二、项目初始化与依赖配置新建Spring Boot项目在pom.xml中引入Spring AI核心依赖以Ollama对接为例1SpringAI使用ollamadependencyManagementdependenciesdependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-bom/artifactIdversion1.0.0-M4/version!--请使用最新的稳定版本或里程碑版本--typepom/typescopeimport/scope/dependency/dependencies/dependencyManagementdependenciesdependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-ollama-spring-boot-starter/artifactIdversion1.0.0-M4/version/dependency/dependencies2SpringAI使用使用OpenAIdependencyManagementdependenciesdependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-bom/artifactIdversion1.0.0-M4/version!--请使用最新的稳定版本或里程碑版本--typepom/typescopeimport/scope/dependency/dependencies/dependencyManagementdependenciesdependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-openai-spring-boot-starter/artifactId/dependency/dependencies三模型配置在application.yml中配置大模型连接信息1SpringAI使用ollamaspring:ai:ollama:base-url:http://localhost:11434chat:options:model:deepseek-r1:latest2SpringAI使用使用OpenAIapplication.ymlspring:ai:openai:base-url:https://dashscope.aliyuncs.com/compatible-mode api-key:${OPENAI_API_KEY}# 从环境变量读取避免硬编码 chat:options:model:gpt-4o # 指定使用的模型如 gpt-4o,gpt-3.5-turbo,qwen-max等 temperature:0.7# 控制生成的随机性 值越大输出结果越随机或者在 application.properties 中配置spring.ai.openai.base-urlhttps://dashscope.aliyuncs.com/compatible-mode spring.ai.openai.api-key${OPENAI_API_KEY} spring.ai.openai.chat.options.modelgpt-4o spring.ai.openai.chat.options.temperature0.7注意在启动应用前需确保环境中已设置 OPENAI_API_KEY 变量例如在终端执行 export OPENAI_API_KEYsk-xxxxxx。代码实现与调用Spring AI 提供了自动配置的 ChatClient 或具体的 OpenAiChatModel Bean可直接注入使用。四、核心功能快速实现1ollama方式方式一配置对话上下文记忆通过内置组件实现对话历史留存保障多轮对话的上下文连贯性BeanpublicChatMemorychatMemory(){returnnewInMemoryChatMemory();// 会将所有历史消息全量传入模型易导致 Token 溢出 。 已经过时弃用已经被重构了 InMemoryChatMemoryRepository 替代}packagecom.example.chatai.config;importorg.springframework.ai.chat.memory.ChatMemory;importorg.springframework.ai.chat.memory.InMemoryChatMemoryRepository;importorg.springframework.ai.chat.memory.MessageWindowChatMemory;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;ConfigurationpublicclassChatMemoryConfig{/** * 配置基于内存的消息仓库 * 生产环境建议替换为 RedisChatMemoryRepository 或 JdbcChatMemoryRepository */BeanpublicInMemoryChatMemoryRepositorychatMemoryRepository(){returnnewInMemoryChatMemoryRepository();}/** * 配置聊天记忆实例 * maxMessages: 设置保留最近的消息数量避免上下文过长导致费用增加或超出模型限制 */BeanpublicChatMemorychatMemory(InMemoryChatMemoryRepositoryrepository){returnMessageWindowChatMemory.builder().chatMemoryRepository(repository).maxMessages(10)// 保留最近10条消息.build();}}构建对话引擎整合AI客户端、对话模板和记忆组件生成核心对话处理单元BeanpublicChatEnginechatEngine(AiClientaiClient,ChatMemorymemory){returnChatEngine.builder(aiClient).memory(memory).build();}暴露Web交互接口快速编写REST接口实现用户请求的接收与回复返回RestControllerRequestMapping(/api/chat)publicclassChatController{AutowiredprivateChatEnginechatEngine;PostMappingpublicStringchat(RequestParamStringquestion){returnchatEngine.chat(question);}}方式二BeanpublicChatClientchatClient(OllamaChatModelmodel){returnChatClient.builder(model).defaultSystem(你是可爱的助手名字叫小团团).build();}RestControllerRequestMapping(/chat)publicclassChatController{privatefinalChatClientchatClient;// 直接注入我们配置好的ChatClientpublicChatController(ChatClientchatClient){this.chatClientchatClient;}GetMapping(producesMediaType.TEXT_EVENT_STREAM_VALUE)publicFluxStringchat(RequestParamStringuserInput){// 自动带上小团团的人设返回流式响应returnchatClient.prompt().user(userInput).stream().content();}}2使用OpenAI方式方式一使用通用的 ChatClient推荐ChatClient 是 Spring AI 提供的高级抽象支持流式输出和更灵活的提示词构建。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;// 注入自动配置的 ChatClient.BuilderpublicChatController(ChatClient.BuilderchatClientBuilder){this.chatClientchatClientBuilder.build();}GetMapping(/ai/chat)publicStringchat(RequestParam(valuemessage,defaultValueHello!)Stringmessage){returnchatClient.prompt().user(message).call().content();}GetMapping(/ai/chat/stream)publicFluxStringchatStream(RequestParam(valuemessage,defaultValueHello!)Stringmessage){returnchatClient.prompt().user(message).stream().content();}}方式二直接使用 OpenAiChatModel如果需要更底层的控制可以直接注入 OpenAiChatModel。importorg.springframework.ai.openai.OpenAiChatModel;importorg.springframework.ai.chat.model.ChatResponse;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassLegacyChatController{privatefinalOpenAiChatModelchatModel;publicLegacyChatController(OpenAiChatModelchatModel){this.chatModelchatModel;}GetMapping(/ai/generate)publicStringgenerate(RequestParam(valuemessage,defaultValueTell me a joke)Stringmessage){returnchatModel.call(message);}}常见问题排查401 Unauthorized 错误通常意味着 API Key 未正确加载。检查环境变量是否生效或确认 application.yml 中的占位符 ${OPENAI_API_KEY} 是否被正确解析。启用调试日志 logging.level.org.springframework.aiDEBUG 可查看属性绑定详情。版本冲突确保 spring-ai-openai-spring-boot-starter 的版本与 Spring Boot 版本兼容。Spring Boot 3.2 通常对应 Spring AI 0.8.1 或 1.0.0。网络问题如果在国内访问 OpenAI API可能需要配置代理。可以通过设置 JVM 参数 -Dhttp.proxyHost 和 -Dhttp.proxyPort 或在配置类中自定义 OpenAiApi 的 RestTemplate 来实现。五、启动验证启动Spring Boot应用调用http://localhost:8080/api/chat?question你好即可收到大模型返回的对话回复完成基础对话机器人的搭建。