【LangChain指南】样例选择器(Example selectors)
在我们构建大语言模型应用时,经常会用到 Few-Shot Prompting(少样本提示),也就是在给模型的提示词(Prompt)中放入几个输入-输出的例子,来引导模型理解我们想要它完成的任务。比如,告诉它“happy”的反义词是“sad”,“tall”的反义词是“short”,然后让它去推理“large”的反义词。
但是,当我们手头有成百上千个例子时,不可能把它们全部塞进一个Prompt里。一方面,会超出模型的上下文窗口(Context Window)长度限制;另一方面,塞入不相关或冗余的例子,反而会干扰模型,降低其表现。
这就是 Example Selector 大显身手的地方!
它的核心作用就是:根据当前的用户输入,从海量的示例库中,智能地挑选出最相关、最有帮助的几个例子,动态地构建Prompt。
一、基础概念与自定义选择器
首先,我们来看最基础的概念。所有的 Example Selector 都需要实现一个核心方法:select_examples
。这个方法接收用户的输入(一个字典),然后返回一个选中的例子列表。
我们可以自己动手写一个简单的选择器。比如,我们写一个根据单词长度来选择最接近例子的选择器。
from langchain_core.example_selectors.base import BaseExampleSelector# 我们的示例库:英文到意大利文的翻译
examples = [{"input": "hi", "output": "ciao"},{"input": "bye", "output": "arrivederci"},{"input": "soccer", "output": "calcio"},
]class LengthBasedExampleSelector(BaseExampleSelector):def __init__(self, examples):self.examples = examplesdef add_example(self, example):"""允许动态添加新例子"""self.examples.append(example)def select_examples(self, input_variables):"""选择与输入单词长度最接近的例子"""target_word = input_variables["input"]target_length = len(target_word)best_example = Nonesmallest_diff = float("inf")for example in self.examples:current_diff = abs(len(example["input"]) - target_length)if current_diff < smallest_diff:smallest_diff = current_diffbest_example = examplereturn [best_example] # 返回一个列表# 实例化我们的选择器
selector = LengthBasedExampleSelector(examples)# 测试:输入 "okay" (长度为4)
print(selector.select_examples({"input": "okay"}))
# 输出: [{'input': 'bye', 'output': 'arrivederci'}] (bye 长度为3,最接近4)# 添加一个新例子 "hand" -> "mano" (长度为4)
selector.add_example({"input": "hand", "output": "mano"})
print