OpenAI Assistants API单次请求Token消耗过高问题求助
问题描述
我用NodeJS开发了一个程序,通过OpenAI Assistant API创建消息,已按照官方文档完成以下操作:
- 创建了基于gpt-4-1106-preview的Assistant及对应交互线程;
- 向线程添加经OpenAI Token工具检测约1000Token的消息:
openai.beta.threads.messages.create(threadId, { role: "user", content: createMessage(), });
- 运行助手:
await openai.beta.threads.runs.create(threadId, { assistant_id: assistantId, instructions: "Please address the user as Mahesh. The user is an administrator.", });
- 每5秒轮询运行状态直至变为"completed":
await openai.beta.threads.runs.retrieve(threadId, runId);
- 获取助手最新响应:
const messages = await openai.beta.threads.messages.list(threadId, { limit: 1, });
但单次请求完成时Token消耗约25万,以下是今日三次请求的Token使用情况:
现咨询该异常高Token消耗的原因及解决办法。
可能原因
- 线程历史上下文累积:Assistant API默认会将线程内的所有历史消息作为上下文传入模型。如果线程中存在大量未清理的历史消息(比如多次测试留下的旧内容),每次运行都会将全部历史上下文计入Token消耗,导致总量激增。
- 助手绑定大体积知识库文件:如果你的Assistant关联了大文件作为知识库,每次运行时模型会加载整个文件的内容作为上下文,这会直接导致prompt Token数大幅增加。
- 输入内容Token数检测误差:你使用的Token工具检测结果可能与OpenAI API实际计算的Token数存在差异,
createMessage()返回的内容实际Token数可能远高于1000。 - 重复触发助手运行:代码逻辑可能存在重复调用
threads.runs.create的情况,多次运行助手会累积Token消耗。 - 模型上下文窗口的隐性计算:gpt-4-1106-preview的上下文窗口为128k,但如果运行过程中存在自动扩展上下文或重复处理内容的情况,也会导致Token消耗异常。
解决办法
- 清理或隔离线程上下文
- 每次用户请求时创建新的线程,避免历史消息累积;
- 如果需要保留部分上下文,在每次运行前清理线程中无关的旧消息,仅保留必要的对话内容。
- 优化知识库文件使用
- 检查Assistant绑定的文件大小,将大文件拆分为多个小文件;
- 使用向量数据库检索知识库的相关片段,仅将与当前问题相关的内容传入模型,而非加载整个文件。
- 准确计算输入Token数
- 使用OpenAI官方的
tiktoken库本地计算createMessage()返回内容的Token数,确保与API计算结果一致; - 限制单条消息的Token数,避免超出预期。
- 使用OpenAI官方的
- 排查代码逻辑
- 检查是否存在重复调用
threads.runs.create的情况,确保单次请求仅触发一次助手运行; - 确认轮询逻辑不会意外触发新的运行请求。
- 检查是否存在重复调用
- 查看详细Token消耗数据
- 在助手运行完成后,获取
run对象的usage字段,查看prompt_tokens和completion_tokens的具体数值,定位是输入还是输出导致的高消耗。
- 在助手运行完成后,获取
内容的提问来源于stack exchange,提问作者Mahesh Samudra
相关产品推荐
相关产品推荐

