DeepSeek 模型

Spring boot starter

  • SpringAI 为封装的 DeepSeek 聊天模型提供 Spring Boot 自动配置。通过添加下面依赖即可:

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-deepseek</artifactId>
    </dependency>
  • 具体 SpringAI 的依赖在前面的学习中有记录。

配置属性

  • SpringAI 封装 DeepSeek 聊天模型提供大量配置属性来灵活控制与模型交互的过程。
  • 根据官方文档给出的配置属性及参考源码,大致整理成连接配置、模型选项配置、重试配置三类配置属性。

连接配置

  • 主要用于配置连接 DeepSeek 模型服务的属性参数。

  • 基本是以spring.ai.deepseek.chat开头的属性参数。属性如下:

    属性 说明 默认值
    spring.ai.deepseek.chat.enabled 启用 DeepSeek 聊天模型 true
    spring.ai.deepseek.chat.base-url 调用 Deepseek 服务的基础url https://api.deepseek.com
    spring.ai.deepseek.chat.api-key 调用 Deepseek 服务的api-key -
    spring.ai.deepseek.chat.completions-path 对话补全API的路径。 /chat/completions
    spring.ai.deepseek.chat.beta-prefix-path Beta(测试)API路径前缀 /beta
  • 基础url以及api-key也可以通过下列两个属性配置,但优先级低于上面spring.ai.deepseek.chat开头的属性

    属性 说明 默认值
    spring.ai.deepseek.base-url 调用 Deepseek 服务的基础url https://api.deepseek.com
    spring.ai.deepseek.api-key 调用 Deepseek 服务的api-key -
  • 两个配置在源码中的属性类分别是

    • org.springframework.ai.model.deepseek.autoconfigure.DeepSeekChatProperties
    • org.springframework.ai.model.deepseek.autoconfigure.DeepSeekConnectionProperties
  • 在源码中能看到通过三元表达式优先取得是DeepSeekChatProperties的属性。

    BaseUrl和ApiKey

模型选项配置

  • 主要都是配置 DeepSeek 模型 API 输入参数选项属性。

  • spring.ai.deepseek.chat.options开头,属性如下:

    属性 说明 默认值
    spring.ai.deepseek.chat.options.model 要使用的模型。 deepseek-chat
    spring.ai.deepseek.chat.options.frequencyPenalty 介于 -2.0 到2 .0 之间的数值。正值会根据 Token 在已生成文本中的现有频率进行惩罚,从而降低模型逐字重复相同内容的可能性。 0.0f
    spring.ai.deepseek.chat.options.maxTokens 聊天补全中生成的最大 Token 数量。输入 Token 和生成 Token 的总长度受模型上下文长度限制。 -
    spring.ai.deepseek.chat.options.presencePenalty 介于 -2.0 到 2.0 之间的数值。正值会根据 Token 是否已在已生成文本中出现进行惩罚,从而提高模型讨论新话题的可能性。 0.0f
    spring.ai.deepseek.chat.options.stop 一个 string 或最多包含 16 个 string 的 list,在遇到这些词时,API 将停止生成更多的 token。 -
    spring.ai.deepseek.chat.options.temperature 采样温度值,范围0到2。较高值(如0.8)使输出更随机,较低值(如0.2)使输出更集中和确定。通常建议仅调整此参数或 top_p 参数,而非同时修改两者。 1.0F
    spring.ai.deepseek.chat.options.topP 温度采样的替代方案——核采样(nucleus sampling),模型仅考虑概率质量累计达到 top_p 阈值的token。例如0.1表示仅考虑概率质量排名前 10% 的 Token。通常建议仅调整此参数或 temperature 参数,而非同时修改两者。 1.0F
    spring.ai.deepseek.chat.options.logprobs 是否返回输出 Token 的对数概率。若为 true,则返回消息内容中每个输出 Token 的对数概率。 -
    spring.ai.deepseek.chat.options.topLogprobs 0 到 20 之间的整数,指定每个 Token 位置返回的最可能 Token 数量(每个附带关联的对数概率)。若使用此参数,必须将 logprobs 设为 true。 -
  • 在源码中的属性类org.springframework.ai.deepseek.DeepSeekChatOptions

    DeepSeekChatOptions

重试配置

  • 用于配置与 DeepSeek 模型交互的重试机制的参数属性。

  • spring.ai.retry开头,属性如下:

    属性 说明 默认值
    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 empty
    spring.ai.retry.on-http-codes 应触发重试的 HTTP 状态码列表(例如用于抛出 TransientAiException empty
  • 以上就是所有可以配置的属性,下面在学习记录一下DeepSeekChatOptions

DeepSeekChatOptions

  • 其实DeepSeekChatOptions在上一篇记录中就有提到其是ChatOptions的实现类。

  • 那么DeepSeekChatOptions也是具备在运行时向ChatModel传递AI模型的选项参数。

  • 所以通过上面配置属性的DeepSeekChatOptions可以视为默认的选项参数,运行时传入的则可以灵活覆盖默认的选项。

  • 在源码中也可以看到合并默认与运行时选项参数的逻辑。首先在自动配置ChatModel时传入了默认的选项参数。

    DefaultOptions

  • 然后在ChatModel运行时合并runtimeOptionsdefaultOptions进行合并为requestOptions`用于请求。

    MergeOptions

DeepSeekChatModel

DeepSeekChatModel

  • DeepSeekChatModelChatModel的实现类,其作用就是与Deepseek模型进行交互。
  • 主要是创建交互前的请求,以及交互后响应进行转换,这个过程包括工具调用。
  • 其次就是通过DeepSeekApi向Deepseek服务发起请求。这个过程使用了RetryTemplate来完成重试机制。
  • 对于ChatModel的作用在上一篇中记录过,对于DeepSeekChatModel的源码这里也不多做记录,以后在专门学习源码时在记录。

DeepSeekApi

  • 按照Deepseek提供的API范式对请求参数、响应参数以及API调用进行封装。
  • 简单来说DeepSeekApi面向Deepseek的API范式并进行调用;DeepSeekChatModel是面向SpingAI内部的结构,将请求、响应转换。

总结

  • 可以通过Spring的属性配置来配置与模型交互的一些默认属性。
  • 也可以通过DeepSeekChatOptions在运行时传递属性以便灵活使用。
  • 从整个SpringAI封装的DeepSeek模型可以看到,其也是通过实现ChatModelChatOptions以及封装一个调用模型服务的客户端DeepSeekApi来完成。整体与上一篇中自行模拟的Dify模型封装是相似的。
  • 到这里可以大概整理一下开发者使用SpringAI与AI模型交互的大致过程:
    1. 使用ChatClient输入与AI交互需要的参数(Advisors、Prompt、Tollcalling等),并选择调用方式及返回类型触发AI交互执行。
    2. 在触发执行时会对输入的参数进一步转换或构建,如将输入的文本提示词转换成Message、将输入的Tollcalling构建到ChatOptions中、将Advisors添加默认的ChatModelAdvisor并构建AdvisorChain等。
    3. 通过AdvisorChain按顺序执行Advisor,默认在最后执行ChatModelAdvisor调用ChatModel
    4. ChatModel与AI模型服务进行交互,如果需要Tollcalling则进行工具调用后继续与模型服务交互得倒最终输出结果。
    5. 最后返回相应类型的输出结果,如果是结构化输出则在此调用StructuredOutputConverter进行结构化转换。

最后

  • 下一篇再继续学习一下SpringAI封装的其他非聊天模型的简单使用,如图像模型、嵌入模型等。
  • 改篇幅学习没有编写案例,基本都是记录的文档中的内容或者源码中的内容。