JAVA接入DeepSeek的两种方式
本文主要介绍了如何在自己的Java程序中接入Deepseek,其中使用到的方法对于其他ai也适用,并不局限于Deepseek。
方法有两个:
- 远程调用Deepseek的api。
- 使用ollama本地部署ai并调用ollama接口。
先说第一个
调用官方的api需要在平台充值余额,首次调试api只充值少量即可。
总体流程:充值并获取key==>根据接口文档构建请求体和响应体è构建请求头==>拼接请求头和请求体==>发送请求并接收响应==>输出响应信息
一、调用DeepSeek官方API。
访问DeepSeek官网并进入开发者平台
-
充值余额并创建key
点击充值可以自定义金额,初次调试接口充值1元就够用了
充值完成后进入API Keys界面创建一个key。
注意:key只在创建时可见,所以创建时务必复制保存好,否则只能重新申请key
创建完成后点击左下角进入接口文档
-
参考接口文档在IDEA构建请求
一个完整的HTTP请求由请求头(header)、请求体(Body)、请求方式(Method)、请求链接(URL)组成,这些信息都可以在接口文档中获取到。
在接口文档中首页提到了首次调用API的最低要求:访问的URL以及自己申请到的key。页面下方是curl、python、nodejs调用的示例
为了方便构建请求可以往下找找JAVA调用的示例
在下方API文档==>对话==>对话补全 页面中可以找到请求所需要的全部信息。
现在得知了需要的信息后,可以在idea构建请求体和响应体了。
首先构建请求体,在文档中标明了required的属性为请求体的必须值,因为是简单使用,请求体只需要把必要的属性创建出来就行了。
观察其中的结构可以知道,请求体包含有两个属性
{
String model; //字符串类型的model,标明使用哪个模型
List<Message> messages; //集合类型的messages,储存了发送的信息
}
而message中主要包含两个属性(name属性为非必须,不讨论)
{
String content; //发送给模型的消息
String role; //发送这条消息的角色(个人调用的值应为user)
}
在idea创建相应的实体类,先从内层的Message开始创建:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Message{
private String content;
private String role;
}
再创建外层的Body,类的名字可以任意取,但是属性名一定要和文档相同:
@Data
public class DeepSeekRequest {
private ArrayList<Message> messages;
private String model;
}
这样请求体就创建好了,先放在一边。
页面往下滑继续创建响应体。
响应体就不需要关注右侧的required,因为我们作为接收方,响应体中的属性可以选择接收或者不接收。所以只需要关注自己需要的属性。
观察响应体要求可以得知,我们最终需要的信息在content里面,然而content是Message类中的一个属性,并且message是Choice类中的一个属性,choices还是响应体中的一个集合属性。注意大小写关系,首字母大写是类,小写是属性。
根据以上信息构建响应体:
最内层的Message直接沿用前面创建的即可:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Message{
private String content;
private String role;
}
Choice类包含一个Message属性:
@Data
public class Choice {
private Message message;
}
主体Body类,和上面一样,类的名字随便取,属性名和文档一致:
@Data
public class DeepSeekResponse {
private ArrayList<Choice> choices;
}
至此,响应体和请求体全部构建完毕!开始写业务接口
-
编写服务类
创建一个DeepseekService服务接口'
public interface DeepSeekService {
public String call(String message);
}
创建一个DeepseekServiceImpl实现类
@Service
public class DeepSeekServiceImpl {
}
现在已经有了请求体,还缺URL、Key、请求头。全部都在在这个业务类中定义。
先准备URL和key
private String url="https://api.deepseek.com/v1/chat/completions";
private String key="自己申请的key ";
这个url是从页面的JAVA示例中获取的
下一步写一个call函数方便调用并在里面构建请求头。
Call函数的作用是调用时传入要发给AI的消息,返回一个AI的回答。
public String call(String message){
//构建请求头
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
headers.add("Accept", "application/json");
headers.add("Authorization", "Bearer "+key);
}
这需要用到一个HttpHeaders的类,这个类是专门用来处理请求头的。关于请求头的信息全部都是从示例中获取的。注意<TOKEN>换成自己的key。
下一步创建请求体并赋值
//构建请求体
DeepSeekRequest deepSeekRequest = new DeepSeekRequest();
//设置模型,值为deepseek-chat或者deepseek-reasoner 文档中有提到
deepSeekRequest.setModel("deepseek-chat");
Message msg = new Message();
//设置message
msg.setRole("user");
msg.setContent(message);
ArrayList<Message> messageArrayList = new ArrayList<>();
messageArrayList.add(msg);
//最终设置请求体
deepSeekRequest.setMessages(messageArrayList);
现在请求体和请求头都设置好了,下一步拼接请求头。
这里要用到一个HttpEntity类,用于拼接请求头和请求体,构成一个请求实体。创建时指定类型为请求体的类型,传入构建好的请求体和请求头即可,如下
HttpEntity<DeepSeekRequest> httpEntity = new HttpEntity<>(deepSeekRequest,headers);
下一步发送请求,使用RestTemplate类。
RestTemplate restTemplate = new RestTemplate();
// ResponseEntity为响应体,用于接收该请求的响应
// exchange函数用于发起请求,参数格式如下
ResponseEntity<DeepSeekResponse> response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, DeepSeekResponse.class);
最终AI返回的内容就装在response里面。
response里的body就是前面写的DeepSeekResponse类,按照前面配置的响应体类
获取里面所需要的消息还要经过层层调用,如下
return response.getBody().getChoices().get(0).getMessage().getContent();
response.getBody()获取到请求体,即前面构建的DeepSeekResponse。
还需要获取到最内层的content才是需要的内容。
最终测试:
完整代码如下:
@Service
public class DeepSeekServiceImpl {
private String url="https://api.deepseek.com/v1/chat/completions";
private String key="自己的key";
public String call(String message){
//构建请求头
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
headers.add("Accept", "application/json");
headers.add("Authorization", "Bearer "+key);
//构建请求体
DeepSeekRequest deepSeekRequest = new DeepSeekRequest();
deepSeekRequest.setModel("deepseek-chat");
Message msg = new Message();
msg.setRole("user");
msg.setContent(message);
ArrayList<Message> messageArrayList = new ArrayList<>();
messageArrayList.add(msg);
deepSeekRequest.setMessages(messageArrayList);
//拼接请求头和请求体
HttpEntity<DeepSeekRequest> httpEntity = new HttpEntity<>(deepSeekRequest,headers);
//发送请求接受响应
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<DeepSeekResponse> response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, DeepSeekResponse.class);
return response.getBody().getChoices().get(0).getMessage().getContent();
}
}
二、Ollama本地部署AI并调用接口
使用Ollama部署建议显卡显存至少4G。
-
下载Ollama
官网:Ollama
下载建议去国内网站下载:Ollama中文官网 - Ollama国内加速下载
- 在Ollama官网查找需要的模型
官网找模型:Ollama
这里以Deepseek-v2为例
选择下载的模型参数,16B表示有160亿个参数。
下载16B的模型建议显存至少8G。
显存小的可以找小参数的模型,例如deepseek-r1
7B建议显存至少4G
根据自己电脑的显存大小选择不同的参数模型,本文以16B的
Deepseek-v2为例。
-
下载模型
直接复制指令在电脑的cmd命令行执行(前提是安装了Ollama)
复制执行后会自动下载模型,等待即可,超时失败就重试,下载完成后会自动运行。因为我已经下载了所以执行指令就直接运行了。
Ctrl+d退出模型,此时可以去idea调用Ollama API
首先声明:springboot在3.2.0及以上的版本才支持AI的API接口。
要升级springboot,mybatis也要同时升级,关于这个问题可自行百度。
-
IDEA调用接口
引入依赖
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
<version>1.0.0-M6</version>
</dependency>
这个依赖如果是使用阿里云镜像可能会找不到,需要自行更换源或者手动下载并安装依赖,关于依赖的手动安装本文不在赘述。
编写Service的实现类
@Service
public class LocalDeepSeekServiceImpl implements DeepSeekService {
}
注入Ollama的API
@Autowired
OllamaChatModel ollamaChatModel;
准备Ollama的专属URL,注意这个URL是固定写法,11434是Ollama的默认端口
String url ="http://localhost:11434/api/chat";
编写接口函数方便调用
@Override
public String call(String message) {
return ollamaChatModel.call(message);
}
Ollama本地AI的部署到这就结束了,很简单。
最终测试:
完整代码:
@Controller
@RequestMapping("/ai")
public class AiController {
@Autowired
DeepSeekService deepSeekService;
@PostMapping("/ollama")
@ResponseBody String send(@RequestParam("message") String message){
return deepSeekService.call(message);
}
}
业务类:
@Service
public class LocalDeepSeekServiceImpl implements DeepSeekService {
@Autowired
OllamaChatModel ollamaChatModel;
String url ="http://localhost:11434/api/chat";
@Override
public String call(String message) {
return ollamaChatModel.call(message);
}
}
更多推荐
所有评论(0)