top-k 与 top-p 学习笔记
这两个概念经常被混在一起问,但它们属于不同阶段、含义不同。最大的混淆点是:top-k 在检索和生成两个阶段都有,而 top-p 只在生成阶段。本笔记把三者彻底分清。
一、核心混淆点
top-k 在两个阶段都有:
检索阶段 top-k: 取相似度最高的 k 个文档 (RAG 用)
生成阶段 top-k: 采样时只考虑概率最高的 k 个词 (LLM 用)
top-p 只在生成阶段:
生成阶段 top-p: 采样时只考虑累积概率达 p 的词集合 (nucleus sampling)
所以"top-k vs top-p"这个问题本身就有歧义——要分清是检索阶段还是生成阶段。
二、两个阶段
检索阶段(RAG 检索文档)
从向量库里挑文档,用 top-k(取最相似的 k 个)。没有 top-p。
生成阶段(LLM 生成下一个词)
LLM 每次生成一个词,从词表里选。采样策略有 top-k、top-p、temperature。
三、检索 top-k(RAG 用)
含义
从向量库检索时,取和 query 相似度最高的 k 个文档。
query 向量 vs 所有文档向量 → 算相似度 → 排序 → 取前 k 个
例子
相似度排序: D1(0.92), D3(0.80), D2(0.71), D4(0.12), D5(0.08)
top-k=3 → 取 D1, D3, D2
作用
控制召回文档数量。k 太小可能漏掉相关文档,k 太大可能引入噪声(不相关的)。
特点
- 固定数量:永远取 k 个
- 只看相似度排名,不看分数差距
四、生成 top-k(LLM 采样)
背景
LLM 生成下一个词时,对词表里每个词算一个概率,然后按概率采样。直接按全词表采样会有问题:大量低概率词拉低质量。
含义
只考虑概率最高的 k 个词,从这 k 个里按概率采样,其余词直接忽略。
例子
下一个词的概率:
"的" 0.40
"是" 0.20
"在" 0.15
"有" 0.10
"了" 0.05
"也" 0.03
... (剩下几千个词概率极低)
top-k=3:只看前 3 个(的/是/在),重新归一化后采样:
"的" 0.40/(0.40+0.20+0.15) = 0.53
"是" 0.20/0.75 = 0.27
"在" 0.15/0.75 = 0.20
从这 3 个里按概率抽一个。
作用
过滤掉大量低概率噪声词,只在高概率词里采样。
特点
- 固定数量:永远只看 k 个词
- 不管概率分布形状(集中的时候 k 太多引入噪声,分散的时候 k 太少漏掉好词)
五、生成 top-p(nucleus sampling)
含义
只考虑累积概率达到 p 的最少词集合。从概率最高的词开始累加,加到累积概率 ≥ p 就停,这些词里采样。
例子(同上概率)
"的" 0.40 → 累积 0.40
"是" 0.20 → 累积 0.60
"在" 0.15 → 累积 0.75
"有" 0.10 → 累积 0.85
"了" 0.05 → 累积 0.90 ← 达到 p=0.9, 停
top-p=0.9:取前 5 个词(的/是/在/有/了),归一化后采样。
作用
动态调整候选词数量:
- 概率集中时(一个词概率很高):少量词就到 p,候选少,更确定
- 概率分散时(没有明显高概率词):要多取几个才到 p,候选多,更多样
特点
- 动态数量:候选数随概率分布变化
- 比_top-k 更自适应:分布集中时候选少,分散时候选多
六、top-k vs top-p(生成阶段对比)
| top-k | top-p | |
|---|---|---|
| 候选数量 | 固定 k 个 | 动态(累积概率达 p) |
| 依赖概率分布 | 不依赖(永远 k 个) | 依赖(集中少、分散多) |
| 自适应性 | 差 | 好 |
| 极端情况 | 分布集中时 k 太多引入噪声 | 不会(自动减少候选) |
直观对比
分布集中时("的" 0.9,其他都低):
- top-k=50:还是看 50 个,引入一堆低概率噪声
- top-p=0.9:只看"的"(累积 0.9 就停),干净
分布分散时(最高才 0.1):
- top-k=50:看 50 个,可能够
- top-p=0.9:要看十几个才累积到 0.9,自动多取
top-p 更智能,所以现代 LLM 多用 top-p。
七、temperature(顺带)
调整概率分布的尖锐程度,和 top-k/top-p 配合控制生成随机性。
原始概率: "的" 0.40, "是" 0.20, "在" 0.15...
temperature 低 (如 0.2): 分布变尖, "的" 概率更高 → 更确定, 偏向高概率词
temperature 高 (如 1.5): 分布变平, 概率差距缩小 → 更随机, 多样性高
temperature=0: 贪心, 永远选概率最高的词
- 低温度(0~0.3):确定、保守,适合事实问答、代码
- 高温度(0.7~1.0):多样、有创意,适合聊天、写作
八、三者怎么配合
生成阶段通常同时设置 top-k、top-p、temperature,组合控制生成行为:
temperature 调整概率分布尖锐度
↓
top-k / top-p 筛选候选词
↓
从候选里按概率采样
常见配置:
- 事实问答:temperature=0, top-p=1(贪心,确定)
- 聊天:temperature=0.7, top_p=0.9(多样但不离谱)
- 创意写作:temperature=1.0, top_p=0.95
本项目 RAG agent 用 temperature=0.7,没显式设 top-p(用默认)。
九、完整对比表
| 检索 top-k | 生成 top-k | 生成 top-p | |
|---|---|---|---|
| 阶段 | 检索 | 生成 | 生成 |
| 选什么 | 文档 | 词 | 词 |
| 数量 | 固定 k | 固定 k | 动态(累积概率 p) |
| 依据 | 相似度排名 | 概率排名 | 累积概率 |
| 用途 | RAG 召回文档 | LLM 采样候选词 | LLM 采样候选词 |
| 本项目 | k=3 | 未显式设 | 未显式设 |
评论区