当前位置:   article > 正文

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

chatgpt-java

简介

ChatGPT Java版SDK开源地址:github.com/Grt1228/cha… ,目前收获将近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>
  6. 复制代码

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

开发思路可以参考:github.com/Grt1228/cha…

流式输出实现方式小程序安卓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:github.com/Grt1228/cha… ,Image SDK枚举值bug:github.com/Grt1228/cha… ,感谢两位朋友指出:@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

  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连接...
  11. 复制代码

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("进入chatgpt-java交流群获取最新版本更新通知。").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. }
  20. 复制代码

单独使用示例:

  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. ChatCompletion completion = ChatCompletion.builder().messages(messages).build();
  17. long tokens = completion.tokens();
  18. log.info("Message集合文本:【{}】", messages, tokens);
  19. log.info("总tokens数{}", tokens);
  20. }
  21. /**
  22. * Completion 接口计算推荐使用这种方法
  23. */
  24. @Test
  25. public void completionTokensTest() {
  26. Completion completion = Completion.builder().prompt(text).build();
  27. long tokens = completion.tokens();
  28. log.info("单句文本:【{}】", text);
  29. log.info("总tokens数{}", tokens);
  30. }
  31. /**
  32. * 通过模型模型名称计算
  33. */
  34. @Test
  35. public void byModelNameTest() {
  36. String modelName = ChatCompletion.Model.GPT_4.getName();
  37. // String modelName = ChatCompletion.Model.GPT_3_5_TURBO.getName();
  38. List<Integer> encode = TikTokensUtil.encode(modelName, text);
  39. log.info(encode.toString());
  40. long tokens = TikTokensUtil.tokens(modelName, text);
  41. log.info("单句文本:【{}】", text);
  42. log.info("总tokens数{}", tokens);
  43. log.info("--------------------------------------------------------------");
  44. tokens = TikTokensUtil.tokens(modelName, messages);
  45. log.info("Message集合文本:【{}】", messages, tokens);
  46. log.info("总tokens数{}", tokens);
  47. }
  48. /**
  49. * 通过Encoding计算
  50. */
  51. @Test
  52. public void byEncodingTest() {
  53. EncodingRegistry registry = Encodings.newDefaultEncodingRegistry();
  54. Encoding enc = registry.getEncoding(EncodingType.P50K_BASE);
  55. List<Integer> encode = TikTokensUtil.encode(enc, text);
  56. log.info(encode.toString());
  57. long tokens = TikTokensUtil.tokens(enc, text);
  58. log.info("单句文本:【{}】", text);
  59. log.info("总tokens数{}", tokens);
  60. }
  61. /**
  62. * 通过EncodingType计算
  63. */
  64. @Test
  65. public void byEncodingTypeTest() {
  66. List<Integer> encode = TikTokensUtil.encode(EncodingType.CL100K_BASE, text);
  67. log.info(encode.toString());
  68. long tokens = TikTokensUtil.tokens(EncodingType.CL100K_BASE, text);
  69. log.info("单句文本:【{}】", text);
  70. log.info("总tokens数{}", tokens);
  71. }
  72. }
  73. 复制代码

站在巨人的肩膀

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/200559
推荐阅读
相关标签
  

闽ICP备14008679号