最大邊際相關性MMR:提升RAG檢索結果的多樣性與實用性
在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) 可以有效地在相關性與多樣性之間取得平衡,優化檢索結果的質量,提升最終回答的豐富性和實用性。
1. MMR 是什么,它能解決什么問題?
Maximum Marginal Relevance(MMR) 是一種排序算法,主要用于在信息檢索、推薦系統和摘要生成等任務中,選擇既相關又不重復的內容。
放到RAG的場景中,傳統的排序方法往往只關注內容的相關性(即與查詢的匹配度)。但如果我們只是單純地根據相關性來排序,可能會出現以下問題:
- 重復內容:比如在推薦系統中,推薦的內容過于相似,用戶感受不到新鮮感。
- 信息不全面:有些系統可能過于關注某一個領域或話題,導致用戶只能看到片面的信息。
MMR 的核心思想是:在確保相關性的同時,增加多樣性,從而提供更全面、更豐富的結果。
簡單來說就是:在一堆候選內容里,優先選那些既跟用戶查詢相關、又跟已經選過的內容不重復的條目。
我們可以這么理解它的"目的"—— MMR = "給你想要的 + 避免你已經看過的"。
假設你正在使用一個新聞推薦系統,輸入了"人工智能"的關鍵詞。傳統的推薦系統可能推薦多篇關于"人工智能在醫療行業應用"的文章,而這些文章的內容高度相似。
使用 MMR 后,系統可能會推薦:
- 一篇講人工智能醫療應用的文章,
- 一篇講人工智能教育領域的文章,
- 一篇關于人工智能倫理問題的文章。
這樣,用戶既能獲得與主題相關的信息,又能了解該領域的不同視角,避免了重復。
2. MMR 的基本思想
這里面涉及到兩個關鍵詞:相關性(Relevance) 和 多樣性(Diversity)。這兩個聽起來像是在"打架",但其實在信息排序里,它們是缺一不可的搭檔。
相關性是基礎,但不夠
相關性很好理解,就是某個內容跟用戶查詢、興趣、目標之間的匹配程度。比如你搜"機器學習",當然不希望系統推"烘焙教程"給你。這就是相關性在起作用。
但如果系統一味追求相關性,就會出現一個問題:內容集中在一個點上,很快就"重復"了。你看著看著就會覺得:"這些不是都差不多嗎?"
多樣性讓信息更豐富
多樣性指的是結果之間的差異程度。如果推薦的每條內容都從不同角度切入,比如一個講原理、一個講應用、一個講未來趨勢,那你看完之后會感覺信息更全面、更有收獲。
相關性保證你"看對東西",多樣性保證你"看到不同的東西"。
全是相關但重復的內容,沒用;全是多樣但不相關的內容,也沒用。
所以,MMR 的目標就很明確了:
從一堆候選內容里,挑出那些既"與查詢高度相關",又"跟已經選過的內容不重復"的條目。
它在每一步選下一個內容時,都會去權衡:
- 這個內容本身和用戶需求有多匹配?
- 它是不是和我們已經選過的那些內容太像了?
MMR 做的就是在這兩者之間找一個平衡點。換句話說,它每次都想選一個"有新意"的好內容,而不是簡單地把"最相關的那幾個"一股腦推出來。
你可以把 MMR 想成一個"懂信息又懂用戶心理"的策展人:
它會說,"這個你可能還沒看過,但跟你想要的很有關,而且比之前那些不一樣,值的一看。"
因此,MMR 的核心目標是:選出既相關又不重復的內容。
3. MMR 的原理和公式解析
3.1 算法流程
3.2 舉個例子:摘要任務中的 MMR
假設我們有一篇長文章,要從中選出三句話組成一個簡短摘要。我們手頭有五個候選句子,編號:S1、S2、S3、S4、S5。
第一次迭代候選集合:
選擇MMR得分最高的句子S4加入已選集合
雖然S2和S3都很"相關",但S4的MMR得分最高,因此選擇S4。
集合狀態更新:
已選集合: {S1, S4}
候選集合: {S2, S3, S5}
第二次迭代候選集合:
選擇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 都能有效避免重復,提升用戶體驗。
本文轉載自???AI取經路???,作者:AI取經路
