简体中文
Tiktoken Openai di Go.
Tiktoken adalah tokeniser BPE cepat untuk digunakan dengan model Openai.
Ini adalah port dari Tiktoken asli.
go get github.com/pkoukk/tiktoken-goTiktoken-Go memiliki mekanisme cache yang sama dengan perpustakaan Tiktoken asli.
Anda dapat mengatur direktori cache dengan menggunakan variabel lingkungan tiktoken_cache_dir.
Setelah variabel ini ditetapkan, TikToken-Go akan menggunakan direktori ini untuk menyimpan kamus token.
Jika Anda tidak mengatur variabel lingkungan ini, TikToken-Go akan mengunduh kamus setiap kali Anda menginisialisasi pengkodean untuk pertama kalinya.
Jika Anda tidak ingin menggunakan cache atau mengunduh kamus setiap kali, Anda dapat menggunakan loader BPE alternatif.
Hubungi saja tiktoken.SetBpeLoader sebelum memanggil tiktoken.GetEncoding atau tiktoken.EncodingForModel .
BpeLoader adalah antarmuka, Anda dapat mengimplementasikan BPE Loader Anda sendiri dengan mengimplementasikan antarmuka ini.
Offline BPE Loader memuat kamus BPE dari file embed, itu membantu jika Anda tidak ingin mengunduh kamus saat runtime.
Karena ukuran kamus BPE, pemuat ini ada di proyek lain.
Sertakan jika Anda memerlukan loader ini: 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 ))
}Di bawah ini adalah contoh fungsi untuk menghitung token untuk pesan yang disampaikan ke GPT-3.5-turbo atau GPT-4.
Kode berikut ditulis berdasarkan contoh OpenAI-Cookbook pada Wednesday, 28 June 2023 .
Harap dicatat bahwa metode perhitungan token untuk pesan dapat berubah kapan saja, jadi kode ini mungkin tidak harus berlaku di masa mendatang.
Jika Anda memerlukan perhitungan yang akurat, silakan merujuk ke dokumentasi resmi.
Jika Anda menemukan bahwa kode ini tidak lagi berlaku, jangan ragu untuk mengirimkan PR atau masalah.
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
}| Nama pengkodean | Model 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 | Model Codex, text-davinci-002 , text-davinci-003 |
r50k_base (atau gpt2 ) | Model GPT-3 seperti davinci |
| Nama model | Model 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-turbo | cl100k_base |
| Text-Davi-003 | p50k_base |
| Text-Davi-002 | p50k_base |
| Text-Davi-001 | r50k_base |
| Text-Curie-001 | r50k_base |
| Text-Babbage-001 | r50k_base |
| Text-Oada-001 | r50k_base |
| DaVinci | r50k_base |
| Curie | r50k_base |
| babbage | r50k_base |
| Ada | r50k_base |
| Kode-Davi-002 | p50k_base |
| kode-Davi-001 | p50k_base |
| Code-Cushman-002 | p50k_base |
| Code-Cushman-001 | p50k_base |
| davinci-codex | p50k_base |
| Cushman-Codex | p50k_base |
| Text-davinci-edit-001 | p50k_edit |
| kode-davinci-edit-001 | p50k_edit |
| Text-Embedding-DAGA-002 | cl100k_base |
| Text-Embedding-3-Small | cl100k_base |
| Text-Embedding-3-Large | cl100k_base |
| Text-Similarity-Davi-001 | r50k_base |
| Teks-Similarity-Curie-001 | r50k_base |
| Text-Similarity-Babbage-001 | r50k_base |
| Text-Similarity-Oada-001 | r50k_base |
| Teks-pencarian-davinci-doc-001 | r50k_base |
| Teks-pencarian-curie-doc-001 | r50k_base |
| Teks-pencarian-Babbage-doc-001 | r50k_base |
| Teks-pencarian-ADA-DOC-001 | r50k_base |
| Code-Search-Babbage-Code-001 | r50k_base |
| Code-Search-Oada-Code-001 | r50k_base |
| gpt2 | gpt2 |
Anda dapat menjalankan tes di folder tes
hasil
hasil
Anda dapat menjalankan benchmark di folder tes
| nama | waktu/op | os | CPU | teks | kali |
|---|---|---|---|---|---|
| Tiktoken-Go | 8795ns | MacOS 13.2 | Apple M1 | Udhr | 100000 |
| Tiktoken | 8838ns | MacOS 13.2 | Apple M1 | Udhr | 100000 |
Sepertinya kinerjanya hampir sama.
Mungkin perbedaannya adalah karena perbedaan dalam kinerja mesin.
Atau mungkin metode benchmark saya tidak tepat.
Jika Anda memiliki metode benchmark yang lebih baik atau jika Anda ingin menambahkan hasil benchmark Anda, jangan ragu untuk mengirimkan PR.
Untuk pengkodean o200k_base baru, tampaknya lebih lambat dari cl100k_base . Tiktoken-Go sedikit lebih lambat dari Tiktoken pada tolok ukur berikut.
| nama | Pengkodean | waktu/op | os | CPU | teks | kali |
|---|---|---|---|---|---|---|
| Tiktoken-Go | O200K_Base | 108522 ns | Ubuntu 22.04 | AMD Ryzen 9 5900hs | Udhr | 100000 |
| Tiktoken | O200K_Base | 70198 ns | Ubuntu 22.04 | AMD Ryzen 9 5900hs | Udhr | 100000 |
| Tiktoken-Go | cl100k_base | 94502 ns | Ubuntu 22.04 | AMD Ryzen 9 5900hs | Udhr | 100000 |
| Tiktoken | cl100k_base | 54642 ns | Ubuntu 22.04 | AMD Ryzen 9 5900hs | Udhr | 100000 |
Mit