• 已删除用户
陈永强
陈永强
发布于 2026-05-28 / 6 阅读
0

SpringBoot LangChain4j 模型接入(一)

SpringBoot LangChain4j 模型接入(一)

若依项目改造,springboot3 java17 langchain4j官网地址:https://docs.langchain4j.dev/

一、Langchain4j pom依赖 ollama本地模型

<!-- langchain4j的依赖配置-->
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-spring-boot-starter</artifactId>
    <version>${langchain.version}</version>
</dependency>

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j</artifactId>
    <version>1.15.0</version>
</dependency>
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-http-client-spring-restclient</artifactId>
    <version>${langchain.version}</version>
</dependency>
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-ollama</artifactId>
    <version>1.10.0</version>
</dependency>

二、模型配置、以及消息会话的配置(使用redis作为消息会话持久化存储)

模型配置


@GetMapping("/chat")
public String test(String msg) {
    HttpClientBuilder httpClientBuilder = new SpringRestClientBuilder();
    if (assistant == null) {
        ChatModel ollamaChatModel = OllamaChatModel.builder()
                .baseUrl("http://192.168.2.136:11434")
                .modelName("qwen3:8b")
                .httpClientBuilder(httpClientBuilder)
                .logRequests(true)
                .logResponses(true)
                .build();

        assistant = AiServices.builder(Assistant.class)
                .chatModel(ollamaChatModel)
                .chatMemoryProvider(getChatMemoryProvider("12345"))
                .build();

    }
    String chat = assistant.chat("12345", msg);
    return chat;
}

public ChatMemoryProvider getChatMemoryProvider(String memoryId) {
    ChatMemoryProvider provider = new ChatMemoryProvider() {
        @Override
        public ChatMemory get(Object o) {
            ChatMemory m = MessageWindowChatMemory.builder().id(memoryId).maxMessages(100)
                    .chatMemoryStore(redisChatMemoryStore).build();
            return m;
        }
    };
    return provider;
}
@AiService
public interface Assistant {

    @SystemMessage("You are a polite assistant")
    String chat(@MemoryId String memoryId, @UserMessage String userMessage);
}

redis 会话存储

@Component
public class RedisChatMemoryStore implements ChatMemoryStore {

    private final StringRedisTemplate redisTemplate;

    // 定义一个 Key 前缀,防止和其他 Redis 数据冲突
    private static final String KEY_PREFIX = "chat:memory:";
    // 定义数据过期时间,例如 7 天后自动删除闲置的聊天记录
    private static final Duration TTL = Duration.ofDays(7);

    public RedisChatMemoryStore(StringRedisTemplate redisTemplate) {
       this.redisTemplate = redisTemplate;
    }

    @Override
    public List<ChatMessage> getMessages(Object memoryId) {
       // 1. 拼接 Key
       String key = KEY_PREFIX + memoryId;

       // 2. 从 Redis 获取 JSON 字符串
       String json = redisTemplate.opsForValue().get(key);

       // 3. 如果为空,返回空列表;否则反序列化
       if (json == null || json.isEmpty()) {
          return new ArrayList<>();
       }
       return messagesFromJson(json);
    }

    @Override
    public void updateMessages(Object memoryId, List<ChatMessage> messages) {
       String key = KEY_PREFIX + memoryId;
       String json = messagesToJson(messages);

       // 4. 保存到 Redis,并设置过期时间
       // set(key, value, timeout)
       redisTemplate.opsForValue().set(key, json, TTL);
    }

    @Override
    public void deleteMessages(Object memoryId) {
       String key = KEY_PREFIX + memoryId;
       redisTemplate.delete(key);
    }
}

三、会话测试