【开源免费】ChatGPT-Java版SDK重磅更新至1.0.10版,支持Tokens计算,快来 ...

打印 上一主题 下一主题

主题 687|帖子 687|积分 2071

简介

ChatGPT Java版SDK开源地址:https://github.com/Grt1228/chatgpt-java ,目前收获将近1000个star。
有bug欢迎朋友们指出,互相学习,所有咨询全部免费。
最新版:1.0.10
  1. <dependency>
  2.     <groupId>com.unfbx</groupId>
  3.     <artifactId>chatgpt-java</artifactId>
  4.     <version>1.0.10</version>
  5. </dependency>
复制代码
整合web示例,支持流式返回:
开发思路可以参考:https://github.com/Grt1228/chatgpt-steam-output
流式输出实现方式小程序安卓iosH5SSE参考: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
  1. [OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI建立sse连接...
  2. [OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:{"choices":[{"delta":{"role":"assistant"},"index":0,"finish_reason":null}]}
  3. [OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:{"choices":[{"delta":{"content":"Ser"},"index":0,"finish_reason":null}]}
  4. [OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:{"choices":[{"delta":{"content":"end"},"index":0,"finish_reason":null}]}
  5. [OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:{"choices":[{"delta":{"content":"ip"},"index":0,"finish_reason":null}]}
  6. [OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:{"choices":[{"delta":{"content":"ity"},"index":0,"finish_reason":null}]}
  7. [OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:{"choices":[{"delta":{},"index":0,"finish_reason":"stop"}]}
  8. [OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据:[DONE]
  9. [OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回数据结束了
  10. [OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI关闭sse连接...
复制代码
tokens计算使用示例

完整使用示例请参考:TikTokensTest
结合chat模型使用示例:
完整示例参考:OpenAiClientTest
  1.     public void chatTokensTest() {
  2.         //聊天模型:gpt-3.5
  3.         List<Message> messages = new ArrayList<>(2);
  4.         messages.add(Message.builder().role(Message.Role.USER).content("关注微信公众号:程序员的黑洞。").build());
  5.         messages.add(Message.builder().role(Message.Role.USER).content("获取最新版本更新通知。").build());
  6.         ChatCompletion chatCompletion = ChatCompletion.builder().messages(messages).build();
  7.         ChatCompletionResponse chatCompletionResponse = v2.chatCompletion(chatCompletion);
  8.         //获取请求的tokens数量
  9.         long tokens = chatCompletion.tokens();
  10.         //这种方式也可以
  11. //        long tokens = TikTokensUtil.tokens(chatCompletion.getModel(),messages);
  12.         log.info("Message集合文本:【{}】", messages, tokens);
  13.         log.info("本地计算的请求的tokens数{}", tokens);
  14.         log.info("本地计算的返回的tokens数{}", TikTokensUtil.tokens(chatCompletion.getModel(),chatCompletionResponse.getChoices().get(0).getMessage().getContent()));
  15.         log.info("---------------------------------------------------");
  16.         log.info("Open AI 官方计算的总的tokens数{}", chatCompletionResponse.getUsage().getTotalTokens());
  17.         log.info("Open AI 官方计算的请求的tokens数{}", chatCompletionResponse.getUsage().getPromptTokens());
  18.         log.info("Open AI 官方计算的返回的tokens数{}", chatCompletionResponse.getUsage().getCompletionTokens());
  19.     }
复制代码
单独使用示例:
  1. public class TikTokensTest {
  2.     String text;
  3.     List<Message> messages;
  4.     @Before
  5.     public void prepareData() {
  6.         text = "关注微信公众号:程序员的黑洞。进入chatgpt-java交流群获取最新版本更新通知。";
  7.         messages = new ArrayList<>(2);
  8.         messages.add(Message.builder().role(Message.Role.USER).content("关注微信公众号:程序员的黑洞。").build());
  9.         messages.add(Message.builder().role(Message.Role.USER).content("进入chatgpt-java交流群获取最新版本更新通知。").build());
  10.     }
  11.     /**
  12.      * gpt-3.5和gpt4.0聊天模型接口计算推荐这种方法
  13.      */
  14.     @Test
  15.     public void chatCompletionTokensTest() {
  16.         
  17.         ChatCompletion completion = ChatCompletion.builder().messages(messages).build();
  18.         long tokens = completion.tokens();
  19.         log.info("Message集合文本:【{}】", messages, tokens);
  20.         log.info("总tokens数{}", tokens);
  21.     }
  22.     /**
  23.      * Completion 接口计算推荐使用这种方法
  24.      */
  25.     @Test
  26.     public void completionTokensTest() {
  27.         Completion completion = Completion.builder().prompt(text).build();
  28.         long tokens = completion.tokens();
  29.         log.info("单句文本:【{}】", text);
  30.         log.info("总tokens数{}", tokens);
  31.     }
  32.     /**
  33.      * 通过模型模型名称计算
  34.      */
  35.     @Test
  36.     public void byModelNameTest() {
  37.         String modelName = ChatCompletion.Model.GPT_4.getName();
  38. //        String modelName = ChatCompletion.Model.GPT_3_5_TURBO.getName();
  39.         List<Integer> encode = TikTokensUtil.encode(modelName, text);
  40.         log.info(encode.toString());
  41.         long tokens = TikTokensUtil.tokens(modelName, text);
  42.         log.info("单句文本:【{}】", text);
  43.         log.info("总tokens数{}", tokens);
  44.         log.info("--------------------------------------------------------------");
  45.         tokens = TikTokensUtil.tokens(modelName, messages);
  46.         log.info("Message集合文本:【{}】", messages, tokens);
  47.         log.info("总tokens数{}", tokens);
  48.     }
  49.     /**
  50.      * 通过Encoding计算
  51.      */
  52.     @Test
  53.     public void byEncodingTest() {
  54.         EncodingRegistry registry = Encodings.newDefaultEncodingRegistry();
  55.         Encoding enc = registry.getEncoding(EncodingType.P50K_BASE);
  56.         List<Integer> encode = TikTokensUtil.encode(enc, text);
  57.         log.info(encode.toString());
  58.         long tokens = TikTokensUtil.tokens(enc, text);
  59.         log.info("单句文本:【{}】", text);
  60.         log.info("总tokens数{}", tokens);
  61.     }
  62.     /**
  63.      * 通过EncodingType计算
  64.      */
  65.     @Test
  66.     public void byEncodingTypeTest() {
  67.         List<Integer> encode = TikTokensUtil.encode(EncodingType.CL100K_BASE, text);
  68.         log.info(encode.toString());
  69.         long tokens = TikTokensUtil.tokens(EncodingType.CL100K_BASE, text);
  70.         log.info("单句文本:【{}】", text);
  71.         log.info("总tokens数{}", tokens);
  72.     }
  73. }
复制代码
站在巨人的肩膀

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宁睿

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表