一架梯子,一头程序猿,仰望星空!
LangChain教程(JS版本) > 内容正文

提示词例子管理


示例选择器

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

基本接口定义如下:

class BaseExampleSelector {
  addExample(example: Example): Promise;

  selectExamples(input_variables: Example): Promise;
}

它需要暴露一个selectExamples方法,该方法接受输入变量并返回一个示例列表,并且还需要一个addExample方法,用于保存待选示例。每个具体的实现可以自行决定如何保存和选择这些示例。

按长度选择

这个示例选择器根据长度选择要使用的示例。当你担心构造的提示会超过上下文窗口的长度时,这非常有用。对于较长的输入,它会选择较少的示例进行包含,而对于较短的输入,它会选择更多的示例。

import {
  LengthBasedExampleSelector,
  PromptTemplate,
  FewShotPromptTemplate,
} from "langchain/prompts";

export async function run() {
  // 创建一个用于格式化示例的提示模板。
  const examplePrompt = new PromptTemplate({
    inputVariables: ["input", "output"],
    template: "输入:{input}\n输出:{output}",
  });

  // 创建一个用于选择示例的LengthBasedExampleSelector。
  const exampleSelector = await LengthBasedExampleSelector.fromExamples(
    [
      { input: "开心", output: "悲伤" },
      { input: "高", output: "矮" },
      { input: "精力充沛", output: "倦怠" },
      { input: "晴朗", output: "阴沉" },
      { input: "刮风", output: "平静" },
    ],
    {
      examplePrompt,
      maxLength: 25,
    }
  );

  // 创建一个使用示例选择器的FewShotPromptTemplate。
  const dynamicPrompt = new FewShotPromptTemplate({
    // 我们提供了一个ExampleSelector而不是示例。
    exampleSelector,
    examplePrompt,
    prefix: "给出每个输入的反义词",
    suffix: "输入:{adjective}\n输出:",
    inputVariables: ["adjective"],
  });

  // 一个输入较小的示例,因此它选择了所有的示例。
  console.log(await dynamicPrompt.format({ adjective: "大" }));
  /*
   给出每个输入的反义词

   输入:开心
   输出:悲伤

   输入:高
   输出:矮

   输入:精力充沛
   输出:倦怠

   输入:晴朗
   输出:阴沉

   输入:刮风
   输出:平静

   输入:大
   输出:
   */

  // 一个输入较长的示例,因此它只选择了一个示例。
  const longString =
    "又大又巨大又巨大又大又巨大又高又非常非常非常非常非常比其他一切都大得多的";
  console.log(await dynamicPrompt.format({ adjective: longString }));
  /*
   给出每个输入的反义词

   输入:开心
   输出:悲伤

   输入:又大又巨大又巨大又大又巨大又高又非常非常非常非常非常比其他一切都大得多的
   输出:
   */
}

相似性选择

此对象根据与输入的相似性选择示例。它通过找到具有与输入具有最大余弦相似度的嵌入的示例来实现此目的。

import { OpenAIEmbeddings } from "langchain/embeddings/openai";
import {
  SemanticSimilarityExampleSelector,
  PromptTemplate,
  FewShotPromptTemplate,
} from "langchain/prompts";
import { HNSWLib } from "langchain/vectorstores/hnswlib";

export async function run() {
  // 创建一个用于格式化示例的提示模板。
  const examplePrompt = new PromptTemplate({
    inputVariables: ["input", "output"],
    template: "输入: {input}\n输出: {output}",
  });

  // 创建一个用于选择示例的SemanticSimilarityExampleSelector。
  const exampleSelector = await SemanticSimilarityExampleSelector.fromExamples(
    [
      { input: "开心", output: "伤心" },
      { input: "高", output: "矮" },
      { input: "精力充沛", output: "懒散" },
      { input: "晴朗", output: "阴郁" },
      { input: "有风的", output: "平静的" },
    ],
    new OpenAIEmbeddings(),
    HNSWLib,
    { k: 1 }
  );

  // 创建一个使用示例选择器的FewShotPromptTemplate。
  const dynamicPrompt = new FewShotPromptTemplate({
    // 我们提供了ExampleSelector而不是examples。
    exampleSelector,
    examplePrompt,
    prefix: "给出每个输入的反义词",
    suffix: "输入: {adjective}\n输出:",
    inputVariables: ["adjective"],
  });

  // 输入是关于天气的,因此应该选择例如“晴朗/阴郁”的示例
  console.log(await dynamicPrompt.format({ adjective: "下雨" }));
  /*
   给出每个输入的反义词

   输入: 晴朗
   输出: 阴郁

   输入: 下雨
   输出:
   */

  // 输入是一个测量,所以应该选择“高/矮”的示例
  console.log(await dynamicPrompt.format({ adjective: "大" }));
  /*
   给出每个输入的反义词

   输入: 高
   输出: 矮

   输入: 大
   输出:
   */
}


关联主题