如何使用示例选择器
如果您有大量示例,您可能需要选择要包含在提示中的示例。示例选择器是负责执行此操作的类。
基本接口定义如下
class BaseExampleSelector {
addExample(example: Example): Promise<void | string>;
selectExamples(input_variables: Example): Promise<Example[]>;
}
它需要定义的唯一方法是 selectExamples
方法。这将接收输入变量,然后返回一个示例列表。每个特定实现如何选择这些示例取决于它。
LangChain 有几种不同类型的示例选择器。有关所有这些类型的概述,请参见下表。
在本指南中,我们将逐步完成创建自定义示例选择器的过程。
示例
为了使用示例选择器,我们需要创建一个示例列表。这些通常应该是示例输入和输出。为了演示目的,让我们假设我们正在选择如何将英语翻译成意大利语的示例。
const examples = [
{ input: "hi", output: "ciao" },
{ input: "bye", output: "arrivaderci" },
{ input: "soccer", output: "calcio" },
];
自定义示例选择器
让我们编写一个示例选择器,它根据单词的长度选择要选择哪个示例。
import { BaseExampleSelector } from "@langchain/core/example_selectors";
import { Example } from "@langchain/core/prompts";
class CustomExampleSelector extends BaseExampleSelector {
private examples: Example[];
constructor(examples: Example[]) {
super();
this.examples = examples;
}
async addExample(example: Example): Promise<void | string> {
this.examples.push(example);
return;
}
async selectExamples(inputVariables: Example): Promise<Example[]> {
// This assumes knowledge that part of the input will be a 'text' key
const newWord = inputVariables.input;
const newWordLength = newWord.length;
// Initialize variables to store the best match and its length difference
let bestMatch: Example | null = null;
let smallestDiff = Infinity;
// Iterate through each example
for (const example of this.examples) {
// Calculate the length difference with the first word of the example
const currentDiff = Math.abs(example.input.length - newWordLength);
// Update the best match if the current one is closer in length
if (currentDiff < smallestDiff) {
smallestDiff = currentDiff;
bestMatch = example;
}
}
return bestMatch ? [bestMatch] : [];
}
}
const exampleSelector = new CustomExampleSelector(examples);
await exampleSelector.selectExamples({ input: "okay" });
[ { input: "bye", output: "arrivaderci" } ]
await exampleSelector.addExample({ input: "hand", output: "mano" });
await exampleSelector.selectExamples({ input: "okay" });
[ { input: "hand", output: "mano" } ]
在提示中使用
我们现在可以在提示中使用此示例选择器
import { PromptTemplate, FewShotPromptTemplate } from "@langchain/core/prompts";
const examplePrompt = PromptTemplate.fromTemplate(
"Input: {input} -> Output: {output}"
);
const prompt = new FewShotPromptTemplate({
exampleSelector,
examplePrompt,
suffix: "Input: {input} -> Output:",
prefix: "Translate the following words from English to Italain:",
inputVariables: ["input"],
});
console.log(await prompt.format({ input: "word" }));
Translate the following words from English to Italain:
Input: hand -> Output: mano
Input: word -> Output:
示例选择器类型
名称 | 描述 |
---|---|
相似度 | 使用输入和示例之间的语义相似性来决定选择哪些示例。 |
长度 | 根据可以容纳在特定长度内的示例数量选择示例 |
下一步
您现在已经了解了一些关于使用示例选择器来进行少样本 LLM 的知识。
接下来,查看一些关于选择示例的其他技术的指南