找回密码
 立即注册
首页 业界区 业界 SpringBoot3 + LangChain4j + Redis 实现大模型多轮对话 ...

SpringBoot3 + LangChain4j + Redis 实现大模型多轮对话及工具调用

拙因 2025-7-10 23:48:46
引言

在人工智能快速发展的当下,大语言模型(LLM)已成为构建智能应用的核心技术之一。LangChain4j 作为 Java 生态中领先的 LLM 应用开发框架,为开发者提供了强大的工具,助力构建基于大语言模型的各类应用。在 Java 领域,目前整合大语言模型的主流工具主要有 Spring AI 和 LangChain4j。许多 Java 开发者可能对 Spring AI 更为熟悉,但 LangChain4j 延续了 LangChain 框架的诸多优点,在 Java 中同样易于使用。
不过,当前网络上关于 LangChain4j 的整合教程较少,官方文档的粒度也不够细致,导致将其集成到现有项目中并非易事。为此,我计划编写一个系列教程,帮助大家快速地将大语言模型集成到自己的项目中。目前已实现了多轮对话和工具调用功能,接下来的短期目标是支持多模态能力和知识库系统。
项目概述

本项目实现了一个基于SpringBoot3的智能对话系统,具有以下核心特性:

  • 流式响应:支持实时流式输出,提供更好的用户体验
  • 多轮对话:基于Redis实现对话历史持久化
  • 工具集成:支持自定义工具函数扩展AI能力
  • 内存管理:智能的对话历史管理,避免上下文过长
技术栈


  • SpringBoot 3.5.3:现代化的Java Web框架
  • Java 21:使用最新的LTS版本
  • LangChain4j 1.1.0-beta7:Java版LangChain框架
  • Redis:用于对话历史持久化存储
  • Lombok:简化Java代码编写
项目结构
  1. src/main/java/com/fengzeng/langchain4j/
  2. ├── chat/
  3. │   └── ChatController.java          # 聊天控制器
  4. ├── config/
  5. │   ├── AssistantConfiguration.java  # AI助手配置
  6. │   ├── PersistentChatMemoryStore.java # Redis持久化存储
  7. │   └── RedisTemplateConfig.java    # Redis配置
  8. ├── service/
  9. │   ├── Assistant.java              # 普通助手接口
  10. │   └── StreamingAssistant.java     # 流式助手接口
  11. ├── tool/
  12. │   └── AssistantTools.java         # 自定义工具
  13. └── listener/
  14.     └── MyChatModelListener.java    # 聊天模型监听器
复制代码
核心实现

1. 依赖配置

首先在pom.xml中添加必要的依赖:
  1. <dependencies>
  2.    
  3.     <dependency>
  4.         <groupId>org.springframework.boot</groupId>
  5.         spring-boot-starter-web</artifactId>
  6.     </dependency>
  7.    
  8.    
  9.     <dependency>
  10.         <groupId>org.springframework.boot</groupId>
  11.         spring-boot-starter-data-redis</artifactId>
  12.     </dependency>
  13.    
  14.    
  15.     <dependency>
  16.         <groupId>dev.langchain4j</groupId>
  17.         langchain4j-spring-boot-starter</artifactId>
  18.         <version>1.1.0-beta7</version>
  19.     </dependency>
  20.    
  21.    
  22.     <dependency>
  23.         <groupId>dev.langchain4j</groupId>
  24.         langchain4j-open-ai-spring-boot-starter</artifactId>
  25.         <version>1.1.0-beta7</version>
  26.     </dependency>
  27.    
  28.    
  29.     <dependency>
  30.         <groupId>dev.langchain4j</groupId>
  31.         langchain4j-reactor</artifactId>
  32.         <version>1.1.0-beta7</version>
  33.     </dependency>
  34. </dependencies>
复制代码
2. 应用配置

在application.yaml中配置OpenAI和Redis:
  1. langchain4j:
  2.   open-ai:
  3.     streaming-chat-model:
  4.       base-url: https://yunwu.ai/v1
  5.       api-key: your-api-key
  6.       model-name: gpt-4o-mini
  7.       log-requests: true
  8.       log-responses: true
  9. spring:
  10.   data:
  11.     redis:
  12.       host: 10.0.5.55
  13.       port: 6379
  14.       database: 1
  15.       password: your-password
  16. server:
  17.   port: 8000
复制代码
3. Redis配置

创建Redis模板配置类:
  1. @Configuration
  2. public class RedisTemplateConfig {
  3.    
  4.     @Bean
  5.     public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
  6.         RedisTemplate<String, Object> template = new RedisTemplate<>();
  7.         template.setConnectionFactory(factory);
  8.         template.setKeySerializer(new StringRedisSerializer());
  9.         template.setHashKeySerializer(new StringRedisSerializer());
  10.         template.setValueSerializer(new StringRedisSerializer());
  11.         template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
  12.         template.afterPropertiesSet();
  13.         return template;
  14.     }
  15. }
复制代码
4. 持久化聊天存储

实现基于Redis的聊天历史持久化:
  1. @Component
  2. @Slf4j
  3. public class PersistentChatMemoryStore implements ChatMemoryStore {
  4.    
  5.     @Resource
  6.     private RedisTemplate<String, Object> redisTemplate;
  7.    
  8.     @Override
  9.     public List<ChatMessage> getMessages(Object memoryId) {
  10.         Object raw = redisTemplate.opsForValue().get(String.valueOf(memoryId));
  11.         if (raw == null) {
  12.             // todo 从数据库中查询最近的历史消息记录
  13.             return List.of(); // 返回空历史,表示是第一次对话
  14.         }
  15.         return messagesFromJson(raw.toString());
  16.     }
  17.    
  18.     @Override
  19.     public void updateMessages(Object memoryId, List<ChatMessage> messages) {
  20.         String json = messagesToJson(messages);
  21.         redisTemplate.opsForValue().set(String.valueOf(memoryId), json);
  22.     }
  23.    
  24.     @Override
  25.     public void deleteMessages(Object memoryId) {
  26.         redisTemplate.delete(String.valueOf(memoryId));
  27.     }
  28. }
复制代码
5. 流式助手接口

定义支持流式响应的AI助手:
  1. @AiService
  2. public interface StreamingAssistant {
  3.    
  4.     @SystemMessage("You are a helpful assistant")
  5.     Flux<String> chat(@UserMessage String userMessage, @MemoryId int memoryId);
  6. }
复制代码
6. 自定义工具

扩展AI助手的能力:
  1. @Component
  2. public class AssistantTools {
  3.    
  4.     @Tool
  5.     @Observed
  6.     public String currentTime() {
  7.         return LocalDateTime.now().toString();
  8.     }
  9. }
复制代码
7. 聊天控制器

其实,核心步骤就在这里。由于引入了 langchain4j-starter 后,框架会根据配置文件中定义的 xxx-chat-model,自动为你注入对应的实例。因此,关键就在于如何正确获取 Assistant。官方文档给出的示例是直接通过注解注入 Assistant,但这种方式无法注入自定义的 memory(记忆)和 tools(工具),限制了更复杂场景的使用。
下面是一个通过显式方式构建 Assistant 的示例,并提供了一个简单的 REST API 接口:
  1. @RestController
  2. @RequestMapping("/api/v1/chat")
  3. public class ChatController {
  4.    
  5.     @Resource
  6.     private OpenAiStreamingChatModel openAiChatModel;
  7.    
  8.     @Resource
  9.     PersistentChatMemoryStore chatMemoryStore;
  10.    
  11.     @Resource
  12.     AssistantTools assistantTools;
  13.    
  14.     @GetMapping(value = "/chat", produces = TEXT_EVENT_STREAM_VALUE)
  15.     public Flux<String> model(@RequestParam(value = "message", defaultValue = "Hello") String message,
  16.                               @RequestParam(value = "memoryId") int memoryId) {
  17.         
  18.         StreamingAssistant assistant = getAssistant(memoryId);
  19.         return assistant.chat(message, memoryId);
  20.     }
  21.    
  22.     private StreamingAssistant getAssistant(int memoryId) {
  23.         ChatMemoryProvider chatMemoryProvider = o -> MessageWindowChatMemory.builder()
  24.                 .id(memoryId)
  25.                 .maxMessages(10)
  26.                 .chatMemoryStore(chatMemoryStore)
  27.                 .build();
  28.         
  29.         return AiServices.builder(StreamingAssistant.class)
  30.                 .streamingChatModel(openAiChatModel)
  31.                 .chatMemoryProvider(chatMemoryProvider)
  32.                 .tools(assistantTools)
  33.                 .build();
  34.     }
  35. }
复制代码
核心特性解析

1. 多轮对话支持

通过@MemoryId注解和Redis持久化存储,系统能够:

  • 为每个用户会话分配唯一的memoryId
  • 自动保存和恢复对话历史
  • 支持最多10轮对话的上下文窗口
2. 流式响应

使用Flux和TEXT_EVENT_STREAM_VALUE实现:

  • 实时流式输出,提升用户体验
  • 减少等待时间,提供即时反馈
  • 支持长文本的渐进式显示
3. 工具集成

通过@Tool注解可以轻松扩展AI能力:

  • 自定义工具函数
  • 自动注入到AI助手中
  • 支持复杂的业务逻辑
4. 内存管理

智能的对话历史管理:

  • 自动限制上下文长度
  • 防止token超限
  • 保持对话的连贯性
使用示例

启动应用
  1. mvn spring-boot:run
复制代码
API调用
  1. curl -N "http://localhost:8000/api/v1/chat/chat?message=你好&memoryId=123"
复制代码
前端集成
  1. const eventSource = new EventSource('/api/v1/chat/chat?message=你好&memoryId=123');
  2. eventSource.onmessage = function(event) {
  3.     console.log('收到流式响应:', event.data);
  4. };
复制代码
总结

本项目展示了如何使用SpringBoot3和LangChain4j构建现代化的AI对话系统。通过Redis实现持久化存储,结合流式响应和工具集成,为开发者提供了一个完整的解决方案。
项目特点:

  • 简单易用:基于SpringBoot的熟悉开发模式
  • 功能完整:支持多轮对话、流式响应、工具集成
  • 可扩展性强:模块化设计,易于扩展新功能
  • 生产就绪:包含完整的配置和部署方案
相关资源


  • 项目地址(github)
  • LangChain4j官方文档
  • SpringBoot官方文档
  • Redis命令手册

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册