java流式实现chatGPT会话功能

简介: java流式实现chatGPT会话功能

环境

SpringBoot2.x

Maven3.x

JDK1.8


具体步骤

1. 了解相关api信息

首先前往openai api官网OpenAI API,登录自己的账号,然后选择API reference,然后就可以查看相关的模型比如“gpt-3.5-turbo”,还有很多的api。

这里是一些请求体信息:

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [
      {
        "role": "system",
        "content": "You are a helpful assistant."
      },
      {
        "role": "user",
        "content": "Hello!"
      }
    ]
  }'


这里是响应信息:

{
  "id": "chatcmpl-123",
  "object": "chat.completion",
  "created": 1677652288,
  "model": "gpt-3.5-turbo-0125",
  "system_fingerprint": "fp_44709d6fcb",
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": "\n\nHello there, how may I assist you today?",
    },
    "logprobs": null,
    "finish_reason": "stop"
  }],
  "usage": {
    "prompt_tokens": 9,
    "completion_tokens": 12,
    "total_tokens": 21
  }
}

最重要的是key,如果是新号则去申请,会送一个5美元的key,或者购买一个key。对了,国内的话需要设置代理才能访问。


2. 创建SpringBoot工程

创建工程后添加依赖

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

请求参数类:

public class ChatParams {
    // 模型
    private String model = "gpt-3.5-turbo";
 
    // 消息列表,获取上下文携带返回消息
    private List<ChatMessage> messages;
 
    // 采样温度,较高的值(如 0.8)将使输出更加随机,而较低的值(如 0.2)将使其更加集中和确定
    @DecimalMin("0.0")
    @DecimalMax("2.0")
    private Double temperature = 1.0;
 
    // 核心采用,其中模型考虑具有top_p概率质量的令牌的结果。因此,0.1 意味着只考虑包含前 10% 概率质量的结果集
    @DecimalMin("0.0")
    @DecimalMax("1.0")
    private Double top_p = 1.0;
 
    // 结果数,如果需要返回多个结果可以设置 n > 1
    @Min(1)
    private Integer n = 1;
 
    // 当前用户id,用于处理滥用行为
    private Long userId;
}

注意,本次是进行流式响应,所以还需一个stream参数:

public class ChatStreamParams extends ChatParams{
    private boolean stream = true;
}

后端使用WebClient向apenai api发起post请求以获得流式数据

@Transactional
    @Override
    public void chatStream2(ChatStreamParams chatParams, String chatId, String userId, Session session) {
        Flux<String> stringFlux = webClient.post()
                .uri(apiHost+"/v1/chat/completions")
                .header("Authorization", "Bearer " + apiKey)
                .bodyValue(chatParams)
                .retrieve()
                .bodyToFlux(String.class);
        stringFlux
                .takeWhile(data -> {
                    try {
                        JSONObject json = new JSONObject(data);
                        JSONArray choices = json.getJSONArray("choices");
                        String finish_reason = choices.getJSONObject(0).getString("finish_reason");
                        if (finish_reason.equals("stop")) {
                            String content = contentBuilder.toString();
                            System.out.println("content"+contentBuilder);
                            gptMessageService.save(chatId, Long.valueOf(userId), content, SystemConstants.MESSAGE_TYPE_GPT);
                            contentBuilder.setLength(0);
                        }
                        return !finish_reason.equals("stop"); // 继续处理数据,直到遇到停止条件
                    } catch (Exception e) {
                        e.printStackTrace();
                        return false; // 数据格式异常,停止处理数据
                    }
                })
                .subscribe(
                data -> {
                    try {
                        JSONObject json = new JSONObject(data);
                        JSONArray choices = json.getJSONArray("choices");
                        String finish_reason = choices.getJSONObject(0).getString("finish_reason");
                        if (finish_reason.equals("stop")) {
                            return;
                        }
                        String delta = choices.getJSONObject(0).getString("delta");
                        System.out.println(data);
                        JSONObject msg = new JSONObject(delta);
                        String content = msg.getString("content");
                        // 拼接消息,保存到数据库
                        contentBuilder.append(content);
                        session.getBasicRemote().sendText(content);
                    }catch (Exception e) {
                        e.printStackTrace();
                    }
                },
                error -> {
                    System.out.println("错误");
                    error.printStackTrace();
                }
        );
    }

参数释义:

chatParams:发送给api的请求参数;

chatId: 会话id;

userId: 用户id;

session: WebSocket的session,前后端流式响应会用到websoket

apiHost: 代理地址;

apiKey: key

注意:在subscribe回调函数里拿到流式数据,在takeWhile回调函数里设置停止条件


好了,通过这些步骤应该能流式响应了,如果遇到啥问题可以留言哦,看到会回。  


目录
相关文章
|
5月前
|
安全 Java API
Java中的Lambda表达式:简洁与功能的结合
Java中的Lambda表达式:简洁与功能的结合
486 211
|
5月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
691 64
|
4月前
|
存储 数据可视化 Java
Java Stream API 的强大功能
Java Stream API 是 Java 8 引入的重要特性,它改变了集合数据的处理方式。通过声明式语法,开发者可以更简洁地进行过滤、映射、聚合等操作。Stream API 支持惰性求值和并行处理,提升了代码效率和可读性,是现代 Java 开发不可或缺的工具。
112 0
Java Stream API 的强大功能
|
5月前
|
前端开发 JavaScript Java
Java 项目实战城市公园信息管理系统开发流程与实用功能实现指南
本系统基于Java开发,采用Spring Boot后端框架与Vue.js前端框架,结合MySQL数据库,构建了一个高效的城市公园信息管理系统。系统包含管理员、用户和保洁人员三大模块,涵盖用户管理、园区信息查询、订票预约、服务管理等功能,提升公园管理效率与服务质量。
202 6
|
5月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
310 2
|
6月前
|
Java API
Java API中Math类功能全景扫描
在实际使用时,这些方法的精确度和性能得到了良好的优化。当处理复杂数学运算或高精度计算时,`Math`类通常是足够的。然而,对于非常精细或特殊的数学运算,可能需要考虑使用 `java.math`包中的 `BigDecimal`类或其他专业的数学库。
153 11
|
5月前
|
机器学习/深度学习 算法 Java
Java 大视界 -- Java 大数据机器学习模型在生物信息学基因功能预测中的优化与应用(223)
本文探讨了Java大数据与机器学习模型在生物信息学中基因功能预测的优化与应用。通过高效的数据处理能力和智能算法,提升基因功能预测的准确性与效率,助力医学与农业发展。
|
6月前
|
Java API
深入解析Java API中Object类的功能
了解和合理运用 Object类的这些方法,对于编写可靠和高效的Java应用程序至关重要。它们构成了Java对象行为的基础,影响着对象的创建、识别、表达和并发控制。
133 0
|
6月前
|
消息中间件 监控 Java
借助最新技术构建 Java 邮件发送功能的详细流程与核心要点分享 Java 邮件发送功能
本文介绍了如何使用Spring Boot 3、Jakarta Mail、MailHog及响应式编程技术构建高效的Java邮件发送系统,涵盖环境搭建、异步发送、模板渲染、测试与生产配置,以及性能优化方案,助你实现现代化邮件功能。
308 0

热门文章

最新文章