微信扫码
添加专属顾问
探索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+中大型企业
2026-07-18
你给AI喂的"企业记忆",可能全是假的
2026-07-17
RAG 怎么评估呢?RAG 评估体系5 个指标让你的知识库从「盲飞」到「可量化」
2026-07-17
RAG 工程里的上下文剪枝:如何减少 68% 的上下文
2026-07-15
RAG 最难的不是向量库,而是知识链路
2026-07-14
别再手调 RAG 了,让 Loop 自己找配置
2026-07-14
9.7k Stars,阿里内部跑了几年的向量数据库开源了,不用起服务,import 就能用
2026-07-13
AI知识库从零到一:个人wiki+企业RAG方案
2026-07-10
千万文档级 RAG 如何逼近零幻觉
2026-04-27
2026-04-23
2026-05-27
2026-05-14
2026-04-22
2026-04-27
2026-04-30
2026-05-11
2026-06-18
2026-04-22
2026-07-04
2026-06-23
2026-06-23
2026-06-15
2026-06-10
2026-06-10
2026-05-20
2026-05-18
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。