简体中文
Tiktoken ของ Openai ใน Go
Tiktoken เป็น Tokeniser BPE ที่รวดเร็วสำหรับใช้กับโมเดลของ OpenAI
นี่คือพอร์ตของ tiktoken ดั้งเดิม
go get github.com/pkoukk/tiktoken-goTiktoken-Go มีกลไกแคชเช่นเดียวกับห้องสมุด Tiktoken ดั้งเดิม
คุณสามารถตั้งค่าไดเรกทอรีแคชโดยใช้ตัวแปรสภาพแวดล้อม tiktoken_cache_dir
เมื่อตั้งค่าตัวแปรนี้แล้ว Tiktoken-Go จะใช้ไดเรกทอรีนี้เพื่อแคชพจนานุกรมโทเค็น
หากคุณไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อมนี้ Tiktoken-Go จะดาวน์โหลดพจนานุกรมทุกครั้งที่คุณเริ่มต้นการเข้ารหัสเป็นครั้งแรก
หากคุณไม่ต้องการใช้แคชหรือดาวน์โหลดพจนานุกรมในแต่ละครั้งคุณสามารถใช้ตัวโหลด BPE ทางเลือก
เพียงโทรหา tiktoken.SetBpeLoader ก่อนโทร tiktoken.GetEncoding หรือ tiktoken.EncodingForModel
BpeLoader เป็นอินเทอร์เฟซคุณสามารถใช้ BPE Loader ของคุณเองได้โดยใช้อินเทอร์เฟซนี้
ตัวโหลด 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 | Codex Models, 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-turbo | cl100k_base |
| Text-Davinci-003 | p50k_base |
| Text-Davinci-002 | p50k_base |
| Text-Davinci-001 | r50k_base |
| ข้อความ Curie-001 | r50k_base |
| Text-BABBAGE-001 | r50k_base |
| Text-ADA-001 | r50k_base |
| Davinci | 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-Embedding-ADA-002 | cl100k_base |
| Text-Embedding-3-small | cl100k_base |
| Text-Embedding-3 ใหญ่ | cl100k_base |
| ข้อความที่มีลักษณะคล้ายคลึงกัน Davinci-001 | r50k_base |
| ข้อความที่คล้ายคลึงกัน-Curie-001 | r50k_base |
| ข้อความที่คล้ายคลึงกัน-babbage-001 | r50k_base |
| Text-similarity-ADA-001 | r50k_base |
| text-search-davinci-doc-001 | r50k_base |
| การค้นหาข้อความ-curie-doc-001 | r50k_base |
| การค้นหาข้อความ -babbage-doc-001 | r50k_base |
| Text-Search-ADA-DOC-001 | r50k_base |
| โค้ดค้นหา-บับรหัส-001 | r50k_base |
| Code-Search-ADA-CODE-001 | r50k_base |
| GPT2 | GPT2 |
คุณสามารถเรียกใช้การทดสอบในโฟลเดอร์ทดสอบ
ผลลัพธ์
ผลลัพธ์
คุณสามารถเรียกใช้เกณฑ์มาตรฐานในโฟลเดอร์ทดสอบ
| ชื่อ | เวลา/op | ระบบปฏิบัติการ | ซีพียู | ข้อความ | เวลา |
|---|---|---|---|---|---|
| tiktoken-go | 8795NS | macos 13.2 | Apple M1 | UDHR | 100000 |
| tiktoken | 8838ns | macos 13.2 | Apple M1 | UDHR | 100000 |
ดูเหมือนว่าการแสดงเกือบจะเหมือนกัน
บางทีความแตกต่างนั้นเกิดจากความแตกต่างในประสิทธิภาพของเครื่อง
หรือวิธีการมาตรฐานของฉันอาจไม่เหมาะสม
หากคุณมีวิธีเบนช์มาร์กที่ดีกว่าหรือหากคุณต้องการเพิ่มผลการวัดประสิทธิภาพของคุณโปรดส่ง PR
สำหรับการเข้ารหัส o200k_base ใหม่ดูเหมือนว่าช้ากว่า cl100k_base Tiktoken-Go ช้ากว่า tiktoken เล็กน้อยบนเกณฑ์มาตรฐานต่อไปนี้
| ชื่อ | การเข้ารหัส | เวลา/op | ระบบปฏิบัติการ | ซีพียู | ข้อความ | เวลา |
|---|---|---|---|---|---|---|
| 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 |
มิกซ์