Skip to main content

最大边际相关性(MMR)选择

MaxMarginalRelevanceExampleSelector根据示例与输入之间的相似性以及多样性进行选择。它通过找到与输入具有最大余弦相似度的嵌入示例,并在迭代中添加它们,同时对已选择示例的接近程度进行惩罚来实现这一目标。

from langchain.prompts.example_selector import (
MaxMarginalRelevanceExampleSelector,
SemanticSimilarityExampleSelector,
)
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.prompts import FewShotPromptTemplate, PromptTemplate

example_prompt = PromptTemplate(
input_variables=["input", "output"],
template="输入:{input}\n输出:{output}",
)

# 这是一个虚构任务(创建反义词)的许多示例。
examples = [
{"input": "开心", "output": "悲伤"},
{"input": "高", "output": "矮"},
{"input": "精力充沛", "output": "倦怠"},
{"input": "晴朗", "output": "阴沉"},
{"input": "有风", "output": "平静"},
]

example_selector = MaxMarginalRelevanceExampleSelector.from_examples(
# 可供选择的示例列表。
examples,
# 用于生成嵌入并用于测量语义相似性的嵌入类。
OpenAIEmbeddings(),
# 用于存储嵌入并进行相似性搜索的VectorStore类。
FAISS,
# 要生成的示例数量。
k=2,
)
mmr_prompt = FewShotPromptTemplate(
# 我们提供一个ExampleSelector而不是示例。
example_selector=example_selector,
example_prompt=example_prompt,
prefix="给出每个输入的反义词",
suffix="输入:{adjective}\n输出:",
input_variables=["adjective"],
)

# 输入是一种感觉,所以应该选择开心/悲伤的示例作为第一个示例
print(mmr_prompt.format(adjective="担心"))

# 让我们将其与仅基于相似性的情况进行比较,
# 使用SemanticSimilarityExampleSelector而不是MaxMarginalRelevanceExampleSelector。
example_selector = SemanticSimilarityExampleSelector.from_examples(
# 可供选择的示例列表。
examples,
# 用于生成嵌入并用于测量语义相似性的嵌入类。
OpenAIEmbeddings(),
# 用于存储嵌入并进行相似性搜索的VectorStore类。
FAISS,
# 要生成的示例数量。
k=2,
)
similar_prompt = FewShotPromptTemplate(
# 我们提供一个ExampleSelector而不是示例。
example_selector=example_selector,
example_prompt=example_prompt,
prefix="给出每个输入的反义词",
suffix="输入:{adjective}\n输出:",
input_variables=["adjective"],
)
print(similar_prompt.format(adjective="担心"))

API 参考: