我有一个NodeJS程序,它连接到OpenAI的助手API来创建消息。我按照OpenAI的文档创建了以下步骤:
- 我创建了一个助手(gpt-4-1106-preview)和一个线程,我通过这个线程与助手互动。
- 向线程中添加一条消息。该消息包含大约1000个代币,通过https://platform.openai.com/tokenizer检查
openai.beta.threads.messages.create(threadId, { role: "user", content: createMessage(), });
- 运行助手
await openai.beta.threads.runs.create(threadId, { assistant_id: assistantId, instructions: "请称呼用户为Mahesh。用户是管理员。", });
- 检查状态。我每5秒运行一次,直到状态变为“已完成”
await openai.beta.threads.runs.retrieve(threadId, runId);
- 获取助手的最后一个响应
const messages = await openai.beta.threads.messages.list(threadId, { limit: 1, });
这段代码完成大约需要250,000个代币。图片显示了今天三次请求的代币使用情况。
回答:
运行助手成本高昂的原因可能有很多。
你使用的是哪个OpenAI模型?
如果你查看官方OpenAI文档,你会发现他们使用的是gpt-4-1106-preview
模型。他们指出:
我们建议使用OpenAI的最新模型与助手API一起使用,以获得最佳效果和与工具的最大兼容性。
但旧模型可能已经足够好。这取决于你的助手的用途。仅仅通过更换模型,你就可以降低运行助手的成本。当然,如果你发现助手的性能显著下降,那么你需要使用最新的模型。请看下表,了解模型选择的差异有多大:
模型 | 输入 | 输出 |
---|---|---|
gpt-4-1106-preview | $0.01 / 1K代币 | $0.03 / 1K代币 |
gpt-3.5-turbo-1106 | $0.001 / 1K代币 | $0.002 / 1K代币 |
你使用同一个线程有多久了?
正如官方OpenAI文档中所述:
助手可以访问持久线程。线程通过存储消息历史并在对话过长时截断它来简化AI应用程序的开发。你创建一个线程后,只需在用户回复时向其追加消息即可。
/ … /
线程和消息代表助手与用户之间的对话会话。你可以在线程中存储的 messages 数量没有限制。一旦消息的大小超过模型的上下文窗口大小,线程将尝试包含尽可能多的适合上下文窗口的消息,并丢弃最旧的消息。
线程在存储消息历史!gpt-4-1106-preview
的上下文窗口为128,000
个代币。因此,如果你使用同一个线程与助手聊天足够长的时间,你将填满线程直到你选择的模型的上下文窗口。
如果你选择gpt-4-1106-preview
,这意味着在使用同一个线程与助手聊天一段时间后,你问助手的一个问题意味着你使用了128,000
个代币。你最近的问题可能包含1,000
个代币,但你还需要记住,过去由你提问或助手回答的数百条消息也被发送到了助手API。
在你的情况下,你今天使用了760,564
个上下文代币。你可能已经使用同一个线程相当长的时间了。
你多久检查一次运行状态?
你说你每5秒检查一次运行状态,看它是否已变为completed
。尝试增加这个时间,比如10秒,以减少API调用。你为每次API调用付费。