简体中文
Openai's tiktoken في Go.
Tiktoken هو رمز BPE سريع للاستخدام مع نماذج Openai.
هذا هو منفذ tiktoken الأصلي.
go get github.com/pkoukk/tiktoken-goلدى Tiktoken-GO نفس آلية ذاكرة التخزين المؤقت مثل مكتبة Tiktoken الأصلية.
يمكنك تعيين دليل ذاكرة التخزين المؤقت باستخدام متغير البيئة Tiktoken_Cache_Dir.
بمجرد تعيين هذا المتغير ، سيستخدم Tiktoken-Go هذا الدليل لتخزين القاموس الرمزي.
إذا لم تقم بتعيين متغير البيئة هذا ، فسيقوم Tiktoken-Go بتنزيل القاموس في كل مرة تقوم فيها بتهيئة ترميز لأول مرة.
إذا كنت لا ترغب في استخدام ذاكرة التخزين المؤقت أو تنزيل القاموس في كل مرة ، فيمكنك استخدام Loader بديل BPE.
ما عليك سوى الاتصال tiktoken.SetBpeLoader قبل الاتصال tiktoken.GetEncoding أو tiktoken.EncodingForModel .
BpeLoader هي واجهة ، يمكنك تنفيذ محمل BPE الخاص بك عن طريق تطبيق هذه الواجهة.
يقوم محمل BPE في وضع عدم الاتصال بتوصيل قاموس BPE من ملفات تضمين ، فهو يساعد إذا كنت لا ترغب في تنزيل القاموس في وقت التشغيل.
نظرًا لحجم قاموس BPE ، يوجد هذا المحمل في مشروع آخر.
قم بتضمين إذا كنت بحاجة إلى هذا المحمل: tiktoken_loader
package main
import (
"fmt"
"github.com/pkoukk/tiktoken-go"
)
func main () {
text := "Hello, world!"
encoding := "cl100k_base"
// if you don't want download dictionary at runtime, you can use offline loader
// tiktoken.SetBpeLoader(tiktoken_loader.NewOfflineLoader())
tke , err := tiktoken . GetEncoding ( encoding )
if err != nil {
err = fmt . Errorf ( "getEncoding: %v" , err )
return
}
// encode
token := tke . Encode ( text , nil , nil )
//tokens
fmt . Println (( token ))
// num_tokens
fmt . Println ( len ( token ))
} package main
import (
"fmt"
"github.com/pkoukk/tiktoken-go"
)
func main () {
text := "Hello, world!"
encoding := "gpt-3.5-turbo"
tkm , err := tiktoken . EncodingForModel ( encoding )
if err != nil {
err = fmt . Errorf ( "getEncoding: %v" , err )
return
}
// encode
token := tkm . Encode ( text , nil , nil )
// tokens
fmt . Println ( token )
// num_tokens
fmt . Println ( len ( token ))
}فيما يلي وظيفة مثال لحساب الرموز للرسائل التي تم تمريرها إلى GPT-3.5-TURBO أو GPT-4.
تمت كتابة الرمز التالي بناءً على أمثلة Openai-Cookbook في Wednesday, 28 June 2023 .
يرجى ملاحظة أن طريقة حساب الرمز المميز للرسالة قد تتغير في أي وقت ، لذلك قد لا يكون هذا الرمز قابلاً بالضرورة في المستقبل.
إذا كنت بحاجة إلى حساب دقيق ، فيرجى الرجوع إلى الوثائق الرسمية.
إذا وجدت أن هذا الرمز لم يعد قابلاً للتطبيق ، فلا تتردد في إرسال PR أو مشكلة.
package main
import (
"fmt"
"github.com/pkoukk/tiktoken-go"
"github.com/sashabaranov/go-openai"
)
// OpenAI Cookbook: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb
func NumTokensFromMessages ( messages []openai. ChatCompletionMessage , model string ) ( numTokens int ) {
tkm , err := tiktoken . EncodingForModel ( model )
if err != nil {
err = fmt . Errorf ( "encoding for model: %v" , err )
log . Println ( err )
return
}
var tokensPerMessage , tokensPerName int
switch model {
case "gpt-3.5-turbo-0613" ,
"gpt-3.5-turbo-16k-0613" ,
"gpt-4-0314" ,
"gpt-4-32k-0314" ,
"gpt-4-0613" ,
"gpt-4-32k-0613" :
tokensPerMessage = 3
tokensPerName = 1
case "gpt-3.5-turbo-0301" :
tokensPerMessage = 4 // every message follows <|start|>{role/name}n{content}<|end|>n
tokensPerName = - 1 // if there's a name, the role is omitted
default :
if strings . Contains ( model , "gpt-3.5-turbo" ) {
log . Println ( "warning: gpt-3.5-turbo may update over time. Returning num tokens assuming gpt-3.5-turbo-0613." )
return NumTokensFromMessages ( messages , "gpt-3.5-turbo-0613" )
} else if strings . Contains ( model , "gpt-4" ) {
log . Println ( "warning: gpt-4 may update over time. Returning num tokens assuming gpt-4-0613." )
return NumTokensFromMessages ( messages , "gpt-4-0613" )
} else {
err = fmt . Errorf ( "num_tokens_from_messages() is not implemented for model %s. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens." , model )
log . Println ( err )
return
}
}
for _ , message := range messages {
numTokens += tokensPerMessage
numTokens += len ( tkm . Encode ( message . Content , nil , nil ))
numTokens += len ( tkm . Encode ( message . Role , nil , nil ))
numTokens += len ( tkm . Encode ( message . Name , nil , nil ))
if message . Name != "" {
numTokens += tokensPerName
}
}
numTokens += 3 // every reply is primed with <|start|>assistant<|message|>
return numTokens
}| الاسم الترميز | نماذج Openai |
|---|---|
o200k_base | gpt-4o |
cl100k_base | gpt-4 ، gpt-3.5-turbo ، text-embedding-ada-002 ، text-embedding-3-small ، text-embedding-3-large |
p50k_base | نماذج المخطوطة ، text-davinci-002 ، text-davinci-003 |
r50k_base (أو gpt2 ) | نماذج GPT-3 مثل davinci |
| اسم النموذج | نماذج Openai |
|---|---|
| GPT-4O-* | O200K_Base |
| GPT-4-* | CL100K_BASE |
| GPT-3.5-TURBO-* | CL100K_BASE |
| GPT-4O | O200K_Base |
| GPT-4 | CL100K_BASE |
| GPT-3.5 توربو | CL100K_BASE |
| نص davinci-003 | P50K_Base |
| نص davinci-002 | P50K_Base |
| نص davinci-001 | R50K_Base |
| نص curie-001 | R50K_Base |
| نص babbage-001 | R50K_Base |
| Text -ADA-001 | R50K_Base |
| دافينشي | R50K_Base |
| كوري | R50K_Base |
| Babbage | R50K_Base |
| أدا | R50K_Base |
| رمز ديافينك-002 | P50K_Base |
| رمز ديافينك-001 | P50K_Base |
| كود كوشمان -002 | P50K_Base |
| كود كوشمان -001 | P50K_Base |
| Davinci-Codex | P50K_Base |
| كوشمان كودكس | P50K_Base |
| نص davinci-edit-001 | P50K_EDIT |
| كود-ديفينك-edit-001 | P50K_EDIT |
| النصوص النصية -ADA-002 | CL100K_BASE |
| النصوص النصية-3-small | CL100K_BASE |
| embedding-3-large | CL100K_BASE |
| النصوص النصية-ديافنغ -001 | R50K_Base |
| تشابه النص curie-001 | R50K_Base |
| النص التشابه--001 | R50K_Base |
| تشابه النص -دا-001 | R50K_Base |
| النص-Search-Davinci-DOC-001 | R50K_Base |
| النص-البحث-curie-doc-001 | R50K_Base |
| النص-البحث-BABBAGE-DOC-001 | R50K_Base |
| نص Search -ADA-DOC-001 | R50K_Base |
| كود-البحث-Babbage-Code-001 | R50K_Base |
| رمز البحث-ada-code-001 | R50K_Base |
| GPT2 | GPT2 |
يمكنك تشغيل الاختبار في مجلد الاختبار
نتيجة
نتيجة
يمكنك تشغيل معيار في مجلد الاختبار
| اسم | الوقت/المرجع | نظام التشغيل | وحدة المعالجة المركزية | نص | مرات |
|---|---|---|---|---|---|
| tiktoken-go | 8795ns | ماكوس 13.2 | Apple M1 | Udhr | 100000 |
| tiktoken | 8838ns | ماكوس 13.2 | Apple M1 | Udhr | 100000 |
يبدو أن الأداء هو نفسه تقريبًا.
ربما يكون الفرق بسبب الفرق في أداء الجهاز.
أو ربما طريقة القياس الخاصة بي غير مناسبة.
إذا كان لديك طريقة مرجعية أفضل أو إذا كنت تريد إضافة نتيجة القياس ، فلا تتردد في إرسال العلاقات العامة.
لترميز o200k_base الجديد ، يبدو أبطأ من cl100k_base . Tiktoken-Go أبطأ قليلاً من Tiktoken في المعيار التالي.
| اسم | الترميز | الوقت/المرجع | نظام التشغيل | وحدة المعالجة المركزية | نص | مرات |
|---|---|---|---|---|---|---|
| tiktoken-go | O200K_Base | 108522 ns | أوبونتو 22.04 | AMD Ryzen 9 5900HS | Udhr | 100000 |
| tiktoken | O200K_Base | 70198 NS | أوبونتو 22.04 | AMD Ryzen 9 5900HS | Udhr | 100000 |
| tiktoken-go | CL100K_BASE | 94502 ns | أوبونتو 22.04 | AMD Ryzen 9 5900HS | Udhr | 100000 |
| tiktoken | CL100K_BASE | 54642 ns | أوبونتو 22.04 | AMD Ryzen 9 5900HS | Udhr | 100000 |
معهد ماساتشوستس للتكنولوجيا