【RAG】ragflow源碼亮點:文檔embedding向量化加權融合

引言:

最近在看ragflow源碼,其中有一個較為巧妙地設計:分別將 文字 、 標題 行向量化 之后,直接根據權重,進行加法運算,得到向量融合,增強了文本向量化的表示能力,這里開始討論一下,為什么這里可以直接對向量進行加法運算,而得到一個增強的表示

加權代碼片段:

title_w = 0.1 是標題的權重
tts 是標題進行embedding向量化后的矩陣
cnts 是將內容進行embedding向量化后的矩陣
vects 生成的最終的文檔向量

    vects = (title_w * tts + (1 - title_w) *cnts) if len(tts) == len(cnts) else cnts

目的:優化表示

單獨使用標題向量可能丟失細節(如標題 “報告” 無法區分是 “營收報告” 還是 “技術報告”);單獨使用內容向量可能因信息冗余導致主題模糊(如大段無關描述覆蓋核心主題)。通過加權融合,可彌補單一模態的缺陷。

完整embedding代碼

async def embedding(docs, mdl, parser_config=None, callback=None):if parser_config is None:parser_config = {}batch_size = 16tts, cnts = [], []for d in docs:tts.append(d.get("docnm_kwd", "Title"))c = "\n".join(d.get("question_kwd", []))if not c:c = d["content_with_weight"]c = re.sub(r"</?(table|td|caption|tr|th)( [^<>]{0,12})?>", " ", c)if not c:c = "None"cnts.append(c)tk_count = 0if len(tts) == len(cnts):vts, c = await trio.to_thread.run_sync(lambda: mdl.encode(tts[0: 1]))tts = np.concatenate([vts for _ in range(len(tts))], axis=0)tk_count += ccnts_ = np.array([])for i in range(0, len(cnts), batch_size):vts, c = await trio.to_thread.run_sync(lambda: mdl.encode([truncate(c, mdl.max_length-10) for c in cnts[i: i + batch_size]]))if len(cnts_) == 0:cnts_ = vtselse:cnts_ = np.concatenate((cnts_, vts), axis=0)tk_count += ccallback(prog=0.7 + 0.2 * (i + 1) / len(cnts), msg="")cnts = cnts_title_w = float(parser_config.get("filename_embd_weight", 0.1))vects = (title_w * tts + (1 - title_w) *cnts) if len(tts) == len(cnts) else cntsassert len(vects) == len(docs)vector_size = 0for i, d in enumerate(docs):v = vects[i].tolist()vector_size = len(v)d["q_%d_vec" % len(v)] = vreturn tk_count, vector_size

問題:為什么可以直接簡單地通過加法進行融合?

要理解“向量值的含義”和“加法為何能融合特征”,我們需要從語義向量空間的本質特征融合的數學邏輯兩個層面入手,結合具體場景(如文檔向量化)解釋:

一、向量值的本質:語義空間中的坐標

在自然語言處理(NLP)中,文本向量化(Embedding)的核心是將文本映射到一個高維語義空間中,向量的每個維度對應空間中的一個“語義特征”。==向量值(即每個維度的數值)本質是文本在該特征上的“得分” ==

舉個具體例子

假設我們有一個簡化的3維語義空間,三個維度分別代表:

  • 維度1:“技術”相關程度(數值越大,文本越可能涉及技術);
  • 維度2:“財務”相關程度(數值越大,文本越可能涉及財務);
  • 維度3:“時間”(數值越大,文本越可能涉及時間描述)。

現在有兩個文本:

  1. 標題:“2023年公司技術研發報告”
    其向量可能是 [0.8, 0.2, 0.7](表示:技術相關度80%,財務相關度20%,時間相關度70%)。
  2. 內容:“本年度研發投入5000萬元,用于AI算法優化”
    其向量可能是 [0.7, 0.6, 0.3](技術相關度70%,財務相關度60%,時間相關度30%)。

這里的每個數值(如0.8、0.2)并非絕對的“分數”,而是模型通過預訓練學習到的相對語義關聯程度。向量整體則表示文本在這個語義空間中的“位置”——相似文本會在空間中相鄰(向量余弦相似度高)。

二、為什么向量加法可以融合特征?

向量加法能融合特征的前提是:標題向量與內容向量在同一語義空間中(即由同一模型編碼,維度相同且每個維度的語義含義一致)。此時,加法操作的本質是將兩個向量在同一空間中的坐標按比例疊加,從而合并兩者的語義信息。

從數學角度看:線性疊加保留所有特征

假設標題向量為 ( \mathbf{T} = [t_1, t_2, …, t_n] ),內容向量為 ( \mathbf{C} = [c_1, c_2, …, c_n] ),融合后的向量為 ( \mathbf{V} = w*\mathbf{T} + (1-w)*\mathbf{C} )(( w ) 是標題權重)。

每個維度 ( v_i ) 的計算為:
[ v_i = w*t_i + (1-w)*c_i ]

這相當于:

  • 對標題在維度 ( i ) 的語義得分 ( t_i ),按權重 ( w ) 保留;
  • 對內容在維度 ( i ) 的語義得分 ( c_i ),按權重 ( (1-w) ) 保留;
  • 最終 ( v_i ) 是兩者的加權和,同時包含標題和內容在該維度的信息。
從語義角度看:互補信息的融合

回到前面的例子,標題和內容的向量各維度得分如下:

維度標題向量 ( \mathbf{T} )內容向量 ( \mathbf{C} )融合后 ( \mathbf{V} )(( w=0.3 ))
技術相關度0.80.7( 0.30.8 + 0.70.7 = 0.24 + 0.49 = 0.73 )
財務相關度0.20.6( 0.30.2 + 0.70.6 = 0.06 + 0.42 = 0.48 )
時間相關度0.70.3( 0.30.7 + 0.70.3 = 0.21 + 0.21 = 0.42 )

融合后的向量 ( \mathbf{V} = [0.73, 0.48, 0.42] ) 同時體現了:

  • 標題的“時間相關度高”(原0.7,融合后0.42);
  • 內容的“財務相關度高”(原0.6,融合后0.48);
  • 兩者共同的“技術相關度高”(原0.8和0.7,融合后0.73)。

這比單獨使用標題(可能忽略財務細節)或內容(可能弱化時間信息)的向量更全面。

三、為什么必須用同一模型編碼?

如果標題和內容用不同模型編碼(例如標題用模型A,內容用模型B),它們的向量可能不在同一語義空間(維度不同,或同一維度的語義含義不同)。此時加法無意義。

例如:

  • 模型A的維度1表示“技術相關度”;
  • 模型B的維度1可能表示“長度”(文本字數);
  • 兩者的維度1數值無法直接相加(一個是語義得分,一個是字數統計)。

而代碼中標題和內容均使用 mdl.encode(同一模型),確保了向量在同一空間中,加法操作才有語義意義。

總結

向量值的本質是文本在高維語義空間中的坐標,每個維度對應一個語義特征的“得分”。同一模型編碼的標題和內容向量處于同一空間,加法操作通過線性疊加合并了兩者在各維度的得分,從而融合了標題的概括性特征和內容的細節性特征。這就像將兩種顏色按比例混合——最終顏色同時保留了兩種顏色的成分,且比例由權重參數控制。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81379.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81379.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

限流系列:sentinel

目錄 滑動窗口算法 Sentinel 數據模型 示例 大致流程 ???????entry ???????entryWithPriority ???????FlowSlot.entry ???????checkFlow ???????canPass ???????avgUsedTokens ???????passQps ???????pa…

Java 訪問者模式深度重構:從靜態類型到動態行為的響應式設計實踐

一、訪問者模式的本質與核心價值 在軟件開發的漫長演進中&#xff0c;設計模式始終是架構師手中的利刃。當我們面對復雜對象結構上的多種操作需求時&#xff0c;訪問者模式&#xff08;Visitor Pattern&#xff09;猶如一把精密的手術刀&#xff0c;能夠優雅地分離數據結構與作…

UE 5 C++設置物體位置和旋轉,初始化虛幻引擎樣條線、加載引用虛幻編輯器中的藍圖、設置虛幻編輯器中Actor大小

一、設置物體位置和旋轉 UE.cpp文件中代碼&#xff1a; Mesh->SetWorldLocationAndRotation(FVector(50.0f, 50.0f, 50.0f),FRotator(0,-90,0)); vs代碼編輯器中旋轉信息順序&#xff08;yzx&#xff09;&#xff1a; Pitch、 Yaw、 Roll UE編輯器中旋轉信息順序&#xf…

【文本分類】KG-HTC 知識圖譜提升分類準確率

最近看到一篇論文“KG-HTC: Integrating Knowledge Graphs into LLMs for Effective Zero-shot Hierarchical Text Classification”&#xff0c;介紹了文本分類的技巧&#xff0c;這篇文航主要利用了知識圖譜大模型的思路&#xff0c;實驗效果不錯&#xff0c;里面的一些論述也…

三大微調技術對比:Prompt/Prefix/P-Tuning

Prompt Tuning、Prefix Tuning和P - Tuning的區別 概念方面: Prompt Tuning:在輸入序列前添加可訓練的額外Token以適配下游任務,預訓練語言模型參數不變。比如在文本分類中,在句子前加特定Token如“(OPINION)”,讓模型理解是對觀點進行分類的任務。Prefix Tuning:在每層T…

14.「實用」扣子(coze)教程 | Excel文檔自動批量AI文檔生成實戰,中級開篇

隨著AI編程工具及其能力的不斷發展&#xff0c;編程將變得越來越簡單。 在這個大趨勢下&#xff0c;大師兄判斷未來的編程將真正成為像office工具一樣的辦公必備技能。每個人通過 &#xff08;專業知識/資源編程&#xff09;將自己變成一個復合型的人才&#xff0c;大大提高生…

量子-經典協同計算新路徑:NISQ 時代混合算法對后量子密碼學的適應性探索

內容來源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨浪味仙 行業動向&#xff1a;3700字丨10分鐘閱讀 5 月 20 日&#xff0c;由北京量子院、清華大學、數學工程與先進計算國家重點實驗室、南洋理工大學、量子信息前沿科學中心…

CentOS中安裝Docker Compose

在CentOS中安裝Docker Compose的步驟如下&#xff1a; 步驟 1&#xff1a;確保Docker已安裝 Docker Compose依賴Docker環境&#xff0c;請先安裝Docker&#xff1a; # 添加Docker官方倉庫 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://downlo…

電商小程序店鋪詳情頁:頭部無限分類與篩選功能實現

電商小程序店鋪詳情頁:頭部無限分類與篩選功能實現 一、場景需求與技術選型二、頭部無限分類導航三、篩選功能實現:Picker多列選擇組件一、場景需求與技術選型 在電商小程序生態中,店鋪詳情頁作為用戶瀏覽商品的核心流量入口,其交互效率與功能完整性直接影響商品轉化率。傳…

Graph Neural Network(GNN)

我們首先要了解什么是圖,圖是由節點和邊組成的,邊的不一樣也導致節點的不同(參考化學有機分子中的碳原子) gnn可以處理classification的問題,也就是分類的問題 也可以處理generation的問題 借一部日劇來說明,這個日劇是講主角尋找殺害他父親的兇手的,劇中的人物有姓名和特征 …

FallbackHome的啟動流程(android11)

首次開機開機動畫播完進入Launcher桌面時黑屏進入Launcher,有黑屏不太美觀&#xff0c;在重啟以后會在進入桌面后會顯示android正在啟動等一會進入Launcher,這就是系統FallBackHome機制 接下來我們跟著代碼看下首次啟動系統如何進入FallbackHome的 在SystemServer的startOthe…

【EdgeYOLO】《EdgeYOLO: An Edge-Real-Time Object Detector》

Liu S, Zha J, Sun J, et al. EdgeYOLO: An edge-real-time object detector[C]//2023 42nd Chinese Control Conference (CCC). IEEE, 2023: 7507-7512. CCC-2023 源碼&#xff1a;https://github.com/LSH9832/edgeyolo 論文&#xff1a;https://arxiv.org/pdf/2302.07483 …

宮格導航--純血鴻蒙組件庫AUI

摘要&#xff1a; 宮格導航(A_GirdNav)&#xff1a;可設置導航數據&#xff0c;建議導航項超過16個&#xff0c;可設置“更多”圖標指向的頁面路由。最多顯示兩行&#xff0c;手機每行最多顯示4個圖標&#xff0c;折疊屏每行最多6個圖標&#xff0c;平板每行最多8個圖標。多余圖…

調試的按鈕

在Debug的時候&#xff0c;會有一些按鈕&#xff0c;我們需要知道它們各自的作用。 注&#xff1a;調試器本身并沒有一個直接的、可以撤銷已執行代碼效果的“返回上一步&#xff08;Undo Last Step&#xff09;”或“逆向執行&#xff08;Reverse Debugging&#xff09;”按鈕…

人工智能如何協助老師做課題

第一步&#xff1a;在騰訊元寶對話框中輸入如何協助老師做課題&#xff0c;通過提問&#xff0c;我們了解了老師做課題的步驟和建議。 第二步&#xff1a;開題報告提問&#xff0c;騰訊元寶對話框中&#xff0c;輸入“大單元視域下小學數學教學實踐研究課題開題報告。”......…

OpenGL Chan視頻學習-5 Vertex Attributes and Layouts in OpenGL

bilibili視頻鏈接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 一、知識點整理 1.1.OpenGL管線工作流程 為顯卡提供繪制的所有數據&#xff0c;并將數據存儲在GPU內存使用著色器&…

Linux_編輯器Vim基本使用

?? 歡迎大家來到小傘的大講堂?? &#x1f388;&#x1f388;養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; 所屬專欄&#xff1a;LInux_st 小傘的主頁&#xff1a;xiaosan_blog 制作不易&#xff01;點個贊吧&#xff01;&#xff01;謝謝喵&#xff01;&a…

MyBatis 高級映射功能詳解:處理復雜數據庫關系

MyBatis 的高級映射功能是其強大特性之一&#xff0c;它允許開發者輕松處理數據庫中的復雜關系&#xff0c;如一對一、一對多和多對多關系。本文將深入探討這些高級映射功能&#xff0c;包括映射配置方法、嵌套查詢和關聯查詢的使用&#xff0c;并通過示例代碼進行演示。 1.數據…

Halo:一個強大易用的國產開源建站工具

Halo 是一款國產開源的建站工具&#xff0c;適合快速搭建博客、論壇、知識庫、公司官網等多種類型的網站&#xff0c;目前在 GitHub 上已經獲得了 35.6k Star。 功能特性 Halo 核心功能與優勢包括&#xff1a; 插件架構&#xff1a;Halo 采用可插拔架構&#xff0c;功能模塊之…

Java-ArrayList集合的遍歷方式詳解

Java-ArrayList集合的遍歷方式詳解 二、ArrayList概述三、ArrayList的遍歷方式1. 普通for循環遍歷2. 增強for循環遍歷3. 迭代器遍歷4. ListIterator遍歷5. Java 8 Stream API遍歷 四、性能對比與分析性能測試結果分析 五、遍歷方式的選擇建議六、常見遍歷陷阱與注意事項1. 并發…