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