一分钟完成对接deepSeek服务,实现流式打印机响应效果

公司搭建了deepSeek服务,让项目对接使用。
这里有两种对接方案,使用okhttp去调用,但过程代码比较多,不够简洁。
这里推荐使用webflux。直接上代码。

maven座标,引入webflux

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

springboot项目,写个controller

package space.goldchen.ai;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;

import javax.servlet.http.HttpServletResponse;

/**
 * deepseek控制层
 *
 * @author 2021
 * @create 2025-02-14 16:41
 */
@RestController
@Slf4j
public class DeepSeekController {
    // deepSeek服务的url
    private final static String BASE_URL ="http://192.16.21.190:8060/";
    // deepSeek的uri
    private final static String URI = "/v1/chat/completions";

    // 向deepSeek发送请求的webclient
    private final WebClient WEB_CLIENT = WebClient.create(BASE_URL);
    /**
     * 请求deepseek
     *
     * @return
     */
    @GetMapping(path = "/chat/completions",produces="text/event-stream")
    public Flux<ServerSentEvent<String>> handleStream4(HttpServletResponse response ) {

        response.setContentType("text/event-stream");
        response.setCharacterEncoding("UTF-8");
        // response.setHeader("Cache-Control", "no-cache");
        // response.setHeader("Connection", "keep-alive");
        response.setHeader("proxy_buffering", "off");
        response.setHeader("proxy_cache", "off");
        // response.setHeader("X-Accel-Buffering", "no");

        // 向DeepSeek提问的内容
        String content = "你好";
        // 是否流式返回
        boolean stream = true;

        // 假设请求体是一个简单的 JSON 对象,参数是content和stream
        String requestBody = "{\n" +
                "  \"model\": \"deepseek_R1\",\n" +
                "  \"strategy\": \"Default\",\n" +
                "  \"messages\": [\n" +
                "    {\n" +
                "      \"role\": \"user\",\n" +
                "      \"content\": \"" + content + "\"\n" +
                "    }\n" +
                "  ],\n" +
                "  \"stream\": " + stream + "\n" +
                "}";

        log.info("请求deepseek{}", requestBody);
        Flux<String> sseFlux = WEB_CLIENT.post()
                .uri(URI)
                .contentType(MediaType.APPLICATION_JSON)
                .bodyValue(requestBody)
                .retrieve()
                .bodyToFlux(String.class);
        // 用answer来接回复的内容,方便回答完成后入库
        StringBuffer answer = new StringBuffer();
        sseFlux.subscribe(eventData -> {
                    // log.info("Received Event: " + eventData);
                    if (eventData.contains("content")) {
                        JSONObject jsonObject = JSONObject.parseObject(eventData);
                        JSONArray jsonArray = jsonObject.getJSONArray("choices");
                        JSONObject jsonObject1 = jsonArray.getJSONObject(0);
                        JSONObject delta = jsonObject1.getJSONObject("delta");
                        if (delta.containsKey("content")) {
                            answer.append(delta.getString("content"));
                        }
                    }
                }
                , error -> {
                    // 处理错误
                    log.error(JSONObject.toJSONString(error));
                    log.error("Error occurred: " + error.getMessage());
                }, () -> {
                    // 处理完成,完成后,将回答的结果入库了
                    log.info("answer{}", answer);
                    log.info("Completed");
                }

        );
        return sseFlux.map(data -> ServerSentEvent.builder(data).build());

    }
}

启动项目,访问接口,流式响应效果,出来了

在这里插入图片描述

完成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Goldchenn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值