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]
API 参考:BaseExampleSelector
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.