LangChain4j 基础系列

LangChain4j 基础 02:DeepSeek 远程调用与动态密钥

接入 OpenAI 兼容接口,阅读 DeepSeek 配置及多租户场景下的动态密钥传入方式。

接着上一讲,本讲使用 LangChain4j 的 OpenAI 兼容接口调用 DeepSeek,并讨论多租户场景下如何在运行时传入各自的 API 密钥。

调整 Maven 依赖

<!-- LongChain4j OpenAI Integration (支持DeepSeek) -->
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai</artifactId>
    <version>${longchain4j.version}</version>
</dependency>

注入相应实例

package com.cnblogs.yjmyzz.longchain4j.study.config;

import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.Duration;

/**
 * DeepSeek配置类
 * 用于配置LongChain4j与DeepSeek大模型的连接
 *
 * @author 菩提树下的杨过
 * @version 1.0.0
 */
@Configuration
public class DeepSeekConfig {

    @Value("${deepseek.api-key:your-deepseek-api-key-here}")
    private String apiKey;

    @Value("${deepseek.base-url:https://api.deepseek.com}")
    private String baseUrl;

    @Value("${deepseek.model:deepseek-chat}")
    private String model;

    @Value("${deepseek.timeout:60}")
    private Integer timeoutSeconds;

    @Value("${deepseek.temperature:0.7}")
    private Double temperature;

    @Value("${deepseek.max-tokens:2048}")
    private Integer maxTokens;

    /**
     * 配置DeepSeek聊天模型
     *
     * @return ChatModel实例
     */
    @Bean
    public ChatModel chatModel() {
        return OpenAiChatModel.builder()
                .apiKey(apiKey)
                .baseUrl(baseUrl)
                .modelName(model)
                .temperature(temperature)
                .maxTokens(maxTokens)
                .timeout(Duration.ofSeconds(timeoutSeconds))
                .logRequests(true)
                .logResponses(true)
                .build();
    }

    /**
     * 配置DeepSeek流式聊天模型
     *
     * @return StreamingChatModel实例
     */
    @Bean
    public StreamingChatModel streamingChatModel() {
        return OpenAiStreamingChatModel.builder()
                .apiKey(apiKey)
                .baseUrl(baseUrl)
                .modelName(model)
                .temperature(temperature)
                .maxTokens(maxTokens)
                .timeout(Duration.ofSeconds(timeoutSeconds))
                .logRequests(true)
                .logResponses(true)
                .build();
    }
}

YAML 配置调整

# DeepSeek配置
deepseek:
  api-key: ${DEEPSEEK_API_KEY:your-deepseek-api-key-here}
  base-url: https://api.deepseek.com
  model: deepseek-chat
  timeout: 60
  temperature: 0.7
  max-tokens: 2048

这样就可以了,API controller部分无需调整。

LangChain4j 的优势

在多租户应用中,各租户可能使用各自的 DeepSeek API 密钥。若把所有密钥固定在 YAML 中,并在启动时创建全部实例,后续调整会不方便。

这种情况下,可以考虑在运行时传入 apiKey 并构建对应实例。

原文使用 OpenAiChatModelBuilder 在构建模型实例时传入 apiKey:

DeepSeek 远程调用与动态密钥示意 2

原文配图:DeepSeek 远程调用与动态密钥示意 2。

DeepSeek 远程调用与动态密钥示意 3

原文配图:DeepSeek 远程调用与动态密钥示意 3。

原文在 Spring AI 1.0 的背景下认为对方尚未提供同样的配置方式,并给出参考:Spring AI 学习系列(2)-调用远程DeepSeek。此处保留历史比较,不据此判断当前版本的能力。

DeepSeek 远程调用与动态密钥示意 1

原文配图:DeepSeek 远程调用与动态密钥示意 1。

文中代码:GitHub - yjmyzz/langchain4j-study at day02

密钥与历史截图

原文截图中的密钥已遮挡。截图演示了通过 URL 参数传入密钥的方式,这里仅保留历史说明;实际接入时应避免密钥进入 URL、访问日志和截图。示例结果未经本站重新调用模型验证。