接着上一讲,本讲使用 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 远程调用与动态密钥示意 3。
原文在 Spring AI 1.0 的背景下认为对方尚未提供同样的配置方式,并给出参考:Spring AI 学习系列(2)-调用远程DeepSeek。此处保留历史比较,不据此判断当前版本的能力。

原文配图:DeepSeek 远程调用与动态密钥示意 1。
文中代码:GitHub - yjmyzz/langchain4j-study at day02
密钥与历史截图
原文截图中的密钥已遮挡。截图演示了通过 URL 参数传入密钥的方式,这里仅保留历史说明;实际接入时应避免密钥进入 URL、访问日志和截图。示例结果未经本站重新调用模型验证。