ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【开源免费】ChatGPT-Java版SDK重磅更新至1.0.10版,支持Tokens计算,快来 [打印本页]

作者: 宁睿    时间: 2023-4-7 19:23
标题: 【开源免费】ChatGPT-Java版SDK重磅更新至1.0.10版,支持Tokens计算,快来
简介

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支持支持支持支持更新日志

最新版支持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 的开源计算算法。

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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4