最大邊際相關(guān)性MMR:提升RAG檢索結(jié)果的多樣性與實用性
在RAG系統(tǒng)中,僅靠向量相似度檢索容易造成信息重復(fù)或片面。為提升回答的多樣性與覆蓋度,引入MMR(Maximum Marginal Relevance)算法能有效在“相關(guān)性”與“多樣性”之間取得平衡,從而挑選出既相關(guān)又不重復(fù)的信息,提升系統(tǒng)輸出的質(zhì)量與實用性。
- 1. MMR 是什么,它能解決什么問題?
- 2. MMR 的基本思想
- 3. MMR 的原理和公式解析
3.1 算法流程
3.2 舉個例子:摘要任務(wù)中的 MMR
- 4. MMR 的應(yīng)用場景
4.1. 信息檢索(比如搜索引擎的結(jié)果排序)
4.2. 問答系統(tǒng)(從多個候選答案中挑出信息最豐富的)
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)系統(tǒng)中,檢索階段決定了最終生成內(nèi)容的"信息來源"。
但僅靠向量相似度進行 top-k 檢索,可能會出現(xiàn)內(nèi)容重復(fù)、信息集中于單一角度的問題,導致模型生成的回答缺乏多樣性和覆蓋度。這時,僅僅"相關(guān)"還不夠,我們更希望檢索結(jié)果是"既相關(guān)又多樣"。
為了解決這個問題,引入 Maximum Marginal Relevance(MMR) 可以有效地在相關(guān)性與多樣性之間取得平衡,優(yōu)化檢索結(jié)果的質(zhì)量,提升最終回答的豐富性和實用性。
1. MMR 是什么,它能解決什么問題?
Maximum Marginal Relevance(MMR) 是一種排序算法,主要用于在信息檢索、推薦系統(tǒng)和摘要生成等任務(wù)中,選擇既相關(guān)又不重復(fù)的內(nèi)容。
放到RAG的場景中,傳統(tǒng)的排序方法往往只關(guān)注內(nèi)容的相關(guān)性(即與查詢的匹配度)。但如果我們只是單純地根據(jù)相關(guān)性來排序,可能會出現(xiàn)以下問題:
- 重復(fù)內(nèi)容:比如在推薦系統(tǒng)中,推薦的內(nèi)容過于相似,用戶感受不到新鮮感。
- 信息不全面:有些系統(tǒng)可能過于關(guān)注某一個領(lǐng)域或話題,導致用戶只能看到片面的信息。
MMR 的核心思想是:在確保相關(guān)性的同時,增加多樣性,從而提供更全面、更豐富的結(jié)果。
簡單來說就是:在一堆候選內(nèi)容里,優(yōu)先選那些既跟用戶查詢相關(guān)、又跟已經(jīng)選過的內(nèi)容不重復(fù)的條目。
我們可以這么理解它的"目的"—— MMR = "給你想要的 + 避免你已經(jīng)看過的"。
假設(shè)你正在使用一個新聞推薦系統(tǒng),輸入了"人工智能"的關(guān)鍵詞。傳統(tǒng)的推薦系統(tǒng)可能推薦多篇關(guān)于"人工智能在醫(yī)療行業(yè)應(yīng)用"的文章,而這些文章的內(nèi)容高度相似。
使用 MMR 后,系統(tǒng)可能會推薦:
- 一篇講人工智能醫(yī)療應(yīng)用的文章,
- 一篇講人工智能教育領(lǐng)域的文章,
- 一篇關(guān)于人工智能倫理問題的文章。
這樣,用戶既能獲得與主題相關(guān)的信息,又能了解該領(lǐng)域的不同視角,避免了重復(fù)。
2. MMR 的基本思想
這里面涉及到兩個關(guān)鍵詞:相關(guān)性(Relevance) 和 多樣性(Diversity)。這兩個聽起來像是在"打架",但其實在信息排序里,它們是缺一不可的搭檔。
相關(guān)性是基礎(chǔ),但不夠
相關(guān)性很好理解,就是某個內(nèi)容跟用戶查詢、興趣、目標之間的匹配程度。比如你搜"機器學習",當然不希望系統(tǒng)推"烘焙教程"給你。這就是相關(guān)性在起作用。
但如果系統(tǒng)一味追求相關(guān)性,就會出現(xiàn)一個問題:內(nèi)容集中在一個點上,很快就"重復(fù)"了。你看著看著就會覺得:"這些不是都差不多嗎?"
多樣性讓信息更豐富
多樣性指的是結(jié)果之間的差異程度。如果推薦的每條內(nèi)容都從不同角度切入,比如一個講原理、一個講應(yīng)用、一個講未來趨勢,那你看完之后會感覺信息更全面、更有收獲。
相關(guān)性保證你"看對東西",多樣性保證你"看到不同的東西"。
全是相關(guān)但重復(fù)的內(nèi)容,沒用;全是多樣但不相關(guān)的內(nèi)容,也沒用。
所以,MMR 的目標就很明確了:
從一堆候選內(nèi)容里,挑出那些既"與查詢高度相關(guān)",又"跟已經(jīng)選過的內(nèi)容不重復(fù)"的條目。
它在每一步選下一個內(nèi)容時,都會去權(quán)衡:
- 這個內(nèi)容本身和用戶需求有多匹配?
- 它是不是和我們已經(jīng)選過的那些內(nèi)容太像了?
MMR 做的就是在這兩者之間找一個平衡點。換句話說,它每次都想選一個"有新意"的好內(nèi)容,而不是簡單地把"最相關(guān)的那幾個"一股腦推出來。
你可以把 MMR 想成一個"懂信息又懂用戶心理"的策展人:
它會說,"這個你可能還沒看過,但跟你想要的很有關(guān),而且比之前那些不一樣,值的一看。"
因此,MMR 的核心目標是:選出既相關(guān)又不重復(fù)的內(nèi)容。
3. MMR 的原理和公式解析
3.1 算法流程
3.2 舉個例子:摘要任務(wù)中的 MMR
假設(shè)我們有一篇長文章,要從中選出三句話組成一個簡短摘要。我們手頭有五個候選句子,編號:S1、S2、S3、S4、S5。
第一次迭代候選集合:
選擇MMR得分最高的句子S4加入已選集合
雖然S2和S3都很"相關(guān)",但S4的MMR得分最高,因此選擇S4。
集合狀態(tài)更新:
已選集合: {S1, S4}
候選集合: {S2, S3, S5}
第二次迭代候選集合:
選擇MMR得分最高的句子S3加入已選集合
在剩余的句子中,S3的MMR得分最高(0.405),因此選擇S3。
集合狀態(tài)更新:
已選集合: {S1, S4, S3}
候選集合: {S2, S5}
最終選出的3句話為:S1, S4, S3
4. MMR 的應(yīng)用場景
4.1. 信息檢索(比如搜索引擎的結(jié)果排序)
你在搜索引擎上輸入一個關(guān)鍵詞,比如"ChatGPT 應(yīng)用案例",后臺系統(tǒng)一下子找到了幾百上千條相關(guān)網(wǎng)頁。
如果我們只看"相關(guān)性",那前幾條可能都是講"教育場景下怎么用 ChatGPT"的,雖然都對,但你可能會覺得太集中、太重復(fù)了。
用上 MMR 之后,系統(tǒng)就會在相關(guān)的基礎(chǔ)上,讓展示結(jié)果更有"層次":
- 第一條是講教育的,
- 第二條可能是講法律行業(yè),
- 第三條是開發(fā)者怎么集成 ChatGPT,
- 第四條可能是講它帶來的倫理問題。
4.2. 問答系統(tǒng)(從多個候選答案中挑出信息最豐富的)
比如你問一個比較開放的問題,比如"人工智能未來會帶來哪些改變?"
系統(tǒng)可能從數(shù)據(jù)庫或模型里找出了 10 個可能的回答。
MMR 在這時候就能幫上忙:不是簡單地把"重復(fù)最多"的答案往上排,而是挑出互補的信息,比如:
- 一個說對就業(yè)的影響,
- 一個說對教育的影響,
- 一個說技術(shù)發(fā)展的潛力……
其他還可以用到:推薦系統(tǒng)(避免推相似內(nèi)容)、文本摘要(避免重復(fù)句子)
5. 代碼測試
# 導入操作系統(tǒng)模塊
import os
# 設(shè)置OpenAI API密鑰
# 注意:在實際應(yīng)用中,請勿硬編碼API密鑰。建議使用環(huán)境變量或其他安全方式管理密鑰。
OPENAI_API_KEY = 'hk-iwtbie4a91e427'# 示例密鑰,請?zhí)鎿Q為您自己的有效密鑰
# 將API密鑰設(shè)置為環(huán)境變量
os.environ['OpenAI_API_KEY'] = OPENAI_API_KEY
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
# 定義一個包含示例文本的列表,這些文本將被嵌入并存儲到向量數(shù)據(jù)庫中
texts = [
"大語言模型(LLM)是基于Transformer架構(gòu)的深度學習模型。", # 關(guān)于LLM的定義
"LLM的核心是Transformer架構(gòu),這是一種強大的深度學習技術(shù)。", # 與上一句相似
"基于Transformer的LLM在自然語言處理任務(wù)中表現(xiàn)出色。", # 與第一句相似
"LLM通過在海量文本數(shù)據(jù)上進行預(yù)訓練來學習語言模式。", # LLM的訓練方式
"預(yù)訓練使得LLM能夠掌握豐富的語言知識和世界常識。", # 與上一句相似
"LLM展現(xiàn)出強大的自然語言理解和生成能力。", # LLM的能力
"理解和生成自然語言是LLM的核心功能之一。", # 與上一句相似
"像GPT-4這樣的LLM可以執(zhí)行翻譯、摘要和問答等多種任務(wù)。", # LLM的應(yīng)用
"LLM在文本翻譯、內(nèi)容摘要和智能問答方面有廣泛應(yīng)用。", # 與上一句相似
"人工智能(AI)是一個更廣泛的領(lǐng)域,LLM是其中的一個子集。", # LLM與AI的關(guān)系
"AI的目標是創(chuàng)造能夠像人類一樣思考和行動的機器。"# AI的目標
]
# 初始化OpenAI嵌入模型,指定模型名稱和API基礎(chǔ)URL
embeddings = OpenAIEmbeddings(model="text-embedding-3-large", base_url="https://api.openai-hk.com/v1")
# 使用Chroma類的from_texts方法創(chuàng)建向量存儲
vectorstore = Chroma.from_texts(
texts=texts, # 需要嵌入和存儲的文本列表
embedding=embeddings, # 用于生成嵌入的嵌入模型實例
persist_directory="./chroma_db"# 指定持久化存儲向量數(shù)據(jù)的目錄
)
# 定義一個查詢字符串,用于在向量數(shù)據(jù)庫中進行搜索
query = '什么是大語言模型以及它們能做什么?'
print("========================= 相似度檢索 ============================")
# 使用向量存儲的similarity_search方法執(zhí)行相似度檢索
t1 = vectorstore.similarity_search(query, k=5) # k=5表示返回最相似的5個結(jié)果
# 打印相似度檢索的結(jié)果
print(t1)
# 標識MMR檢索(lambda=0.3)部分的開始
print("========================= MMR lambda=0.3 ============================")
# 使用向量存儲的max_marginal_relevance_search方法執(zhí)行MMR檢索
t2 = vectorstore.max_marginal_relevance_search(query, k=5, fetch_k=10, lambda_mult=0.3)
# k=5表示最終返回5個結(jié)果,fetch_k=10表示初始獲取10個相似結(jié)果進行MMR計算,lambda_mult=0.3控制多樣性與相似度的權(quán)衡
# 打印MMR檢索(lambda=0.3)的結(jié)果
print(t2)
# 標識MMR檢索(lambda=0.7)部分的開始
print("========================= MMR lambda=0.7 ============================")
# 使用向量存儲的max_marginal_relevance_search方法執(zhí)行MMR檢索
t3 = vectorstore.max_marginal_relevance_search(query, k=5, fetch_k=10, lambda_mult=0.7)
# k=5表示最終返回5個結(jié)果,fetch_k=10表示初始獲取10個相似結(jié)果進行MMR計算,lambda_mult=0.7控制多樣性與相似度的權(quán)衡
# 打印MMR檢索(lambda=0.7)的結(jié)果
print(t3)
運行結(jié)果:
========================= 相似度檢索 =============================
[Document(id='76a37d7d-4f9e-43ca-8ca1-396fd5a956bc', metadata={}, page_content='大語言模型(LLM)是基于Transformer架構(gòu)的深度學習模型。'),
Document(id='9f76337c-3f6c-4c14-81e5-399338e30938', metadata={}, page_content='LLM通過在海量文本數(shù)據(jù)上進行預(yù)訓練來學習語言模式。'),
Document(id='23717671-2353-4daa-a30f-80ce191cfb90', metadata={}, page_content='理解和生成自然語言是LLM的核心功能之一。'),
Document(id='f5a64fe0-b616-4a02-b932-ea1d6f7a1217', metadata={}, page_content='LLM展現(xiàn)出強大的自然語言理解和生成能力。'),
Document(id='c6237dc4-4087-4eee-b838-a2392a3ef993', metadata={}, page_content='基于Transformer的LLM在自然語言處理任務(wù)中表現(xiàn)出色。')]
========================= MMR lambda=0.3 =============================
[Document(id='76a37d7d-4f9e-43ca-8ca1-396fd5a956bc', metadata={}, page_content='大語言模型(LLM)是基于Transformer架構(gòu)的深度學習模型。'),
Document(id='f5a64fe0-b616-4a02-b932-ea1d6f7a1217', metadata={}, page_content='LLM展現(xiàn)出強大的自然語言理解和生成能力。'),
Document(id='4a3a8219-8065-4d74-b7ce-187f16e87ecf', metadata={}, page_content='像GPT-4這樣的LLM可以執(zhí)行翻譯、摘要和問答等多種任務(wù)。'),
Document(id='fc2b9c7a-c63c-4c7b-a153-eece2d6bb02e', metadata={}, page_content='預(yù)訓練使得LLM能夠掌握豐富的語言知識和世界常識。'),
Document(id='d0cbe326-c4c0-4252-9636-eef7bed06379', metadata={}, page_content='人工智能(AI)是一個更廣泛的領(lǐng)域,LLM是其中的一個子集。')]
========================= MMR lambda=0.7 =============================
[Document(id='76a37d7d-4f9e-43ca-8ca1-396fd5a956bc', metadata={}, page_content='大語言模型(LLM)是基于Transformer架構(gòu)的深度學習模型。'),
Document(id='9f76337c-3f6c-4c14-81e5-399338e30938', metadata={}, page_content='LLM通過在海量文本數(shù)據(jù)上進行預(yù)訓練來學習語言模式。'),
Document(id='23717671-2353-4daa-a30f-80ce191cfb90', metadata={}, page_content='理解和生成自然語言是LLM的核心功能之一。'),
Document(id='f5a64fe0-b616-4a02-b932-ea1d6f7a1217', metadata={}, page_content='LLM展現(xiàn)出強大的自然語言理解和生成能力。'),
Document(id='4a3a8219-8065-4d74-b7ce-187f16e87ecf', metadata={}, page_content='像GPT-4這樣的LLM可以執(zhí)行翻譯、摘要和問答等多種任務(wù)。')]
5.1 標準相似度檢索 (Top 5)
這種策略旨在找出與查詢最相似的文檔。
結(jié)果特點:
- 高度相關(guān):檢索到的文檔都與"大語言模型"的定義、架構(gòu)和能力直接相關(guān)。
- 潛在冗余:部分文檔內(nèi)容相似度較高,例如都提到了 Transformer 架構(gòu)或自然語言處理能力。
5.2 MMR檢索 (lambda=0.3, k=5, fetch_k=10)
較低的 ??lambda?
? 值 (0.3) 更側(cè)重于 多樣性。
結(jié)果特點:
- 平衡性:保留了最相關(guān)的文檔,同時引入了更多不同方面的信息,如具體應(yīng)用、訓練方法和與 AI 的關(guān)系。
- 較低冗余:相比純相似度檢索,結(jié)果的重復(fù)性較低。
5.3 MMR檢索 (lambda=0.7, k=5, fetch_k=10)
較高的 ??lambda?
? 值 (0.7) 更側(cè)重于 相關(guān)性。
結(jié)果特點:
- 高相關(guān)性:結(jié)果與標準相似度檢索非常接近,保留了大部分最相似的文檔。
- 有限多樣性:相比?
?lambda=0.3?
?,多樣性較低,但仍比純相似度檢索略高,引入了關(guān)于 LLM 具體任務(wù)的文檔。
MMR 的核心價值在于 提升結(jié)果的多樣性,確保返回的內(nèi)容既相關(guān)又有足夠的多樣性。在推薦系統(tǒng)、摘要生成、問答系統(tǒng)等多個場景中,MMR 都能有效避免重復(fù),提升用戶體驗。
本文轉(zhuǎn)載自???AI取經(jīng)路???,作者:AI取經(jīng)路
