探索最大边缘相关性(MMR):优化多样性与相似度的示例选择

# 探索最大边缘相关性(MMR):优化多样性与相似度的示例选择

## 引言

在机器学习和自然语言处理任务中,选择合适的示例来指导模型生成或学习是至关重要的。最大边缘相关性(MMR)示例选择是一种能够在选择与输入最相似的示例的同时,优化多样性的技术。这篇文章旨在深入探讨如何实现MMR示例选择,并通过代码示例展示它在实践中的应用。

## 主要内容

### 什么是最大边缘相关性(MMR)?

MMR是一种算法,旨在从给定的多样化示例集中选择子集。其核心思想是平衡选择示例的相似性和多样性。具体来说,它会选择与输入具有最大余弦相似度的示例,然后在每次选择后,对已经选择的示例进行距离上的惩罚,以鼓励多样性。

### 如何实现MMR示例选择?

我们可以利用Langchain库中的`MaxMarginalRelevanceExampleSelector`来实现这种选择策略。通过结合向量存储(例如FAISS)和嵌入类(例如OpenAIEmbeddings),我们可以高效地管理和搜索示例。

### 代码示例

以下是实现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"},
]

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"],
)

# 输入是感觉,因此应该选择happy/sad作为第一个示例
print(mmr_prompt.format(adjective="worried"))

# 使用API代理服务提高访问稳定性

常见问题和解决方案

网络访问限制问题

在某些地区,由于网络限制,访问OpenAI嵌入服务可能不稳定。开发者可以考虑使用API代理服务来提高访问的稳定性。

处理大规模数据集

对于非常大的示例集,计算相似度可能会变得昂贵。可以考虑使用更高效的索引方法,或者通过并行计算进行加速。

总结与进一步学习资源

MMR示例选择是一种非常有用的技术,可以在保持相关性的同时提升生成结果的多样性。通过本文的介绍和代码示例,希望你能够在实际项目中应用这一技术。

进一步学习资源:

参考资料

  1. Langchain GitHub Repository: https://github.com/hwchase17/langchain
  2. OpenAI API Documentation: https://beta.openai.com/docs/

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

---END---
### MMR (Maximal Marginal Relevance) 算法Python 实现 MMR 是一种用于解决信息检索中的多样性问题的方法,旨在平衡结果的相关性和新颖性。下面是一个简单的 MMR 算法实现: ```python import numpy as np from sklearn.metrics.pairwise import cosine_similarity def mmr(doc_embedding, word_embeddings, words, lambda_param=0.5, top_n=5): """ 计算并返回前 N 个最相关的关键词 参数: doc_embedding: 文档嵌入向量 word_embeddings: 单词嵌入矩阵 words: 对应于单词嵌入列表的词语列表 lambda_param: 控制多样性的参数,默认值为 0.5 top_n: 返回的最大关键词数量 返回: selected_words: 经过 MMR 排序后的关键词列表 """ # 初始化已选和未选集合 selected_indices = [] candidate_indices = list(range(len(words))) for _ in range(min(top_n, len(words))): max_score = -1 best_candidate_index = None for i in candidate_indices: relevance = cosine_similarity([doc_embedding], [word_embeddings[i]])[0][0] diversity_scores = [ cosine_similarity( [word_embeddings[j]], [word_embeddings[i]] )[0][0] for j in selected_indices ] if not diversity_scores: diversity = 0 else: diversity = min(diversity_scores) score = lambda_param * relevance - (1-lambda_param) * diversity if score > max_score: max_score = score best_candidate_index = i selected_indices.append(best_candidate_index) candidate_indices.remove(best_candidate_index) selected_words = [words[i] for i in selected_indices] return selected_words ``` 此代码片段展示了如何利用余弦相似度来计算文档候选词汇之间的相关性得分,并通过调整 `lambda_param` 来控制最终选取的关键短语间的冗余程度[^2]。 为了使上述函数正常工作,需要提供合适的输入数据结构,比如预训练好的词向量模型(如 Word2Vec 或 GloVe),以及待处理的目标文本对应的嵌入表示形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值