精炼回答
Few-shot CoT的例子选择绝对不能随便选,这直接影响模型推理质量。大语言模型在Few-shot场景下,本质上是在做模式匹配和类比推理,你给的例子就是模型的参考答案模板。
核心原则是例子要与目标任务相似且具有代表性。具体来说,你选择的示例应该覆盖目标问题的主要推理模式。比如做数学题,如果目标是解方程组,你给的例子最好也是方程组求解的推理链,而不是几何题的推理过程,否则模型容易被误导。
推理链的质量比数量更重要。一个清晰、逻辑严密的推理步骤,胜过多个模糊的例子。推理步骤要完整展示中间思考过程,不能跳步骤,否则模型学不到正确的推理方式。实践中有几个有效策略:多样性采样能让例子覆盖不同难度和子类型;相似度检索可以根据输入问题动态选择最相关的示例(这就是Dynamic Few-shot);难度递进的例子排列有时比随机排列效果更好。
还要注意例子数量的平衡,太少可能指导不足,太多会超出context长度限制且增加噪声。通常3-8个精选例子就够了。在实际应用中,精心选择的Few-shot CoT示例,能让模型在数学推理、逻辑问答这类任务上的准确率提升20-30个百分点,而随机选择的示例提升就很有限,甚至可能负优化。
扩展分析
为什么示例选择如此关键
面试时听到这个问题,千万别顺着说"可以随便选"。面试官抛出这个问题,其实是在测试你对Few-shot CoT底层逻辑的理解深度。你要先明确否定,然后快速点出核心要害:"不能随便选,示例的选择对模型推理质量影响很大。因为大语言模型在Few-shot场景下,本质上是在做模式匹配和类比推理,你给的例子就是模型的参考答案模板。"
Few-shot CoT和普通的Few-shot学习有个本质区别,就是我们不仅要让模型看到问题和答案,还要展示解题的思维过程。这就好比教小孩做数学题,光告诉他答案是42没用,得把"先算括号里的,再处理乘除,最后算加减"这个过程演示出来。大模型在看到这些示例后,本质上是在做一种上下文学习(In-Context Learning),它会从你给的例子里提取出任务的模式和推理范式。模型不是简单的复制粘贴,而是在理解"这类问题应该怎么思考"这个元层面的规律。所以你给的示例质量,直接决定了模型能学到什么样的推理模式。
谈示例选择时要从几个关键维度来评估适配度。任务相关性不只是表面的主题匹配,而是深层的推理结构相似。拿电商场景举例,假如目标任务是根据用户行为判断购买意图,那选择的示例最好也包含"观察行为特征→分析意图信号→得出结论"这样的推理链,而不是选一个简单的商品分类推理过程。虽然都是电商领域,但推理模式差异很大。
推理复杂度的匹配也很关键但容易被忽略。示例的推理难度要和目标任务匹配,太简单了模型学不到足够的推理深度,太复杂又可能引入不必要的噪声。如果目标问题需要三层因果推理,你给的例子只有一层直接推断,模型就很难泛化出正确的推理深度。
还有一个关键点是推理路径的多样性。即使在同一个任务下,不同问题可能需要不同的解题路径。比如数学应用题,有些需要列方程求解,有些用比例关系更直接,有些则需要逆向推理。如果你选的几个示例全是同一种解题思路,模型在遇到需要不同路径的问题时就会卡住。
面试时对比主流策略要有自己的观点,别平铺直叙地列举。随机采样是最基础的方法,简单粗暴,但在任务分布比较均匀的情况下,运气好也能work。不过它的问题很明显,就是不稳定性太高,可能碰巧选到好的示例组合,也可能选到完全不相关的。
相似度检索策略是当前比较主流的做法。对每个输入问题,动态地从示例池里检索最相似的几个作为few-shot examples。通常用embedding向量的余弦距离,或者更精细一点的话,可以在语义相似度基础上加入任务特征的匹配度。具体实现是通过预训练的encoder把问题编码成向量,然后用向量检索技术快速找到最近邻。
聚类采样策略适合示例池比较大的场景。先把所有候选示例做聚类,然后从每个簇里选代表性样本,这样能保证示例的多样性覆盖。这个策略的优势是能系统性地避免示例冗余,缺点是对单个query的针对性不如检索方法强。实际工程中,更好的做法是把检索和多样性结合起来,比如先用相似度检索缩小候选范围,再在topK结果里做多样性采样,既保证相关性又避免同质化。
谈推理链质量时,面试官最关心的是你能不能识别好坏。比如问"一个水池有两个进水管,A管每小时进10吨,B管每小时进15吨,同时开启多久能注满50吨的水池?"差的推理链可能直接跳到:"总速度25吨/小时,需要2小时。"这种缺少思考过程,模型学不到推理方法。
好的推理链应该是:"首先识别这是工程问题中的合作完成类型。A管速度10吨/小时,B管速度15吨/小时,两管同时工作时速度相加。因此总速度=10+15=25吨/小时。水池容量50吨,所需时间=50÷25=2小时。"好的推理链有几个特征:明确问题类型,列出已知条件,说明推理依据,最后才是计算过程。这样的步骤完整性让模型能够复用这个思考框架。
推理链里的每一步都要有明确的因果关系或逻辑依据,不能出现跳跃或循环论证。在选示例时要特别检查是否有"因为A所以B"这类明确的逻辑连接词,这些是推理链质量的信号。
谈到示例数量时,要讲出背后的权衡。数量选择其实是在几个因素之间找平衡点。首先是上下文窗口的物理限制,每个示例都会占用token,特别是CoT的推理链往往比较长。如果模型的context window是4K tokens,几个详细的示例可能就占掉一半,留给实际问题和生成答案的空间就被压缩了。
其次是指导充分性的需求。太少的示例可能覆盖不了任务的推理多样性。比如只给一个示例,模型可能过拟合到那个特定的推理模式上。假设做客服意图识别,只给一个退款咨询的推理示例,模型遇到售前咨询就可能套用错误的推理框架。
还有一个容易被忽视的点是认知负担。示例太多反而会稀释模型的注意力。研究表明,模型对prompt中靠前和靠后的内容更敏感,中间部分容易被忽略。所以精选5个高质量示例,往往比堆砌10个平庸示例效果更好。实践经验是,先根据任务复杂度确定基准数量,简单任务3个左右,复杂任务5-8个,然后通过实验微调。重点是保证每个示例都有明确的价值,而不是为了凑数。
实际落地的完整流程
面试时如果面试官问到"你会怎么落地这个示例选择过程",这就是在考察你的实操能力了。要先建立一个清晰的思维框架,然后用具体操作来填充。
构建示例池是基础。示例池里的每个样本都需要包含问题、完整推理链和答案三个部分,推理链是人工标注的,质量要求比普通标注高很多。

对于特定任务,一般会准备50-200个高质量示例,覆盖任务的主要变体和难度梯度。这些示例不是一次性准备完的,而是在实际使用中持续积累和筛选的结果。
拿到一个新的输入问题后,会先做语义编码,用预训练模型把问题映射成embedding向量。可以用Sentence-BERT或者OpenAI的embedding API。然后在示例池里做向量检索,召回语义上最相近的top20左右的候选。注意这里先召回一个较大的候选集,而不是直接选最终的几个,这个细节能体现思考深度。
在这20个候选里,不会直接按相似度排序截断,而是做一次多样性重排。因为top20里可能有很多高度相似的示例,都选上的话就冗余了。可以用一个简单的贪心策略,每次选出来一个示例后,下一个要选的示例既要和问题相关,又要和已选示例保持一定差异度。
不同类型的任务,示例选择的侧重点会有差异。对于数学推理任务,要特别关注示例的解题路径覆盖度。比如应用题场景,有些用方程求解,有些用比例关系,有些需要逆向推理,要确保选出的示例覆盖这几种主要解法。因为数学推理对推理步骤的严谨性要求很高,如果模型没见过某种解法的推理链,很容易在类似问题上卡住或跳步骤。
换到常识推理任务,思路就不太一样了。常识推理往往没有标准的推理模板,更多是基于经验的联想。所以选示例时会更看重场景的相关性,而不是推理结构的相似性。如果问题是"下雨天为什么要打伞",要选那些涉及雨天情境的推理示例,而不是其他因果推理的例子,即使后者的推理链结构很相似。
对于代码生成任务,又是另一套逻辑。会重点看函数签名和算法模式的匹配度。如果目标是写一个排序函数,选的示例也应该包含类似的数组操作和比较逻辑,而不是字符串处理的代码,即使它们都是Python函数。另外代码示例的推理链,要求包含实现思路的注释,比如"首先遍历数组找最小值,然后交换到首位"这种,而不仅仅是代码本身。
示例效果评估要从两个层面来看,离线评估和在线反馈。离线评估阶段,会准备一个验证集,用不同的示例组合跑实验,对比最终任务的准确率。不只是比较整体准确率,还要看细分场景的表现。比如同样是数学题,简单题、中等题、难题的准确率可能对示例的敏感度不一样。还要做消融实验,看单个示例的边际贡献。具体做法是固定其他示例,替换掉其中一个,看性能变化,这样能识别出哪些示例是真正有效的,哪些是凑数的。
在线反馈更接近实战。在实际系统中,会记录每次请求使用了哪些示例,以及最终输出的质量评分。质量评分可能来自用户反馈,也可能是通过自动化检查,比如代码能否运行、答案是否符合格式约束等。积累一段时间后,可以分析哪些示例组合的成功率更高,逐步淘汰那些拖累整体表现的低质量示例。
还有一个评估角度是看模型生成的推理链和示例推理链的一致性。如果模型总是忽略示例中的某些推理步骤,说明这个示例可能太复杂了,或者跟当前问题的匹配度不够。可以通过文本相似度或者关键步骤的抽取来量化这种一致性。
在实际操作中,有几个误区特别容易踩。过度追求相似度是第一个坑,刚开始可能觉得示例和问题越像越好,结果发现太相似反而限制了模型的泛化能力。比如做文本分类,如果示例和测试问题在用词、句式上都高度相似,模型可能学到的是表面的模式匹配,而不是深层的推理逻辑。遇到表达方式稍有变化的问题就失效了。后来会刻意选一些表达形式不同但推理结构类似的示例,这样模型学到的是更本质的推理能力。
忽视示例的顺序是第二个坑。示例在prompt中的排列顺序,对模型的影响比想象中大。研究发现模型对最后一个示例的权重往往更高,容易过度模仿最后那个例子的风格和推理模式。实践中会测试不同的排列顺序,或者根据问题的难度把示例从简单到复杂排列,有时这样的渐进式引导效果更好。
示例池长期不更新是第三个坑。一开始准备的示例池用久了会发现效果下降,因为实际问题的分布在变化。要定期审查示例池,把那些从未被选中或者效果持续不好的示例剔除,同时补充新出现的问题类型的示例。这个更新周期可能是每个月或每季度,取决于任务的变化速度。
可以用一个实际案例来说明示例选择的价值。之前做过一个问答系统的优化,就是通过改进示例选择带来明显提升的。最开始用的是随机选择策略,从200个示例里随机抽5个。这个方法简单但不稳定,同一个问题多跑几次,准确率能从65%波动到78%,完全看运气选到的示例好不好。
后来换成相似度检索加多样性重排,确保选出的示例既相关又不冗余。同时调整了示例池,把那些推理链质量不高的示例替换掉,补充了一些覆盖边界情况的高质量样本。优化后准确率稳定在82%左右,波动范围缩小到正负2个百分点。更重要的是,那些之前经常出错的长推理链问题,正确率从40%提升到了70%。
分析badcase时发现,之前随机策略经常选到推理深度不匹配的示例,比如问题需要三步推理,结果给的示例都是一步直达的简单推理,模型就学不到完整的思考过程。用检索策略后这种不匹配显著减少了。
自动化与前沿探索
面试中回答完前面的内容后,面试官通常会通过追问来考察你的知识深度和思维延展性。如果你前面回答得不错,面试官很可能会问"有没有办法让示例选择过程自动化"。这时候别急着说"可以用Auto-CoT"这种结论式的回答,那样太干。可以先铺垫一下思路:手工选择示例确实成本高,特别是当任务类型多了以后,维护示例池会变成很重的负担。自动化的核心思路是让系统从两个层面学习:一是学会判断什么样的示例是好的,二是学会根据具体问题动态组合示例。
最近比较有代表性的工作是Auto-CoT,它的思路是先对问题做聚类,然后让模型给每个簇自动生成推理链,这样就不需要人工标注了。这种方法的优势是可扩展性强,缺点是自动生成的推理链质量不稳定,可能会有逻辑错误或者跳步骤的情况。所以实际应用时可能还需要加一个质量过滤的环节,比如用另一个模型检查推理链的合理性,或者通过验证集的效果反馈来筛选。
如果面试官对模型大小和示例选择的关系感兴趣,这个问题背后其实在考察你对Few-shot学习本质的理解。模型规模确实会影响示例选择的策略。大模型的上下文理解能力更强,对示例的容错性更好,即使示例不是那么完美匹配,它也能抽取出有用的模式。小模型就比较敏感,示例选得不好很容易被误导。比如用GPT-4这种大模型,可能随机选几个还算靠谱的示例都能得到不错的结果,但换成几十亿参数的小模型,就必须非常精心地选择和问题高度相关的示例,否则效果会差很多。
如果让我在实际系统中落地示例选择的优化,会把它当成一个持续迭代的过程。初期可能先用人工标注少量高质量示例,配合相似度检索的方式快速上线。然后在运行过程中收集用户反馈和模型表现数据,识别出哪些类型的问题效果不好。针对这些问题,要么补充对应的高质量示例,要么调整检索策略的参数。等积累了足够多的数据后,可以尝试训练一个小的示例质量评分模型,用它来辅助筛选和排序。
对于前沿研究的跟踪,最近看到一些有意思的研究方向。比如有人在探索用强化学习来优化示例选择,把模型最终的任务表现作为奖励信号,让选择器学会挑选最有利于推理的示例组合。还有人在研究示例的压缩表示,试图在不丢失关键推理信息的前提下,减少示例占用的token数,这样可以在有限的context window里放入更多有效信息。
其实示例选择这个问题,本质上反映的是如何让模型更好地理解任务意图。往更深层次想,未来可能不需要显式地选择示例,而是让模型在预训练或微调阶段就内化了各种推理模式,到了推理时只需要很少的示例甚至零样本就能完成复杂推理。这可能是Chain-of-Thought未来的一个演进方向。
Few-shot CoT在示例选择上,和普通Few-shot learning最大的不同,就是我们不仅要选对问题,还要选对推理过程。普通Few-shot可能更关注输入输出的模式匹配,比如情感分类任务,给几个"文本→情感标签"的例子就行。但CoT要求示例里必须包含可以被模型学习的思维链条。这意味着示例构造的成本更高,但带来的收益也更明显,特别是在需要复杂推理的任务上。在一些benchmark上,精心选择的Few-shot CoT示例,能让模型在数学推理、逻辑问答这类任务上的准确率提升20-30个百分点,而随机选择的示例提升就很有限,甚至可能负优化。