【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 = 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值