geraldddd 2024-03-22 16:47 采纳率: 0%
浏览 38

MoonShot API调用Token计算计费

问题遇到的现象和发生背景

该问题关于MoonShot API 调用过程中Token计算计费。

本人由于学习需要,使用Python通过OpenAI库中client.chat.completions.create()方法多次调用MoonShotAPI,并使用Print()打印获得的调用结果,其中打印的结果会包含“total_tokens”数据,如下图所示:

img

img

img

通过把打印获得的调用结果和MoonShot用户中心“计费明细”模块中“账单详情”中“消耗(Token)”对比,发现MoonShot用户中心“计费明细”模块中“账单详情”中“消耗(Token)”中Token多余实际调用答应出来的“total_tokens”。如下图所示:

img

图中画红圈的行是在调用时命令行没有打印出现过的消耗,所以想请问有人知道为什么会有这样的额外消耗吗?因为每一次消耗Token都是计费的。

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-03-22 16:59
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    针对该问题,可能存在以下原因:
    1. 请求失败/retry导致的多余Token消耗。在每一次请求失败后,服务端都会将该请求消耗的Token计入用户账号的消耗,而如果客户端在请求失败后未作重试处理,则该Token会被多次计入消耗明细中。
    2. 非API调用导致的Token消耗。除API调用以外,MoonShot内建了许多其他功能,如数据准备、分析等,也会消耗Token计费。 针对第1种情况,建议在请求失败时,先将该token进行缓存,并在重试时重新使用该缓存的token进行请求,避免多次消耗。 示例代码:
    import openai_secret_manager
    import openai
    import time
    api_key = openai_secret_manager.get_secret("openai")["api_key"]
    model_engine = "text-davinci-002"
    openai.api_key = api_key
    def generate_text(prompt):
        try:
            response = openai.Completion.create(
                engine=model_engine,
                prompt=prompt,
                max_tokens=1024,
                n=1,
                stop=None,
                temperature=0.5,
                frequency_penalty=0,
                presence_penalty=0
            )
            if 'choices' in response:
                return response['choices'][0]['text']
            else:
                print('there is no choices in the response')
                return ''
        except Exception as e:
            print('generate_text_api_error:', e)
            return ''
    cached_token = ''
    def generate_text_with_retry(prompt, retry_num=2):
        global cached_token
        for i in range(retry_num):
            try:
                # 判断是否需要重新使用缓存的token
                if cached_token:
                    response = openai.Completion.create(
                        engine=model_engine,
                        prompt=prompt,
                        max_tokens=1024,
                        n=1,
                        stop=None,
                        temperature=0.5,
                        frequency_penalty=0,
                        presence_penalty=0,
                        access_token=cached_token
                    )
                else:
                    response = openai.Completion.create(
                        engine=model_engine,
                        prompt=prompt,
                        max_tokens=1024,
                        n=1,
                        stop=None,
                        temperature=0.5,
                        frequency_penalty=0,
                        presence_penalty=0
                    )
                # 是否需要缓存token
                if 'access_token' in response:
                    cached_token = response['choices'][0]['access_token']
                if 'choices' in response:
                    return response['choices'][0]['text']
                else:
                    print('there is no choices in the response')
                    return ''
            except Exception as e:
                print('generate_text_api_error:', e)
                time.sleep(3)
                continue
        return ''
    

    针对第2种情况,建议通过MoonShot用户中心的“计费明细”模块中的“消耗(Token)”详情,查看非API调用部分所消耗的Token数量,从而进一步优化代码,减少非API调用的消耗。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月22日