简体中文
OpenaiのTiktoken in Go。
Tiktokenは、Openaiのモデルで使用するための高速BPEトーナイザーです。
これは、元のティクトークンのポートです。
go get github.com/pkoukk/tiktoken-goTiktoken-goには、元のTiktokenライブラリと同じキャッシュメカニズムがあります。
環境変数tiktoken_cache_dirを使用して、キャッシュディレクトリを設定できます。
この変数が設定されると、TikToken-Goはこのディレクトリを使用してトークン辞書をキャッシュします。
この環境変数を設定しない場合、TikToken-Goは、初めてエンコードを初期化するたびに辞書をダウンロードします。
毎回キャッシュを使用したり、辞書をダウンロードしたくない場合は、代替BPEローダーを使用できます。
tiktoken.GetEncodingまたはtiktoken.EncodingForModelを呼び出す前に、 tiktoken.SetBpeLoaderに電話してください。
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-ターボまたはGPT-4に渡されたメッセージのトークンをカウントするための例です。
次のコードはWednesday, 28 June 2023にOpenai-Cookbookの例に基づいて書かれています。
メッセージのトークン計算方法はいつでも変更される可能性があるため、このコードが将来的に適用されるとは限りません。
正確な計算が必要な場合は、公式ドキュメントを参照してください。
このコードが適用できなくなった場合は、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 | Codex Models、 text-davinci-002 、 text-davinci-003 |
r50k_base (またはgpt2 ) | davinciのようなGPT-3モデル |
| モデル名 | 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 |
| Text-Davinci-003 | p50k_base |
| Text-Davinci-002 | p50k_base |
| Text-Davinci-001 | r50k_base |
| Text-Curie-001 | r50k_base |
| Text-Babbage-001 | r50k_base |
| Text-Ada-001 | r50k_base |
| ダビンチ | r50k_base |
| キュリー | r50k_base |
| バベージ | r50k_base |
| エイダ | r50k_base |
| code-davinci-002 | p50k_base |
| code-davinci-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 |
| code-davinci-edit-001 | p50k_edit |
| Text-rembedding-ada-002 | CL100K_BASE |
| Text-embedding-3-Small | CL100K_BASE |
| Text-rembedding-3-large | CL100K_BASE |
| Text-Similarity-Davinci-001 | r50k_base |
| Text-Similarity-Curie-001 | r50k_base |
| Text-Similarity-Babbage-001 | r50k_base |
| text-similarity-ada-001 | r50k_base |
| text-search-davinci-doc-001 | r50k_base |
| Text-Search-Curie-Doc-001 | r50k_base |
| Text-Search-Babbage-Doc-001 | r50k_base |
| text-search-ada-doc-001 | r50k_base |
| Code-Search-Babbage-Code-001 | r50k_base |
| code-search-ada-code-001 | r50k_base |
| GPT2 | GPT2 |
テストフォルダーでテストを実行できます
結果
結果
テストフォルダーでベンチマークを実行できます
| 名前 | 時間/op | OS | CPU | 文章 | 時代 |
|---|---|---|---|---|---|
| Tiktoken-go | 8795ns | macOS 13.2 | Apple M1 | udhr | 100000 |
| ティクトーク | 8838ns | macOS 13.2 | Apple M1 | udhr | 100000 |
パフォーマンスはほぼ同じように見えます。
たぶん、違いはマシンのパフォーマンスの違いによるものです。
または、私のベンチマーク方法が適切ではないかもしれません。
より良いベンチマーク方法がある場合、またはベンチマークの結果を追加したい場合は、PRをお気軽に送信してください。
新しいo200k_baseエンコードの場合、 cl100k_baseよりも遅いようです。 Tiktoken-goは、次のベンチマークでTiktokenよりもわずかに遅いです。
| 名前 | エンコーディング | 時間/op | OS | CPU | 文章 | 時代 |
|---|---|---|---|---|---|---|
| Tiktoken-go | O200K_Base | 108522 ns | Ubuntu 22.04 | AMD Ryzen 9 5900HS | udhr | 100000 |
| ティクトーク | 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 |
| ティクトーク | CL100K_BASE | 54642 ns | Ubuntu 22.04 | AMD Ryzen 9 5900HS | udhr | 100000 |
mit