Skip to main content
Open In Colab在 GitHub 上打开

如何使用示例选择器

如果您有大量示例,则可能需要选择要包含在提示中的示例。Example Selector 是负责执行此作的类。

基本接口定义如下:

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 有几种不同类型的示例 selector。有关所有这些类型的概述,请参阅下表

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

例子

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

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

自定义示例选择器

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

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'}]

在提示中使用

我们现在可以在 prompt 中使用这个示例 selector

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.