springboot集成LangChain4j
langchain4j和springboot3需要安装jdk17环境
本次测试使用的 https://qwen3.slmnb.cn/#api,免费的api测试
一、测试案例
1、改pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.openchat</groupId><artifactId>openchat</artifactId><version>1.0-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring-boot.version>3.2.6</spring-boot.version><knife4j.version>4.3.0</knife4j.version><langchain4j.version>1.0.0-beta3</langchain4j.version><mybatis-plus.version>3.5.11</mybatis-plus.version><java.version>17</java.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><tomcat.version>10.1.24</tomcat.version></properties><dependencies><!-- web应用程序核心依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 编写和运行测试用例 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai-spring-boot-starter</artifactId></dependency></dependencies><dependencyManagement><dependencies><!--引入SpringBoot依赖管理清单--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!--引入langchain4j依赖管理清单--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-bom</artifactId><version>${langchain4j.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version> <!-- 使用最新版本 --><configuration><source>17</source><target>17</target><release>17</release> <!-- 重要:确保使用JDK9+的release参数 --></configuration></plugin></plugins></build>
</project>
2、改配置
servert:port: 8081tomcat:apr:enabled: false
langchain4j:open-ai:chat-model:base-url: "https://api.suanli.cn/v1"api-key: "you-key"model-name: "deepseek-r1"log-requests: truelog-responses: true
3、测试类
public class LLMTest {@Autowiredprivate OpenAiChatModel openAiChatModel;@Testpublic void testAiChatModel() {//向模型提问String answer = openAiChatModel.chat("你是谁");//输出结果System.out.println("输出结果:" + answer);}
}
二、ChatMemery实现记忆,ChatMemoryStore实现持久化
1、ChatMemery实现记忆
1.1 ChatMemory 实现类对比
LangChain4j 提供两种实现,适应不同场景:
- MessageWindowChatMemory: 保留最近的 N 条消息,适用于原型开发、轻量级对话。 ⚡ 简单高效;❌ 忽略 token 长度,可能超限
- TokenWindowChatMemory: 保留最近的 N 个 tokens,适用于生产环境、成本敏感场景 ✅ 精准控制 token 用量;❌ 需搭配 Tokenizer(如 OpenAiTokenizer)
@Configuration
public class MemoryConfig {@Beanpublic ChatMemoryProvider chatMemoryProvider(ChatMemoryStore store) {return memoryId -> MessageWindowChatMemory.builder().id(memoryId).maxMessages(10).chatMemoryStore(store).build();}
}
2、ChatMemoryStore持久化
通过实现 ChatMemoryStore 接口,可将消息存储到 Redis、数据库等。以下是 Redis 持久化 的完整示例:
pom
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
yaml
spring:data:redis:host: localhostport: 6379database: 0
实现ChatMemoryStore接口
@Component
public class RedisChatMemoryStore implements ChatMemoryStore {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Overridepublic List<ChatMessage> getMessages(Object memoryId) {String key = "chat:" + memoryId;String json = redisTemplate.opsForValue().get(key);return (json != null) ? ChatMessageDeserializer.messagesFromJson(json) : List.of();}@Overridepublic void updateMessages(Object memoryId, List<ChatMessage> messages) {String key = "chat:" + memoryId;String json = ChatMessageSerializer.messagesToJson(messages);redisTemplate.opsForValue().set(key, json);}@Overridepublic void deleteMessages(Object memoryId) {redisTemplate.delete("chat:" + memoryId);}
}
@AiService
public interface ChatAssistant {String chat(@MemoryId String sessionId, @UserMessage String input);
}
3、测试
public class LLMTest {private static final Logger logger = LogManager.getLogger(LLMTest.class);@Autowiredprivate ChatAssistant chatAssistant;@Testpublic void testAliAiChat() {logger.info("sessionId1问我是李四:" + chatAssistant.chat("sessionId1", "我是李四"));logger.info("sessionId1问我12岁了:" + chatAssistant.chat("sessionId1", "我13岁了"));logger.info("sessionId1我是谁,我多少岁:" + chatAssistant.chat("sessionId1", "我是谁,我多少岁"));logger.info("sessionId2我是谁,我多少岁:" + chatAssistant.chat("sessionId2", "我是谁,我多少岁"));}
}