微信扫码
添加专属顾问
我要投稿
探索RAG系统中提升检索结果多样性与实用性的新策略。 核心内容: 1. MMR算法在RAG系统中的作用与优势 2. MMR原理和公式解析,以及算法流程 3. MMR在信息检索和问答系统中的应用实例
在RAG系统中,仅靠向量相似度检索容易造成信息重复或片面。为提升回答的多样性与覆盖度,引入MMR(Maximum Marginal Relevance)算法能有效在“相关性”与“多样性”之间取得平衡,从而挑选出既相关又不重复的信息,提升系统输出的质量与实用性。
-- 领取学习资料大礼包,见文末
在 RAG(Retrieval-Augmented Generation)系统中,检索阶段决定了最终生成内容的"信息来源"。
但仅靠向量相似度进行 top-k 检索,可能会出现内容重复、信息集中于单一角度的问题,导致模型生成的回答缺乏多样性和覆盖度。这时,仅仅"相关"还不够,我们更希望检索结果是"既相关又多样"。
为了解决这个问题,引入 Maximum Marginal Relevance(MMR) 可以有效地在相关性与多样性之间取得平衡,优化检索结果的质量,提升最终回答的丰富性和实用性。
相关阅读:本地知识库,通过RAG来解决信息的精准生成
Maximum Marginal Relevance(MMR) 是一种排序算法,主要用于在信息检索、推荐系统和摘要生成等任务中,选择既相关又不重复的内容。
放到RAG的场景中,传统的排序方法往往只关注内容的相关性(即与查询的匹配度)。但如果我们只是单纯地根据相关性来排序,可能会出现以下问题:
MMR 的核心思想是:在确保相关性的同时,增加多样性,从而提供更全面、更丰富的结果。
简单来说就是:在一堆候选内容里,优先选那些既跟用户查询相关、又跟已经选过的内容不重复的条目。
我们可以这么理解它的"目的"—— MMR = "给你想要的 + 避免你已经看过的"。
假设你正在使用一个新闻推荐系统,输入了"人工智能"的关键词。传统的推荐系统可能推荐多篇关于"人工智能在医疗行业应用"的文章,而这些文章的内容高度相似。
使用 MMR 后,系统可能会推荐:
这样,用户既能获得与主题相关的信息,又能了解该领域的不同视角,避免了重复。
这里面涉及到两个关键词:相关性(Relevance) 和 多样性(Diversity)。这两个听起来像是在"打架",但其实在信息排序里,它们是缺一不可的搭档。
相关性是基础,但不够
相关性很好理解,就是某个内容跟用户查询、兴趣、目标之间的匹配程度。比如你搜"机器学习",当然不希望系统推"烘焙教程"给你。这就是相关性在起作用。
但如果系统一味追求相关性,就会出现一个问题:内容集中在一个点上,很快就"重复"了。你看着看着就会觉得:"这些不是都差不多吗?"
多样性让信息更丰富
多样性指的是结果之间的差异程度。如果推荐的每条内容都从不同角度切入,比如一个讲原理、一个讲应用、一个讲未来趋势,那你看完之后会感觉信息更全面、更有收获。
相关性保证你"看对东西",多样性保证你"看到不同的东西"。
全是相关但重复的内容,没用;全是多样但不相关的内容,也没用。
所以,MMR 的目标就很明确了:
从一堆候选内容里,挑出那些既"与查询高度相关",又"跟已经选过的内容不重复"的条目。
它在每一步选下一个内容时,都会去权衡:
MMR 做的就是在这两者之间找一个平衡点。换句话说,它每次都想选一个"有新意"的好内容,而不是简单地把"最相关的那几个"一股脑推出来。
你可以把 MMR 想成一个"懂信息又懂用户心理"的策展人:
它会说,"这个你可能还没看过,但跟你想要的很有关,而且比之前那些不一样,值的一看。"
因此,MMR 的核心目标是:选出既相关又不重复的内容。
MMR 的标准公式表达如下(左右滑动):
其中:
:当前候选文档
:用户查询问题
:已选文档集合
:候选文档与查询问题的相关性得分
:候选文档 与某个已选文档 的相似度 (公式中会取 与所有已选文档 中最相似的那一个)
:平衡参数(0 ≤ λ ≤ 1)
相关阅读:人工智能小白到高手:余弦相似度(Cosine Similarity)的简单理解
假设我们有一篇长文章,要从中选出三句话组成一个简短摘要。我们手头有五个候选句子,编号:S1、S2、S3、S4、S5。
假设我们设定平衡参数 。
1.初始化:
集合状态更新:
已选集合: {S1}
候选集合: {S2, S3, S4, S5}
2.迭代选择:
对剩余句子集合中的每个句子,计算(左右滑动):
第一次迭代候选集合:
= 0.9 | = 0.8
= 0.75 | = 0.2
= 0.85, = 0.3
= 0.65, = 0.2
选择MMR得分最高的句子S4加入已选集合
虽然S2和S3都很"相关",但S4的MMR得分最高,因此选择S4。
集合状态更新:
已选集合: {S1, S4}
候选集合: {S2, S3, S5}
第二次迭代候选集合:
= 0.9 | = 0.8, = 0.6
= 0.75 | = 0.2, = 0.4
= 0.65 | = 0.2, = 0.3
选择MMR得分最高的句子S3加入已选集合
在剩余的句子中,S3的MMR得分最高(0.405),因此选择S3。
集合状态更新:
已选集合: {S1, S4, S3}
候选集合: {S2, S5}
最终选出的3句话为:S1, S4, S3
你在搜索引擎上输入一个关键词,比如"ChatGPT 应用案例",后台系统一下子找到了几百上千条相关网页。
如果我们只看"相关性",那前几条可能都是讲"教育场景下怎么用 ChatGPT"的,虽然都对,但你可能会觉得太集中、太重复了。
用上 MMR 之后,系统就会在相关的基础上,让展示结果更有"层次":
比如你问一个比较开放的问题,比如"人工智能未来会带来哪些改变?"
系统可能从数据库或模型里找出了 10 个可能的回答。
MMR 在这时候就能帮上忙:不是简单地把"重复最多"的答案往上排,而是挑出互补的信息,比如:
其他还可以用到:推荐系统(避免推相似内容)、文本摘要(避免重复句子)
# 导入操作系统模块
import os
# 设置OpenAI API密钥
# 注意:在实际应用中,请勿硬编码API密钥。建议使用环境变量或其他安全方式管理密钥。
OPENAI_API_KEY = 'hk-iwtbie4a91e427'# 示例密钥,请替换为您自己的有效密钥
# 将API密钥设置为环境变量
os.environ['OpenAI_API_KEY'] = OPENAI_API_KEY
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
# 定义一个包含示例文本的列表,这些文本将被嵌入并存储到向量数据库中
texts = [
"大语言模型(LLM)是基于Transformer架构的深度学习模型。", # 关于LLM的定义
"LLM的核心是Transformer架构,这是一种强大的深度学习技术。", # 与上一句相似
"基于Transformer的LLM在自然语言处理任务中表现出色。", # 与第一句相似
"LLM通过在海量文本数据上进行预训练来学习语言模式。", # LLM的训练方式
"预训练使得LLM能够掌握丰富的语言知识和世界常识。", # 与上一句相似
"LLM展现出强大的自然语言理解和生成能力。", # LLM的能力
"理解和生成自然语言是LLM的核心功能之一。", # 与上一句相似
"像GPT-4这样的LLM可以执行翻译、摘要和问答等多种任务。", # LLM的应用
"LLM在文本翻译、内容摘要和智能问答方面有广泛应用。", # 与上一句相似
"人工智能(AI)是一个更广泛的领域,LLM是其中的一个子集。", # LLM与AI的关系
"AI的目标是创造能够像人类一样思考和行动的机器。"# AI的目标
]
# 初始化OpenAI嵌入模型,指定模型名称和API基础URL
embeddings = OpenAIEmbeddings(model="text-embedding-3-large", base_url="https://api.openai-hk.com/v1")
# 使用Chroma类的from_texts方法创建向量存储
vectorstore = Chroma.from_texts(
texts=texts, # 需要嵌入和存储的文本列表
embedding=embeddings, # 用于生成嵌入的嵌入模型实例
persist_directory="./chroma_db"# 指定持久化存储向量数据的目录
)
# 定义一个查询字符串,用于在向量数据库中进行搜索
query = '什么是大语言模型以及它们能做什么?'
print("========================= 相似度检索 ============================")
# 使用向量存储的similarity_search方法执行相似度检索
t1 = vectorstore.similarity_search(query, k=5) # k=5表示返回最相似的5个结果
# 打印相似度检索的结果
print(t1)
# 标识MMR检索(lambda=0.3)部分的开始
print("========================= MMR lambda=0.3 ============================")
# 使用向量存储的max_marginal_relevance_search方法执行MMR检索
t2 = vectorstore.max_marginal_relevance_search(query, k=5, fetch_k=10, lambda_mult=0.3)
# k=5表示最终返回5个结果,fetch_k=10表示初始获取10个相似结果进行MMR计算,lambda_mult=0.3控制多样性与相似度的权衡
# 打印MMR检索(lambda=0.3)的结果
print(t2)
# 标识MMR检索(lambda=0.7)部分的开始
print("========================= MMR lambda=0.7 ============================")
# 使用向量存储的max_marginal_relevance_search方法执行MMR检索
t3 = vectorstore.max_marginal_relevance_search(query, k=5, fetch_k=10, lambda_mult=0.7)
# k=5表示最终返回5个结果,fetch_k=10表示初始获取10个相似结果进行MMR计算,lambda_mult=0.7控制多样性与相似度的权衡
# 打印MMR检索(lambda=0.7)的结果
print(t3)
运行结果:
========================= 相似度检索 =============================
[Document(id='76a37d7d-4f9e-43ca-8ca1-396fd5a956bc', metadata={}, page_content='大语言模型(LLM)是基于Transformer架构的深度学习模型。'),
Document(id='9f76337c-3f6c-4c14-81e5-399338e30938', metadata={}, page_content='LLM通过在海量文本数据上进行预训练来学习语言模式。'),
Document(id='23717671-2353-4daa-a30f-80ce191cfb90', metadata={}, page_content='理解和生成自然语言是LLM的核心功能之一。'),
Document(id='f5a64fe0-b616-4a02-b932-ea1d6f7a1217', metadata={}, page_content='LLM展现出强大的自然语言理解和生成能力。'),
Document(id='c6237dc4-4087-4eee-b838-a2392a3ef993', metadata={}, page_content='基于Transformer的LLM在自然语言处理任务中表现出色。')]
========================= MMR lambda=0.3 =============================
[Document(id='76a37d7d-4f9e-43ca-8ca1-396fd5a956bc', metadata={}, page_content='大语言模型(LLM)是基于Transformer架构的深度学习模型。'),
Document(id='f5a64fe0-b616-4a02-b932-ea1d6f7a1217', metadata={}, page_content='LLM展现出强大的自然语言理解和生成能力。'),
Document(id='4a3a8219-8065-4d74-b7ce-187f16e87ecf', metadata={}, page_content='像GPT-4这样的LLM可以执行翻译、摘要和问答等多种任务。'),
Document(id='fc2b9c7a-c63c-4c7b-a153-eece2d6bb02e', metadata={}, page_content='预训练使得LLM能够掌握丰富的语言知识和世界常识。'),
Document(id='d0cbe326-c4c0-4252-9636-eef7bed06379', metadata={}, page_content='人工智能(AI)是一个更广泛的领域,LLM是其中的一个子集。')]
========================= MMR lambda=0.7 =============================
[Document(id='76a37d7d-4f9e-43ca-8ca1-396fd5a956bc', metadata={}, page_content='大语言模型(LLM)是基于Transformer架构的深度学习模型。'),
Document(id='9f76337c-3f6c-4c14-81e5-399338e30938', metadata={}, page_content='LLM通过在海量文本数据上进行预训练来学习语言模式。'),
Document(id='23717671-2353-4daa-a30f-80ce191cfb90', metadata={}, page_content='理解和生成自然语言是LLM的核心功能之一。'),
Document(id='f5a64fe0-b616-4a02-b932-ea1d6f7a1217', metadata={}, page_content='LLM展现出强大的自然语言理解和生成能力。'),
Document(id='4a3a8219-8065-4d74-b7ce-187f16e87ecf', metadata={}, page_content='像GPT-4这样的LLM可以执行翻译、摘要和问答等多种任务。')]
这种策略旨在找出与查询最相似的文档。
结果特点:
较低的 lambda
值 (0.3) 更侧重于 多样性。
结果特点:
较高的 lambda
值 (0.7) 更侧重于 相关性。
结果特点:
lambda=0.3
,多样性较低,但仍比纯相似度检索略高,引入了关于 LLM 具体任务的文档。MMR 的核心价值在于 提升结果的多样性,确保返回的内容既相关又有足够的多样性。在推荐系统、摘要生成、问答系统等多个场景中,MMR 都能有效避免重复,提升用户体验。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-04-23
基于推理模型+RAG+Agent,作业帮内部安全体系建设实践
2025-04-23
MCP审计场景再探,用AI操作Excel?不太靠谱
2025-04-23
RAG进阶:Embedding Models嵌入式模型原理和选择
2025-04-23
大模型:多种RAG组合优化(langchain实现)
2025-04-23
一文搞懂RAG构建知识库和知识图谱
2025-04-23
RAG不需要切块向量化了?通过PageIndex构建Agentic RAG
2025-04-22
文档解析主流开源工具全家桶及RAG中的文档目录解析PageIndex思路解析
2025-04-22
腾讯发布Conan-Embedding-V2,登顶MTEB中英榜单,性能更强、覆盖场景更广
2024-10-27
2024-09-04
2024-07-18
2024-05-05
2024-06-20
2024-06-13
2024-07-09
2024-07-09
2024-05-19
2024-07-07
2025-04-22
2025-04-22
2025-04-20
2025-04-19
2025-04-18
2025-04-16
2025-04-14
2025-04-13