提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、必要信息准备
- 二、HTTP问答接入
-
- 1.配置文件
- 2.创建实例类
- 3.创建调用外部API接口
- 4.创建调用服务service
- 5.业务层service选择模型,并调用刚刚的服务
- 三、WSS流式调用
-
- 1.先写一个处理流式响应的方法
- 2.业务层service调用
- 3.WebSocket调用
- 总结
前言
硅基流动推出了功能完备的DeepSeek满血版,然而众多用户在尝试接入大型模型时仍面临诸多挑战,特别是在流式接入方面。今天,我将引领大家通过Java实现双模式接入DeepSeek满血版,这涵盖了利用HTTP协议实现的问答模式,以及借助WSS协议实现的流式问答功能。话不多说,我们直接开始。
一、必要信息准备

接入满血版DeepSeek,肯定要有个硅基流动账号和秘钥啦,搜索一下硅基流动官网,打开硅基流动首页,注册账号,别忘了填邀请码wkzJFskh,注册后可以获取14元的赠送额度,嫌麻烦的同学可以直接复制https://cloud.siliconflow.cn/i/wkzJFskh,可以直接跳转到官网。

注册完成后,左侧菜单栏点击API秘钥,然后选择右上角的创建秘钥,输入必要信息后,秘钥创建完成,鼠标点击刚刚创建的秘钥,单击复制,这一步可以先把秘钥用个记事本记录一下,等会代码里会用到。

点击左侧模型广场,选取DeepSeekR1满血版模型,可以看到,广场里面有很多小模型是免费的,大家有空可以都尝试玩一下。

复制一下模型名称,写在记事本里,等会会用到。点击API文档,进入官方接入指南。

记住这边的路径,请求以及响应,下面要开始代码部分啦。
二、HTTP问答接入
我们先进行HTTP问答接入,这种接入方式需要等大模型完全回答完问题,将答案生成好之后,全部返回,这种方式的优点是前后端交互方便,缺点是在用户看来等待好长时间才返回答案。下面开始上代码
1.配置文件
代码如下(示例):
sili:
apiKey: sk-xxxxxxxxx-your-api-key
baseUrl: https://api.siliconflow.cn/v1/
2.创建实例类
会看第一节的官方API指南,根据官方的请求体和响应,构造实体类,我这边不展开篇幅
3.创建调用外部API接口
这里将普通调用和流模式均展示在了下面,流式调用需要用@Streaming注解。这里不使用openFeign是因为openFeign不支持流式响应的接收。
package com.example.awesome.feign.siliconflow;
import com.example.awesome.feign.siliconflow.req.ChatCompletionReq;
import com.example.awesome.feign.siliconflow.res.ChatCompletionRes;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.HeaderMap;
import retrofit2.http.POST;
import retrofit2.http.Streaming;
import java.util.Map;
/**
* 定义与 SiliconFlow API 交互的 Retrofit 接口。
*/
public interface SiliconFlowApiService {
/**
* 发起同步的聊天完成请求。
*
* @param chatCompletionReq 请求体,包含聊天完成所需的参数。
* @param headers HTTP 请求头,包括授权信息等。
* @return 返回一个 {@link Call} 对象,用于执行HTTP请求并获取 {@link ChatCompletionRes} 响应。
*/
@POST("/chat/completions")
Call<ChatCompletionRes> getChatCompletions(
@Body ChatCompletionReq chatCompletionReq,
@HeaderMap Map<String, String> headers
);
/**
* 发起流式的聊天完成请求。
*
* @param chatCompletionReq 请求体,包含聊天完成所需的参数。
* @param headers HTTP 请求头,包括授权信息等。
* @return 返回一个 {@link Call} 对象,用于执行HTTP请求并获取 {@link ResponseBody} 流式响应。
* @see Streaming 表示该请求是流式的,不会将整个响应体加载到内存中。
*/
@POST("/chat/completions")
@Streaming
Call<ResponseBody> getChatCompletionsStream(
@Body ChatCompletionReq chatCompletionReq,
@HeaderMap Map<String, String> headers
);
}
4.创建调用服务service
package com.example.awesome.feign.siliconflow;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.example.awesome.feign.siliconflow.req.ChatCompletionReq;
import com.example.awesome.feign.siliconflow.res.ChatCompletionRes;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.volcengine.ark.runtime.model.completion.chat.ChatCompletionResult;
import com.volcengine.ark.runtime.utils.ResponseBodyCallback;
import com.volcengine.ark.runtime.utils.SSE;
import io.reactivex.BackpressureStrategy;
import io.reactivex.Flowable;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import okhttp3.ResponseBody;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import retrofit2.Call;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* 实现与 SiliconFlow API 交互的服务类。
*/
@Service
@Slf4j

&spm=1001.2101.3001.5002&articleId=145614899&d=1&t=3&u=09656b56a6874992bb8384735a27b36a)
4346

被折叠的 条评论
为什么被折叠?



