【AI应用开发捷径之路】第二课:SpringAi接入Deepseek
原创 小数先生
摘要
本文主要介绍SpringAi接入Deepseek的一些核心及参数:
1、接入和配置步骤
2、模型通用参数详解
3、deepseek深度思考及流式输出
4、请求deepseek大模型的通信原理
一、接入Deepseek
1. 引入BOM进行版本管理
首先,在你的pom.xml的 <dependencyManagement> 部分引入Spring AI的BOM。强烈推荐使用当时最新的稳定版本。
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.3</version> <!-- 建议使用最新稳定版 –>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
引入BOM后,在添加其他Spring AI组件依赖时就可以省略<version>标签了,所有版本都由BOM统一管理。
2. 添加模型Starter依赖
接下来,在<dependencies>部分添加你所需模型的Starter。例如,集成OpenAI和Ollama可以这样配置:
<!–接入deepseek,由于使用是spring-ai-bom,所有不需要添加版本号–>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-deepseek</artifactId>
</dependency>
3.配置文件
依赖添加完成后,你需要在:
application.yml 或 application.properties 中进行配置。
spring:
ai:
deepseek:
api-key: sk-xxx # 替换为你的DeepSeek API密钥
# base-url: https://api.deepseek.com # 可省略,使用默认值
chat:
options:
model: deepseek-chat # 可选:deepseek-chat 或 deepseek-reasoner (R1模型)[citation:3]
temperature: 0.8 # 可选,控制输出随机性
api-key可以通过官网注册获取:
https://platform.deepseek.com/api_keys
4.测试
①阻断性返回测试
package com.example;
import cn.myeasyai.FaceApplication;
import org.junit.jupiter.api.Test;
import org.springframework.ai.deepseek.DeepSeekChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest(classes = FaceApplication.class)
public class TestDeepseek {
@Test
public void rest(@Autowired DeepSeekChatModel deepSeekChatModel) {
String call = deepSeekChatModel.call("你好,你是谁");
System.out.println(call);
}
}

②流式返回测试
package com.example;
import cn.myeasyai.FaceApplication;
import org.junit.jupiter.api.Test;
import org.springframework.ai.deepseek.DeepSeekChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import reactor.core.publisher.Flux;
@SpringBootTest(classes = FaceApplication.class)
public class TestDeepseek {
/**
* 测试流式
* @param deepSeekChatModel
*/
@Test
public void testDeepseekStream(@Autowired DeepSeekChatModel deepSeekChatModel) {
Flux<String> stream = deepSeekChatModel.stream("你好,你是谁");
stream.toIterable().forEach(System.out::println);
}
}

二、模型通用配置参数
temperature(温度) --性格
0-2 浮点数值
数值越高 更有创造性 热情
数值越低 保守
各业务场景适合的温度取值建议:

@Test
public void testChatWithTemperature(@Autowired DeepSeekChatModel deepSeekChatModel) {
// 创建带有温度参数的选项
DeepSeekChatOptions options = DeepSeekChatOptions.builder()
.temperature(0.9d) // 温度参数范围通常是 0.0 到 2.0
.maxTokens(500) // 限制最大token数
.build();
// 创建提示
Prompt prompt = new Prompt("请写一首表达爱意的诗词", options);
// 调用模型
ChatResponse response = deepSeekChatModel.call(prompt);
String content = response.getResult().getOutput().getText();
// 打印结果
System.out.println("=== AI 响应 ===");
System.out.println(content);
System.out.println("===============");
}

@Test
public void testChatWithTemperature(@Autowired DeepSeekChatModel deepSeekChatModel) {
// 创建带有温度参数的选项
DeepSeekChatOptions options = DeepSeekChatOptions.builder()
.temperature(0.2d) // 温度参数范围通常是 0.0 到 2.0
.maxTokens(500) // 限制最大token数
.build();
// 创建提示
Prompt prompt = new Prompt("请写一首表达爱意的诗词", options);
// 调用模型
ChatResponse response = deepSeekChatModel.call(prompt);
String content = response.getResult().getOutput().getText();
// 打印结果
System.out.println("=== AI 响应 ===");
System.out.println(content);
System.out.println("===============");
}

model(模型)–主体
deepseek-chat 或 deepseek-reasoner (R1模型)[citation:3]
deepseek-reasoner
deepseek-chat
@Test
public void testChatWithTemperature(@Autowired DeepSeekChatModel deepSeekChatModel) {
// 创建带有温度参数的选项
DeepSeekChatOptions options = DeepSeekChatOptions.builder()
.temperature(0.2d) // 温度参数范围通常是 0.0 到 2.0
.maxTokens(500) // 限制最大token数
.model("deepseek-reasoner") //深度思考模型
.build();
// 创建提示
Prompt prompt = new Prompt("请写一首表达爱意的诗词", options);
// 调用模型
ChatResponse response = deepSeekChatModel.call(prompt);
String content = response.getResult().getOutput().getText();
// 打印结果
System.out.println("=== AI 响应 ===");
System.out.println(content);
System.out.println("===============");
}
提示词–要求
在调用大模型的时候,也可以通过提示词降低他的主观臆想,例如在提示词中输入:
1、只引用可靠来源中的信息,不做任何假设或扩展描述。
2、请只基于已知事实回答,不要主观臆想或添加额外内容
3、请简明、客观地给出答案,不要进行修饰或补充未经请求的信息
@Test
public void testChatWithTemperature(@Autowired DeepSeekChatModel deepSeekChatModel) {
// 创建带有温度参数的选项
DeepSeekChatOptions options = DeepSeekChatOptions.builder()
.temperature(0.2d) // 温度参数范围通常是 0.0 到 2.0
.maxTokens(500) // 限制最大token数
.model("deepseek-reasoner") //深度思考模型
.build();
// 创建提示
Prompt prompt = new Prompt("请写一首表达爱意的诗词,请简明、客观地给出答案,不要进行修饰或补充未经请求的信息", options);
// 调用模型
ChatResponse response = deepSeekChatModel.call(prompt);
String content = response.getResult().getOutput().getText();
// 打印结果
System.out.println("=== AI 响应 ===");
System.out.println(content);
System.out.println("===============");
}
}
maxToken -限制输出长度
maxTokens:限制Al模型生成的最大token数(近似理解为字数上限)
需要简洁回复、打分、列表、短摘要等,建议设置小值(如10~50)
防止用户跑长对话导致无关内容花费过多token费用。
如果遇到生成内容经常被截断,可以适当配置更大maxTokens。
@Test
public void testChatWithTemperature(@Autowired DeepSeekChatModel deepSeekChatModel) {
// 创建带有温度参数的选项
DeepSeekChatOptions options = DeepSeekChatOptions.builder()
.temperature(0.2d) // 温度参数范围通常是 0.0 到 2.0
.maxTokens(500) // 限制最大token数
.model("deepseek-reasoner") //深度思考模型
.build();
// 创建提示
Prompt prompt = new Prompt("请写一首表达爱意的诗词,请简明、客观地给出答案,不要进行修饰或补充未经请求的信息", options);
// 调用模型
ChatResponse response = deepSeekChatModel.call(prompt);
String content = response.getResult().getOutput().getText();
// 打印结果
System.out.println("=== AI 响应 ===");
System.out.println(content);
System.out.println("===============");
}
stop-截断输出内容
当触发设置的敏感关键词时,可以通过该参数进行截断输出
@Test
public void testChatWithTemperature(@Autowired DeepSeekChatModel deepSeekChatModel) {
//设置截断关键词
ArrayList<String> stopList = new ArrayList<>();
stopList.add("。");
// 创建带有温度参数的选项
DeepSeekChatOptions options = DeepSeekChatOptions.builder()
.temperature(0.2d) // 温度参数范围通常是 0.0 到 2.0
.maxTokens(500) // 限制最大token数
.model("deepseek-reasoner") //深度思考模型
.stop(stopList)
.build();
// 创建提示
Prompt prompt = new Prompt("请写一首表达爱意的诗词", options);
// 调用模型
ChatResponse response = deepSeekChatModel.call(prompt);
String content = response.getResult().getOutput().getText();
// 打印结果
System.out.println("=== AI 响应 ===");
System.out.println(content);
System.out.println("===============");
}
可以看到输出一句诗词就没有再继续输出了(被截断丢弃了)

三、deepseek深度思考-流式输出
deepseek的深度思考内容和结果是分2个字段返回的,因此可以根据业务场景需求来决定是否需要获取到思维链。但需要注意的是,如果开启了深度思考模式,那么返回的方式必须是流式,否则会超时。
@Test
public void testOptimizedReasoningStream(@Autowired DeepSeekChatModel deepSeekChatModel) {
DeepSeekChatOptions options = DeepSeekChatOptions.builder()
.temperature(0.2d)
.maxTokens(2000)
.model("deepseek-reasoner")
.build();
Flux<ChatResponse> stream = deepSeekChatModel.stream(new Prompt("请写一首表达爱意的诗词",options));
stream.toIterable().forEach(chatResponse -> {
DeepSeekAssistantMessage assistantMessage = (DeepSeekAssistantMessage) chatResponse.getResult().getOutput();
System.out.println(assistantMessage.getReasoningContent()==null? "":assistantMessage.getReasoningContent());
});
System.out.println("输出结果==============================================================");
stream.toIterable().forEach(chatResponse -> {
DeepSeekAssistantMessage assistantMessage = (DeepSeekAssistantMessage) chatResponse.getResult().getOutput();
System.out.println(assistantMessage.getText()==null? "":assistantMessage.getText());
});
}




