topK 越大,召回越全但注入的上下文越多——既推高成本,也稀释模型对关键信息的注意力。这里帮你算清这笔账。
-
注入 token
-
占窗口(%)
-
剩余可用 token
-
千次查询($)
-
日成本($)
| topK | 注入 token | 占窗口 | 千次查询成本($) |
|---|
注入 token = 单块 token × topK;占窗口比 = 注入 ÷ 上下文窗口;剩余可用 = 窗口 − 注入 − 输出预留 − 问题 token;单次成本 = (注入 + 问题 token) ÷ 1000000 × 输入单价 + 输出预留 ÷ 1000000 × 输出单价。
topK 是 RAG 里最需要权衡的参数
RAG(检索增强生成)的流程是:把用户问题向量化 → 在知识库里找最相似的 K 个片段 → 把这些片段拼进提示词 → 让模型据此回答。这里的 K 就是 topK。
直觉上"召回的越多,答案越准",但实际规律恰恰相反:
| topK 过小 | topK 过大 |
|---|---|
| 关键信息没被召回,模型答"不知道" | 无关内容混入,模型被干扰,容易答偏 |
| 成本低但命中率差 | 成本线性上升,且注意力被稀释 |
| 表现为"知识库里明明有" | 表现为"答非所问"或"混入了其他文档的内容" |
业界常引用的一句话是"lost in the middle":当上下文很长时,模型对中间位置的信息利用率明显低于开头和结尾。也就是说,多召回的那些排在后面的片段,很可能根本没被有效利用——钱花了,效果没提升。
topK 怎么定
| 场景 | 建议 topK | 理由 |
|---|---|---|
| FAQ、单一事实查询 | 3–5 | 答案集中在单块,多了是噪声 |
| 流程说明、操作指引 | 5–8 | 步骤可能跨块,需要连续几块 |
| 多文档对比、综述 | 8–15 | 需要覆盖多个来源 |
| 代码库理解 | 10–20 | 依赖关系跨文件,需扩大召回面 |
更专业的做法不是单纯调 K,而是重排序(Rerank):先用向量检索召回较大的候选集(如 50 条),再用交叉编码器精排,最终只把最相关的 5 条放进提示词。这样既保住了召回率,又控制了注入量。
分块大小同样关键
单块 200 token 太碎(语义不完整),2000 token 太粗(一叶障目)。300–600 token 是常见甜区,同时保留 10%–20% 的重叠(overlap)避免句子被切断。分块策略对效果的影响,往往比调 topK 更显著。
另外注意:注入量直接吃掉上下文窗口。若窗口 32K、单块 450、topK 20,仅检索内容就占 9000 token,加上输出预留和系统提示词,留给多轮对话历史的余地就很小了。
你可能还想问
topK 怎么定?
K 越大召回越全但上下文越长、成本越高且噪声增多;常见起点 K=3-5,配合重排序(rerank)用少量高质量片段,效果与成本更平衡。
上下文占用怎么估算?
总 token ≈ K × 单块 token 数 + 系统提示 + 对话历史 + 输出预留;接近模型窗口上限时会截断,必须留出 20% 以上的余量。
块大小和 K 怎么配合?
块小则 K 要大,块大则 K 可小;总 token 相近时,小块的检索精度通常更好但上下文更碎,需按内容类型实测选择。
速查在线工具箱