在Java项目中集成Deepseek大语言模型实践指南
1. 引言
随着人工智能技术的发展,大语言模型在各领域应用日益广泛。本文将详细介绍如何在Java项目中集成Deepseek大模型,实现智能文本生成、对话等功能。
2. 前期准备
- 准备Java Spring Boot项目环境
- 确保Maven已配置
- 注册Deepseek账号并获取API密钥
获取api key
这里我简单演示一下怎么申请获取key
点击 deepseek API开放平台
申请创建好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: deepseekconnect-timeout: 30000 # 连接超时时间(ms)read-timeout: 90000 # 读取超时时间(ms)# Deepseek配置
deepseek:api-key: your-api-key-heremodel: deepseek-chatapi-url: https://api.deepseek.com/v1/chat/completionsmax-retries: 2 # 请求失败后最大重试次数
以我的项目作为示例:
# 服务配置
server:port: 9999servlet: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: 10MBmax-request-size: 10MBdatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/personal_health?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=trueusername: rootpassword: 123456# SpringBoot 2.6+解决与Swagger兼容性问题mvc:pathmatch:matching-strategy: ANT_PATH_MATCHER
# 让 Mybatis 在 Mapper目录下找到 XML 映射文件
mybatis:mapper-locations: classpath:mapper/*.xml# 大模型配置
llm:# 使用deepseek,可选值:openai/deepseekprovider: deepseekconnect-timeout: 30000 # 连接超时时间(ms)read-timeout: 90000 # 读取超时时间(ms),对于大模型需要更长时间# Deepseek配置
deepseek:api-key: #注意这里配置你的真实的keymodel: deepseek-chatapi-url: https://api.deepseek.com/v1/chat/completionsmax-retries: 2 # 请求失败后最大重试次数# 健康分析服务配置
health:analysis:provider: llm# Knife4j配置
knife4j:enable: truebasic:enable: falsesetting:language: zh-CNenableSwaggerModels: trueenableDocumentManage: trueswaggerModelName: 实体类列表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;@Autowiredprivate AIModelLogMapper aiModelLogMapper;@Overridepublic 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模型奠定基础。