Spring AI:开启 Java 应用智能化的新篇章

引言:AI 浪潮下的 Java 生态

在人工智能技术席卷全球的今天,如何让传统的 Java 应用快速、便捷地集成 AI 能力,成为了众多开发者面临的新挑战。Spring 框架作为 Java 生态的基石,以其强大的整合能力和优雅的设计哲学,再次站到了技术浪潮的前沿。Spring AI 项目的诞生,正是为了将 AI 能力无缝融入 Spring 应用开发范式,为 Java 开发者提供一套标准、统一且易于使用的 AI 应用开发接口。

本文将带你全面了解 Spring AI 的核心概念、核心功能、快速入门方法以及最佳实践,助你轻松开启 Java 应用的智能化升级之旅。

什么是 Spring AI?

Spring AI 是 Spring 官方推出的一个项目,旨在为基于 Spring 的应用程序集成人工智能功能提供一个抽象层。它的核心目标是简化 AI 功能的集成,让开发者无需深入理解不同 AI 提供商(如 OpenAI、Azure OpenAI、Anthropic、Google Vertex AI 等)的复杂 API 细节,就能在应用中调用大语言模型(LLM)、生成嵌入向量、进行多模态交互等。

你可以将其理解为“AI 领域的 Spring Data”。正如 Spring Data 为各种数据库提供了统一的 Repository 抽象,Spring AI 则为各种 AI 服务提供了统一的ChatClientEmbeddingClient等抽象接口。

核心价值

  1. 抽象与统一:屏蔽底层 AI 供应商的 API 差异,使用一套 Spring 风格的 API 进行开发。
  2. 便捷集成:通过熟悉的 Spring Boot 自动配置和 Starter 依赖,快速引入 AI 能力。
  3. 生产就绪:集成了连接池管理、重试机制、可观测性(Micrometer)等企业级特性。
  4. 生态融合:与 Spring 生态的其他项目(如 Spring Security, Spring Data, Spring Integration)天然集成。

核心概念与模块

Spring AI 围绕几个核心抽象构建,理解它们是高效使用该框架的关键。

1. 模型(Model)与客户端(Client)

  • ChatModel / ChatClient:用于与大语言模型进行对话式交互的核心接口。你通过它发送Prompt(提示),并接收ChatResponse(模型响应)。
  • EmbeddingModel / EmbeddingClient:用于将文本(或图像)转换为数值向量(嵌入)的接口。这是实现语义搜索、推荐、聚类等任务的基础。
  • ImageModel:用于图像生成或理解的接口(部分供应商支持)。

2. 提示词(Prompt)与提示词模板(PromptTemplate)

  • Prompt:包含一组Message对象(如系统消息、用户消息)的容器,是发给模型的请求。
  • PromptTemplate:一个强大的工具,允许你创建带有占位符(如{topic})的提示词字符串,在运行时动态填充内容,实现提示词的复用和工程化。

3. 输出解析器(OutputParser)

用于将模型返回的非结构化文本响应,解析为应用程序所需的强类型对象(如POJOList等)。Spring AI 内置了BeanOutputParserListOutputParser等常用解析器。

4. 向量存储(Vector Store)集成

Spring AI 提供了与主流向量数据库(如 Pinecone、Redis、PGVector、Chroma 等)的集成抽象VectorStore。结合EmbeddingClient,可以轻松实现文档的存储、检索(RAG)功能。

快速入门:构建你的第一个 AI 应用

下面我们通过一个简单的例子,快速体验 Spring AI 的魅力。我们将创建一个 Spring Boot 应用,调用 OpenAI 的模型进行对话。

步骤 1:创建项目并添加依赖

使用 Spring Initializr 创建一个新的 Spring Boot 项目,选择以下依赖:

  • Spring Web
  • Spring AI OpenAI(如果你使用其他模型,如 Azure OpenAI,则选择对应的 Starter)

对应的pom.xml依赖如下:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency>

步骤 2:配置 API 密钥

application.propertiesapplication.yml中配置你的 OpenAI API 密钥和基础 URL(如果使用 Azure OpenAI 或其他兼容服务):

# application.properties spring.ai.openai.api-key=${OPENAI_API_KEY} # 可选,如果使用 Azure OpenAI 或其他兼容端点 # spring.ai.openai.base-url=https://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.chatClient=chatClient;}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.chatService=chatService;}@GetMapping("/chat")publicStringchat(@RequestParam(value="msg",defaultValue="Hello")Stringmessage){returnchatService.chat(message);}}

步骤 5:运行并测试

启动 Spring Boot 应用,访问http://localhost:8080/chat?msg=用Java写一个Hello World程序,你将收到来自 AI 模型的代码回复。

进阶功能与实践

1. 使用 PromptTemplate 和 System Message

通过System Prompt可以更好地控制模型的行为。

publicStringgeneratePoemAbout(Stringtopic){PromptTemplatepromptTemplate=newPromptTemplate(""" 你是一位诗人。请以{style}风格,创作一首关于{topic}的短诗。 """);Map<String,Object>params=Map.of("topic",topic,"style","七言绝句");Promptprompt=promptTemplate.create(params);returnchatClient.prompt(prompt).call().content();}

2. 流式响应(Streaming)

对于需要实时显示模型生成结果的场景(如聊天界面),可以使用流式响应。

importorg.springframework.ai.chat.model.ChatResponse;importreactor.core.publisher.Flux;publicFlux<String>streamChat(Stringmessage){Flux<ChatResponse>responseFlux=chatClient.prompt().user(message).stream().call();returnresponseFlux.map(chunk->chunk.getResult().getOutput().getContent());}// 在Controller中返回 Flux<String> 即可实现 SSE (Server-Sent Events)

3. 实现 RAG(检索增强生成)

RAG 是当前构建知识库问答系统的核心模式。Spring AI 使其实现变得异常简单。

// 伪代码流程// 1. 将文档分块,并通过 EmbeddingClient 转换为向量,存入 VectorStore。// 2. 当用户提问时,将问题转换为向量,在 VectorStore 中检索最相关的文档块。// 3. 将检索到的文档块作为上下文,与用户问题一起构建 Prompt,发送给 ChatModel。// 4. 返回基于上下文生成的答案。