《大模型应用开发 2 实战:用 SpringAI 实现多轮对话记忆功能》

在现代人工智能应用中,大型语言模型(LLM)已成为核心驱动力,尤其在对话系统中。多轮对话记忆功能允许AI记住之前的交互历史,从而提供连贯、个性化的响应。这在客服、教育或娱乐场景中至关重要。本文将基于Spring框架(一个流行的Java开发平台)集成AI功能,实现一个简单的多轮对话记忆系统。通过实战步骤,您将学会如何构建这一功能,提升应用的用户体验。

多轮对话记忆的核心概念

多轮对话记忆指的是在连续对话中,AI系统能存储和引用之前的用户输入和自身响应。这避免了每次交互都从零开始,使对话更自然。例如,用户询问“天气如何?”后,再问“明天呢?”,AI能基于历史数据理解上下文。实现的关键在于:

  • 对话状态管理:使用数据结构(如列表)存储消息序列。
  • 上下文传递:每次请求时,将历史对话附加到新输入中。
  • AI服务集成:调用外部LLM API(如OpenAI的ChatGPT)处理增强后的输入。

在Spring生态中,我们可以利用其轻量级和模块化特性,快速搭建应用。以下步骤将展示如何用Spring Boot实现这一功能。

实战步骤:构建多轮对话记忆系统

我们将分三步实现:创建Spring项目、集成AI服务、添加记忆功能。项目使用Java语言,依赖Spring Boot 3.x和Spring WebClient进行HTTP通信。

  1. 设置Spring Boot项目 使用Spring Initializr(https://start.spring.io/)创建一个新项目。选择依赖:

    • Spring Web:用于构建REST API。
    • Spring Reactive Web:支持异步通信(适合调用外部API)。 生成项目后,导入到IDE(如IntelliJ IDEA)。

    关键配置文件application.properties

    server.port=8080
    # 设置AI服务API密钥(示例值,实际使用时替换)
    ai.api.key=your-api-key
    ai.api.url=https://api.openai.com/v1/chat/completions
    

  2. 集成AI服务 创建一个服务类来调用外部LLM API。这里假设使用OpenAI的ChatGPT API,但方法适用于其他类似服务。

    首先,定义消息模型类Message.java

    public class Message {
        private String role; // "user" 或 "assistant"
        private String content;
        
        // 构造器、getter和setter省略
        public Message(String role, String content) {
            this.role = role;
            this.content = content;
        }
    }
    

    然后,实现AI调用服务AIService.java

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Service;
    import org.springframework.web.reactive.function.client.WebClient;
    import reactor.core.publisher.Mono;
    import java.util.List;
    
    @Service
    public class AIService {
        @Value("${ai.api.url}")
        private String apiUrl;
        
        @Value("${ai.api.key}")
        private String apiKey;
        
        public Mono<String> getAIResponse(List<Message> messages) {
            WebClient webClient = WebClient.builder()
                    .defaultHeader("Authorization", "Bearer " + apiKey)
                    .build();
            
            // 构建请求体
            String requestBody = String.format("{\"model\": \"gpt-3.5-turbo\", \"messages\": %s}", messages);
            
            return webClient.post()
                    .uri(apiUrl)
                    .header("Content-Type", "application/json")
                    .bodyValue(requestBody)
                    .retrieve()
                    .bodyToMono(String.class)
                    .map(response -> {
                        // 简化处理:提取AI响应内容
                        return response.split("\"content\":\"")[1].split("\"")[0];
                    });
        }
    }
    

  3. 实现多轮对话记忆功能 添加一个服务类来管理对话历史。使用内存存储(如ArrayList),在实际应用中可扩展为数据库。

    创建ConversationService.java

    import org.springframework.stereotype.Service;
    import java.util.ArrayList;
    import java.util.List;
    
    @Service
    public class ConversationService {
        private List<Message> conversationHistory = new ArrayList<>();
        
        public void addMessage(String role, String content) {
            conversationHistory.add(new Message(role, content));
        }
        
        public List<Message> getFullHistory() {
            return new ArrayList<>(conversationHistory); // 返回副本避免修改
        }
        
        public void resetConversation() {
            conversationHistory.clear();
        }
    }
    

    最后,构建REST控制器ConversationController.java来处理用户请求:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    import reactor.core.publisher.Mono;
    import java.util.List;
    
    @RestController
    @RequestMapping("/api/conversation")
    public class ConversationController {
        @Autowired
        private ConversationService conversationService;
        
        @Autowired
        private AIService aiService;
        
        @PostMapping
        public Mono<String> handleUserInput(@RequestBody String userInput) {
            // 添加用户消息到历史
            conversationService.addMessage("user", userInput);
            List<Message> fullHistory = conversationService.getFullHistory();
            
            // 调用AI服务,传入完整历史
            return aiService.getAIResponse(fullHistory)
                    .map(aiResponse -> {
                        // 添加AI响应到历史
                        conversationService.addMessage("assistant", aiResponse);
                        return aiResponse;
                    });
        }
        
        @DeleteMapping("/reset")
        public String resetConversation() {
            conversationService.resetConversation();
            return "对话历史已重置";
        }
    }
    

测试与应用

运行Spring Boot应用后,使用工具(如Postman)测试:

  • 发送POST请求到http://localhost:8080/api/conversation,body为JSON字符串(如"今天天气不错")。
  • AI响应会基于历史对话生成。例如,第一次响应后,再发送"推荐活动",AI能结合上下文推荐户外活动。
  • 调用DELETE /api/conversation/reset可清除历史。

此实现优点在于:

  • 灵活性:Spring的依赖注入和模块化使代码易于维护和扩展。
  • 可扩展性:可轻松添加数据库存储(如使用Spring Data JPA)或支持更多LLM。
  • 用户体验提升:对话更连贯,适用于智能助手或教育工具。
总结

通过本实战,您学会了如何用Spring框架集成AI服务实现多轮对话记忆功能。这不仅提升了应用的智能化水平,还为开发更复杂的LLM应用奠定了基础。未来,您可以探索添加情感分析或个性化推荐,进一步丰富对话体验。Spring生态的强大工具链,让AI开发变得高效且可靠。

Logo

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

更多推荐