引言AI 浪潮下的 Java 生态在人工智能技术席卷全球的今天如何让传统的 Java 应用快速、便捷地集成 AI 能力成为了众多开发者面临的新挑战。Spring 框架作为 Java 生态的基石以其强大的整合能力和优雅的设计哲学再次站到了技术浪潮的前沿。Spring AI 项目的诞生正是为了将 AI 能力无缝融入 Spring 应用开发范式为 Java 开发者提供一套标准、统一且易于使用的 AI 应用开发接口。本文将带你全面了解 Spring AI 的核心概念、核心功能、快速入门方法以及最佳实践助你轻松开启 Java 应用的智能化升级之旅。什么是 Spring AISpring AI 是 Spring 官方推出的一个项目旨在为基于 Spring 的应用程序集成人工智能功能提供一个抽象层。它的核心目标是简化 AI 功能的集成让开发者无需深入理解不同 AI 提供商如 OpenAI、Azure OpenAI、Anthropic、Google Vertex AI 等的复杂 API 细节就能在应用中调用大语言模型LLM、生成嵌入向量、进行多模态交互等。你可以将其理解为“AI 领域的 Spring Data”。正如 Spring Data 为各种数据库提供了统一的 Repository 抽象Spring AI 则为各种 AI 服务提供了统一的ChatClient、EmbeddingClient等抽象接口。核心价值抽象与统一屏蔽底层 AI 供应商的 API 差异使用一套 Spring 风格的 API 进行开发。便捷集成通过熟悉的 Spring Boot 自动配置和 Starter 依赖快速引入 AI 能力。生产就绪集成了连接池管理、重试机制、可观测性Micrometer等企业级特性。生态融合与 Spring 生态的其他项目如 Spring Security, Spring Data, Spring Integration天然集成。核心概念与模块Spring AI 围绕几个核心抽象构建理解它们是高效使用该框架的关键。1. 模型Model与客户端ClientChatModel / ChatClient用于与大语言模型进行对话式交互的核心接口。你通过它发送Prompt提示并接收ChatResponse模型响应。EmbeddingModel / EmbeddingClient用于将文本或图像转换为数值向量嵌入的接口。这是实现语义搜索、推荐、聚类等任务的基础。ImageModel用于图像生成或理解的接口部分供应商支持。2. 提示词Prompt与提示词模板PromptTemplatePrompt包含一组Message对象如系统消息、用户消息的容器是发给模型的请求。PromptTemplate一个强大的工具允许你创建带有占位符如{topic}的提示词字符串在运行时动态填充内容实现提示词的复用和工程化。3. 输出解析器OutputParser用于将模型返回的非结构化文本响应解析为应用程序所需的强类型对象如POJO、List等。Spring AI 内置了BeanOutputParser、ListOutputParser等常用解析器。4. 向量存储Vector Store集成Spring AI 提供了与主流向量数据库如 Pinecone、Redis、PGVector、Chroma 等的集成抽象VectorStore。结合EmbeddingClient可以轻松实现文档的存储、检索RAG功能。快速入门构建你的第一个 AI 应用下面我们通过一个简单的例子快速体验 Spring AI 的魅力。我们将创建一个 Spring Boot 应用调用 OpenAI 的模型进行对话。步骤 1创建项目并添加依赖使用 Spring Initializr 创建一个新的 Spring Boot 项目选择以下依赖Spring WebSpring AI OpenAI(如果你使用其他模型如 Azure OpenAI则选择对应的 Starter)对应的pom.xml依赖如下dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-openai-spring-boot-starter/artifactId/dependency步骤 2配置 API 密钥在application.properties或application.yml中配置你的 OpenAI API 密钥和基础 URL如果使用 Azure OpenAI 或其他兼容服务# application.properties spring.ai.openai.api-key${OPENAI_API_KEY} # 可选如果使用 Azure OpenAI 或其他兼容端点 # spring.ai.openai.base-urlhttps://your-endpoint.openai.azure.com/请将${OPENAI_API_KEY}替换为你的实际密钥或通过环境变量设置。步骤 3编写一个简单的对话服务创建一个Service注入ChatClient并调用它。importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.stereotype.Service;ServicepublicclassSimpleChatService{privatefinalChatClientchatClient;// 通过构造器注入 ChatClientpublicSimpleChatService(ChatClientchatClient){this.chatClientchatClient;}publicStringchat(Stringmessage){returnchatClient.prompt().user(message)// 设置用户消息.call()// 调用模型.content();// 获取响应的文本内容}}步骤 4创建 REST 控制器暴露接口importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassChatController{privatefinalSimpleChatServicechatService;publicChatController(SimpleChatServicechatService){this.chatServicechatService;}GetMapping(/chat)publicStringchat(RequestParam(valuemsg,defaultValueHello)Stringmessage){returnchatService.chat(message);}}步骤 5运行并测试启动 Spring Boot 应用访问http://localhost:8080/chat?msg用Java写一个Hello World程序你将收到来自 AI 模型的代码回复。进阶功能与实践1. 使用 PromptTemplate 和 System Message通过System Prompt可以更好地控制模型的行为。publicStringgeneratePoemAbout(Stringtopic){PromptTemplatepromptTemplatenewPromptTemplate( 你是一位诗人。请以{style}风格创作一首关于{topic}的短诗。 );MapString,ObjectparamsMap.of(topic,topic,style,七言绝句);PromptpromptpromptTemplate.create(params);returnchatClient.prompt(prompt).call().content();}2. 流式响应Streaming对于需要实时显示模型生成结果的场景如聊天界面可以使用流式响应。importorg.springframework.ai.chat.model.ChatResponse;importreactor.core.publisher.Flux;publicFluxStringstreamChat(Stringmessage){FluxChatResponseresponseFluxchatClient.prompt().user(message).stream().call();returnresponseFlux.map(chunk-chunk.getResult().getOutput().getContent());}// 在Controller中返回 FluxString 即可实现 SSE (Server-Sent Events)3. 实现 RAG检索增强生成RAG 是当前构建知识库问答系统的核心模式。Spring AI 使其实现变得异常简单。// 伪代码流程// 1. 将文档分块并通过 EmbeddingClient 转换为向量存入 VectorStore。// 2. 当用户提问时将问题转换为向量在 VectorStore 中检索最相关的文档块。// 3. 将检索到的文档块作为上下文与用户问题一起构建 Prompt发送给 ChatModel。// 4. 返回基于上下文生成的答案。
Spring AI:开启 Java 应用智能化的新篇章
引言AI 浪潮下的 Java 生态在人工智能技术席卷全球的今天如何让传统的 Java 应用快速、便捷地集成 AI 能力成为了众多开发者面临的新挑战。Spring 框架作为 Java 生态的基石以其强大的整合能力和优雅的设计哲学再次站到了技术浪潮的前沿。Spring AI 项目的诞生正是为了将 AI 能力无缝融入 Spring 应用开发范式为 Java 开发者提供一套标准、统一且易于使用的 AI 应用开发接口。本文将带你全面了解 Spring AI 的核心概念、核心功能、快速入门方法以及最佳实践助你轻松开启 Java 应用的智能化升级之旅。什么是 Spring AISpring AI 是 Spring 官方推出的一个项目旨在为基于 Spring 的应用程序集成人工智能功能提供一个抽象层。它的核心目标是简化 AI 功能的集成让开发者无需深入理解不同 AI 提供商如 OpenAI、Azure OpenAI、Anthropic、Google Vertex AI 等的复杂 API 细节就能在应用中调用大语言模型LLM、生成嵌入向量、进行多模态交互等。你可以将其理解为“AI 领域的 Spring Data”。正如 Spring Data 为各种数据库提供了统一的 Repository 抽象Spring AI 则为各种 AI 服务提供了统一的ChatClient、EmbeddingClient等抽象接口。核心价值抽象与统一屏蔽底层 AI 供应商的 API 差异使用一套 Spring 风格的 API 进行开发。便捷集成通过熟悉的 Spring Boot 自动配置和 Starter 依赖快速引入 AI 能力。生产就绪集成了连接池管理、重试机制、可观测性Micrometer等企业级特性。生态融合与 Spring 生态的其他项目如 Spring Security, Spring Data, Spring Integration天然集成。核心概念与模块Spring AI 围绕几个核心抽象构建理解它们是高效使用该框架的关键。1. 模型Model与客户端ClientChatModel / ChatClient用于与大语言模型进行对话式交互的核心接口。你通过它发送Prompt提示并接收ChatResponse模型响应。EmbeddingModel / EmbeddingClient用于将文本或图像转换为数值向量嵌入的接口。这是实现语义搜索、推荐、聚类等任务的基础。ImageModel用于图像生成或理解的接口部分供应商支持。2. 提示词Prompt与提示词模板PromptTemplatePrompt包含一组Message对象如系统消息、用户消息的容器是发给模型的请求。PromptTemplate一个强大的工具允许你创建带有占位符如{topic}的提示词字符串在运行时动态填充内容实现提示词的复用和工程化。3. 输出解析器OutputParser用于将模型返回的非结构化文本响应解析为应用程序所需的强类型对象如POJO、List等。Spring AI 内置了BeanOutputParser、ListOutputParser等常用解析器。4. 向量存储Vector Store集成Spring AI 提供了与主流向量数据库如 Pinecone、Redis、PGVector、Chroma 等的集成抽象VectorStore。结合EmbeddingClient可以轻松实现文档的存储、检索RAG功能。快速入门构建你的第一个 AI 应用下面我们通过一个简单的例子快速体验 Spring AI 的魅力。我们将创建一个 Spring Boot 应用调用 OpenAI 的模型进行对话。步骤 1创建项目并添加依赖使用 Spring Initializr 创建一个新的 Spring Boot 项目选择以下依赖Spring WebSpring AI OpenAI(如果你使用其他模型如 Azure OpenAI则选择对应的 Starter)对应的pom.xml依赖如下dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-openai-spring-boot-starter/artifactId/dependency步骤 2配置 API 密钥在application.properties或application.yml中配置你的 OpenAI API 密钥和基础 URL如果使用 Azure OpenAI 或其他兼容服务# application.properties spring.ai.openai.api-key${OPENAI_API_KEY} # 可选如果使用 Azure OpenAI 或其他兼容端点 # spring.ai.openai.base-urlhttps://your-endpoint.openai.azure.com/请将${OPENAI_API_KEY}替换为你的实际密钥或通过环境变量设置。步骤 3编写一个简单的对话服务创建一个Service注入ChatClient并调用它。importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.stereotype.Service;ServicepublicclassSimpleChatService{privatefinalChatClientchatClient;// 通过构造器注入 ChatClientpublicSimpleChatService(ChatClientchatClient){this.chatClientchatClient;}publicStringchat(Stringmessage){returnchatClient.prompt().user(message)// 设置用户消息.call()// 调用模型.content();// 获取响应的文本内容}}步骤 4创建 REST 控制器暴露接口importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassChatController{privatefinalSimpleChatServicechatService;publicChatController(SimpleChatServicechatService){this.chatServicechatService;}GetMapping(/chat)publicStringchat(RequestParam(valuemsg,defaultValueHello)Stringmessage){returnchatService.chat(message);}}步骤 5运行并测试启动 Spring Boot 应用访问http://localhost:8080/chat?msg用Java写一个Hello World程序你将收到来自 AI 模型的代码回复。进阶功能与实践1. 使用 PromptTemplate 和 System Message通过System Prompt可以更好地控制模型的行为。publicStringgeneratePoemAbout(Stringtopic){PromptTemplatepromptTemplatenewPromptTemplate( 你是一位诗人。请以{style}风格创作一首关于{topic}的短诗。 );MapString,ObjectparamsMap.of(topic,topic,style,七言绝句);PromptpromptpromptTemplate.create(params);returnchatClient.prompt(prompt).call().content();}2. 流式响应Streaming对于需要实时显示模型生成结果的场景如聊天界面可以使用流式响应。importorg.springframework.ai.chat.model.ChatResponse;importreactor.core.publisher.Flux;publicFluxStringstreamChat(Stringmessage){FluxChatResponseresponseFluxchatClient.prompt().user(message).stream().call();returnresponseFlux.map(chunk-chunk.getResult().getOutput().getContent());}// 在Controller中返回 FluxString 即可实现 SSE (Server-Sent Events)3. 实现 RAG检索增强生成RAG 是当前构建知识库问答系统的核心模式。Spring AI 使其实现变得异常简单。// 伪代码流程// 1. 将文档分块并通过 EmbeddingClient 转换为向量存入 VectorStore。// 2. 当用户提问时将问题转换为向量在 VectorStore 中检索最相关的文档块。// 3. 将检索到的文档块作为上下文与用户问题一起构建 Prompt发送给 ChatModel。// 4. 返回基于上下文生成的答案。