LangChain:模型I/O之示例选择器

示例选择器的作用是在传递给模型的示例中进行选择,以确保示例的数量和内容长度不会超过模型的处理能力。这样,即使有大量的示例,模型也能够有效地处理提示词,而不会因为示例过多或内容过长而无法处理。

示例选择器

Langchain 提供了多种示例选择器,分别实现了不同的选择策略。

  1. 基于长度的示例选择器(LengthBasedExampleSelector):根据示例的长度来选择示例。

  2. 最大边缘相关性选择器(MaxMarginalRelevanceExampleSelector):根据示例与输入的相似度及示例之间的多样性来选择示例。通过找到与输入最相似(即嵌入向量的余弦相似度最大)的示例来遍历添加示例,同时对已选择的示例进行惩罚。

  3. 基于n-gram重叠度的选择器(NGramOverlapExampleSelector):根据示例与输入的 n-gram 重叠度来选择和排序示例。

    n-gram是一个介于 0.0 和 1.0 之间的浮点数。该选择器还允许设置一个阈值,重叠度低于或等于阈值的示例将被剔除。

  4. 基于语义相似度的选择器(SemanticSimilarityExampleSelector):根据示例与输入相似度来选择示例,通过找到与输入最相似(即嵌入向量的余弦相似度最大)的示例来实现。

示例选择器使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from langchain.prompts.example_selector import LengthBasedExampleSelector
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_deepseek import ChatDeepSeek

llm_mode = ChatDeepSeek(
model="deepseek-chat", # 或 "deepseek-coder" 等具体模型
api_key="xxxxxxxxxxx",
base_url="https://api.deepseek.com",
temperature=0.7,
max_tokens=1024,
)

# 示例列表,包含输入和输出
examples = [
{"input": "高兴", "output": "伤心"},
{"input": "开心", "output": "难过"},
{"input": "快乐", "output": "痛苦"}
]

# PromptTemplate 对象,用于格式化示例
example_prompt = PromptTemplate(
input_variables=["input", "output"],
template="""
词语:{input}
反应词:{output}
"""
)
#
example_selector = LengthBasedExampleSelector(
examples=examples,
example_prompt=example_prompt,
max_length=100 # 假设每个示例的最大长度为 100
)

example_selector_prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
example_separator="\n",
prefix="来玩个反应词接龙游戏,我说词语,你说它的反义词:\n",
suffix="\n词语:{input}\n反义词:",
input_variables=["input"]
)
final_few_prompt = example_selector_prompt.format(input="凶")
print(final_few_prompt)
response = llm_mode.invoke(final_few_prompt)
print(response.content)

LengthBasedExampleSelector

LengthBasedExampleSelector 是 langchain 库中的一个示例选择器,其主要功能是根据示例的长度来选择合适的示例,确保最终生成的提示词不会超过指定的最大长度。在处理资源受限(如语言模型有输入长度限制)的场景时,这个选择器非常有用。

主要参数

  • examples
    类型:list[dict]
    含义:包含示例的列表,每个示例是一个字典,通常包含输入和输出信息。这些示例是选择器挑选示例的数据源。

  • example_prompt
    类型:PromptTemplate
    含义:用于格式化示例的 PromptTemplate 对象。它定义了如何将示例中的输入和输出信息组合成一个完整的提示(即示例在最终提示词中的呈现格式)。

  • max_length
    类型:int
    含义:指定最终提示词中示例部分的最大长度。选择器会按顺序添加示例,直到总长度接近但不超过这个值。

  • get_text_length
    类型:Callable[[str], int],可选参数,默认值为 lambda x: len(re.split(“\n| “, x))
    含义:一个可选函数,用于计算文本的长度。默认情况下,它使用 len 函数切割分割换行符和空格来计算文本的“单词”数量。如果你有特殊的长度计算需求(如按 token 数计算),可以传入自定义函数。

    默认值:None

  • example_text_length
    类型:dict[str, int],可选参数
    含义:一个字典,用于存储每个示例的预计算长度。如果提供了这个字典,选择器会直接使用这些长度,而不是调用 get_text_length 函数。

使用示例

1
2
3
4
5
6
7
8
# 长度选择器,用于选择示例
length_selector = LengthBasedExampleSelector(
examples=examples, # 示例列表
example_prompt=example_prompt, # 示例格式化模板
max_length=100, # 假设每个示例的最大长度为 100
# 若有特殊长度计算需求,可传入自定义函数,这里使用默认的 len 函数
get_text_length=None
)

max_length 用于控制选择的示例。示例设置为 25,超出了则会被过滤掉;设置为 100,所有示提词都会打印出来。

MaxMarginalRelevanceExampleSelector

MaxMarginalRelevanceExampleSelector 是 langchain 库中的一个示例选择器,用于根据最大边缘相关性(MMR)算法选择最相关且多样化的示例。以下是该选择器初始化时常用的参数及其含义:

主要参数

  • examples
    类型:List[Dict[str, Any]]
    含义:包含示例的列表,每个示例是一个字典,字典的键通常对应输入和输出的变量名。
  • ai_embedding
    类型:Embeddings
    含义:用于生成文本嵌入的嵌入模型实例,例如 OpenAIEmbeddings() 或其他实现了 Embeddings 接口的类。通过这个模型将文本转换为向量表示,以便计算相关性。
  • example_prompt
    类型:PromptTemplate
    含义:用于格式化示例的 PromptTemplate 对象,定义了示例在最终提示词中的呈现格式。
  • k
    类型:int
    含义:指定要选择的示例数量,即选择前 k 个最相关的示例。默认值为 4。
  • lambda_mult
    类型:float
    含义:控制相关性和多样性之间的平衡,取值范围在 0 到 1 之间。值越接近 1,越强调相关性;值越接近 0,越强调多样性。默认值为 0.5。
  • embedding_batch_size
    类型:int
    含义:指定在生成嵌入时的批量大小。如果一次处理大量示例,适当设置批量大小可以提高性能。默认值为 512。

使用示例

1
2
3
4
5
6
7
8
9
# 创建最大边缘相关性选择器
max_marginal_relevance_selector = MaxMarginalRelevanceExampleSelector(
examples=examples, # 示例列表
ai_embedding=OpenAIEmbeddings(), # 嵌入模型
example_prompt=example_prompt, # 示例格式化模板
k=2, # 选择前两个最相关的示例
lambda_mult=0.5, # 控制相关性和多样性之间的平衡
embedding_batch_size=512 # 嵌入生成的批量大小
)

NGramOverlapExampleSelector

NGramOverlapExampleSelector 是 langchain 库中的一个示例选择器,其核心功能是基于 n-gram 重叠度从给定的示例集合中挑选出与输入最相关的示例。n-gram 是将文本拆分成连续的 n 个词元(如字符、单词等)的序列,通过计算输入文本和示例文本的 n-gram 重叠程度,能衡量它们之间的相关性,进而选出合适的示例。

主要参数

以下是 NGramOverlapExampleSelector 初始化时可用的参数:

  • examples
    类型:List[Dict]
    含义:存储示例的列表,每个示例是一个字典,通常包含输入和输出信息。这些示例是选择器挑选相关示例的数据源。
  • example_prompt
    类型:PromptTemplate
    含义:用于格式化示例的模板对象。它定义了示例在最终提示词里的呈现格式。
  • k
    类型:int
    含义:指定要选择的最相关示例的数量,也就是选择器会返回与输入最相关的前 k 个示例。
    默认值:4
  • n
    类型:int
    含义:表示 n - gram 中的 n 值,决定了将文本分割成连续词元序列的长度。
    默认值:2
  • input_keys
    类型:Optional[List[str]]
    含义:指定示例字典中用于计算 n - gram 重叠度的键名。若为 None,则使用示例字典里的所有键。
    默认值:None

使用示例

1
2
3
4
5
6
7
8
# ngram选择器,用于选择示例
ngram_selector = NGramOverlapExampleSelector(
examples=examples, # 示例列表
example_prompt=example_prompt, # 示例格式化模板
k=2, # 选择前两个最相关的示例
n=2, # 设置n-gram中的n值为2
input_keys=["input"] # 指定使用 "input" 键的值计算n-gram重叠度
)

SemanticSimilarityExampleSelector

SemanticSimilarityExampleSelector 是 langchain 库中的一个示例选择器,其核心功能是基于语义相似度从给定的示例集合中挑选出与输入文本最相关的示例。它借助嵌入模型(如 OpenAIEmbeddings)将文本转换为向量表示,然后通过计算向量之间的相似度(通常是余弦相似度)来确定示例与输入文本的相关性。

主要参数

以下是 SemanticSimilarityExampleSelector 初始化时可用的参数:

  • examples
    类型:List[Dict]
    含义:包含示例的列表,每个示例是一个字典,一般包含输入和输出信息。这些示例是选择器筛选相关示例的数据源。
  • ai_embedding
    类型:实现了嵌入功能的对象,如 OpenAIEmbeddings、HuggingFaceEmbeddings 等。
    含义:用于将文本转换为向量表示的嵌入模型,通过该模型计算文本之间的语义相似度。
  • example_prompt
    类型:PromptTemplate
    含义:用于格式化示例的模板对象,定义了示例在最终提示词中的呈现格式。
  • k
    类型:int
    含义:指定要选择的最相关示例的数量,即选择器会返回与输入最相关的前 k 个示例。
    默认值:4
  • lambda_mult
    类型:float
    含义:控制相关性和多样性之间的平衡,取值范围在 0 到 1 之间。值越接近 1,越注重相关性;值越接近 0,越注重多样性。
    默认值:0.5

使用示例

1
2
3
4
5
6
7
8
# 创建语义相似度选择器
ss_selector = SemanticSimilarityExampleSelector(
examples=examples, # 示例列表
ai_embedding=OpenAIEmbeddings(), # 嵌入模型,用于计算语义相似度
example_prompt=example_prompt, # 示例格式化模板
k=2, # 选择前两个最相关的示例
lambda_mult=0.5 # 控制相关性和多样性之间的平衡
)
作者

光星

发布于

2025-04-11

更新于

2025-04-13

许可协议

评论