pkoukk / tiktoken-go

go version of tiktoken
MIT License
601 stars 67 forks source link

关于计算误差比较大的问题 #16

Closed ZeroDeng01 closed 1 year ago

ZeroDeng01 commented 1 year ago

你好,我这边采用如下方法计算的token误差和Openai 官方计算工具上计算的结果相差很大,不知你您那边遇见过没有。gpt3.5。使用如下demo结果方法进行的计算

func NumTokensFromMessages(messages []openai.ChatCompletionMessage, model string) (num_tokens int) {
    tkm, err := tiktoken.EncodingForModel(model)
    if err != nil {
        err = fmt.Errorf("EncodingForModel: %v", err)
        fmt.Println(err)
        return
    }

    var tokens_per_message int
    var tokens_per_name int
    if model == "gpt-3.5-turbo-0301" || model == "gpt-3.5-turbo" {
        tokens_per_message = 4
        tokens_per_name = -1
    } else if model == "gpt-4-0314" || model == "gpt-4" {
        tokens_per_message = 3
        tokens_per_name = 1
    } else {
        fmt.Println("Warning: model not found. Using cl100k_base encoding.")
        tokens_per_message = 3
        tokens_per_name = 1
    }

    for _, message := range messages {
        num_tokens += tokens_per_message
        num_tokens += len(tkm.Encode(message.Content, nil, nil))
        num_tokens += len(tkm.Encode(message.Role, nil, nil))
        num_tokens += len(tkm.Encode(message.Name,nil,nil))
        if message.Name != "" {
            num_tokens += tokens_per_name
        }
    }
    num_tokens += 3
    return num_tokens
}
pkoukk commented 1 year ago

这个页面上的tokenizer是针对gpt3版本的,也就是p50k_base这个Encoding 这个示例代码是gpt-3.5以上版本使用的,也就是cl100k_base,两个encoding不同,计算结果也不相同