1. 引言
随着人工智能技术的发展,大语言模型在各领域应用日益广泛。本文将详细介绍如何在Java项目中集成Deepseek大模型,实现智能文本生成、对话等功能。
2. 前期准备
- 准备Java Spring Boot项目环境
- 确保Maven已配置
- 注册Deepseek账号并获取API密钥
获取api key
这里我简单演示一下怎么申请获取key
申请创建好key后,请注意保存并保密好你的key
然后再需要充点米按照我下面的步骤就能调用了
3. 添加必要依赖
下面以我的一个项目为例,在pom.xml中添加以下依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kmbeast</groupId>
<artifactId>personal-health-api</artifactId>
<version>1.0-SNAPSHOT</version>
<name>personal-health-api</name>
<!--springboot父依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.13</version>
<relativePath/>
</parent>
<!--编译配置与版本管理-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- 依赖版本管理 -->
<commons-lang3.version>3.12.0</commons-lang3.version>
<mybatis-spring-boot-starter.version>2.1.2</mybatis-spring-boot-starter.version>
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
<druid-spring-boot-starter.version>1.2.8</druid-spring-boot-starter.version>
<easyexcel.version>3.2.1</easyexcel.version>
<poi.version>4.1.2</poi.version>
<java-jwt.version>3.4.0</java-jwt.version>
<jjwt.version>0.9.0</jjwt.version>
<itext-asian.version>5.2.0</itext-asian.version>
<fastjson2.version>2.0.33</fastjson2.version>
<weka.version>3.8.5</weka.version>
<commons-math3.version>3.6.1</commons-math3.version>
<drools.version>7.59.0.Final</drools.version>
<opennlp.version>1.9.3</opennlp.version>
<jfreechart.version>1.5.3</jfreechart.version>
<ehcache.version>2.10.6</ehcache.version>
<knife4j.version>4.4.0</knife4j.version>
</properties>
<!--依赖-->
<dependencies>
<!--工具类依赖-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<!--SpringBoot 启动包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--SpringBoot Web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringBoot Aop-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--Lombok 简化实体类开发-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--数据库链接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid-spring-boot-starter.version}</version>
</dependency>
<!-- mybatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot-starter.version}</version>
</dependency>
<!--MybatisPlus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!--excel处理-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyexcel.version}</version>
</dependency>
<!--excel处理-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<!-- JWT相关 -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>${java-jwt.version}</version>
</dependency>
<!-- JWT相关 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<!-- JWT相关 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>${itext-asian.version}</version>
</dependency>
<!-- JSON解析 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>${fastjson2.version}</version>
</dependency>
<!-- WebSocket依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- 机器学习库 -->
<dependency>
<groupId>nz.ac.waikato.cms.weka</groupId>
<artifactId>weka-stable</artifactId>
<version>${weka.version}</version>
</dependency>
<!-- 数学计算库 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>${commons-math3.version}</version>
</dependency>
<!-- 规则引擎 -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools.version}</version>
</dependency>
<!-- OpenNLP -->
<dependency>
<groupId>org.apache.opennlp</groupId>
<artifactId>opennlp-tools</artifactId>
<version>${opennlp.version}</version>
</dependency>
<!-- 图表生成 -->
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>${jfreechart.version}</version>
</dependency>
<!-- 开启缓存支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- 添加 Ehcache 支持 -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>${ehcache.version}</version>
</dependency>
<!-- Knife4j API文档 -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
</dependencies>
<build>
<defaultGoal>compile</defaultGoal>
<!--定义资源路径-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*/*.*</include>
<include>*.*</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
上面是我一个项目的全部依赖,,因为我调用deepseekapi后,还用了保存日志持久化的操作,必须要有以下依赖。
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Lombok简化代码 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- MyBatis数据库操作 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!--MybatisPlus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>
4. 配置Deepseek参数
在application.yml中添加Deepseek配置:
# 大模型配置
llm:
provider: deepseek
connect-timeout: 30000 # 连接超时时间(ms)
read-timeout: 90000 # 读取超时时间(ms)
# Deepseek配置
deepseek:
api-key: your-api-key-here
model: deepseek-chat
api-url: https://api.deepseek.com/v1/chat/completions
max-retries: 2 # 请求失败后最大重试次数
以我的项目作为示例:
# 服务配置
server:
port: 9999
servlet:
context-path: /api/personal-heath/v1.0
# API地址前缀,用于接口拦截放行
my-server:
api-context-path: /api/personal-heath/v1.0
#MySQL与文件上传限制配置
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/personal_health?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
username: root
password: 123456
# SpringBoot 2.6+解决与Swagger兼容性问题
mvc:
pathmatch:
matching-strategy: ANT_PATH_MATCHER
# 让 Mybatis 在 Mapper目录下找到 XML 映射文件
mybatis:
mapper-locations: classpath:mapper/*.xml
# 大模型配置
llm:
# 使用deepseek,可选值:openai/deepseek
provider: deepseek
connect-timeout: 30000 # 连接超时时间(ms)
read-timeout: 90000 # 读取超时时间(ms),对于大模型需要更长时间
# Deepseek配置
deepseek:
api-key: #注意这里配置你的真实的key
model: deepseek-chat
api-url: https://api.deepseek.com/v1/chat/completions
max-retries: 2 # 请求失败后最大重试次数
# 健康分析服务配置
health:
analysis:
provider: llm
# Knife4j配置
knife4j:
enable: true
basic:
enable: false
setting:
language: zh-CN
enableSwaggerModels: true
enableDocumentManage: true
swaggerModelName: 实体类列表
enableOpenApi: false
这里不方便展示我的真实的key
5. 创建数据传输对象
这里的传输对象不固定,可根据需求修改
LLMRequest.java
@Data
@Builder
public class LLMRequest {
private String userPrompt;
private String systemPrompt;
private String modelName;
private Float temperature;
private Integer maxTokens;
}
LLMResponse.java
@Data
@Builder
public class LLMResponse {
private String content;
private Integer usedTokens;
private String requestId;
private boolean success;
private String errorMessage;
}
6. 实现大模型服务接口
public interface ILLMService {
LLMResponse generateResponse(LLMRequest request);
LLMResponse generateChatResponse(LLMRequest request);
List<LLMResponse> batchProcess(List<LLMRequest> requests);
}
7. RestTemplate配置
@Configuration
public class RestTemplateConfig {
@Value("${llm.connect-timeout:30000}")
private int connectTimeout;
@Value("${llm.read-timeout:90000}")
private int readTimeout;
@Bean("llmRestTemplate")
public RestTemplate llmRestTemplate() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(connectTimeout);
factory.setReadTimeout(readTimeout);
return new RestTemplate(factory);
}
}
8. 实现Deepseek服务
@Slf4j
@Service("deepseekService")
@ConditionalOnProperty(name = "llm.provider", havingValue = "deepseek")
public class DeepseekServiceImpl implements ILLMService {
@Value("${deepseek.api-key}")
private String apiKey;
@Value("${deepseek.model:deepseek-chat}")
private String model;
@Value("${deepseek.api-url}")
private String apiUrl;
@Value("${deepseek.max-retries:2}")
private int maxRetries;
@Autowired
@Qualifier("llmRestTemplate")
private RestTemplate restTemplate;
@Autowired
private AIModelLogMapper aiModelLogMapper;
@Override
public LLMResponse generateResponse(LLMRequest request) {
long startTime = System.currentTimeMillis();
AIModelLog logRecord = createLogRecord("Deepseek", apiUrl);
// 重试机制
int retryCount = 0;
Exception lastException = null;
while (retryCount <= maxRetries) {
try {
// 构建请求体
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("model", StringUtils.hasText(request.getModelName()) ?
request.getModelName() : model);
List<Map<String, String>> messages = new ArrayList<>();
// 添加系统提示词
if (StringUtils.hasText(request.getSystemPrompt())) {
Map<String, String> systemMessage = new HashMap<>();
systemMessage.put("role", "system");
systemMessage.put("content", request.getSystemPrompt());
messages.add(systemMessage);
}
// 添加用户提示词
Map<String, String> userMessage = new HashMap<>();
userMessage.put("role", "user");
userMessage.put("content", request.getUserPrompt());
messages.add(userMessage);
requestBody.put("messages", messages);
// 设置温度参数
if (request.getTemperature() != null) {
requestBody.put("temperature", request.getTemperature());
}
// 设置最大令牌数
if (request.getMaxTokens() != null) {
requestBody.put("max_tokens", request.getMaxTokens());
}
// 设置请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer " + apiKey);
// 发送请求
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(requestBody, headers);
ResponseEntity<Map> response = restTemplate.exchange(
apiUrl, HttpMethod.POST, entity, Map.class);
// 解析响应
Map responseBody = response.getBody();
if (responseBody != null && responseBody.containsKey("choices")) {
List<Map> choices = (List<Map>) responseBody.get("choices");
if (!choices.isEmpty()) {
Map choice = choices.get(0);
Map message = (Map) choice.get("message");
String content = (String) message.get("content");
// 记录成功日志
logRecord.setStatus((byte) 1);
logRecord.setResponseTime((int)(System.currentTimeMillis() - startTime));
saveLog(logRecord);
return LLMResponse.builder()
.content(content)
.usedTokens(responseBody.containsKey("usage") ?
(Integer)((Map)responseBody.get("usage")).get("total_tokens") : null)
.requestId(responseBody.containsKey("id") ? (String)responseBody.get("id") : null)
.success(true)
.build();
}
}
// 失败处理...
} catch (ResourceAccessException e) {
// 网络错误重试逻辑...
retryCount++;
}
}
// 所有重试失败后返回错误响应
return LLMResponse.builder()
.success(false)
.errorMessage("Deepseek API调用失败")
.build();
}
// 其他方法实现...
}
9. 使用示例
@RestController
@RequestMapping("/api/llm")
public class LLMController {
@Autowired
@Qualifier("deepseekService")
private ILLMService llmService;
@PostMapping("/generate")
public ResponseEntity<LLMResponse> generateResponse(@RequestBody LLMRequest request) {
LLMResponse response = llmService.generateResponse(request);
return ResponseEntity.ok(response);
}
}
用swagger测试后你就会看到
10.注意事项
API密钥安全:永远不要在代码中硬编码API密钥,使用配置文件或环境变量
错误处理:实现合理的重试机制和错误处理策略
性能优化:对大模型响应进行缓存,避免重复请求
成本控制:监控Token使用量,设置合理的最大Token限制
超时设置:大模型请求可能需要较长时间,合理设置超时参数
11. 总结
通过以上步骤,我们成功在Java项目中集成了Deepseek大模型,实现了智能文本生成功能。该方案具有良好的可扩展性,可以根据业务需求进一步优化和扩展。
采用这种方式集成大模型,不仅能够为应用提供强大的AI能力,还能保持代码的解耦和灵活性,为未来集成更多AI模型奠定基础。