返回博客

RAG 与数据指南

一个 RAG 问题要花多少钱:发送多少片段

估算一个 RAG 问题中的 token,按实时价格查看 1,000 和 100,000 个问题的成本,并选择适合你预算的片段数量。

作者:CheapTokens Team发布于 5 分钟阅读

示意图:一个问题与检索到的片段流入模型,成本取决于片段数量
本页内容
  1. 一次 RAG 请求包含什么
  2. 1,000 个问题要花多少钱
  3. Top-k:每个片段增加相同数量
  4. 整个文档放进提示,还是四个片段
  5. 发送请求
  6. 缩小输入的四种方法

你的文档聊天机器人运行正常,第一张账单来了,却比这些问题应得的费用更高。几乎每个 RAG 配置中,钱都花在同一个地方:你在每个问题前粘贴的检索片段。一个 RAG 问题的成本包括输入侧的问题、指令和 N 个片段的 token,以及输出侧的简短回答。片段是你可控的部分,每个片段都会给每一次请求增加相同数量的 token。

本指南统计一次请求,按实时价格计算 1,000 次和 100,000 次请求的费用,并展示将 top-k 从 3 调到 10 时会发生什么变化。检索本身(你的向量存储、你的分块)留在你这边;只有最终的生成调用会发到模型 API。如果你对输入和输出计费还不熟悉,请先阅读输入与输出 token。

一次 RAG 请求包含什么#

假设你在公司文档上运行一个支持机器人。客户问:“如何重置双因素登录?”,你的检索器返回五个最佳段落,然后你把以下内容发给模型:

  • 一个系统提示:“只根据上下文回答。如果上下文中没有,就说明没有。”——加上格式规则后大约 300 token;
  • 问题加上一点聊天上下文——大约 200 token;
  • 5 个片段,每个约 500 token——5 × 500 = 2,500 token;
  • 回答:两三个短段落——输出约 300 token。

输入侧是 2,500 + 300 + 200 = 3,000 token,输出侧约 300。这些是作者对典型支持机器人的假设;请换成你自己的数字。下面所有内容都以这一次请求为单位。

快速看清结构:片段大约占整个输入的五分之六,而输入是回答的十倍。自己估算一下:

猜数字

上面的请求发送多少输入 token?

显示答案

答案: 3,000

3,000:5 个片段 × 500 = 2,500,加上系统提示的 300 和问题的 200。片段占主导。

1,000 个问题要花多少钱#

一次请求太小,感觉不到,所以要放大。输入 3,000 token、输出 300 token 时,1,000 个问题发送 3,000,000 输入 token 并生成 300,000 输出 token。拖动下面的滑块来匹配你自己的机器人;网站会按每个模型的实时价格重新计算。

成本计算器

支持机器人的一天

每次请求的输入 token 数: 3,000 · 每次请求的输出 token 数: 300 · 每日请求数: 1,000

模型每天每月
GLM-5.3-Flash$0.072$2.16
DeepSeek-V4-Flash$0.075$2.25
MiniMax-M2.7$0.195$5.85

表格显示了三个模型在相同工作量下的费用,旁边是 OpenRouter 参考价。按总量计算,输入和输出加在一起,这里每个模型都比 OpenRouter 便宜。

模型 每次请求 1,000 次请求 OpenRouter,1,000 次请求
GLM-5.3-Flash $0.000072 $0.072 $0.147
DeepSeek-V4-Flash $0.000075 $0.075 $0.19
MiniMax-M2.7 $0.0002 $0.195 $1.26

每次请求 3,000 个输入 token 和 300 个输出 token。每 100 万 token 的价格为当前价格,会随我们的资费一同变动;OpenRouter 列显示相同工作负载的参考价格。

那 100,000 个问题呢?就是 300,000,000 token 输入和 30,000,000 token 输出。在 DeepSeek-V4-Flash 上是 $7.50,在 GLM-5.3-Flash 上是 $7.20,在 MiniMax-M2.7 上是 $19.50。价格按模型固定,没有高峰时段,所以夜间批处理和白天聊天每 token 成本相同。完整价格列表见定价页面。

Top-k:每个片段增加相同数量#

第二个场景:内部 wiki 助手。有人建议:“以防万一,我们发 10 个片段而不是 3 个。”输入呈直线增长:每个片段在每次请求中都会多出 500 token。

三个片段对十个片段:同一个问题,不同的输入大小
top-k 3 和 top-k 10 时每次请求的输入 token,假设每个片段 500 token

2,000 对 5,500 token:回答长度相同,所以 wiki 助手账单的全部差异都在输入。它是否能带来更好的回答是质量问题:一旦正确段落已经在上下文中,额外片段大多只会增加噪声和成本。选择 k 的实用方法是:取一组真实问题,检查正确段落在哪个 k 出现,然后停在略高于该值的位置。

上下文窗口是另一个限制。这里三个模型对普通 top-k 都有充足空间:MiniMax-M2.7 为 180K token,DeepSeek-V4-Flash 为 380K,GLM-5.3-Flash 为 390K。输出限制不同:GLM-5.3-Flash 和 MiniMax-M2.7 每个回答最多 8,192 token,DeepSeek-V4-Flash 最多 32,768 token,如果你的回答是长报告而不是简短回复,这一点很重要。

选择你的情况

你的 RAG 场景是什么?

来自少量片段的简短回答

一个支持机器人或 FAQ,top-k 为 3–6,回答几百 token,三个模型都适合。根据你自己问题上的质量来选择,然后让上面的成本表来决定。

长回答和摘要

如果回答达到数千 token,DeepSeek-V4-Flash 允许每个回答最多 32,768 输出 token 和 380K 上下文。

每次请求包含许多文档

如果你想合并许多段落或整个章节,GLM-5.3-Flash 在三个模型中上下文最大,为 390K。

整个文档放进提示,还是四个片段#

第三个场景:合同问答。偷懒的做法是把整个 30,000 token 的 PDF 粘贴到每个问题中。检索版本发送问题、指令和四个相关片段,每个约 650 token,总共约 3,000 token。同样是 1,000 个问题,同样是 300 token 的回答:

DeepSeek-V4-Flash 上 1,000 个合同问题的成本
  • 每次请求都放入整个 30,000 token 文档$0.48
  • 问题、指令和 4 个检索片段,约 3,000 token$0.075

完整文档发送的输入是十倍,30,000 ÷ 3,000 = 10,而问题相同。对于关于一个能放进上下文的文档的一次性问题,它仍然合理。对于全天回答的机器人,这是昂贵的默认做法。如果其中大量输入每次都是相同文本,请阅读提示缓存。

发送请求#

下面是生成步骤。检索部分由你负责:chunks 是你的向量存储返回的任何内容。同样的代码适用于 OpenAI SDK 或普通 curl。

用检索到的片段提问

Python

python
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key="YOUR_CHEAPTOKENS_KEY",
)

chunks = ["Chunk 1 text...", "Chunk 2 text...", "Chunk 3 text..."]
context = "\n\n---\n\n".join(chunks)

resp = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    max_tokens=400,
    messages=[
        {"role": "system", "content": "Answer only from the context. If the answer is not there, say so."},
        {"role": "user", "content": f"Context:\n{context}\n\nQuestion: How do I reset two-factor login?"},
    ],
)
print(resp.choices[0].message.content)
print(resp.usage.prompt_tokens, resp.usage.completion_tokens)

curl

bash
curl https://api.cheaptokens.dev/v1/chat/completions \
  -H "Authorization: Bearer YOUR_CHEAPTOKENS_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-ai/DeepSeek-V4-Flash-0731",
    "max_tokens": 400,
    "messages": [
      {"role": "system", "content": "Answer only from the context. If the answer is not there, say so."},
      {"role": "user", "content": "Context:\nChunk 1...\n\nQuestion: How do I reset two-factor login?"}
    ]
  }'

Python 示例的最后一行是有用的那行。usage.prompt_tokens 是你每个问题的真实输入;把它与 3,000 的估算比较,并用你的数字替换我的假设。使用完整模型 id,如示例所示:deepseek-ai/DeepSeek-V4-Flash-0731。这些 id 列在文档中。完整设置见文档,如果你想看一个机器人的 token 在对话中如何累加,为什么长聊天更贵涵盖了历史部分。

缩小输入的四种方法#

从 max_tokens 开始,它限制回答长度并保护你免受失控回复的影响。然后把 k 降到仍能找到正确段落的最小值。让片段更紧凑,使 500 token 承载 500 token 的含义,而不是标题和样板文字。发送前删除重复片段:两个几乎相同的段落花费两倍却只说一次。并在真实流量上用 usage 测量,因为对 500 token 片段的猜测只是猜测。要更广泛地了解 API 调用中 token 的去向,请参阅一次请求使用多少 token。

把你每次请求的 token 数输入上面的计算器,按三个模型为你的机器人定价;如果你的回答很长,DeepSeek-V4-Flash是应该首先考虑的。