【开源免费】ChatGPT-Java版SDK更新至1.0.10版,支持Tokens计算,快来一键接入。

news/2024/7/10 20:35:45 标签: java, 开源, chatgpt, spring boot

简介

ChatGPT Java版SDK开源地址:https://github.com/Grt1228/chatgpt-java ,目前收获将近1000个star。

有bug欢迎朋友们指出,互相学习,所有咨询全部免费。

最新版:1.0.10

<dependency>
    <groupId>com.unfbx</groupId>
    <artifactId>chatgpt-java</artifactId>
    <version>1.0.10</version>
</dependency>

整合web示例,支持流式返回:

开发思路可以参考:https://github.com/Grt1228/chatgpt-steam-output

流式输出实现方式小程序安卓iosH5
SSE参考:OpenAISSEEventSourceListener不支持支持支持支持
WebSocket参考:OpenAIWebSocketEventSourceListener支持支持支持支持

更新日志

  • 1.0.10 支持tokens计算:TikTokensTest ,更多详细的资料参考文档:Tokens_README.md
  • 1.0.9 支持自定义key使用策略参考:OpenAiClientTest 和OpenAiStreamClientTest ,弃用ChatGPTClient,优化Moderation接口
  • 1.0.8 修改OpenAiClient和OpenAiStreamClient的自定义相关实现,超时设置,代理设置,自定义拦截器设置改为通过自定义OkHttpClient实现,将OkHttpClient交由用户自定义控制更加合理,可以实现更多的参数自定义。支持多Api Keys配置。
  • 1.0.7 修复反序列化报错Bug:https://github.com/Grt1228/chatgpt-java/issues/79 ,Image SDK枚举值bug:https://github.com/Grt1228/chatgpt-java/issues/76 ,感谢两位朋友指出:@CCc3120 、@seven-cm
  • 1.0.6 支持余额查询参考:OpenAiClientTest 和OpenAiStreamClientTest creditGrants方法,支持最新GPT-4模型,参考:ChatCompletion.Model构建消息体传入模型即可。感谢群友提供的余额接口地址以及@PlexPt 提供的模型参数
  • 1.0.5 支持自定义Api Host,使用Builder构建。参考下面的快速开始部分代码。
  • 1.0.4 官方最新的ChatGPT Stream模式下的Api返回值改动。
  • 1.0.3 支持最新的GPT-3.5-Turbo模型和Whisper-1模型,支持语音功能转文字,语音翻译。OpenAiClient和OpenAiStreamClient支持Builder构造,支持代理。
  • 1.0.2 支持Stream流式输出,参考:OpenAiStreamClient
  • 1.0.1 支持自定义超时时间,自定义OkHttpClient拦截器,参考:OpenAiClient构造函数
  • 1.0.0 支持所有的OpenAI官方接口

最新版支持tokens计算

tokens计算说明

openai 的tokens计算规则适合模型先关的,不同的模型计算方法是不一样的。大致的表格如下:

关于流式返回

流式返回的数据,返回行数-2=返回tokens

[DONE]这一行不参与tokens计算,没有content属性的不参与token计算。
所以tokens数量是4,[“Ser”,“end”,“ip”,“ity”],总返回行数6 - 无效行数2 = 4个tokens


[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI建立sse连接...
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:{"choices":[{"delta":{"role":"assistant"},"index":0,"finish_reason":null}]}
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:{"choices":[{"delta":{"content":"Ser"},"index":0,"finish_reason":null}]}
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:{"choices":[{"delta":{"content":"end"},"index":0,"finish_reason":null}]}
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:{"choices":[{"delta":{"content":"ip"},"index":0,"finish_reason":null}]}
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:{"choices":[{"delta":{"content":"ity"},"index":0,"finish_reason":null}]}
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:{"choices":[{"delta":{},"index":0,"finish_reason":"stop"}]}
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:[DONE]
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据结束了
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI关闭sse连接...

tokens计算使用示例

完整使用示例请参考:TikTokensTest

结合chat模型使用示例:
完整示例参考:OpenAiClientTest

    public void chatTokensTest() {
        //聊天模型:gpt-3.5
        List<Message> messages = new ArrayList<>(2);
        messages.add(Message.builder().role(Message.Role.USER).content("关注微信公众号:程序员的黑洞。").build());
        messages.add(Message.builder().role(Message.Role.USER).content("进入chatgpt-java交流群获取最新版本更新通知。").build());
        ChatCompletion chatCompletion = ChatCompletion.builder().messages(messages).build();
        ChatCompletionResponse chatCompletionResponse = v2.chatCompletion(chatCompletion);
        //获取请求的tokens数量
        long tokens = chatCompletion.tokens();
        //这种方式也可以
//        long tokens = TikTokensUtil.tokens(chatCompletion.getModel(),messages);
        log.info("Message集合文本:【{}】", messages, tokens);
        log.info("本地计算的请求的tokens数{}", tokens);
        log.info("本地计算的返回的tokens数{}", TikTokensUtil.tokens(chatCompletion.getModel(),chatCompletionResponse.getChoices().get(0).getMessage().getContent()));
        log.info("---------------------------------------------------");
        log.info("Open AI 官方计算的总的tokens数{}", chatCompletionResponse.getUsage().getTotalTokens());
        log.info("Open AI 官方计算的请求的tokens数{}", chatCompletionResponse.getUsage().getPromptTokens());
        log.info("Open AI 官方计算的返回的tokens数{}", chatCompletionResponse.getUsage().getCompletionTokens());
    }

单独使用示例:

java">public class TikTokensTest {
    String text;
    List<Message> messages;

    @Before
    public void prepareData() {
        text = "关注微信公众号:程序员的黑洞。进入chatgpt-java交流群获取最新版本更新通知。";
        messages = new ArrayList<>(2);
        messages.add(Message.builder().role(Message.Role.USER).content("关注微信公众号:程序员的黑洞。").build());
        messages.add(Message.builder().role(Message.Role.USER).content("进入chatgpt-java交流群获取最新版本更新通知。").build());
    }
    /**
     * gpt-3.5和gpt4.0聊天模型接口计算推荐这种方法
     */
    @Test
    public void chatCompletionTokensTest() {
        
        ChatCompletion completion = ChatCompletion.builder().messages(messages).build();
        long tokens = completion.tokens();
        log.info("Message集合文本:【{}】", messages, tokens);
        log.info("总tokens数{}", tokens);
    }

    /**
     * Completion 接口计算推荐使用这种方法
     */
    @Test
    public void completionTokensTest() {
        Completion completion = Completion.builder().prompt(text).build();
        long tokens = completion.tokens();
        log.info("单句文本:【{}】", text);
        log.info("总tokens数{}", tokens);
    }

    /**
     * 通过模型模型名称计算
     */
    @Test
    public void byModelNameTest() {
        String modelName = ChatCompletion.Model.GPT_4.getName();
//        String modelName = ChatCompletion.Model.GPT_3_5_TURBO.getName();
        List<Integer> encode = TikTokensUtil.encode(modelName, text);
        log.info(encode.toString());
        long tokens = TikTokensUtil.tokens(modelName, text);
        log.info("单句文本:【{}】", text);
        log.info("总tokens数{}", tokens);
        log.info("--------------------------------------------------------------");
        tokens = TikTokensUtil.tokens(modelName, messages);
        log.info("Message集合文本:【{}】", messages, tokens);
        log.info("总tokens数{}", tokens);
    }

    /**
     * 通过Encoding计算
     */
    @Test
    public void byEncodingTest() {
        EncodingRegistry registry = Encodings.newDefaultEncodingRegistry();
        Encoding enc = registry.getEncoding(EncodingType.P50K_BASE);
        List<Integer> encode = TikTokensUtil.encode(enc, text);
        log.info(encode.toString());
        long tokens = TikTokensUtil.tokens(enc, text);
        log.info("单句文本:【{}】", text);
        log.info("总tokens数{}", tokens);
    }

    /**
     * 通过EncodingType计算
     */
    @Test
    public void byEncodingTypeTest() {
        List<Integer> encode = TikTokensUtil.encode(EncodingType.CL100K_BASE, text);
        log.info(encode.toString());
        long tokens = TikTokensUtil.tokens(EncodingType.CL100K_BASE, text);
        log.info("单句文本:【{}】", text);
        log.info("总tokens数{}", tokens);
    }

}

站在巨人的肩膀

感谢大佬:knuddelsgmbh 的jtokkit 的开源计算算法。


http://www.niftyadmin.cn/n/204458.html

相关文章

NeRF代码学习

学习nerf_pytorch项目代码&#xff0c;以及pytorch_lighting形式代码&#xff0c; 首先需要读取数据&#xff0c;将数据输入神经网络进行训练&#xff08;包括生成编码、生成光线、计算密度颜色、体渲染步骤&#xff09;&#xff0c;将数据输出 1、数据集读取 代码中给出的样…

基于springboot的在线考试系统源码数据库论文

目 录 目 录 第一章 概述 1.1研究背景 1.2 开发意义 1.3 研究现状 1.4 研究内容 1.5论文结构 第二章 开发技术介绍 2.1 系统开发平台 2.2 平台开发相关技术 2.2.1 Java技术 2.2.2 mysql数据库介绍 2.2.3 MySQL环境配置 2.2.4 B/S架构 2.2.5 Spr…

go学习线路图

1. go学习线路图 1.1.2. 资源 先决条件 GoSQL 通用开发技能 学习 GIT&#xff0c;在 GitHub 上建立一些仓库&#xff0c;与其它人分享你的代码了解 HTTP(S) 协议&#xff0c;request 方法&#xff08;GET, POST, PUT, PATCH, DELETE, OPTIONS&#xff09;不要害怕使用 Google&a…

分享五款小众的电脑利器,让电脑更好用

电脑是我们日常生活和工作中不可缺少的工具&#xff0c;但是有时候我们会遇到一些问题&#xff0c;比如电脑卡顿、文件传输困难等。为了解决这些问题&#xff0c;我为你推荐了五款让电脑更好用的软件。 1.进程管理——Process Explorer Process Explorer是一款进程管理软件&a…

tf.unique

1、tf.unique使用 tf.unique(x,out_idxtf.int32,nameNone ) 函数参数&#xff1a; x&#xff1a;一个 Tensor,是1维的.out_idx&#xff1a;可选 tf.DType 来自&#xff1a;tf.int32, tf.int64,默认为 tf.int32.name&#xff1a;操作的名称(可选). 函数返回值&#xff1a; T…

Git --- 常用命令、分支操作、团队协作机制

一、Git 概述 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目 Git 易于学习&#xff0c;占地面积小&#xff0c;性能极快。它具有廉价的本地库&#xff0c;方便的暂存区域和多个工作流分支等特性 其性能优于 Subversion、…

GP03丨宽窄基资金管理增强策略

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 正 文 大家好&#xff0c;今天我们分享股票社群第3期量化策略——ETF资金管理增强策略。 在上一期中&#xff0c;我们分享了基础版ETF轮动&#xff08;结合股票多因子排序逻辑&#xff09;策略&#xf…

Android消息机制-Handler小结

Android消息机制-Handler小结 讲一下Handler原理&#xff1f; Handler主要有这么几个角色&#xff1a;Handler、Message、MessageQueue、Looper&#xff1b; 当Handler发送消息时&#xff0c;Message会按照时间的先后顺序被保存到MessageQueue里面&#xff1b; 然后Looper不…