纲要静态示例与动态示例静态示例示例固定在模板中无法随任务或上下文长度调整动态示例根据任务需求和上下文窗口动态选择最合适的示例子集示例选择器核心概念LengthBasedExampleSelector基于长度动态选择示例控制最终提示词的总长度工作原理根据max_length和已占用的提示词长度自动截取示例列表关键组件examples示例列表输入-输出对example_prompt示例格式化模板FewShotPromptTemplate组合前缀、示例和后缀的完整提示词模板示例Python 脚本展示长短输入下示例数量的自适应变化引言在上一篇关于 Few Shot 提示词工程的文章中我们介绍了如何通过静态示例让模型学会自定义规则。然而在实际应用中大模型的上下文窗口是有限且宝贵的资源。如果示例过多或输入过长就可能超出窗口限制甚至引入与当前任务无关的噪声。LangChain 提供了示例选择器Example Selector来解决这一问题其中LengthBasedExampleSelector是最简单直接的一种它根据最终提示词的长度动态决定使用哪些示例以及使用多少示例确保提示词始终控制在合理长度内。静态示例 vs 动态示例在传统 Few Shot 中示例是“写死”在模板里的无论输入什么任务所有示例都会被完整地拼接到提示词中。这种方式存在两个问题浪费上下文窗口大量示例可能占用过多 token挤压实际任务的空间。引入无关信息示例组中包含与当前任务不相关的例子反而干扰模型输出。动态示例选择器则允许我们准备一个大而全的示例池在运行时根据输入长度和上下文窗口只挑选合适的示例子集注入提示词。特性静态示例动态示例示例调整不可变根据输入长度动态截取上下文利用可能浪费或溢出精确控制在窗口内实现复杂度低中使用示例选择器适用场景示例少且固定示例多、输入长度变化大根据长度动态选择示例的工作原理LengthBasedExampleSelector的核心逻辑是在格式化提示词时先计算前缀系统指令和后缀用户问题的长度然后用剩余的max_length空间从示例列表中从头开始依次添加示例直到下一个示例会导致总长度超出限制为止。这样较长的输入会自动压缩示例数量避免超出上下文窗口。其处理流程可用下图表示是否准备完整示例列表计算前缀与后缀长度剩余长度 max_length - 前缀长度 - 后缀长度从示例列表头部开始逐个添加添加后总长度 max_length?保留该示例跳过该示例及后续所有示例继续下一示例输出最终选择的示例子集由于示例是按顺序添加的因此将最重要、最通用的示例放在列表前面是一个最佳实践可以保证它们在大部分情况下都会被选中。示例代码以下代码基于 LangChain 实现了一个反义词示例的LengthBasedExampleSelector并演示了输入较短和较长时最终提示词中示例数量的动态变化。首先安装依赖pipinstalllangchain langchain-core完整代码fromlangchain_core.promptsimportPromptTemplate,FewShotPromptTemplatefromlangchain_core.example_selectorsimportLengthBasedExampleSelector# 1. 准备反义词示例池examples[{input:happy,output:sad},{input:高兴,output:悲伤},{input:sunny,output:gloomy},{input:up,output:down},{input:大,output:小},]# 2. 定义示例格式化模板example_promptPromptTemplate(input_variables[input,output],template原词: {input}\n反义词: {output})# 3. 创建长度选择器# max_length 控制整个提示词的最大字符数用于演示设得较小example_selectorLengthBasedExampleSelector(examplesexamples,example_promptexample_prompt,max_length100,# 限制最终提示词不超过100个字符)# 4. 构建动态 Few Shot 提示词模板dynamic_promptFewShotPromptTemplate(example_selectorexample_selector,example_promptexample_prompt,prefix给出每个输入词的反义词,suffix原词: {input}\n反义词:,input_variables[input],)# 5. 测试输入较短时可以容纳更多示例short_inputhotprint( 短输入hot)print(dynamic_prompt.format(inputshort_input))print()# 6. 测试输入非常长时示例会被自动压缩long_input非常*30# 构造一个很长的输入print( 长输入非常*30)print(dynamic_prompt.format(inputlong_input))运行后会观察到短输入时最终提示词中包含了多个示例如 happy、高兴、sunny 等而长输入时由于用户问题本身就占用了大量长度示例会被压缩到只剩一两个甚至完全没有确保总长度不超过max_length。使用建议与注意事项示例排序很重要选择器从前往后挑选示例因此将典型、通用的示例排在前面能保证在截断时优先保留高质量示例。合理设置max_length该值应略小于模型的实际上下文窗口长度以字符或 token 计为回答预留一定空间。若使用 token 分词器可以自定义get_text_length函数以 token 数计算长度。配合其他选择器当仅按长度选择不够智能时LangChain 还提供了SemanticSimilarityExampleSelector等基于语义相似度的选择器可以实现“选择与输入最相关的示例”后续文章将详细介绍。总结动态示例选择器是 Few Shot 提示工程走向实用化的关键一环。LengthBasedExampleSelector以其简单高效的机制保证了提示词长度始终处于可控范围内非常适合输入长度波动较大或示例池丰富的场景。结合良好的示例排序策略可以在不增加额外计算开销的前提下显著提升大模型应用的稳定性和响应质量。