SpringAI 实战进阶:从 0 搭建大模型对话交互系统

在当今人工智能技术飞速发展的背景下,构建基于大语言模型的对话系统已成为企业和开发者的核心需求。SpringAI 作为 Spring 生态的扩展模块,为 Java 开发者提供了强大的工具链,帮助快速集成大模型并实现交互功能。本文将从零开始,手把手教你如何利用 SpringAI 搭建一个完整的对话系统。文章结构清晰,步骤详细,确保你能够轻松上手。

1. 环境准备与项目初始化

在开始搭建前,需要准备基础开发环境。确保你的系统已安装以下工具:

  • Java Development Kit (JDK) 17 或更高版本
  • Maven 或 Gradle 构建工具
  • Spring Boot 3.x 框架

使用 Spring Initializr 快速创建项目。打开终端,执行以下命令:

curl https://start.spring.io/starter.zip -o springai-demo.zip -d dependencies=web,ai \
  -d type=maven-project -d language=java -d bootVersion=3.2.0
unzip springai-demo.zip
cd springai-demo

这将生成一个包含 SpringAI 依赖的 Spring Boot 项目。SpringAI 模块提供了预定义的接口,简化了与大模型(如 OpenAI GPT 系列)的集成。

2. SpringAI 核心概念与模型集成

SpringAI 的核心是 AiClient 接口,它抽象了大模型的调用过程。首先,添加 OpenAI 的 API 密钥到 application.properties 文件:

spring.ai.openai.api-key=YOUR_API_KEY
spring.ai.openai.model=gpt-4

在代码中,创建一个服务类来处理模型请求。以下是一个简单的 ChatService 实现:

import org.springframework.ai.client.AiClient;
import org.springframework.stereotype.Service;

@Service
public class ChatService {
    private final AiClient aiClient;

    public ChatService(AiClient aiClient) {
        this.aiClient = aiClient;
    }

    public String generateResponse(String userInput) {
        String prompt = "用户说: " + userInput + "\n请生成合适的回复。";
        return aiClient.generate(prompt);
    }
}

这里,AiClient 自动注入并处理与 OpenAI 的通信。用户输入被包装为提示词,模型返回响应。SpringAI 还支持上下文管理,例如通过 AiContext 类跟踪对话历史。

3. 构建对话交互控制器

接下来,实现一个 REST 控制器来处理 HTTP 请求。创建一个 ChatController 类:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ChatController {
    private final ChatService chatService;

    public ChatController(ChatService chatService) {
        this.chatService = chatService;
    }

    @PostMapping("/chat")
    public String chat(@RequestBody String userMessage) {
        return chatService.generateResponse(userMessage);
    }
}

这个控制器暴露了一个 /chat 端点,接收用户消息并返回模型响应。使用 Postman 或 curl 测试:

curl -X POST -H "Content-Type: text/plain" -d "你好,今天天气如何?" http://localhost:8080/chat

系统将返回类似“今天天气晴朗,适合外出”的响应。这实现了基本的对话交互。

4. 进阶功能:上下文管理与错误处理

为了提升系统实用性,添加上下文记忆和错误处理。首先,在 ChatService 中引入上下文:

import org.springframework.ai.context.AiContext;

@Service
public class ChatService {
    private final AiClient aiClient;
    private final AiContext context = new AiContext();

    public ChatService(AiClient aiClient) {
        this.aiClient = aiClient;
    }

    public String generateResponse(String userInput) {
        context.addUserInput(userInput); // 存储用户输入历史
        String history = context.getHistory(); // 获取所有对话上下文
        String prompt = "对话历史: " + history + "\n用户最新输入: " + userInput + "\n请回复。";
        String response = aiClient.generate(prompt);
        context.addAiResponse(response); // 存储模型响应
        return response;
    }
}

AiContext 类自动维护对话状态,确保多轮交互的连贯性。例如,用户问“北京的景点”,后续问“有哪些推荐?”时,系统能基于历史回复。

错误处理通过 Spring 的 @ControllerAdvice 实现:

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public String handleError(Exception e) {
        return "系统发生错误: " + e.getMessage() + ",请稍后重试。";
    }
}

这确保了 API 调用时的健壮性,例如网络故障或模型超时。

5. 系统测试与部署

完成开发后,进行单元测试。使用 JUnit 和 Mockito 测试 ChatService

import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class ChatServiceTest {
    @Test
    public void testResponseGeneration() {
        AiClient mockAiClient = Mockito.mock(AiClient.class);
        Mockito.when(mockAiClient.generate(Mockito.anyString())).thenReturn("测试回复");
        ChatService service = new ChatService(mockAiClient);
        String response = service.generateResponse("测试输入");
        assertEquals("测试回复", response);
    }
}

运行测试:

mvn test

部署时,使用 Docker 容器化应用。创建 Dockerfile

FROM openjdk:17
COPY target/springai-demo.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

构建并运行:

docker build -t springai-chat .
docker run -p 8080:8080 springai-chat

系统现在可在云服务器上运行,支持高并发对话。

总结

通过本文,你学会了如何从零开始,利用 SpringAI 搭建一个大模型对话交互系统。整个过程包括环境准备、模型集成、控制器实现、上下文管理、错误处理及部署。SpringAI 的优势在于其简洁的 API 和强大的扩展性,能轻松对接各种大模型。实际项目中,你可以进一步添加用户认证、日志监控等功能,打造企业级应用。动手实践吧,SpringAI 将助你快速构建智能对话解决方案!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐