跳到主要内容

DeepSeek 聊天

DeepSeek V3 中英对照 DeepSeek AI DeepSeek Chat

深度求索人工智能 提供了开源的 DeepSeek V3 模型,以其前沿的推理和问题解决能力而闻名。

Spring AI 通过复用现有的 OpenAI 客户端与 DeepSeek AI 进行集成。要开始使用,你需要获取一个 DeepSeek API Key,配置基础 URL,并选择一个支持的模型。

spring ai deepseek 集成

备注

当前版本的 deepseek-chat 模型的 Function Calling 功能尚不稳定,可能会导致循环调用或空响应。

查看 DeepSeekWithOpenAiChatModelIT.java 测试,了解如何在 Spring AI 中使用 DeepSeek 的示例。

先决条件

  • 创建 API 密钥:访问此处创建 API 密钥。在您的 Spring AI 项目中使用 spring.ai.openai.api-key 属性进行配置。

  • 设置 DeepSeek 基础 URL:将 spring.ai.openai.base-url 属性设置为 [api.deepseek.com](https://api.deepseek.com)

  • 选择 DeepSeek 模型:使用 spring.ai.openai.chat.model=<model name> 属性指定模型。有关可用选项,请参阅支持的模型

示例环境变量配置:

export SPRING_AI_OPENAI_API_KEY=<INSERT DEEPSEEK API KEY HERE>
export SPRING_AI_OPENAI_BASE_URL=https://api.deepseek.com
export SPRING_AI_OPENAI_CHAT_MODEL=deepseek-chat
shell

添加仓库和 BOM

Spring AI 的构件已发布在 Maven Central 和 Spring Snapshot 仓库中。请参考 Repositories 部分,将这些仓库添加到您的构建系统中。

为了帮助进行依赖管理,Spring AI 提供了一个 BOM(物料清单),以确保在整个项目中使用的 Spring AI 版本一致。请参考依赖管理部分,将 Spring AI BOM 添加到您的构建系统中。

自动配置

Spring AI 为 OpenAI 聊天客户端提供了 Spring Boot 自动配置。要启用此功能,请将以下依赖项添加到项目的 Maven pom.xml 或 Gradle build.gradle 构建文件中:

<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
xml
提示

请参考依赖管理部分,将 Spring AI BOM 添加到你的构建文件中。

聊天属性

重试属性

前缀 spring.ai.retry 用作属性前缀,允许你为 OpenAI 聊天模型配置重试机制。

属性描述默认值
spring.ai.retry.max-attempts最大重试次数。10
spring.ai.retry.backoff.initial-interval指数退避策略的初始休眠时间。2 秒
spring.ai.retry.backoff.multiplier退避间隔乘数。5
spring.ai.retry.backoff.max-interval最大退避时间。3 分钟
spring.ai.retry.on-client-errors如果为 false,抛出 NonTransientAiException,并且不对 4xx 客户端错误代码进行重试。false
spring.ai.retry.exclude-on-http-codes不应触发重试的 HTTP 状态码列表(例如抛出 NonTransientAiException)。
spring.ai.retry.on-http-codes应触发重试的 HTTP 状态码列表(例如抛出 TransientAiException)。

连接属性

前缀 spring.ai.openai 用作属性前缀,允许你连接到 OpenAI。

属性描述默认值
spring.ai.openai.base-url连接的 URL。必须设置为 [api.deepseek.com](https://api.deepseek.com)-
spring.ai.openai.chat.api-key您的 DeepSeek API 密钥-

配置属性

前缀 spring.ai.openai.chat 是用于配置 OpenAI 聊天模型实现的属性前缀。

属性描述默认
spring.ai.openai.chat.enabled启用 OpenAI 聊天模型。true
spring.ai.openai.chat.base-url可选地覆盖 spring.ai.openai.base-url 以提供聊天特定的 URL。必须设置为 [api.deepseek.com](https://api.deepseek.com)-
spring.ai.openai.chat.api-key可选地覆盖 spring.ai.openai.api-key,以提供特定于聊天的 API 密钥。-
spring.ai.openai.chat.options.model使用的 DeepSeek LLM 模型-
spring.ai.openai.chat.options.temperature采样温度用于控制生成内容的表面创造力。较高的值会使输出更加随机,而较低的值会使结果更加集中和确定。不建议在同一个生成请求中同时修改 temperaturetop_p,因为这两个设置的交互效果难以预测。0.8
spring.ai.openai.chat.options.frequencyPenalty数值介于 -2.0 到 2.0 之间。正值会根据新 token 在文本中已有的频率对其进行惩罚,从而降低模型逐字重复相同内容的可能性。0.0f
spring.ai.openai.chat.options.maxTokens在聊天完成中生成的最大 token 数量。输入 token 和生成 token 的总长度受模型上下文长度的限制。-
spring.ai.openai.chat.options.n为每条输入消息生成多少个聊天补全选项。请注意,您将根据所有选项中生成的 token 数量进行计费。将 n 保持为 1 以最小化成本。1
spring.ai.openai.chat.options.presencePenalty数值介于 -2.0 到 2.0 之间。正值会根据新 token 是否已出现在文本中对它们进行惩罚,从而增加模型谈论新话题的可能性。-
spring.ai.openai.chat.options.responseFormat一个指定模型必须输出的格式的对象。设置为 { "type": "json_object" } 可以启用 JSON 模式,该模式保证模型生成的消息是有效的 JSON。-
spring.ai.openai.chat.options.seed此功能处于 Beta 测试阶段。如果指定了此功能,我们的系统将尽最大努力进行确定性采样,这意味着使用相同的种子和参数重复请求应返回相同的结果。-
spring.ai.openai.chat.options.stop最多 4 个序列,API 将在这些序列处停止生成更多 token。-
spring.ai.openai.chat.options.topP一种替代温度采样的方法是核采样(nucleus sampling),在这种方法中,模型会考虑概率质量最高的 top_p 范围内的 token。例如,top_p=0.1 意味着只考虑概率质量最高的前 10% 的 token。我们通常建议调整 top_p 或温度(temperature)中的其中一个,而不是同时调整两者。-
spring.ai.openai.chat.options.tools模型可以调用的工具列表。目前,仅支持函数作为工具。使用此选项提供模型可能生成 JSON 输入的函数列表。-
spring.ai.openai.chat.options.toolChoice控制模型调用哪个(如果有的话)函数。none 表示模型不会调用函数,而是生成一条消息。auto 表示模型可以选择生成消息或调用函数。通过 {"type": "function", "function": {"name": "my_function"}} 指定特定函数会强制模型调用该函数。当没有函数存在时,默认值为 none。如果有函数存在,默认值为 auto-
spring.ai.openai.chat.options.user一个代表您终端用户的唯一标识符,可以帮助 OpenAI 监控和检测滥用行为。-
spring.ai.openai.chat.options.functions列出需要启用的函数名称列表,以便在单个提示请求中进行函数调用。这些名称对应的函数必须存在于 functionCallbacks 注册表中。-
spring.ai.openai.chat.options.stream-usage(仅适用于流式传输)设置为添加一个包含整个请求的 token 使用统计信息的额外数据块。此数据块的 choices 字段为空数组,所有其他数据块也将包含一个 usage 字段,但其值为 nullfalse
spring.ai.openai.chat.options.proxy-tool-calls如果为 true,Spring AI 将不会在内部处理函数调用,而是会将它们代理给客户端。然后由客户端负责处理函数调用,将它们分派到适当的函数并返回结果。如果为 false(默认值),Spring AI 将在内部处理函数调用。仅适用于支持函数调用的聊天模型。false
提示

所有以 spring.ai.openai.chat.options 为前缀的属性都可以在运行时通过向 Prompt 调用添加特定请求的 运行时选项 来覆盖。

运行时选项

OpenAiChatOptions.java 提供了模型配置,例如使用的模型、温度(temperature)、频率惩罚(frequency penalty)等。

在启动时,默认选项可以通过 OpenAiChatModel(api, options) 构造函数或 spring.ai.openai.chat.options.* 属性进行配置。

在运行时,你可以通过在 Prompt 调用中添加新的、特定于请求的选项来覆盖默认选项。例如,要为特定请求覆盖默认的模型和温度:

ChatResponse response = chatModel.call(
new Prompt(
"Generate the names of 5 famous pirates.",
OpenAiChatOptions.builder()
.withModel("deepseek-chat")
.withTemperature(0.4)
.build()
));
java
提示

除了特定模型的 OpenAiChatOptions 之外,你还可以使用一个可移植的 ChatOptions 实例,该实例可以通过 ChatOptionsBuilder#builder() 创建。

函数调用

备注

当前版本的 deepseek-chat 模型的 Function Calling 功能尚不稳定,可能会导致循环调用或空响应。

多模态

备注

目前,DeepSeek API 不支持媒体内容。

示例控制器

创建一个新的 Spring Boot 项目,并将 spring-ai-openai-spring-boot-starter 添加到你的 pom(或 gradle)依赖中。

src/main/resources 目录下添加一个 application.properties 文件,以启用并配置 OpenAi 聊天模型:

spring.ai.openai.api-key=<DEEPSEEK_API_KEY>
spring.ai.openai.base-url=https://api.deepseek.com
spring.ai.openai.chat.options.model=deepseek-chat
spring.ai.openai.chat.options.temperature=0.7

# The DeepSeek API doesn't support embeddings, so we need to disable it.
spring.ai.openai.embedding.enabled=false
application.properties

:::提示
api-key 替换为你的 DeepSeek API 密钥。
:::

这将创建一个 OpenAiChatModel 实现,你可以将其注入到你的类中。以下是一个简单的 @Controller 类的示例,该类使用聊天模型进行文本生成。

@RestController
public class ChatController {

private final OpenAiChatModel chatModel;

@Autowired
public ChatController(OpenAiChatModel chatModel) {
this.chatModel = chatModel;
}

@GetMapping("/ai/generate")
public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
return Map.of("generation", this.chatModel.call(message));
}

@GetMapping("/ai/generateStream")
public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
Prompt prompt = new Prompt(new UserMessage(message));
return this.chatModel.stream(prompt);
}
}
java

参考文献