让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
针对该问题,可能存在以下原因:
- 请求失败/retry导致的多余Token消耗。在每一次请求失败后,服务端都会将该请求消耗的Token计入用户账号的消耗,而如果客户端在请求失败后未作重试处理,则该Token会被多次计入消耗明细中。
- 非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调用的消耗。