Files
ai-bot/internal/tokens/tokens.go
T

52 lines
994 B
Go

package tokens
import "github.com/pkoukk/tiktoken-go"
var tke *tiktoken.Tiktoken
func getEncoding() *tiktoken.Tiktoken {
if tke == nil {
t, err := tiktoken.GetEncoding("o200k_base")
if err != nil {
return nil
}
tke = t
}
return tke
}
// Tokenize 将文本编码为 o200k_base token id 列表(去重)。
// 编码器初始化失败时返回 nil。
func Tokenize(text string) []int64 {
if text == "" {
return nil
}
enc := getEncoding()
if enc == nil {
return nil
}
seen := make(map[int64]bool)
var out []int64
for _, id := range enc.Encode(text, nil, nil) {
tid := int64(id)
if seen[tid] {
continue
}
seen[tid] = true
out = append(out, tid)
}
return out
}
// Count 统计文本的 token 数量;编码器初始化失败时回退为字符数/2 估算。
func Count(text string) int64 {
if text == "" {
return 0
}
enc := getEncoding()
if enc == nil {
return int64(len([]rune(text)) / 2)
}
return int64(len(enc.Encode(text, nil, nil)))
}