簡介
ChatGPT Java版SDK開源地址:https://github.com/Grt1228/chatgpt-java ,目前收獲將近1000個(gè)star。
有bug歡迎朋友們指出,互相學(xué)習(xí),所有咨詢?nèi)棵赓M(fèi)。
最新版:1.0.10
<dependency>
<groupId>com.unfbx</groupId>
<artifactId>chatgpt-java</artifactId>
<version>1.0.10</version>
</dependency>
整合web示例,支持流式返回:
開發(fā)思路可以參考:https://github.com/Grt1228/chatgpt-steam-output
流式輸出實(shí)現(xiàn)方式 | 小程序 | 安卓 | ios | H5 |
---|---|---|---|---|
SSE參考:OpenAISSEEventSourceListener | 不支持 | 支持 | 支持 | 支持 |
WebSocket參考:OpenAIWebSocketEventSourceListener | 支持 | 支持 | 支持 | 支持 |
更新日志
- 1.0.10 支持tokens計(jì)算:TikTokensTest ,更多詳細(xì)的資料參考文檔:Tokens_README.md
- 1.0.9 支持自定義key使用策略參考:OpenAiClientTest 和OpenAiStreamClientTest ,棄用ChatGPTClient,優(yōu)化Moderation接口
- 1.0.8 修改OpenAiClient和OpenAiStreamClient的自定義相關(guān)實(shí)現(xiàn),超時(shí)設(shè)置,代理設(shè)置,自定義攔截器設(shè)置改為通過自定義OkHttpClient實(shí)現(xiàn),將OkHttpClient交由用戶自定義控制更加合理,可以實(shí)現(xiàn)更多的參數(shù)自定義。支持多Api Keys配置。
- 1.0.7 修復(fù)反序列化報(bào)錯(cuò)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構(gòu)建消息體傳入模型即可。感謝群友提供的余額接口地址以及@PlexPt 提供的模型參數(shù)
- 1.0.5 支持自定義Api Host,使用Builder構(gòu)建。參考下面的快速開始部分代碼。
- 1.0.4 官方最新的ChatGPT Stream模式下的Api返回值改動。
- 1.0.3 支持最新的GPT-3.5-Turbo模型和Whisper-1模型,支持語音功能轉(zhuǎn)文字,語音翻譯。OpenAiClient和OpenAiStreamClient支持Builder構(gòu)造,支持代理。
- 1.0.2 支持Stream流式輸出,參考:OpenAiStreamClient
- 1.0.1 支持自定義超時(shí)時(shí)間,自定義OkHttpClient攔截器,參考:OpenAiClient構(gòu)造函數(shù)
- 1.0.0 支持所有的OpenAI官方接口
最新版支持tokens計(jì)算
tokens計(jì)算說明
openai 的tokens計(jì)算規(guī)則適合模型先關(guān)的,不同的模型計(jì)算方法是不一樣的。大致的表格如下:
關(guān)于流式返回
流式返回的數(shù)據(jù),返回行數(shù)-2=返回tokens
[DONE]這一行不參與tokens計(jì)算,沒有content屬性的不參與token計(jì)算。
所以tokens數(shù)量是4,[“Ser”,“end”,“ip”,“ity”],總返回行數(shù)6 - 無效行數(shù)2 = 4個(gè)tokens
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI建立sse連接...
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回?cái)?shù)據(jù):{"choices":[{"delta":{"role":"assistant"},"index":0,"finish_reason":null}]}
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回?cái)?shù)據(jù):{"choices":[{"delta":{"content":"Ser"},"index":0,"finish_reason":null}]}
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回?cái)?shù)據(jù):{"choices":[{"delta":{"content":"end"},"index":0,"finish_reason":null}]}
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回?cái)?shù)據(jù):{"choices":[{"delta":{"content":"ip"},"index":0,"finish_reason":null}]}
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回?cái)?shù)據(jù):{"choices":[{"delta":{"content":"ity"},"index":0,"finish_reason":null}]}
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回?cái)?shù)據(jù):{"choices":[{"delta":{},"index":0,"finish_reason":"stop"}]}
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回?cái)?shù)據(jù):[DONE]
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI返回?cái)?shù)據(jù)結(jié)束了
[OkHttp 省略 INFO com.unfbx.chatgpt.*****istener - OpenAI關(guān)閉sse連接...
tokens計(jì)算使用示例
完整使用示例請參考:TikTokensTest
結(jié)合chat模型使用示例:
完整示例參考:OpenAiClientTest
public void chatTokensTest() {
//聊天模型:gpt-3.5
List<Message> messages = new ArrayList<>(2);
messages.add(Message.builder().role(Message.Role.USER).content("關(guān)注微信公眾號:程序員的黑洞。").build());
messages.add(Message.builder().role(Message.Role.USER).content("進(jìn)入chatgpt-java交流群獲取最新版本更新通知。").build());
ChatCompletion chatCompletion = ChatCompletion.builder().messages(messages).build();
ChatCompletionResponse chatCompletionResponse = v2.chatCompletion(chatCompletion);
//獲取請求的tokens數(shù)量
long tokens = chatCompletion.tokens();
//這種方式也可以
// long tokens = TikTokensUtil.tokens(chatCompletion.getModel(),messages);
log.info("Message集合文本:【{}】", messages, tokens);
log.info("本地計(jì)算的請求的tokens數(shù){}", tokens);
log.info("本地計(jì)算的返回的tokens數(shù){}", TikTokensUtil.tokens(chatCompletion.getModel(),chatCompletionResponse.getChoices().get(0).getMessage().getContent()));
log.info("---------------------------------------------------");
log.info("Open AI 官方計(jì)算的總的tokens數(shù){}", chatCompletionResponse.getUsage().getTotalTokens());
log.info("Open AI 官方計(jì)算的請求的tokens數(shù){}", chatCompletionResponse.getUsage().getPromptTokens());
log.info("Open AI 官方計(jì)算的返回的tokens數(shù){}", chatCompletionResponse.getUsage().getCompletionTokens());
}
單獨(dú)使用示例:文章來源:http://www.zghlxwxcb.cn/news/detail-409922.html
public class TikTokensTest {
String text;
List<Message> messages;
@Before
public void prepareData() {
text = "關(guān)注微信公眾號:程序員的黑洞。進(jìn)入chatgpt-java交流群獲取最新版本更新通知。";
messages = new ArrayList<>(2);
messages.add(Message.builder().role(Message.Role.USER).content("關(guān)注微信公眾號:程序員的黑洞。").build());
messages.add(Message.builder().role(Message.Role.USER).content("進(jìn)入chatgpt-java交流群獲取最新版本更新通知。").build());
}
/**
* gpt-3.5和gpt4.0聊天模型接口計(jì)算推薦這種方法
*/
@Test
public void chatCompletionTokensTest() {
ChatCompletion completion = ChatCompletion.builder().messages(messages).build();
long tokens = completion.tokens();
log.info("Message集合文本:【{}】", messages, tokens);
log.info("總tokens數(shù){}", tokens);
}
/**
* Completion 接口計(jì)算推薦使用這種方法
*/
@Test
public void completionTokensTest() {
Completion completion = Completion.builder().prompt(text).build();
long tokens = completion.tokens();
log.info("單句文本:【{}】", text);
log.info("總tokens數(shù){}", tokens);
}
/**
* 通過模型模型名稱計(jì)算
*/
@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數(shù){}", tokens);
log.info("--------------------------------------------------------------");
tokens = TikTokensUtil.tokens(modelName, messages);
log.info("Message集合文本:【{}】", messages, tokens);
log.info("總tokens數(shù){}", tokens);
}
/**
* 通過Encoding計(jì)算
*/
@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數(shù){}", tokens);
}
/**
* 通過EncodingType計(jì)算
*/
@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數(shù){}", tokens);
}
}
站在巨人的肩膀
感謝大佬:knuddelsgmbh 的jtokkit 的開源計(jì)算算法。文章來源地址http://www.zghlxwxcb.cn/news/detail-409922.html
到了這里,關(guān)于【開源免費(fèi)】ChatGPT-Java版SDK更新至1.0.10版,支持Tokens計(jì)算,快來一鍵接入。的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!