1. 概述

现代Web应用正越来越多地集成大语言模型(LLMs)来构建解决方案。

DeepSeek是一家中国AI研究公司,开发了强大的大语言模型,近期凭借其DeepSeek-V3DeepSeek-R1模型在AI领域引发轰动。后者在响应中会暴露其思维链(CoT),让我们能洞察AI模型如何解读和处理给定提示。

本教程将探讨如何将DeepSeek模型与Spring AI集成。我们将构建一个支持多轮文本对话的简单聊天机器人。

2. 依赖项与配置

将DeepSeek模型集成到应用中有多种方式,本节将讨论几种主流选项。可根据实际需求选择最适合的方案。

2.1. 使用OpenAI API

DeepSeek模型完全兼容OpenAI API,可通过任何OpenAI客户端或库访问

首先在项目的pom.xml中添加Spring AI的OpenAI启动器依赖

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
    <version>1.0.0-M6</version>
</dependency>

由于当前版本1.0.0-M6是里程碑版本,还需在pom.xml中添加Spring Milestones仓库:

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

该仓库用于发布里程碑版本,而非标准的Maven中央仓库。无论选择哪种配置方式,都需要添加此里程碑仓库。

接下来在application.yaml中配置DeepSeek API密钥聊天模型

spring:
  ai:
    openai:
      api-key: ${DEEPSEEK_API_KEY}
      chat:
        options:
          model: deepseek-reasoner
      base-url: https://api.deepseek.com
      embedding:
        enabled: false

同时指定DeepSeek API的基础URL,并禁用嵌入功能(因DeepSeek当前未提供兼容嵌入的模型)。

配置上述属性后,Spring AI会自动创建ChatModel类型的Bean,允许我们与指定模型交互。后续教程中将使用它为聊天机器人定义其他Bean。

2.2. 使用Amazon Bedrock Converse API

也可通过Amazon Bedrock Converse API集成DeepSeek R1模型。

要完成此配置步骤,需拥有有效的AWS账户DeepSeek-R1模型可通过Amazon Bedrock Marketplace获取,并使用Amazon SageMaker托管。可参考此部署指南进行设置

首先在pom.xml中添加Bedrock Converse启动器依赖

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-bedrock-converse-spring-boot-starter</artifactId>
    <version>1.0.0-M6</version>
</dependency>

接下来在application.yaml中配置AWS凭证和DeepSeek模型托管区域:

spring:
  ai:
    bedrock:
      aws:
        region: ${AWS_REGION}
        access-key: ${AWS_ACCESS_KEY}
        secret-key: ${AWS_SECRET_KEY}
      converse:
        chat:
          options:
            model: arn:aws:sagemaker:REGION:ACCOUNT_ID:endpoint/ENDPOINT_NAME

使用*${}*属性占位符从环境变量加载属性值。

同时指定DeepSeek模型托管的SageMaker接口URL ARN。需将REGIONACCOUNT_IDENDPOINT_NAME占位符替换为实际值。

最后,为模型交互需向IAM用户分配以下IAM策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "bedrock:InvokeModel",
      "Resource": "arn:aws:bedrock:REGION:ACCOUNT_ID:marketplace/model-endpoint/all-access"
    }
  ]
}

同样需将Resource ARN中的REGIONACCOUNT_ID占位符替换为实际值。

2.3. 使用Ollama本地部署

对于本地开发和测试,可通过Ollama运行DeepSeek模型。这是一个开源工具,允许在本地机器上运行大语言模型。

在项目pom.xml中导入必要依赖:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
    <version>1.0.0-M6</version>
</dependency>

Ollama启动器依赖帮助建立与Ollama服务的连接。

接下来在application.yaml中配置聊天模型:

spring:
  ai:
    ollama:
      chat:
        options:
          model: deepseek-r1
      init:
        pull-model-strategy: when_missing
      embedding:
        enabled: false

这里指定deepseek-r1模型,也可尝试使用其他可用模型

同时设置pull-model-strategywhen_missing这确保Spring AI在本地缺少指定模型时会自动拉取

Spring AI在默认端口11434localhost上运行时会自动连接Ollama。但可通过spring.ai.ollama.base-url属性覆盖连接URL。也可使用Testcontainers设置Ollama服务。

此时Spring AI同样会自动创建ChatModel Bean。若类路径同时存在OpenAI API、Bedrock Converse和Ollama依赖,可通过限定符openAiChatModelbedrockProxyChatModelollamaChatModel引用特定Bean

3. 构建聊天机器人

讨论完各种配置选项后,让我们使用配置的DeepSeek模型构建一个简单聊天机器人

3.1. 定义聊天机器人Bean

首先定义聊天机器人所需的Bean:

@Bean
ChatMemory chatMemory() {
    return new InMemoryChatMemory();
}

@Bean
ChatClient chatClient(ChatModel chatModel, ChatMemory chatMemory) {
    return ChatClient
      .builder(chatModel)
      .defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory))
      .build();
}

先使用InMemoryChatMemory实现定义ChatMemory Bean,用于在内存中存储聊天历史以保持对话上下文。

然后使用ChatModelChatMemory Bean创建ChatClient Bean。ChatClient类是与配置的DeepSeek模型交互的主要入口点

3.2. 创建自定义StructuredOutputConverter

如前所述,DeepSeek-R1模型的响应包含其思维链,我们收到的响应格式如下:



原始标题:Building an AI Chatbot Using DeepSeek Models With Spring AI | Baeldung