Skip to main content
Open In ColabOpen on GitHub

如何使用示例选择器

如果您有大量示例,可能需要选择哪些包含在提示中。示例选择器是负责此操作的类。

基础接口定义如下:

class BaseExampleSelector(ABC):
"""Interface for selecting examples to include in prompts."""

@abstractmethod
def select_examples(self, input_variables: Dict[str, str]) -> List[dict]:
"""Select which examples to use based on the inputs."""

@abstractmethod
def add_example(self, example: Dict[str, str]) -> Any:
"""Add new example to store."""

它需要定义的唯一种方法是 select_examples 方法。该方法接收输入变量,然后返回一个示例列表。具体如何选择这些示例由各个特定实现自行决定。

LangChain 有几种不同类型的示例选择器。关于所有这些类型的概述,请查看下面的表格

在本指南中,我们将介绍如何创建自定义示例选择器。

示例

为了使用示例选择器,我们需要创建一个示例列表。这些通常应该是示例输入和输出。为了这个演示目的,让我们假设我们正在选择如何将英语翻译成意大利语的示例。

examples = [
{"input": "hi", "output": "ciao"},
{"input": "bye", "output": "arrivederci"},
{"input": "soccer", "output": "calcio"},
]

自定义示例选择器

让我们编写一个示例选择器,该选择器根据单词的长度来选择要选取的示例。

from langchain_core.example_selectors.base import BaseExampleSelector


class CustomExampleSelector(BaseExampleSelector):
def __init__(self, examples):
self.examples = examples

def add_example(self, example):
self.examples.append(example)

def select_examples(self, input_variables):
# This assumes knowledge that part of the input will be a 'text' key
new_word = input_variables["input"]
new_word_length = len(new_word)

# Initialize variables to store the best match and its length difference
best_match = None
smallest_diff = float("inf")

# Iterate through each example
for example in self.examples:
# Calculate the length difference with the first word of the example
current_diff = abs(len(example["input"]) - new_word_length)

# Update the best match if the current one is closer in length
if current_diff < smallest_diff:
smallest_diff = current_diff
best_match = example

return [best_match]
example_selector = CustomExampleSelector(examples)
example_selector.select_examples({"input": "okay"})
[{'input': 'bye', 'output': 'arrivederci'}]
example_selector.add_example({"input": "hand", "output": "mano"})
example_selector.select_examples({"input": "okay"})
[{'input': 'hand', 'output': 'mano'}]

在提示词中使用

我们现在可以在提示词中使用此示例选择器

from langchain_core.prompts.few_shot import FewShotPromptTemplate
from langchain_core.prompts.prompt import PromptTemplate

example_prompt = PromptTemplate.from_template("Input: {input} -> Output: {output}")
prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
suffix="Input: {input} -> Output:",
prefix="Translate the following words from English to Italian:",
input_variables=["input"],
)

print(prompt.format(input="word"))
Translate the following words from English to Italian:

Input: hand -> Output: mano

Input: word -> Output:

示例选择器类型

名称描述
SimilarityUses semantic similarity between inputs and examples to decide which examples to choose.
MMRUses Max Marginal Relevance between inputs and examples to decide which examples to choose.
LengthSelects examples based on how many can fit within a certain length
NgramUses ngram overlap between inputs and examples to decide which examples to choose.