我挖掘了一个巨牛的 人工智能 学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
前言:核心背景:为什么需要示例选择器
- 少样本提示的矛盾点 给模型提供越多示例,任务规则、输出格式越清晰,模型效果越好; 但示例全部塞进提示词会带来三大问题:
- Token 变多,调用成本上升、响应延迟更高;
- 超出模型上下文窗口,直接报错截断;
- 过量无关示例会干扰模型判断,反而降低准确率。
-
业务场景痛点 当你的示例库规模很大(几十、上百条),不可能一次性全部放入提示词。 此时不能固定写死少量
examples=[...],需要一套动态筛选机制:针对用户当下输入,自动挑最合适的一小批示例送入提示词。 -
示例选择器的定位 专门负责:接收完整示例库 + 用户当前输入,按照指定算法策略,输出一小段最优示例子集,供给少样本模板(
FewShotPromptTemplate/FewShotChatMessagePromptTemplate)拼接提示词。 -
所以说示例选择器本质只是一个组件!需要搭配着模板使用,示例选择器本质是筛选示例,筛选完还是需要套入模板传给大模型调用。
调用完整流程
示例选择器 (筛选) → 选中的示例 → 套入模板 → 最终提示词 → 传给大模型

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)。 选择器逻辑:
- 从列表从头依次加入样本;
- 每加入一条,累加当前总长度;
- 如果再加下一条会超过
max_length,就停止,不再纳入后续样本; - 最终只保留前面累加后不超限的样本。
举个直观例子,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))
逻辑:
- 把格式化后的示例文本,按换行
\n、空格切分成单词列表; - 返回列表元素个数,以单词数量作为长度单位。
1.3两种自定义场景
- 想按字符数统计长度(替代单词)
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、完整运行流程
FewShotPromptTemplate格式化提示词时,会调用example_selector.select_examples({"adjective": "angry"});- 选择器循环遍历
examples,用example_prompt渲染单条文本; - 调用
get_text_length计算单条长度,持续累加; - 一旦累加值触碰
max_length,停止读取剩余样本; - 返回筛选后的小样例列表,交给
FewShotPromptTemplate拼接进提示词。
1.5、使用限制与注意事项
-
只能搭配 FewShotPromptTemplate(文本模板) 对话式
FewShotChatMessagePromptTemplate不支持任何 example_selector,二者互斥。 -
样本遍历顺序固定:从头往后累加 只会保留前面的样本,后面长样本会被丢弃;如果想优先匹配语义相似样本,改用
SemanticSimilarityExampleSelector(相似度选择器)。 -
和 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
- LengthBasedExampleSelector:按长度截断,顺序优先,无语义;速度快,不需要向量库;
- SemanticSimilarityExampleSelector:根据当前用户输入语义,挑选最相似样本;效果更好,但依赖向量数据库、额外向量计算,开销更大。
1.7、优缺点总结
优点
- 开箱即用,无需向量库,零额外依赖;
- 自动控制提示词长度,解决上下文超限报错;
- 支持自定义长度统计规则(字符 / 单词 /token)。
缺点
- 只按顺序截取,不关心样本和当前提问的相关性;
- 后面高价值长样本会直接被舍弃;
- 仅支持老式文本少样本模板,对话模板无法使用。
完整代码调用:
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
- 第一条:累计 4 ≤25,保留
- 第二条:累计 8 ≤25,保留
- 第三条:累计 12
- 第四条:累计 16
- 第五条:累计 20 五条全部加起来总单词数 20,小于 25,全部保留。
如果每条单词数更大,累加超过 25 就停止读取后面样本: 比如每条占 7 个单词,4 条累加 28 >25,则只保留前 3 条。
4. 关键两点容易误解
- ❌ 不是单条示例最多 25 个单词 ✅ 是全部选中示例总和不超过 25
- ❌ 不是字符个数 ✅ 默认是按空格 / 换行分割后的单词计数; 如果你想改成按字符、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. 底层实现原理
- 通过嵌入模型(Embedding) 将文本转为高维数字向量;
- 计算用户输入向量与所有示例向量的余弦相似度;
- 筛选出余弦相似度最高的 k 条示例放入提示词。
3. 适用场景
示例库量大,需要动态匹配和用户提问含义最贴合的样例,替代固定示例、按长度截断的简单筛选,大幅提升少样本效果。
3.4.3.2 核心类与内置方法
类路径
langchain_core.example_selectors.semantic_similarity.SemanticSimilarityExampleSelector
1. 静态构造方法 from_examples ()(最常用)
作用:一次性加载示例集,自动完成向量化、存入向量库,生成选择器实例 入参:
examples:示例字典列表,每条示例是{变量名:文本}结构embeddings:嵌入模型实例,用于文本向量化(OpenAIEmbeddings / BGE 本地向量)vectorstore_cls:向量数据库类,用于存储向量、相似度检索(Chroma/FAISS)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)是一种重排序算法,以语义相似度为基础,从候选示例集中选出一组示例,同时满足两点:
- 单个示例和用户查询语义高度相关;
- 选中的示例彼此差异大、无冗余,兼顾多样性。
2. MMR 与普通语义相似度的通俗对比
- 纯语义相似度:只单独打分,只看单个示例和用户输入匹配度。如同面试官单独评估每位求职者,只看个人匹配分数,容易选出一堆技能完全一样的候选人。
- MMR 最大边际相关性 :兼顾匹配度 + 样本多样性,类似组建团队。
- 第一轮先选和输入最匹配的示例;
- 后续每一轮挑选时,会惩罚和已选中示例高度雷同的候选;
- 最终选出 k 个相关但覆盖不同维度、信息不重复的示例。
3. 适用场景
- 语义相似度选择器适用场景:基础搜索、单一精准匹配、只追求最高相关、不在乎示例重复。
- MMR 专属适用场景:
- 推荐系统:避免信息茧房,推荐同类但不同维度内容;
- 文本摘要:挑选多维度关键句子,摘要不重复;
- RAG 检索增强生成:检索后去重,多维度素材减少模型幻觉;
- 少样本提示工程:示例库大量同类样例,需要多样参考案例。
4. 底层算法逻辑
- 全部示例通过 Embedding 转为向量,计算与用户输入的余弦相似度;
- 贪心迭代选取:
- 首次:选取相似度最高的示例加入结果集;
- 后续:对每个候选,计算综合得分 = 相关性 − 与已选样本最大相似度(雷同样本扣分);
- 循环选出 k 个示例,保证整体相关且多元;
- 可调参数
lambda_mult:平衡相关性和多样性,越接近 1 越看重相似度,越接近 0 越看重多样性。
3.4.4.2 类与内置核心方法
类完整路径
langchain_core.example_selectors.MaxMarginalRelevanceExampleSelector
1. 静态构造方法 from_examples ()(实例化选择器)
入参:
examples:示例字典列表;embeddings:嵌入模型实例(OpenAIEmbeddings/BGE 本地向量);vectorstore_cls:向量数据库类(Chroma/FAISS);k:最终需要选出的示例数量,默认 4;fetch_k:先检索多少条候选再做 MMR 重排,必须大于 k;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(焦虑)属于情绪类词汇:
- 第一条匹配最高相关示例
happy-sad(情绪维度); - MMR 会规避第二个情绪类示例
energetic-lethargic,转而挑选天气维度不重复的windy-calm; - 最终两条示例覆盖不同语义维度,避免全部是情绪类冗余案例。
基于 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. 适用场景
- 短关键词、指令、固定句式匹配;
- 低成本轻量检索,不想部署向量模型 / 向量库;
- 过滤完全无相同字词、字面完全无关的示例;
- 简单文本查重、固定模板匹配。
3.4.5.2 类、参数与内置方法
类路径
langchain_community.example_selectors.ngram_overlap.NGramOverlapExampleSelector
构造入参说明
examples:示例字典列表,{"input":文本,"output":结果}格式;example_prompt:格式化单条示例的 PromptTemplate;threshold:重叠分数字段过滤阈值(分数区间 0~1),默认-1.0;threshold < 0:不剔除任何示例,仅按重叠分数降序排序;threshold = 0.0:排序后剔除无任何字面重叠的示例;threshold ≥ 1.0:所有示例分数≤1,直接全部剔除,返回空列表。
内置核心方法
add_example(example: dict[str, str])动态新增单条示例,自动参与后续 N-Gram 分数计算。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 效果对比
-
threshold=0.0剔除无任何相同字词的My dog barks.,仅保留前两条重叠示例:给出每个输入的中文翻译
Input: Spot can run.
Output: Spot可以跑。
Input: See Spot run.
Output: 看见Spot跑。
Input: Spot can run fast.
Output: -
threshold=1.0所有示例分数小于 1,全部过滤,无参考示例:给出每个输入的中文翻译
Input: Spot can run fast.
Output:
3.4.6 四种示例选择器完整对比总结
| 选择器 | 核心匹配逻辑 | 依赖组件 | 优势 | 短板 | 适用场景 |
|---|---|---|---|---|---|
| LengthBasedExampleSelector | 文本总长度截断 | 无额外依赖 | 零开销、轻量 | 不看语义、易保留无关示例 | 示例语义统一,仅控制提示词长度 |
| SemanticSimilarityExampleSelector | 向量余弦相似度 | Embedding + 向量库 | 理解深层语义,匹配同义句 | 需要向量模型、数据库,开销大 | 需要精准语义匹配、多语义示例库 |
| MaxMarginalRelevanceExampleSelector(MMR) | 相似度 + 样本多样性 | Embedding + 向量库 | 匹配相关且示例不重复 | 计算开销最高 | RAG 检索、多维度参考、避免信息冗余 |
| NGramOverlapExampleSelector | 字面 N-Gram 片段重叠 | nltk 分词库 | 无需向量、速度极快 | 仅匹配字面,不识别同义词 | 短指令、关键词、固定句式轻量匹配 |
四类选择器对话能力总区分
- SemanticSimilarity / MMR(完整支持对话特性) 自动拆分 human/ai,仅提取用户提问做向量检索,匹配同类用户问题,贴合问答逻辑。
- LengthBased / NGramOverlap(仅语法兼容,不支持对话专属特性)
- Length:全部对话文本拼接统计长度,无角色区分、无语义匹配;
- NGram:全部对话文本拼接计算字面重叠,无角色区分; 二者都只是单纯对完整对话字符串做处理,完全无视一问一答的对话结构。
