在我们构建大语言模型应用时,经常会用到 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 = examples
def 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 = None
smallest_diff = float("inf")
for example in self.examples:
current_diff = abs(len(example["input"]) - target_length)
if current_diff < smallest_diff:
smallest_diff = current_diff
best_example = example
return [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

最低0.47元/天 解锁文章
1513

被折叠的 条评论
为什么被折叠?



