1. 概述
现代Web应用正越来越多地集成大语言模型(LLMs)来构建解决方案。
DeepSeek是一家中国AI研究公司,开发了强大的大语言模型,近期凭借其DeepSeek-V3和DeepSeek-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。需将REGION、ACCOUNT_ID和ENDPOINT_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中的REGION和ACCOUNT_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-strategy为when_missing。这确保Spring AI在本地缺少指定模型时会自动拉取。
Spring AI在默认端口11434的localhost上运行时会自动连接Ollama。但可通过spring.ai.ollama.base-url属性覆盖连接URL。也可使用Testcontainers设置Ollama服务。
此时Spring AI同样会自动创建ChatModel Bean。若类路径同时存在OpenAI API、Bedrock Converse和Ollama依赖,可通过限定符openAiChatModel、bedrockProxyChatModel或ollamaChatModel引用特定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,用于在内存中存储聊天历史以保持对话上下文。
然后使用ChatModel和ChatMemory Bean创建ChatClient Bean。ChatClient类是与配置的DeepSeek模型交互的主要入口点。
3.2. 创建自定义StructuredOutputConverter
如前所述,DeepSeek-R1模型的响应包含其思维链,我们收到的响应格式如下: