langchain (example selectors) v0.2文档(17)如何使用案例选择器(中英对照)

90 阅读2分钟

If you have a large number of examples, you may need to select which ones to include in the prompt. The Example Selector is the class responsible for doing so.

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

The base interface is defined as below:

基本接口定义如下:

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."""

The only method it needs to define is a select_examples method. This takes in the input variables and then returns a list of examples. It is up to each specific implementation as to how those examples are selected.

它需要定义的唯一方法是 select_examples 方法。这接受输入变量,然后返回示例列表。如何选择这些示例取决于每个具体的实现。

LangChain has a few different types of example selectors. For an overview of all these types, see the below table.

LangChain 有几种不同类型的示例选择器。有关所有这些类型的概述,请参阅下表。

In this guide, we will walk through creating a custom example selector.

在本指南中,我们将逐步创建自定义示例选择器。

Examples

In order to use an example selector, we need to create a list of examples. These should generally be example inputs and outputs. For this demo purpose, let's imagine we are selecting examples of how to translate English to Italian.

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

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

Custom Example Selector

Let's write an example selector that chooses what example to pick based on the length of the word.

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

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

Use in a Prompt

We can now use this example selector in a prompt

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

example_prompt = PromptTemplate.from_template("Input: {input} -> Output: {output}")

API Reference: FewShotPromptTemplate | PromptTemplate

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:

Example Selector Types

NameDescription
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.