Spring AI:Java开发者的福音

大家好。生成式AI正在改变软件的构建方式——从聊天机器人到智能自动化。对于Java和Spring Boot开发者来说,掌握这一转变不再只是一个选项——可以说这是当今就业市场上最热门、最赚钱的技能。企业正在迫切寻找能够将AI引入其现有企业技术栈的工程师。

但如果你仔细观察,如今大多数教程都围绕Python生态系统,比如LangChain或LlamaIndex。

这对于实验来说很好。但企业系统呢? 它们绝大多数构建在Java、Spring Boot和微服务之上。这就造成了一个巨大的鸿沟。如何在不重写整个技术栈的情况下将GenAI集成到企业Java系统中?这就是Spring AI发挥作用的地方——它充当了现代AI能力与久经考验的Spring生态系统之间的桥梁。

1. 为什么企业GenAI需要Java和Spring

虽然Python在数据科学实验室中占主导地位,但Java在数据中心中占主导地位。现实世界的AI集成需要:

  • 可扩展性:通过Spring的非阻塞I/O处理数百万请求。
  • 安全性:将AI与现有的OAuth2和Spring Security协议集成。
  • 可维护性:Python在大规模构建中往往缺乏的强类型和清晰的设计模式。

2. Spring框架回顾(AI语境)

在我们将AI引入画面之前,让我们快速回顾一下为什么Spring在企业开发中占主导地位。

Spring是一个Java框架,旨在简化可扩展和可维护应用程序的构建。

它提供:

  • 依赖注入(DI) → 松耦合
  • 控制反转(IoC) → 更好的生命周期管理
  • 模块化架构 → 易于扩展

典型的Spring Boot架构

  • Controller → 处理HTTP请求* Service → 业务逻辑* Repository → 数据访问

这种结构允许团队干净地扩展应用程序。

3. 缺失的环节:将GenAI引入Spring

在Spring AI之前,Java开发者面临的是一种"蛮荒西部"的场景:

没有统一的SDK:每个LLM都有不同的自定义Java包装器。

手动解析:开发者必须手动将JSON字符串映射到Java对象。

样板代码过载:管理提示和历史记录是重复且容易出错的。

4. Spring AI简介

Spring AI为AI提供了统一接口。它将LLM当作数据库来对待——你可以连接它、查询它,并将它抽象化。

关键优势

  • 提供商可移植性:编写一次代码;通过更改属性文件即可从OpenAI切换到Azure或本地Ollama实例。
  • Spring原生:它感觉就像Spring。如果你了解ServiceRestTemplate,你已经掌握了Spring AI的80%。

5. Spring AI核心概念

你需要掌握三个构建模块:

6. 设置你的项目

A. 依赖将starter添加到你的pom.xml。这会自动处理API连接的所有繁重工作。

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

B. 配置

连接不需要任何代码。只需将你的密钥添加到application.properties

spring.ai.openai.api-key=${OPENAI_API_KEY}
spring.ai.openai.chat.options.model=gpt-4o

6.1 选择你的LLM和向量数据库

在编写代码之前,你需要决定应用程序的"大脑"放在哪里。Spring AI使得以后切换这些变得轻而易举,但以下是你的初始技术栈:

LLM(大语言模型)

在本指南中,我们主要使用OpenAI GPT-4o,因为它具有高推理能力,但Spring AI允许轻松的混合方式:

  • 云端(OpenAI/Azure):最适合高质量响应和复杂逻辑。
  • 本地(Ollama):最适合开发、离线测试或严格的数据隐私。你可以在自己的机器上运行Llama 3或Mistral等模型。

可移植性的力量

从付费云模型切换到免费本地模型就像更改属性一样简单:

# OpenAI
spring.ai.openai.api-key=${OPENAI_API_KEY}

# OR Ollama
spring.ai.ollama.base-url=http://localhost:11434

向量数据库("记忆")

虽然这部分专注于聊天,但企业系统最终需要一个存储"嵌入"(向量化数据)的地方,用于RAG(检索增强生成)。

  • 对于Java开发者:带有pgvector的PostgreSQL通常是首选,因为它适合现有的数据库基础设施。
  • 其他选项:Pinecone、Redis或Weaviate都由Spring AI原生支持。

本文专注于LLM集成(聊天用例)。

7. 编写你的第一个AI API(企业方式)

在真实的Spring Boot应用程序中,我们将Web层(Controller)与业务逻辑(Service)分开。以下是如何构建一个干净的、企业级的AI端点。

7.1 AI服务层

这是实际AI编排发生的地方。我们在这里注入ChatClient,以便它可以在应用程序的不同部分复用。

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.stereotype.Service;

@Service
public class AiChatService {

    private final ChatClient chatClient;

    // Use the Builder to instantiate the ChatClient
    public AiChatService(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    public String getJoke(String topic) {
        return chatClient.prompt()
                .system("You are a helpful assistant that tells clean, tech-related jokes.")
                .user("Tell me a joke about: " + topic)
                .call()
                .content();
    }
}

注意AI调用是多么直观。Spring AI使用流式构建器模式来构造请求。让我们分解这个链中具体发生了什么:

  • chatClient.prompt():这启动AI请求。
  • .system("You are a helpful assistant…"):这设置了系统消息。在企业应用中,这至关重要。它定义了角色、设定了边界,并充当护栏,防止AI偏离主题。
  • .user("Tell me a joke about: " + topic):这设置了用户消息。这是你传递从客户端接收的动态输入的地方。
  • .call():这实际执行到LLM提供商(例如OpenAI)的同步网络请求。
  • .content():LLM返回一个包含token、元数据和选项的复杂JSON有效载荷。这个便捷方法剥离所有这些,仅返回原始文本响应作为标准Java字符串。

7.2 REST控制器

控制器保持极其精简。它只处理HTTP请求并将数据传递给服务层。

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/ai")
public class ChatController {

    private final AiChatService aiChatService;

    public ChatController(AiChatService aiChatService) {
        this.aiChatService = aiChatService;
    }

    @GetMapping("/generate")
    public String generate(@RequestParam(defaultValue = "Java") String topic) {
        return aiChatService.getJoke(topic);
    }
}

7.3 Spring AI执行流程

为了让企业开发者更容易理解这个流程,你可以将其呈现为请求-响应管道。这强调了Spring AI如何在你干净的Java代码与混乱的LLM API世界之间处理"繁重工作":

客户端请求:用户或外部服务访问你的@RestController端点(/ai/generate)。

委派和编排:控制器提取HTTP参数并立即将其传递给@Service层。

提示模板化:在服务层内部,Spring AI获取你的原始输入并将其包装在Prompt对象中。这是注入"系统"指令(例如"You are a helpful assistant that tells clean, tech-related jokes.")和"用户"上下文并将它们组合的地方。

模型交互:Spring AI抽象掉了网络复杂性。它处理HTTP连接、认证头和重试,将有效载荷安全地发送到LLM提供商(OpenAI、Ollama等)。

归一化:来自AI的原始、非结构化JSON响应被Spring AI拦截并"清理"。

交付:最终结果作为标准String返回给服务层(或使用输出解析器映射到类型化的Java对象),然后通过控制器流畅地返回给用户。

快速对比:手动方式 vs. Spring AI

8. Spring AI在企业系统中的定位

Spring AI不仅适用于聊天应用。在企业系统中,它成为一个服务层组件

可以无缝集成:

  • 数据库 外部API 复杂业务工作流

未来是Agent化的: Spring AI也在快速采用模型上下文协议(MCP),充当MCP服务器。这意味着你不仅会与AI对话;AI还能够安全地发现并执行你安全的Java业务逻辑作为工具。AI成为你现有架构中的编排者,而不是一个独立的、断开的系统。

9. 结束语

Spring AI弥合了传统Spring应用现代生成式AI能力之间的关键差距。通过为开发者提供对复杂LLM API的统一、Spring原生抽象,它确保Java在AI时代保持一等公民的地位。


原文链接: If You’re a Java Developer Ignoring Spring AI, You’re Falling Behind

汇智网翻译整理,转载请标明出处