我正在尝试对调用 OPENAI 时使用的代币进行定价。我有一个纯文本的 txt 文件,已上传到 Qdrant。当我问以下问题:
谁是迈克尔·乔丹?
并使用
get_openai_callback
函数来跟踪代币数量和操作价格时,输出中的信息关键之一并没有对我来说很有意义。
Tokens Used: 85
Prompt Tokens: 68
Completion Tokens: 17
Successful Requests: 1
Total Cost (USD): $0.00013600000000000003
为什么 提示令牌 值与输入值不同?输入文本中的标记数量(我理解为提示标记)是:
query = 'Who is Michael Jordan'
encoding = tiktoken.encoding_for_model('gpt-3.5-turbo-instruct')
print(f"Tokens: {len(encoding.encode(query))}")
4
,但响应中的输出类似于 68。我认为提示标记是基本标记(txt文件)已添加到问题标记中,但数学不适合。
txt 文件中的标记数量: 17
Arquivo txt: 'Michael Jeffrey Jordan 是一位美国商人,前任担任得分后卫的篮球运动员'
查询 + file_token : 21 (4+17)
有人能帮我理解定价计算吗?
我尝试搜索 OPENAI 自己的文档、github 和其他论坛,但我认为查找信息并不容易,或者向公众开放。我想了解我是否遗漏了某些内容,或者是否是用户无权访问的计算。
你发现的问题很有意思!虽然乍看之下,提示标记的数量(68)与你的预期(4 个查询标记 + 17 个文件标记 = 21)不符,但这里有一些因素会导致这种差异:
-
嵌入: 你提到了将文本文件上传到 Qdrant。这表明你很可能在使用嵌入来进行语义搜索。重要的是要理解, 嵌入本身并不是发送给 OpenAI 的提示的一部分 。相反,嵌入用于在 Qdrant 中找到与你的查询最相关的文本块。检索到的文本块 然后 才被添加到你的查询中,形成发送给 OpenAI 的完整提示。
-
检索到的文本块的大小: 即使你的原始文本文件只有 17 个标记,Qdrant 返回的相关文本块也可能大得多。这是因为 Qdrant 并不局限于返回整个文件或段落;它可以返回与你的查询语义相关的任何文本片段。68 个提示标记和 21 个预期标记之间的差异表明,检索到的文本块可能包含大约 47 个标记 (68 - 21 = 47)。
-
OpenAI API 的开销: 请记住,OpenAI API 会添加一些围绕用户提示的额外标记,用于指令和格式化目的。这些额外的标记通常很短,但在计算提示标记总数时也应该考虑在内。
要理解定价计算,你需要考虑以下因素:
- 实际发送给 OpenAI 的完整提示, 包括你的查询和 Qdrant 检索到的任何相关文本块。
- OpenAI API 添加的任何额外标记。
- OpenAI 用于你所选模型的每 1000 个标记的成本。
为了更深入地了解情况,我建议采取以下步骤:
- 检查发送给 OpenAI API 的完整提示。 大多数 OpenAI 客户端库都允许你查看发送到 API 的原始请求和响应。这将使你能够看到构成 68 个提示标记的确切内容。
- 尝试使用不同长度的文本文件和查询, 并观察提示标记数量是如何变化的。这将帮助你了解嵌入和检索到的文本块在最终提示大小中的作用。
通过仔细检查这些因素,你应该能够理解 OpenAI API 调用中代币定价的计算方式。
标签:python,token,openai-api,langchain,qdrant From: 78802377