简介

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

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

更新日志

  • 1.0.10 支持tokens计算:TikTokensTest ,更多详细的资料参考文档:Tokens_README.md
  • 1.0.9 支持自定义key使用策略参考:OpenAiClientTestOpenAiStreamClientTest ,弃用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 支持余额查询参考:OpenAiClientTestOpenAiStreamClientTest 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("获取最新版本更新通知。").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());
}

单独使用示例:

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);
} }

站在巨人的肩膀

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

【开源免费】ChatGPT-Java版SDK重磅更新至1.0.10版,支持Tokens计算,快来一键接入。的更多相关文章

  1. Win10《芒果TV》更新v3.6.0秋收版:新增追剧磁贴、记忆续播、跳转列表

    热血青春,唱响革命战歌,<秋收起义>正在芒果TV热播,Win10版<芒果TV>更新v3.6.0秋收版,新增追剧磁贴.记忆续播.跳转列表. Win10版<芒果TV>V ...

  2. L脚本语言语法手冊 0.10版

    L脚本语言语法手冊 0.10版       简  介 L脚本语言是一个轻量级的,旨在接近自然语言的编程语言,眼下支持在中文.英文基础上的编程.并可扩展为随意语种.L脚本语言的语法结构简单.程序结构相对 ...

  3. Win10《芒果TV》商店版更新v3.4.0:率先支持创意者画中画,工作娱乐两不误

    在Win10创新者更新中,微软为Windows10 PC系统添加了UWP应用窗口置顶功能(亦称画中画功能),Win10版<芒果TV>更新v3.4.0,率先宣布支持画中画新特性,为广大用户带 ...

  4. Java核心技术·卷 II(原书第10版)分享下载

    Java核心技术·卷 II 内容介绍 Java领域最有影响力和价值的著作之一,由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),与<Java编程思想>齐名,10余年 ...

  5. 【6年开源路】海王星给你好看!FineUI v4.0正式版暨《FineUI3to4一键升级工具》发布!

    去年10-28号,我发布了一篇文章<海王星给你好看!FineUI v4.0公测版发布暨<你找BUG我送书>活动开始>,标志着FineUI开始向4.0版本迈进.经过4个月3个公测 ...

  6. centos7.6下编译安装zabbix4.0.10长期支持版

    一.安装数据库,这里使用的是percona-server5..24版本 配置如下 [root@zabbix4_clone:~]# cat /etc/my.cnf # Example MySQL con ...

  7. Win10《芒果TV》更新v3.8.0初夏版:全新视觉体验,即刻分享视频

    历时半年多昼夜,千呼万唤始出来,Win10版<芒果TV>全平台同步更新初夏版v3.8.0,统一视觉体验,完善分享投屏,进一步提升使用体验. Win10版<芒果TV>V3.8.0 ...

  8. Win10《芒果TV》更新v3.5.0夏至版:会员尊享蓝光画质,关联本地视频播放

    在Win10秋季创意者更新前夕,Win10版<芒果TV>全平台同步更新夏至版v3.5.0,新增会员蓝光画质,关联本地视频播放,进一步提升使用体验. Win10版<芒果TV>V3 ...

  9. 开源免费ERP/CRM/SCM:iDempiere 2.0 安装配置

    首先简单介绍一下iDempiere:iDempiere是一款Java平台的基于Compiere/ADempiere的​开源企业级开源ERP/CRM/SCM系统​, 由于是在ADempiere基础上用O ...

  10. 从来也科技UiBot 6.0社区版全线免费,看RPA距离“人人可用”还有多远

    来也科技RPA产品UiBot 6.0社区版全线免费,背后的逻辑是什么? 来也科技CPO褚瑞:开发者生态才是RPA厂商的真正护城河 来也科技UiBot 6.0社区版全线免费,RPA距离真正人人可用还有多 ...

随机推荐

  1. vim实用用法

    1 dd 删除1行 1 gg 跳到第一行 G 文本最后 C 删除当前光标到行尾,并进入插入模式 D 删除当前光标到行尾 dw 删除一个单词 yw 复制一个单词 r /PATH/FROM/SOMEFIL ...

  2. mysql_记录操作

    在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现数据的删除 使用SELECT查询数据以及 ...

  3. centos7 系统运行中做raid磁盘阵列

    插入磁盘 lsblk查看磁盘总体情况 对sdb1等需要做的硬盘进行制作 fdisk /dev/sdb 开始 n 创建 p 给资源回车 重选代码 t 确认磁盘阵列代码 fd 保存w 首先安装工具 mda ...

  4. redis缓存lua脚本过多导致内存占用很多问题

    现象 生产某集群各节点已使用内存比较大,在清理了大量业务无用数据后,节点已使用内存却未下降. 排查与分析 通过info memory命令查看,内存碎片率略高,但是对某个主节点新添加的从节点内存使用依然 ...

  5. Linux应用开发之【多线程开发-回调函数】

    原来我一直都不懂回调函数是什么 ... Callback Function 定义:通过函数指针调用的函数 在理解这个回调函数之前我们需要先了解回调机制 回调机制在编程中体现在:特定的情况发生后,返回并 ...

  6. WEB开发日志1

    2020/6/11 23:23 今天做系统时,用到二级菜单,菜单下方放了一个<iframe>标签,但二级菜单的菜单项太多,导致一部分菜单项被<iframe>覆盖,从而无法再选中 ...

  7. 性能工具---JConsole基于JMX的可视化监视、管理工具

    与visualvm类似: JConsole: (Java Monitoring and Management Console),一种基于JMX的可视化监视.管理工具 VisualVM:(All-in- ...

  8. springboot中redis使用和工具

    application.properties #Redis相关配置 spring.data.redis.host=localhost #端口 spring.data.redis.port=6379 # ...

  9. finereport连接sql server

    1.添加jdbc 2.选择sql server 3.jdbc:sqlserver://localhost:1433(localhost=其他IP地址)

  10. python 引用传递,简单例子

    from threading import Threaddef test1(a): while 1: print adef test2(a): a["a"] = 2if __nam ...