简体中文
Openai의 tiktoken in go.
Tiktoken은 OpenAI의 모델과 함께 사용하기위한 빠른 BPE 토큰 자입니다.
이것은 원래 Tiktoken의 항구입니다.
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 로더는 Embed Files에서 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로 전달 된 메시지에 대한 토큰 계산의 예제 기능입니다.
다음 코드는 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-4-* | 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 |
| 텍스트 -ADA-001 | r50k_base |
| 다빈치 | r50k_base |
| 로마 교황청 | r50k_base |
| babbage | 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 |
| 텍스트 -davinci-edit-001 | p50k_edit |
| Code-Davinciedit-001 | p50k_edit |
| 텍스트-엠 베딩-아다 -002 | CL100K_BASE |
| 텍스트 엠 베딩 -3 스몰 | CL100K_BASE |
| 텍스트-엠 베딩 -3- 레이지 | CL100K_BASE |
| 텍스트-유사성 -davinci-001 | r50k_base |
| 텍스트 유사성 -Curie-001 | r50k_base |
| 텍스트-유사성 -Babbage-001 | r50k_base |
| 텍스트 유사성 -ADA-001 | r50k_base |
| 텍스트 검색 -davinci-Doc-001 | r50k_base |
| Text-Search-Curie-DOC-001 | r50k_base |
| 텍스트 검색-바이저 DOC-001 | r50k_base |
| Text-Search-DADA-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 | 마코스 13.2 | Apple M1 | Udhr | 100000 |
| 티크 턴 | 8838ns | 마코스 13.2 | Apple M1 | Udhr | 100000 |
성능이 거의 같은 것 같습니다.
어쩌면 차이는 기계의 성능 차이로 인한 것일 수 있습니다.
또는 내 벤치 마크 방법이 적절하지 않을 수도 있습니다.
더 나은 벤치 마크 방법이 있거나 벤치 마크 결과를 추가하려면 PR을 제출하십시오.
새로운 o200k_base 인코딩의 경우 cl100k_base 보다 느리게 보입니다. Tiktoken-Go는 다음 벤치 마크에서 Tiktoken보다 약간 느립니다.
| 이름 | 부호화 | 시간/op | OS | CPU | 텍스트 | 타임스 |
|---|---|---|---|---|---|---|
| Tiktoken-Go | O200K_BASE | 108522 ns | 우분투 22.04 | AMD Ryzen 9 5900HS | Udhr | 100000 |
| 티크 턴 | 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 |
| 티크 턴 | CL100K_BASE | 54642 ns | 우분투 22.04 | AMD Ryzen 9 5900HS | Udhr | 100000 |
MIT