LangChain 示例选择器(Example selectors)完整基础概念解读

我挖掘了一个巨牛的 人工智能 学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

前言:核心背景:为什么需要示例选择器

  1. 少样本提示的矛盾点 给模型提供越多示例,任务规则、输出格式越清晰,模型效果越好; 但示例全部塞进提示词会带来三大问题:
  • Token 变多,调用成本上升、响应延迟更高;
  • 超出模型上下文窗口,直接报错截断;
  • 过量无关示例会干扰模型判断,反而降低准确率。
  1. 业务场景痛点 当你的示例库规模很大(几十、上百条),不可能一次性全部放入提示词。 此时不能固定写死少量 examples=[...],需要一套动态筛选机制:针对用户当下输入,自动挑最合适的一小批示例送入提示词。

  2. 示例选择器的定位 专门负责:接收完整示例库 + 用户当前输入,按照指定算法策略,输出一小段最优示例子集,供给少样本模板(FewShotPromptTemplate / FewShotChatMessagePromptTemplate)拼接提示词。

  3. 所以说示例选择器本质只是一个组件!需要搭配着模板使用,示例选择器本质是筛选示例,筛选完还是需要套入模板传给大模型调用。

调用完整流程

示例选择器 (筛选) → 选中的示例 → 套入模板 → 最终提示词 → 传给大模型

1、按长度选择LengthBasedExampleSelector 完整讲解

1.1、核心作用

当你批量放入很多少样本示例时,如果全部塞进提示词,很容易超出模型上下文窗口限制、token 超限报错。 LengthBasedExampleSelector自动从示例列表里挑选若干样本 ,控制拼接后的总文本长度不超过你设定的 max_length,动态删减样本,避免上下文溢出。

它只会配合老式文本模板 FewShotPromptTemplate 使用,不支持对话模板 FewShotChatMessagePromptTemplate

1.2、构造参数逐行拆解

python 复制代码
example_selector = LengthBasedExampleSelector(
    examples=examples,
    example_prompt=example_prompt,
    max_length=25,
    # get_text_length: 自定义长度计算函数
)

参数讲解

1. examples=examples

原始样本列表,就是你存放所有输入输出样例的数组,会被选择器读取。 示例:

python 复制代码
examples = [
    {"input": "happy", "output": "sad"},
    {"input": "tall", "output": "short"},
    {"input": "energetic", "output": "lethargic"},
]

2. example_prompt=example_prompt

单条示例的格式化模板,选择器必须知道一条样本格式化后长什么样,才能计算单条占用长度。 我定义的模板:

python 复制代码
example_prompt = PromptTemplate.from_template("Input: {input}\nOutput: {output}")

每条样本会先套用模板拼接成完整文本,再计算长度。

3. max_length=25 关键阈值

允许所有选中示例拼接后的总最大长度 (按单词 / 字符统计,取决于 get_text_length)。 选择器逻辑:

  1. 从列表从头依次加入样本
  2. 每加入一条,累加当前总长度;
  3. 如果再加下一条会超过 max_length,就停止,不再纳入后续样本;
  4. 最终只保留前面累加后不超限的样本。

举个直观例子,max_length=25

  • 第一条格式化:Input: happy\nOutput: sad → 统计长度 8
  • 累加 = 8,小于 25,保留
  • 第二条:Input: tall\nOutput: short → 长度 7,累加 = 15,保留
  • 第三条:Input: energetic\nOutput: lethargic → 长度 12,累加 15+12=27 >25,舍弃第三条 最终提示词只会包含前两条示例。

注意:是所有示例加起来总长度,不是单条示例上限。

4. get_text_length 长度统计函数(可选,有默认)

默认内置函数:

复制代码
lambda x: len(re.split("\n| ", x))

逻辑:

  1. 把格式化后的示例文本,按换行 \n、空格 切分成单词列表;
  2. 返回列表元素个数,以单词数量作为长度单位。

1.3两种自定义场景

  1. 想按字符数统计长度(替代单词)
python 复制代码
import re
# 按字符串字符长度计算
def count_char(text: str) -> int:
    return len(text)

example_selector = LengthBasedExampleSelector(
    examples=examples,
    example_prompt=example_prompt,
    max_length=100,
    get_text_length=count_char
)

2.想要按 token 数量精准控制(最贴合 LLM) 配合 tiktoken (open AI官方)统计真实 token,精准防止超限:

python 复制代码
import tiktoken
from langchain_core.example_selectors import LengthBasedExampleSelector

# 初始化编码器(根据您的模型选择)
encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")  # 或 "gpt-4"

def token_length(text: str) -> int:
    """计算文本的 token 数量"""
    return len(encoding.encode(text))

example_selector = LengthBasedExampleSelector(
    examples=examples,
    example_prompt=example_prompt,
    max_length=25,  # 最大 token 数
    get_text_length=token_length  # 自定义函数
)

1.4、完整运行流程

  1. FewShotPromptTemplate 格式化提示词时,会调用 example_selector.select_examples({"adjective": "angry"})
  2. 选择器循环遍历 examples,用 example_prompt 渲染单条文本;
  3. 调用 get_text_length 计算单条长度,持续累加;
  4. 一旦累加值触碰 max_length,停止读取剩余样本;
  5. 返回筛选后的小样例列表,交给 FewShotPromptTemplate 拼接进提示词。

1.5、使用限制与注意事项

  1. 只能搭配 FewShotPromptTemplate(文本模板) 对话式 FewShotChatMessagePromptTemplate 不支持任何 example_selector,二者互斥。

  2. 样本遍历顺序固定:从头往后累加 只会保留前面的样本,后面长样本会被丢弃;如果想优先匹配语义相似样本,改用 SemanticSimilarityExampleSelector(相似度选择器)。

  3. 和 examples 参数互斥 FewShotPromptTemplate 里,传了 example_selector 就不能再写 examples=[],二选一。如下面的代码

python 复制代码
# 正确
few_shot_prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    prefix="给出每个输入的反义词:",
    suffix="Input: {adjective}\nOutput: ",
    input_variables=["adjective"],
)
# 错误,不能同时写
# few_shot_prompt = FewShotPromptTemplate(
#    examples=examples,
#    example_selector=example_selector,
# )

1.6、适用场景 & 对比其他选择器

适用 LengthBasedExampleSelector

  • 示例无区分优先级,随便保留前几条即可;
  • 主要需求:防止提示词文本过长、简单控制上下文长度;
  • 不需要语义匹配,所有样本任务逻辑一致。

对比语义相似度选择器 SemanticSimilarityExampleSelector

  1. LengthBasedExampleSelector:按长度截断,顺序优先,无语义;速度快,不需要向量库;
  2. SemanticSimilarityExampleSelector:根据当前用户输入语义,挑选最相似样本;效果更好,但依赖向量数据库、额外向量计算,开销更大。

1.7、优缺点总结

优点

  1. 开箱即用,无需向量库,零额外依赖;
  2. 自动控制提示词长度,解决上下文超限报错;
  3. 支持自定义长度统计规则(字符 / 单词 /token)。

缺点

  1. 只按顺序截取,不关心样本和当前提问的相关性;
  2. 后面高价值长样本会直接被舍弃;
  3. 仅支持老式文本少样本模板,对话模板无法使用。

完整代码调用:

python 复制代码
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
from langchain.prompts.example_selector import LengthBasedExampleSelector
from langchain_openai import ChatOpenAI
import tiktoken

# 1. 准备数据
all_examples = [
    {"word": "happy", "antonym": "sad"},
    {"word": "big", "antonym": "small"},
    {"word": "hot", "antonym": "cold"},
    {"word": "fast", "antonym": "slow"},
    {"word": "bright", "antonym": "dark"},
]

# 2. 定义"单个示例的模板"(最终套用的模板)
example_prompt = PromptTemplate(
    input_variables=["word", "antonym"],
    template="Input: {word}\nOutput: {antonym}\n"
)

# 3. 创建"示例选择器"(只负责筛选)
def token_count(text):
    return len(tiktoken.encoding_for_model("gpt-3.5-turbo").encode(text))

example_selector = LengthBasedExampleSelector(
    examples=all_examples,
    example_prompt=example_prompt,  # 选择器用这个模板来"计算长度"
    max_length=30,                  # 筛选条件:总长度不超过30 tokens
    get_text_length=token_count
)

# 4. 创建"完整模板"(选择器 + 模板的组合)
few_shot_prompt = FewShotPromptTemplate(
    example_selector=example_selector,  # 注入选择器
    example_prompt=example_prompt,      # 注入单示例模板
    prefix="请给出反义词:",            # 前缀
    suffix="Input: {adjective}\nOutput: ",  # 后缀(含变量)
    input_variables=["adjective"],
)

# 5. 格式化(选择器筛选 + 套入模板)
final_prompt = few_shot_prompt.format(adjective="angry")

# 6. 传给大模型
llm = ChatOpenAI(model="gpt-3.5-turbo")
response = llm.invoke(final_prompt)

max_length=25 完整含义

1. 定义

max_length所有被选中示例,格式化拼接后的总长度上限 ,单位由 get_text_length 函数决定(默认是「单词数」)。 25 = 允许纳入提示词的所有示例加起来,最多 25 个单词。

2. 默认长度计算规则(get_text_length 底层逻辑)

复制代码
# 默认函数
lambda x: len(re.split("\n| ", x))

把格式化后的示例文本,默认按换行、空格 切割,统计切出来片段的总数,当作 "单词数量"。

示例单条模板:

复制代码
Input: happy
Output: sad

切割拆分结果:["Input:", "happy", "Output:", "sad"] → 长度 = 4

3. 选择器筛选流程演示(结合反义词样例)

复制代码
examples = [
    {"input": "happy", "output": "sad"},      # 格式化后单词数:4
    {"input": "tall", "output": "short"},    # 4
    {"input": "energetic", "output": "lethargic"}, #4
    {"input": "sunny", "output": "gloomy"},   #4
    {"input": "windy", "output": "calm"},     #4
]
max_length=25
  1. 第一条:累计 4 ≤25,保留
  2. 第二条:累计 8 ≤25,保留
  3. 第三条:累计 12
  4. 第四条:累计 16
  5. 第五条:累计 20 五条全部加起来总单词数 20,小于 25,全部保留

如果每条单词数更大,累加超过 25 就停止读取后面样本: 比如每条占 7 个单词,4 条累加 28 >25,则只保留前 3 条。

4. 关键两点容易误解

  1. ❌ 不是单条示例最多 25 个单词 ✅ 是全部选中示例总和不超过 25
  2. ❌ 不是字符个数 ✅ 默认是按空格 / 换行分割后的单词计数; 如果你想改成按字符、token 统计,可以自定义 get_text_length

5. 举例:切换成按字符统计

复制代码
def count_char(text: str) -> int:
    return len(text)

example_selector = LengthBasedExampleSelector(
    examples=examples,
    example_prompt=example_prompt,
    max_length=100, # 此时代表总字符上限100
    get_text_length=count_char
)

6. 设计目的

限制示例总长度,防止示例太多导致提示词整体过长,超出模型上下文窗口、触发报错。


语义相似性选择示例

3.4.3 按语义相似性选择示例(SemanticSimilarityExampleSelector)知识点整理

3.4.3.1 核心概念

1. 语义相似定义

衡量两段文本内在含义 的贴近程度,而非字面文字重合度,可解决一词多义、字面相近但含义无关的问题。

示例 1:

  • text1 = "我喜欢猫"
  • text2 = "我讨厌狗" 字面文字差异大,但语义都在表达对小动物的喜好态度,语义相似度高。

示例 2:

  • text1 = "苹果很甜"(水果)
  • text2 = "苹果市值创新高"(科技公司) 字面都含 "苹果",但指代完全不同,语义相似度极低。

2. 底层实现原理

  1. 通过嵌入模型(Embedding) 将文本转为高维数字向量;
  2. 计算用户输入向量与所有示例向量的余弦相似度
  3. 筛选出余弦相似度最高的 k 条示例放入提示词。

3. 适用场景

示例库量大,需要动态匹配和用户提问含义最贴合的样例,替代固定示例、按长度截断的简单筛选,大幅提升少样本效果。

3.4.3.2 核心类与内置方法

类路径

langchain_core.example_selectors.semantic_similarity.SemanticSimilarityExampleSelector

1. 静态构造方法 from_examples ()(最常用)

作用:一次性加载示例集,自动完成向量化、存入向量库,生成选择器实例 入参:

  1. examples:示例字典列表,每条示例是 {变量名:文本} 结构
  2. embeddings:嵌入模型实例,用于文本向量化(OpenAIEmbeddings / BGE 本地向量)
  3. vectorstore_cls:向量数据库类,用于存储向量、相似度检索(Chroma/FAISS)
  4. k:每次检索返回语义最接近的示例数量,默认值 4 返回值:语义相似度示例选择器对象

2. add_example(example: dictstr, str)

作用:运行时动态新增单条示例,自动向量化存入向量库 入参:单条示例字典,格式和初始化 examples 保持一致

3. select_examples(input_variables: dictstr, str) → listdict

作用:接收用户输入,执行向量检索,返回筛选后的示例子集 入参:用户输入变量字典,和模板占位符匹配 返回值:匹配到的相似示例列表

3.4.3.3 完整标准代码(官方原版,OpenAI 向量)

前置安装命令

复制代码
# 新版langchain分离包,必须安装
pip install -U langchain-chroma chromadb langchain-openai
python 复制代码
from langchain_chroma import Chroma
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_openai import OpenAIEmbeddings

# 1. 反义词示例数据集
examples = [
    {"input": "happy", "output": "sad"},
    {"input": "tall", "output": "short"},
    {"input": "energetic", "output": "lethargic"},
    {"input": "sunny", "output": "gloomy"},
    {"input": "windy", "output": "calm"},
]

# 2. 单条示例格式化模板
example_prompt = PromptTemplate(
    input_variables=["input", "output"],
    template="Input: {input}\nOutput: {output}",
)

# 3. 构建语义相似选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(
    examples,
    OpenAIEmbeddings(),   # 云端OpenAI向量模型
    Chroma,               # 向量存储数据库
    k=1,                  # 每次只选1条最相似示例
)

# 4. 组装完整少样本文本模板
similar_prompt = FewShotPromptTemplate(
    example_selector=example_selector,  # 使用选择器替代固定examples列表
    example_prompt=example_prompt,
    prefix="给出每个输入的反义词",
    suffix="Input: {adjective}\nOutput:",
    input_variables=["adjective"],
)

# 5. 执行格式化,打印完整提示词文本
res_text = similar_prompt.invoke({"adjective": "worried"}).to_messages()[0].content
print(res_text)

运行输出

复制代码
给出每个输入的反义词:
Input: happy
Output: sad
Input: worried
Output:

结果说明

用户输入worried(焦虑的)属于情绪类词汇,向量计算后和happy(开心)语义最贴近,因此自动筛选出这条情绪相关示例。

3.4.4 按最大边际相关性选择示例(MMR)知识点整理

3.4.4.1 核心概念

1. MMR 定义

最大边际相关性(Max Marginal Relevance)是一种重排序算法,以语义相似度为基础,从候选示例集中选出一组示例,同时满足两点:

  1. 单个示例和用户查询语义高度相关;
  2. 选中的示例彼此差异大、无冗余,兼顾多样性。

2. MMR 与普通语义相似度的通俗对比

  • 纯语义相似度:只单独打分,只看单个示例和用户输入匹配度。如同面试官单独评估每位求职者,只看个人匹配分数,容易选出一堆技能完全一样的候选人。
  • MMR 最大边际相关性 :兼顾匹配度 + 样本多样性,类似组建团队。
    1. 第一轮先选和输入最匹配的示例;
    2. 后续每一轮挑选时,会惩罚和已选中示例高度雷同的候选;
    3. 最终选出 k 个相关但覆盖不同维度、信息不重复的示例。

3. 适用场景

  1. 语义相似度选择器适用场景:基础搜索、单一精准匹配、只追求最高相关、不在乎示例重复。
  2. MMR 专属适用场景:
    • 推荐系统:避免信息茧房,推荐同类但不同维度内容;
    • 文本摘要:挑选多维度关键句子,摘要不重复;
    • RAG 检索增强生成:检索后去重,多维度素材减少模型幻觉;
    • 少样本提示工程:示例库大量同类样例,需要多样参考案例。

4. 底层算法逻辑

  1. 全部示例通过 Embedding 转为向量,计算与用户输入的余弦相似度;
  2. 贪心迭代选取:
    • 首次:选取相似度最高的示例加入结果集;
    • 后续:对每个候选,计算综合得分 = 相关性 − 与已选样本最大相似度(雷同样本扣分);
    • 循环选出 k 个示例,保证整体相关且多元;
  3. 可调参数 lambda_mult:平衡相关性和多样性,越接近 1 越看重相似度,越接近 0 越看重多样性。

3.4.4.2 类与内置核心方法

类完整路径

langchain_core.example_selectors.MaxMarginalRelevanceExampleSelector

1. 静态构造方法 from_examples ()(实例化选择器)

入参:

  1. examples:示例字典列表;
  2. embeddings:嵌入模型实例(OpenAIEmbeddings/BGE 本地向量);
  3. vectorstore_cls:向量数据库类(Chroma/FAISS);
  4. k:最终需要选出的示例数量,默认 4;
  5. fetch_k:先检索多少条候选再做 MMR 重排,必须大于 k;
  6. lambda_mult:相关性与多样性平衡系数,0~1 之间。 返回:MMR 示例选择器实例。

2. add_example(example: dictstr, str)

运行时动态新增单条示例,自动向量化存入向量库。

3. select_examples(input_variables: dictstr, str) → listdict

接收用户输入变量,执行 MMR 检索重排,返回筛选完毕、多样不重复的示例子集。

3.4.4.3 完整标准代码(OpenAI 向量)

前置安装

复制代码
pip install -U langchain-chroma chromadb langchain-openai
python 复制代码
from langchain_chroma import Chroma
from langchain_core.example_selectors import MaxMarginalRelevanceExampleSelector
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_openai import OpenAIEmbeddings

# 反义词示例集合
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"],
    template="Input: {input}\nOutput: {output}",
)

# MMR语义选择器,k=2选出2条相关且多样示例
example_selector = MaxMarginalRelevanceExampleSelector.from_examples(
    examples,
    OpenAIEmbeddings(),
    Chroma,
    k=2,
)

# 组装完整少样本文本模板
similar_prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    prefix="给出每个输入的反义词",
    suffix="Input: {adjective}\nOutput:",
    input_variables=["adjective"],
)

# 打印完整提示词文本
res = similar_prompt.invoke({"adjective": "worried"}).to_messages()[0].content
print(res)

运行输出

plaintext

复制代码
给出每个输入的反义词
Input: happy
Output: sad
Input: windy
Output: calm
Input: worried
Output:

结果说明

输入worried(焦虑)属于情绪类词汇:

  1. 第一条匹配最高相关示例 happy-sad(情绪维度);
  2. MMR 会规避第二个情绪类示例energetic-lethargic,转而挑选天气维度不重复的windy-calm
  3. 最终两条示例覆盖不同语义维度,避免全部是情绪类冗余案例。

基于 N-Gram 重叠选择示例(NGramOverlapExampleSelector)知识点整理

3.4.5.1 核心概念

1. N-Gram 定义

N-Gram 指一段文本里连续 n 个单词 / 字符组成的片段,用于衡量文本字面重合度。

2. 传统 N-Gram 重叠(字面匹配)

通过统计两段文本完全相同的连续字词片段数量 计算相似度,仅比对文字本身,无法识别同义词、近义词

示例 1(重叠度高)

text1 = "苹果手机很好用" text2 = "这款手机很好用" 分词后共享连续片段「手机、很好用」,N-Gram 重叠分数高。

示例 2(语义相近、重叠度 0)

text1 = "苹果手机很好用" text2 = "iPhone 非常不错" 文字无任何相同片段,传统 N-Gram 重叠为 0,但实际表达同一含义。

3. 语义 N-Gram 重叠(拓展概念)

不再比对原始文字,而是将单词转为 Embedding 向量,通过向量相似度判断片段是否 "语义重叠",可以识别同义词改写文本,多用于查重、抄袭检测。

4. 传统 N-Gram 选择器优缺点

✅ 优势:无需 Embedding、无需向量数据库、依赖轻量、计算速度快,只需要 nltk 分词库; ❌ 劣势:仅字面匹配,不能理解深层语义,同义词、同义句无法匹配。

5. 适用场景

  1. 短关键词、指令、固定句式匹配;
  2. 低成本轻量检索,不想部署向量模型 / 向量库;
  3. 过滤完全无相同字词、字面完全无关的示例;
  4. 简单文本查重、固定模板匹配。

3.4.5.2 类、参数与内置方法

类路径

langchain_community.example_selectors.ngram_overlap.NGramOverlapExampleSelector

构造入参说明

  1. examples:示例字典列表,{"input":文本,"output":结果}格式;
  2. example_prompt:格式化单条示例的 PromptTemplate;
  3. threshold:重叠分数字段过滤阈值(分数区间 0~1),默认-1.0
    • threshold < 0:不剔除任何示例,仅按重叠分数降序排序;
    • threshold = 0.0:排序后剔除无任何字面重叠的示例;
    • threshold ≥ 1.0:所有示例分数≤1,直接全部剔除,返回空列表。

内置核心方法

  1. add_example(example: dict[str, str]) 动态新增单条示例,自动参与后续 N-Gram 分数计算。
  2. select_examples(input_variables: dict[str, str]) -> list[dict] 接收用户输入,计算全部示例 N-Gram 重叠分数,按规则过滤、降序排序,返回筛选后的示例列表。

运行前置依赖

复制代码
# 分词依赖
pip install nltk
# 社区组件依赖
pip install langchain-community

3.4.5.3 完整标准可运行代码

python 复制代码
from langchain_community.example_selectors import NGramOverlapExampleSelector
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate

# 翻译任务示例集
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"],
    template="Input: {input}\nOutput: {output}",
)

# 1. threshold=-1.0:全部保留,仅按重叠分数排序
example_selector = NGramOverlapExampleSelector(
    examples=examples,
    example_prompt=example_prompt,
    threshold=-1.0,
)

# 组装完整少样本文本模板
dynamic_prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    prefix="给出每个输入的中文翻译",
    suffix="Input: {sentence}\nOutput:",
    input_variables=["sentence"],
)

# 用户输入
res = dynamic_prompt.invoke({"sentence": "Spot can run fast."}).to_messages()[0].content
print(res)

输出结果(threshold=-1.0)

plaintext

复制代码
给出每个输入的中文翻译
Input: Spot can run.
Output: Spot可以跑。
Input: See Spot run.
Output: 看见Spot跑。
Input: My dog barks.
Output: 我的狗叫。
Input: Spot can run fast.
Output:

排序逻辑:Spot can run.字面重叠最多排第一,See Spot run.次之,完全无关的My dog barks.排在最后。

不同 threshold 效果对比

  1. threshold=0.0 剔除无任何相同字词的My dog barks.,仅保留前两条重叠示例:

    给出每个输入的中文翻译
    Input: Spot can run.
    Output: Spot可以跑。
    Input: See Spot run.
    Output: 看见Spot跑。
    Input: Spot can run fast.
    Output:

  2. threshold=1.0 所有示例分数小于 1,全部过滤,无参考示例:

    给出每个输入的中文翻译
    Input: Spot can run fast.
    Output:

3.4.6 四种示例选择器完整对比总结

选择器 核心匹配逻辑 依赖组件 优势 短板 适用场景
LengthBasedExampleSelector 文本总长度截断 无额外依赖 零开销、轻量 不看语义、易保留无关示例 示例语义统一,仅控制提示词长度
SemanticSimilarityExampleSelector 向量余弦相似度 Embedding + 向量库 理解深层语义,匹配同义句 需要向量模型、数据库,开销大 需要精准语义匹配、多语义示例库
MaxMarginalRelevanceExampleSelector(MMR) 相似度 + 样本多样性 Embedding + 向量库 匹配相关且示例不重复 计算开销最高 RAG 检索、多维度参考、避免信息冗余
NGramOverlapExampleSelector 字面 N-Gram 片段重叠 nltk 分词库 无需向量、速度极快 仅匹配字面,不识别同义词 短指令、关键词、固定句式轻量匹配

四类选择器对话能力总区分

  1. SemanticSimilarity / MMR(完整支持对话特性) 自动拆分 human/ai,仅提取用户提问做向量检索,匹配同类用户问题,贴合问答逻辑。
  2. LengthBased / NGramOverlap(仅语法兼容,不支持对话专属特性)
    • Length:全部对话文本拼接统计长度,无角色区分、无语义匹配;
    • NGram:全部对话文本拼接计算字面重叠,无角色区分; 二者都只是单纯对完整对话字符串做处理,完全无视一问一答的对话结构。
相关推荐
Darling噜啦啦1 小时前
JWT 登录鉴权全链路:从 Zustand 状态管理到 Axios 拦截器,彻底搞懂前端鉴权工程
前端
Csvn1 小时前
😱 React `<StrictMode>`:为什么 useEffect 被调用了两次?别慌,这是特性不是 bug
前端
袁小皮皮不皮1 小时前
数通完整讲义-上册-HCIA篇
服务器·网络·网络协议·tcp/ip·智能路由器
luj_17681 小时前
变频技术核心原理揭秘
服务器·c语言·开发语言·经验分享·算法
Asize1 小时前
2 道大厂面试题:TS 工具类型我懂了,CSS 3 列布局把我问住了
前端·css·typescript
胡萝卜术1 小时前
从"氛围编程"到规范驱动:两次创造如何让 AI 协作从碰运气变成工程流水线
前端·面试·github
_Narcissus_1 小时前
B树概念及操作笔记(含完整代码实现)
c语言·数据结构·数据库·c++·笔记·b树·算法
Imchendiana1 小时前
《狂人日记NO.11》— 给 AI 装一本"项目说明书":我把"自己"蒸馏成了一个编码知识库Skill
前端·ai编程
l1258651 小时前
# RAG多轮对话检索设计:Query重写如何让“那它呢“变成完整问题
前端·数据库·人工智能·python·算法·fastapi·milvus