V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dier
V2EX  ›  OpenAI

ChatGPT 的 Tokens 是怎么计算的?

  •  
  •   dier · 2023-04-14 09:18:21 +08:00 · 4699 次点击
    这是一个创建于 591 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的账号因为没有试用金,所以不能测试。希望有用地的帮忙解答一下

    我想了解一下这个 tokens 的计算是统计的我提问时提交内容折算成 tokens 还是 ChatGPT 生成的内容折算成 tokens 。

    我开始以为是根据我提问的内容计算 tokens ,但是今天一想感觉好像不太对?因为大部分情况下提问的内容是很少的,那如果只是提问、对话,1000 个 tokens 岂不是可以提问好多内容?

    如果是按回复的内容算 tokens ,那它讲废话也是挺合理的了,毕竟说得越多,收费越贵🐶

    我搜了一下,没有比较明确的说明。另外,还看到说好像上下文也会每次算在提交的 tokens 中。

    15 条回复    2024-09-02 09:41:20 +08:00
    airyland
        1
    airyland  
       2023-04-14 09:22:37 +08:00   ❤️ 1
    input + output
    dier
        2
    dier  
    OP
       2023-04-14 09:24:01 +08:00
    @airyland 那上下文的内容也会反复计算在内吗
    vbe
        3
    vbe  
       2023-04-14 09:26:03 +08:00   ❤️ 1
    @dier 不会
    zapper
        4
    zapper  
       2023-04-14 09:28:14 +08:00   ❤️ 1
    https://platform.openai.com/tokenizer
    1,000 tokens is about 750 (英文) words

    [上文] + 输入+输出,GPT3.5 最大就是 4096 tokens ,这也解释了为什么他说着说着就会忘记前面的事情
    cs3230524
        5
    cs3230524  
       2023-04-14 09:43:24 +08:00   ❤️ 2
    @dier 会啊。
    第一轮:Q1A1
    第二轮:Q1A1+Q2A2
    第三轮:Q1A1+Q2A3+Q3A3
    ......

    最长的 token 有限制,超过了你要自己选择携带的会话请求。相关的 token 拆分算法官方文档已经写得很清楚了。
    abelyao
        6
    abelyao  
       2023-04-14 09:48:20 +08:00
    #5 @cs3230524 说的才是正常的,上下文是算字数的
    hahastudio
        7
    hahastudio  
       2023-04-14 09:52:28 +08:00
    @zapper 不是的吧,如果你 API 前面给的 context 太长,它最后回复的就很短,context + response = 4096 token
    Yeen
        8
    Yeen  
       2023-04-14 09:56:11 +08:00
    官方有文档,直接给官方结论(英文文本):正常文本统计来说,单词数大约相当于 token 数的 75%。
    也就是 1000 个 token 大约有效单词是 750 个。
    pkoukk
        9
    pkoukk  
       2023-04-14 10:03:04 +08:00   ❤️ 2
    官方提供的 token 序列化算法,可以计算实际消耗 token 。
    官方提供了 python 和 c#两个语言的版本,其他语言的实现可以在 github 上找。
    https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb

    你说的上下文问题和 token 没关系,属于你自己的 api 封装策略。
    在 chat 这个模式下,你向 API 发起的请求模式是 [Q1 ,A1 ,Q2 ,A2 ,Q3 ,A3 ,Q4],等待 API 返回 A4
    这种模式带有越多的之前的 QA ,上下文效果越好,但是单次请求消耗的 token 越多
    如果你想少用点 token ,可以对之前的 QA 做出裁剪,比如只发起[Q2 ,A2 ,Q3 ,A3 ,Q4]
    我自己写来玩的 cli 实现了根据 token 限制动态裁剪对话,你可以参考
    https://github.com/pkoukk/chatgpt-cli/blob/main/gpt/conversion.go
    BrandonNg
        10
    BrandonNg  
       2023-04-14 10:16:08 +08:00
    evil0harry
        11
    evil0harry  
       2023-04-14 10:33:10 +08:00
    go 版本可以使用这个 https://github.com/pkoukk/tiktoken-go
    rwecho
        12
    rwecho  
       2023-04-14 10:45:24 +08:00
    如果是 stream 模式, 那它的回复只算最终的吧, stream 的中间文本会产生吗?
    xqdoo00o
        13
    xqdoo00o  
       2023-04-14 12:22:51 +08:00
    @rwecho stream 模式,一条 data 算一个 token
    Biluesgakki
        14
    Biluesgakki  
       2023-04-14 13:11:45 +08:00   ❤️ 1
    反正问一个问题大概在几百到几千不等 ,不要带太多的上下文 ,token 会吃得很快
    waliwaliCrazy
        15
    waliwaliCrazy  
       84 天前
    vue 的版本有吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3047 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:19 · PVG 22:19 · LAX 06:19 · JFK 09:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.