一、少样本提示基础1.1 什么是少样本提示少样本提示是指在给大模型的输入中除任务描述外还提供少量通常 2~10 个输入-输出示例。模型利用其“上下文学习”能力从示例中推断出输入与输出之间的映射规律然后将该规律应用到最终查询上。任务将英文翻译成西班牙语示例1 输入See Spot run. 输出Ver correr a Spot.示例2 输入My dog barks. 输出Mi perro ladra.最终查询 输入Spot can run. 输出模型在看到两个示例后会学会翻译模式并输出Spot puede correr.1.2 为什么要使用示例选择器当示例库变大比如 50 个以上时将全部示例放入提示会有三大问题问题说明成本飙升每个示例消耗 token增加 API 费用延迟增加更长的输入导致模型处理时间变长性能下降不相关的示例可能干扰模型产生“思维噪音”示例选择器的核心价值针对每个新的输入动态选择最相关的少数示例通常 3~5 个在保持效果的同时控制成本。1.3 示例选择器在 LangChain 中的位置所有示例选择器都继承自BaseExampleSelector需要实现select_examples(input_variables)方法。它们可以注入到FewShotPromptTemplate或FewShotChatMessagePromptTemplate中替代固定的examples列表。from langchain_core.prompts import FewShotPromptTemplate # 静态示例 prompt FewShotPromptTemplate(examplesmy_examples, ...) # 动态选择器 prompt FewShotPromptTemplate(example_selectormy_selector, ...)二、四种示例选择器详解2.1 按长度选择示例LengthBasedExampleSelector原理它根据示例内容的长度以 token 数计算进行筛选优先选择较短的示例直到总长度接近设定的最大长度限制。它不关心内容相关性只关心 token 预算。适用场景你需要严格控制提示的 token 总数比如模型上下文窗口很小或成本敏感。示例之间的质量相近长度成为主要限制因素。初始化参数参数类型说明examplesList[dict]示例列表example_promptPromptTemplate用于格式化单个示例的模板max_lengthint所有示例格式化后的最大总 token 数超过该长度将剪切示例get_text_lengthCallable可选自定义计算长度的函数默认使用 LangChain 的 token 计数器代码示例# 四种示例选择器 from langchain_core.example_selectors import LengthBasedExampleSelector from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate # 1、按长度选择示例length # 反义词示例集合 examples [ {input:happy,output:sad}, {input:tall,output:short}, {input:sunny,output:gloomy}, {input:windy,output:calm} ] # 字符串模板 example_prompt PromptTemplate( input_variables[input,output], templateInput:{input}\nOutput:{output}, ) # 长度示例选择器 example_selector LengthBasedExampleSelector( examplesexamples, example_promptexample_prompt, # 格式化示例的最大长度 # 长度由下面的get_length函数测量 max_length25, ) # 用于实例化示例的模板 dynamic_prompt FewShotPromptTemplate( # 提供了一个ExampleSelector而不是examples example_selectorexample_selector, example_promptexample_prompt, prefix给出每个输入的反义词, suffixInput:{adjective}\nOutput:, input_variables[adjective], ) print( dynamic_prompt.invoke({adjective:big}).to_messages()[0].content )代码会按顺序添加示例直到总长度超过max_length。优缺点优点缺点保证 token 预算不超限完全不考虑内容相关性计算极快无外部依赖可能选出与任务无关的短示例2.2 按语义相似性选择示例SemanticSimilarityExampleSelector原理将每个示例的输入或整个示例通过嵌入模型转换为向量存入向量数据库。对于新查询也将其转换为向量然后通过余弦相似度等度量找出最相似的k个示例。适用场景任务对语义相关性的要求高如问答、主题分类、情感分析。示例库内容多样需要根据输入意图匹配最合适的例子。内置方法from_examples()根据示例集生成语义相似示例选择器输入· examples示例列表· embeddings初始化的嵌入API接口如 OpenAIEmbeddungs()· vectorstore_cls向量存储数据库接口类· k最终要选择的示例的数量。默认值为4输出语义相似性示例选择器add_example(example: dict[str,str])将新示例添加到列表中。输入一个字典其中键作为输入变量值作为其值。select_examples(input_variables: dict[str,str]) → list[dict]根据输入选择要使用的示例。输入一个字典其中键作为输入变量值作为其值输出要包含在提示中的示例列表代码示例给一个示例集输入和输出互为反义词定义 PromptTemplate 字符串模板包含输入和输出两个“占位符”定义 SemanticSimilarityExampleSelector 语义相似示例选择器设置初始值示例集与嵌入API接口定义一个 FewShotPromptTemplate 模板对象用于实例化示例将示例转化为聊天信息打印消息结果注意运行前先安装 langchain-chroma 库 pip install -U langchain-chroma# 按语义相似性选择示例 import os from langchain_chroma import Chroma from langchain_core.example_selectors import SemanticSimilarityExampleSelector from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate from langchain_community.embeddings import DashScopeEmbeddings # 反义词示例集合 examples [ {input:happy,output:sad}, {input:tall,output:short}, {input:energetic,output:lethargic}, {input:sunny,output:gloomy}, {input:windy,output:calm}, ] # 字符串模板 example_prompt PromptTemplate( input_variables[input,output], templateInput: {input}\nOutput: {output}\n, ) # 阿里通义 Embedding使用 DashScope Embeddings embeddings DashScopeEmbeddings( modeltext-embedding-v3, dashscope_api_keyos.getenv(DASHSCOPE_API_KEY) ) # 语义相似示例选择器 example_selector SemanticSimilarityExampleSelector.from_examples( examples, # 嵌入类用于生成用于度量语义相似度的嵌入 embeddings, # VectorStore类用于存储嵌入并对其进行相似性搜索 Chroma, # 生成示例的数量 k1, ) # 用于实例化示例的模板 similar_prompt FewShotPromptTemplate( # 提供了一个ExampleSelector而不是examples example_selectorexample_selector, example_promptexample_prompt, prefix给出每个输入的反义词, suffixInput:{adjective}\nOutput:, input_variables[adjective], ) print( similar_prompt.invoke({adjective:cold}).to_messages()[0].content )输入的内容和最后选择的示例语义最相似。优缺点优点缺点语义理解能力强能匹配同义词需要嵌入模型和向量库有额外成本效果好最常用对精确术语如代码关键字可能不如 N-gram 敏感2.3 按最大边际相关性选择示例MaxMarginalRelevanceExampleSelector原理MMRMaximum Marginal Relevance在保证示例与查询相关的同时也注重示例之间的多样性避免选出的示例过于同质化。核心公式为MMRargmaxDi∈R∖S[λ⋅sim(Di,Q)−(1−λ)⋅maxDj∈Ssim(Di,Dj)]MMRargDi∈R∖Smax[λ⋅sim(Di,Q)−(1−λ)⋅Dj∈Smaxsim(Di,Dj)]QQ查询RR候选集SS已选集λλ平衡参数lambda_mult越大越重视相关性越小越重视多样性适用场景示例库中存在大量重复或高度相似的示例。你希望有限的k个示例能覆盖不同“子主题”提供更全面的参考。初始化参数参数类型说明examplesList[dict]示例列表embeddingsEmbeddings嵌入模型vectorstoreVectorStore向量库kint最终选择数量默认值为4fetch_kint先检索多少个候选默认 20再从中 MMR 筛选lambda_multfloat公式中的 λ范围 0~1默认 0.5如何使用MMR示例选择器给一个示例集输入和输出互为反义词。定义 PromptTemplate 字符串模板包含输入和输出两个“占位符”。定义 MaxMarginalRelevannceExampleSelector MMR 示例选择器设置初始示例集与嵌入API接口。定义一个 FewShotPromptTemplate 模板对象用于实例化示例将示例转化为聊天信息。打印消息结果。代码示例# 按最大边性相关性选择示例 import os from langchain_chroma import Chroma from langchain_community.embeddings import DashScopeEmbeddings from langchain_core.example_selectors import MaxMarginalRelevanceExampleSelector from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate from langchain_openai import OpenAIEmbeddings # 反义词示例集合 examples [ {input:happy,output:sad}, {input:good,output:bad}, {input:bright,output:dark}, {input:positive,output:negative}, {input:up,output:down}, ] # 字符串模板 example_prompt PromptTemplate( input_variables[input,output], templateInput: {input}\nOutput:{output}, ) # 阿里通义 Embedding embeddings DashScopeEmbeddings( modeltext-embedding-v3, dashscope_api_keyos.getenv(DASHSCOPE_API_KEY), ) # MMR示例选择器 example_selector MaxMarginalRelevanceExampleSelector.from_examples( examples, # OpenAIEmbeddings(), embeddings, Chroma, k2, ) # 用于实例化示例的模板 similar_prompt FewShotPromptTemplate( # 提供了一个ExampleSelector而不是examples example_selectorexample_selector, example_promptexample_prompt, prefix给出每个输出的反义词, suffixInput:{adjective}\nOutput:, input_variables[adjective], ) print( similar_prompt.invoke({adjective:sad}).to_messages()[0].content )优缺点优点缺点减少冗余提高示例信息量计算开销比纯相似度稍高在有限 token 内覆盖更多方面调参λ需要实验2.4 按 N-gram 重叠选择示例NGramOverlapExampleSelector原理基于词汇级别的 N-gram 重叠度进行选择。它计算查询与每个示例输入之间的 N-gram 重叠分数使用 NLTK 的sentence_bleu变体分数越高表示共享的连续词片段越多。可以设置阈值threshold来过滤低重叠示例。适用场景任务对精确术语极其敏感如代码生成printvsprintf不可混淆、翻译、拼写纠正、实体识别。无法依赖语义相似度因为同义词会导致错误匹配。初始化参数参数类型说明examplesList[dict]示例列表example_promptPromptTemplate格式化单个示例的模板thresholdfloat最小重叠分数阈值低于此值的示例被排除默认 -1.0不过滤nint使用的 N-gram 大小默认为 2bi-gram如何使用语义相似示例选择器给一个示例集设置相关文本。定义 PromptTemplate 字符串模板包含输入和输出两个“占位符”。定义一个 NGramOverlapExampleSelector 示例1选择器设置初始示例集与阈值-1表示对示例进行排序但不排除任何示例。定义一个 FewShotPromptTemplate 模板对象用于实例化示例将示例转化为聊天消息。打印消息排序结果。运行前先安装 nltk 库pip install nltk。这个是自然语言处理工具包在NLP领域中最常使用的一个Python库。运行前先安装 langchain_community 库pip install -U langchain community代码示例# ngram 重叠选择示例 from langchain_community.example_selectors import NGramOverlapExampleSelector from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate # 翻译示例 examples [ {input:See Spot run.,output:看见Spot跑。}, {input:My dog barks.,output:我的狗叫。}, {input:Spot can run.,output:Spot可以跑。}, ] # 字符串模板 example_prompt PromptTemplate( input_variables[input,output], templateInput: {input}\nOutput:{output}, ) # NGram 示例选择器 example_selector NGramOverlapExampleSelector( examplesexamples, example_promptexample_prompt, threshold-1.0, ) # 用于实例化示例的模板 dynamic_prompt FewShotPromptTemplate( example_selectorexample_selector, example_promptexample_prompt, prefix给出每个输入的中文翻译, suffixInput: {sentence}\nOutput:, input_variables[sentence], ) # 按照重叠分数排序 print( dynamic_prompt.invoke({sentence:Spot can run fast.}).to_messages()[0].content )优缺点优点缺点对词汇精确匹配敏感适合术语驱动任务无法识别同义词可能漏掉语义相关但用词不同的示例无需嵌入模型计算快对词序和标点敏感可能过于严格可通过threshold过滤完全不相关的示例不适合长文本长文本的 N-gram 匹配可能稀疏第三部分四种选择器对比总结选择器核心依据相关性捕捉多样性支持外部依赖典型延迟最佳场景LengthBasedToken 长度无无无极低Token 预算严格控制SemanticSimilarity语义向量强无嵌入模型向量库中等问答、主题分类MaxMarginalRelevance语义向量 多样性惩罚强强嵌入模型向量库较高示例库冗余需覆盖多角度NGramOverlap词汇 N-gram 重叠弱仅精确词无NLTK可选低代码、翻译、拼写纠正