支持私有化部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


最大边际相关性MMR:提升RAG检索结果的多样性与实用性

发布日期:2025-04-23 12:05:58 浏览次数: 1529 作者:AI取经路
推荐语

探索RAG系统中提升检索结果多样性与实用性的新策略。

核心内容:
1. MMR算法在RAG系统中的作用与优势
2. MMR原理和公式解析,以及算法流程
3. MMR在信息检索和问答系统中的应用实例

杨芳贤
53A创始人/腾讯云(TVP)最具价值专家


-正文-

在RAG系统中,仅靠向量相似度检索容易造成信息重复或片面。为提升回答的多样性与覆盖度,引入MMR(Maximum Marginal Relevance)算法能有效在“相关性”与“多样性”之间取得平衡,从而挑选出既相关又不重复的信息,提升系统输出的质量与实用性。

  • 1. MMR 是什么,它能解决什么问题?
  • 2. MMR 的基本思想
  • 3. MMR 的原理和公式解析
    • 3.1 算法流程
    • 3.2 举个例子:摘要任务中的 MMR
  • 4. MMR 的应用场景
    • 4.1. 信息检索(比如搜索引擎的结果排序)
    • 4.2. 问答系统(从多个候选答案中挑出信息最丰富的)
  • 5. 代码测试
    • 5.1  标准相似度检索 (Top 5)
    • 5.2  MMR检索 (lambda=0.3, k=5, fetch_k=10)
    • 5.3  MMR检索 (lambda=0.7, k=5, fetch_k=10)

-- 领取学习资料大礼包,见文末

在 RAG(Retrieval-Augmented Generation)系统中,检索阶段决定了最终生成内容的"信息来源"。

但仅靠向量相似度进行 top-k 检索,可能会出现内容重复、信息集中于单一角度的问题,导致模型生成的回答缺乏多样性和覆盖度。这时,仅仅"相关"还不够,我们更希望检索结果是"既相关又多样"。

为了解决这个问题,引入 Maximum Marginal Relevance(MMR) 可以有效地在相关性与多样性之间取得平衡,优化检索结果的质量,提升最终回答的丰富性和实用性。

相关阅读:本地知识库,通过RAG来解决信息的精准生成

1. MMR 是什么,它能解决什么问题?

Maximum Marginal Relevance(MMR) 是一种排序算法,主要用于在信息检索、推荐系统和摘要生成等任务中,选择既相关又不重复的内容。

放到RAG的场景中,传统的排序方法往往只关注内容的相关性(即与查询的匹配度)。但如果我们只是单纯地根据相关性来排序,可能会出现以下问题:

  • 重复内容:比如在推荐系统中,推荐的内容过于相似,用户感受不到新鲜感。
  • 信息不全面:有些系统可能过于关注某一个领域或话题,导致用户只能看到片面的信息。

MMR 的核心思想是:在确保相关性的同时,增加多样性,从而提供更全面、更丰富的结果。

简单来说就是:在一堆候选内容里,优先选那些既跟用户查询相关、又跟已经选过的内容不重复的条目。

我们可以这么理解它的"目的"—— MMR = "给你想要的 + 避免你已经看过的"。

假设你正在使用一个新闻推荐系统,输入了"人工智能"的关键词。传统的推荐系统可能推荐多篇关于"人工智能在医疗行业应用"的文章,而这些文章的内容高度相似。

使用 MMR 后,系统可能会推荐:

  • 一篇讲人工智能医疗应用的文章,
  • 一篇讲人工智能教育领域的文章,
  • 一篇关于人工智能伦理问题的文章。

这样,用户既能获得与主题相关的信息,又能了解该领域的不同视角,避免了重复。

2. MMR 的基本思想

这里面涉及到两个关键词:相关性(Relevance) 和 多样性(Diversity)。这两个听起来像是在"打架",但其实在信息排序里,它们是缺一不可的搭档。

相关性是基础,但不够

相关性很好理解,就是某个内容跟用户查询、兴趣、目标之间的匹配程度。比如你搜"机器学习",当然不希望系统推"烘焙教程"给你。这就是相关性在起作用。

但如果系统一味追求相关性,就会出现一个问题:内容集中在一个点上,很快就"重复"了。你看着看着就会觉得:"这些不是都差不多吗?"

多样性让信息更丰富

多样性指的是结果之间的差异程度。如果推荐的每条内容都从不同角度切入,比如一个讲原理、一个讲应用、一个讲未来趋势,那你看完之后会感觉信息更全面、更有收获。

相关性保证你"看对东西",多样性保证你"看到不同的东西"。

全是相关但重复的内容,没用;全是多样但不相关的内容,也没用。

所以,MMR 的目标就很明确了:

从一堆候选内容里,挑出那些既"与查询高度相关",又"跟已经选过的内容不重复"的条目。

它在每一步选下一个内容时,都会去权衡:

  • 这个内容本身和用户需求有多匹配?
  • 它是不是和我们已经选过的那些内容太像了?

MMR 做的就是在这两者之间找一个平衡点。换句话说,它每次都想选一个"有新意"的好内容,而不是简单地把"最相关的那几个"一股脑推出来。

你可以把 MMR 想成一个"懂信息又懂用户心理"的策展人:

它会说,"这个你可能还没看过,但跟你想要的很有关,而且比之前那些不一样,值的一看。"

因此,MMR 的核心目标是:选出既相关又不重复的内容

3. MMR 的原理和公式解析

MMR 的标准公式表达如下(左右滑动):

其中:

  • :当前候选文档

  • :用户查询问题

  • :已选文档集合

  • :候选文档与查询问题的相关性得分

  • :候选文档  与某个已选文档  的相似度 (公式中会取  与所有已选文档  中最相似的那一个)

  • :平衡参数(0 ≤ λ ≤ 1)

    • λ = 1:完全关注相关性,忽视多样性。
    • λ = 0:完全关注多样性,忽视相关性。
    • 0 < λ < 1:在相关性和多样性之间进行平衡。

相关阅读:人工智能小白到高手:余弦相似度(Cosine Similarity)的简单理解

3.1 算法流程

  1. 初始化
  • 计算文档集合中所有文档与查询得分
  • 选择得分最高的文档
  • 加入已选集合
  • 迭代选择
    • 对剩余文档集合中的每个文档,计算:
    • 选择剩余文档MMR得分最高的文档加入集合

    3.2 举个例子:摘要任务中的 MMR

    假设我们有一篇长文章,要从中选出三句话组成一个简短摘要。我们手头有五个候选句子,编号:S1、S2、S3、S4、S5。

    假设我们设定平衡参数 

    1.初始化

    • 计算所有候选句子与用户问题的得分
    • 选择得分最高的句子S1 (假设 S1 是与查询 Q 相关性得分 () 最高的句子)
    • 将S1加入已选集合

    集合状态更新:

    已选集合: {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

    4. MMR 的应用场景

    4.1. 信息检索(比如搜索引擎的结果排序)

    你在搜索引擎上输入一个关键词,比如"ChatGPT 应用案例",后台系统一下子找到了几百上千条相关网页。

    如果我们只看"相关性",那前几条可能都是讲"教育场景下怎么用 ChatGPT"的,虽然都对,但你可能会觉得太集中、太重复了。

    用上 MMR 之后,系统就会在相关的基础上,让展示结果更有"层次":

    • 第一条是讲教育的,
    • 第二条可能是讲法律行业,
    • 第三条是开发者怎么集成 ChatGPT,
    • 第四条可能是讲它带来的伦理问题。

    4.2. 问答系统(从多个候选答案中挑出信息最丰富的)

    比如你问一个比较开放的问题,比如"人工智能未来会带来哪些改变?"

    系统可能从数据库或模型里找出了 10 个可能的回答。

    MMR 在这时候就能帮上忙:不是简单地把"重复最多"的答案往上排,而是挑出互补的信息,比如:

    • 一个说对就业的影响,
    • 一个说对教育的影响,
    • 一个说技术发展的潜力……

    其他还可以用到:推荐系统(避免推相似内容)、文本摘要(避免重复句子)

    5. 代码测试

    # 导入操作系统模块
    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可以执行翻译、摘要和问答等多种任务。')]

    5.1  标准相似度检索 (Top 5)

    这种策略旨在找出与查询最相似的文档。

    结果特点:

    • 高度相关:检索到的文档都与"大语言模型"的定义、架构和能力直接相关。
    • 潜在冗余:部分文档内容相似度较高,例如都提到了 Transformer 架构或自然语言处理能力。

    5.2  MMR检索 (lambda=0.3, k=5, fetch_k=10)

    较低的 lambda 值 (0.3) 更侧重于 多样性

    结果特点:

    • 平衡性:保留了最相关的文档,同时引入了更多不同方面的信息,如具体应用、训练方法和与 AI 的关系。
    • 较低冗余:相比纯相似度检索,结果的重复性较低。

    5.3  MMR检索 (lambda=0.7, k=5, fetch_k=10)

    较高的 lambda 值 (0.7) 更侧重于 相关性

    结果特点:

    • 高相关性:结果与标准相似度检索非常接近,保留了大部分最相似的文档。
    • 有限多样性:相比 lambda=0.3,多样性较低,但仍比纯相似度检索略高,引入了关于 LLM 具体任务的文档。

    MMR 的核心价值在于 提升结果的多样性,确保返回的内容既相关又有足够的多样性。在推荐系统、摘要生成、问答系统等多个场景中,MMR 都能有效避免重复,提升用户体验。

    53AI,企业落地大模型首选服务商

    产品:场景落地咨询+大模型应用平台+行业解决方案

    承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

    联系我们

    售前咨询
    186 6662 7370
    预约演示
    185 8882 0121

    微信扫码

    添加专属顾问

    回到顶部

    加载中...

    扫码咨询