【RAG】向量?知識庫的底層原理:向量數據庫の技術鑒賞 | HNSW(導航小世界)、LSH、K-means

一、向量化表示的核心概念

1.1 特征空間與向量表示

  • 多維特征表示:通過多個特征維度(如體型、毛發長度、鼻子長短等)描述對象,每個對象對應高維空間中的一個坐標點,來表示狗這個對象,這樣可以區分出不同種類的狗狗;如果有些種類難以區分,還可以繼續擴充向量的維度。世界萬物都可以用這種方法表達。
  • 向量特性
    • 相似對象在特征空間中距離更近
    • 支持向量運算(如:警察-小偷 ≈ 貓-老鼠)
  • 典型應用場景
    • 以圖搜圖(圖片向量化)
    • 視頻推薦(視頻向量化)
    • 商品推薦(商品向量化)
    • 智能問答(文本向量化)
      image.png

1.2 向量數據庫特點

特性傳統數據庫向量數據庫
存儲結構數據表向量集合
查詢方式精確匹配相似度搜索
查詢結果確定值近似最近鄰

二、最近鄰問題(Nearest Neighbors)

2.1 暴力搜索(Flat Search)

  • 原理:線性掃描所有向量,計算與查詢向量的相似度
  • 相似度度量
    • 余弦相似度(向量夾角)
    • 歐氏距離(向量間距)
  • 優缺點
    • ? 100%準確率
    • ? O(n)時間復雜度
  • 暴力算法:優點是搜索質量是完美的,缺點是耗時;如果數據集小,搜索時間可以接受,那可以用。
- 優化思路:**縮小搜索范圍**,比如用【***聚類算法***】(比如k-means),【***哈希算法***】(位置敏感哈希)等,但不能不能保證是最近鄰的(除了暴搜能保證,其他都不能保證)

2.2 近似最近鄰搜索(ANN)(Approximate Nearest Neighbors)-提速度

2.2.1 基于聚類的方法(以K-Means為例)

  1. 隨機生成四個點,作為初始的聚類中心點,然后根據與中心點距離的遠近進行分類;
  2. 計算已有分類的平均點,該平均點作為中心點繼續分類,然后不斷重復,趨于收斂
# K-Means偽代碼
1. 隨機初始化k個中心點
2. while not converged:a. 將每個向量分配到最近的中心點b. 重新計算每個簇的中心點(均值)
3. 搜索時只需查詢最近簇內的向量
  • 優化技巧
    • 增加聚類數量(降低速度)
    • 查詢多個最近簇(降低速度)
  • 權衡:搜索質量 vs 搜索速度
    image.png

2.2.2 位置敏感哈希(LSH)(Locality Sensitive Hashing)

核心特性

  1. 高碰撞概率設計
  2. 相似向量更可能哈希到同桶
  • 哈希碰撞:由于輸入是固定長度的數據,而輸出是固定長度的哈希值,根據鴿巢原理,必然會出現數據不同而哈希值相同的情況,這叫碰撞。
  • 正常而言,哈希算法要盡可能減少碰撞的發生,而(對向量)位置敏感哈希函數-LSH則相反,盡可能讓位置相近的數據發生碰撞,然后根據哈希碰撞來進行分組,構建方法:隨機劃出直線分割平面,兩面的點分別增加意味0或1來表示
    image.png
    image.png
    隨機超平面哈希實現(隨機投影):
  1. 在d維空間中隨機生成超平面
  2. 根據向量在超平面哪側生成bit(1/0)
  3. 組合多個超平面結果生成二進制哈希碼
    在這里插入圖片描述

分段優化策略:合理地擴充

  • 將哈希碼分成m段
  • 只要任意一段匹配即作為候選
  • 顯著提高召回率
    image.png

積量化(Product Quantization)-省內存

問題:除了搜索速度,還有內存開銷問題

方法——量化(Quantization):降低向量本身大小,但產生碼本

聚類算法訓練——有損壓縮(圖片中每個像素點都被其所在分類質心點所替代)——在一定程度保留原始信息——給質心編碼,只需存儲單個編碼值,減少空間(把向量用質心編碼表示就是量化)——碼本

存在問題——維度災難:

維度增加(數據稀疏)——需要非常大的聚類數——維度災難——碼本指數級膨脹,超過了量化節約出來的內存,得不償失
進一步解決:高維分成低維(128->16–子空間需要的聚類數量小2^8)——拼接子向量——笛卡爾積——積量化PQ(Product Quantization)

NSW (Navigable Small World) - 犧牲內存,換取速度和質量

6人理論小世界——導航小世界nsw

需要手動建立圖結構

保證以下性質:

需要這個:德勞內三角剖分法

但是這個建立的圖結構搜索時候不一定很快速,所以nsw方法如下,
在隨機足夠放回向量的初始階段向量點非常的稀疏,很容易在距離較遠的點之間建立連接,通過長鏈接快速導航,再通過短鏈接精細化搜索
這就是NSW算法的大致工作原理,短連接滿足了德勞內三角,長鏈接幫助快速導航,妙在先粗快,后細慢

HNSW(Hierarchical NSW):分層的導航小世界

搜索時候從最上層進入,快速導航,逐步進入下一層,比 NSW 更可控穩定。缺點就是占用內存太大

三、關鍵技術對比

方法預處理成本查詢速度內存消耗準確性補充說明
暴力搜索100%線性掃描所有向量,保證結果完全準確,但時間復雜度高(O(n)),僅適用于小規模數據集。
K-Means聚類80-95%通過聚類縮小搜索范圍,犧牲少量精度換取速度。增加聚類數量可提高準確性,但會降低查詢速度。
LSH最快70-90%基于哈希碰撞的近似搜索,適合高維數據。分段策略可提高召回率,但內存開銷較大。
NSW85-98%基于圖結構的導航小世界,通過長鏈接快速導航、短鏈接精細化搜索。預處理成本低于HNSW,但穩定性稍差。
HNSW最快90-99%分層NSW,搜索時從頂層快速導航到底層,精度接近暴力搜索,但內存占用高,適合大規模實時場景和高維向量場景:既解決了高維數據的稀疏性問題,又避免了傳統方法因維度增長導致的性能崩塌,成為高維向量搜索的黃金標準
PQ(積量化)75-90%通過子空間量化和笛卡爾積壓縮向量,顯著節省內存,但需權衡精度損失。適合內存受限的部署場景。

關鍵總結

  1. 速度優先級:LSH ≈ HNSW > NSW > K-Means > PQ > 暴力搜索
  2. 內存優先級:PQ < 暴力搜索 < NSW < K-Means < HNSW < LSH
  3. 精度優先級:暴力搜索 > HNSW > NSW > K-Means > PQ > LSH

適用場景建議

  • 實時推薦/搜索:HNSW(高精度+高速)
  • 內存敏感型應用:PQ(如移動端、嵌入式設備)
  • 中等規模數據:NSW(平衡速度與內存)
  • 高維數據快速過濾:LSH(如去重、粗篩)
  • 小數據集或驗證場景:暴力搜索(確保100%準確率)

四、典型應用場景

  1. 大語言模型

    • 對話歷史向量化存儲
    • 實現"記憶檢索"功能
  2. 推薦系統

    • 用戶/商品聯合向量空間
    • 實時相似推薦
  3. 多媒體檢索

    • 跨模態向量搜索(圖→文,文→視頻)

以上是整理的筆記,筆記 pdf 下載 --》 【向量數據庫與近似最近鄰算法】-CSDN文庫
速覽b站原片!–》 【上集】向量數據庫技術鑒賞_嗶哩嗶哩_bilibili

我的其他文章

RAG調優|AI聊天|知識庫問答

  • 你是一名平平無奇的大三生,你投遞了簡歷和上線的項目鏈接,結果HR真打開鏈接看!結果還報錯登不進去QAQ!【RAG知識庫問答系統】新增模型混用提示和報錯排查【用戶反饋與優化-2025.04.28-CSDN博客
  • 你知不知道像打字機一樣的流式輸出效果是怎么實現的?AI聊天項目實戰經驗:流式輸出的前后端完整實現!圖文解說與源碼地址(LangcahinAI,RAG,fastapi,Vue,python,SSE)-CSDN博客
  • 【豆包寫的標題…】《震驚!重排序為啥是 RAG 調優殺手锏?大學生實戰項目,0 基礎也能白嫖學起來》(Langchain-CSDN博客
  • 【Langchain】RAG 優化:提高語義完整性、向量相關性、召回率–從字符分割到語義分塊 (SemanticChunker)-CSDN博客
    • 如何讓你的RAG-Langchain項目持久化對話歷史\保存到數據庫中_rag保存成數據庫-CSDN博客
  • 分享開源項目oneapi的部分API接口文檔【oneapi?你的大模型網關】-CSDN博客

Agent

  • 【MCP】哎只能在cursor中用MCP嗎?NONONO!三分鐘教你自己造一個MCP客戶端!-CSDN博客

docker

  • 【docker0基礎教學】手把手教你將你的本地項目進行docker部署-CSDN博客
  • 怎么把我的前后端項目通過docker部署到云服務器【手把手教學】-CSDN博客

前端

  • 面試官:你會怎么做前端web性能優化?我:.%*&.!-CSDN博客
  • CDN是啥?十分鐘讓Cloudflare免費為你的網站做CDN加速!-CSDN博客

nginx

  • Nginx 反向代理,啥是“反向代理“啊,為啥叫“反向“代理?而不叫“正向”代理?-CSDN博客
  • 關于nginx,負載均衡是什么?它能給我們的業務帶來什么?怎么去配置它?-CSDN博客

好用插件

  • 你想不想讓你寫的博客一鍵發布多平臺?!

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

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

相關文章

如何用CSS實現HTML元素的旋轉效果

原文&#xff1a;如何用CSS實現HTML元素的旋轉效果 | w3cschool筆記 &#xff08;本文為科普文章&#xff0c;請勿標記為付費&#xff09; 在網頁制作中&#xff0c;為 HTML 元素設置旋轉效果可使其更靈動&#xff0c;提升用戶體驗。本文將深入淺出地介紹如何利用 CSS 實現 H…

Spark集群搭建之Yarn模式

配置集群 1.上傳并解壓spark-3.1.2-bin-hadoop3.2.tgz&#xff0c;重命名解壓之后的目錄為spark-yarn。 2. 修改一下spark的環境變量&#xff0c;/etc/profile.d/my_env.sh 。 # spark 環境變量 export SPARK_HOME/opt/module/spark-yarn export PATH$PATH:$SPARK_HOME/bin:$SP…

xLua筆記

Generate Code干了什么 肉眼可見的&#xff0c;在Asset文件夾生成了XLua/Gen文件夾&#xff0c;里面有一些腳本。然后對加了[CSharpCallLua]的變量尋找引用&#xff0c;發現它被XLua/Gen/DelegatesGensBridge引用了。也可以在這里查哪些類型加了[CSharpCallLua]。 public over…

【tcp連接windows redis】

tcp連接windows redis 修改redis.conf 修改redis.conf bind * -::*表示禁用保護模式&#xff0c;允許外部網絡連接 protected-mode no

【序列貪心】擺動序列 / 最長遞增子序列 / 遞增的三元子序列 / 最長連續遞增序列

??個人主頁&#xff1a;小羊 ??所屬專欄&#xff1a;貪心算法 很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~ 目錄 擺動序列最長遞增子序列遞增的三元子序列最長連續遞增序列 擺動序列 擺動序列 貪心策略&#xff1a;統計出所有的極大值和極小…

STM32F103C8T6使用MLX90614模塊

首先說明&#xff1a; 1.SMBus和I2C的區別 我曾嘗試用江科大的I2C底層去直接讀取該模塊&#xff0c;但是無法成功&#xff0c;之后AI生成的的代碼也無法成功。 思來想去最大的可能就是SMBus這個協議的問題&#xff0c;根據百度得到的結果如下&#xff1a; SMBus和I2C的區別 鏈…

tp5 php獲取農歷年月日干支甲午

# 切換為國內鏡像源 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/# 再次嘗試安裝 composer require overtrue/chinese-calendar核心寫法一個農歷轉公歷&#xff0c;一個公歷轉農歷 農歷閏月可能被錯誤標記&#xff08;例如 閏四月 應表示…

Ubuntu搭建Conda+Python開發環境

目錄 一、環境說明 1、測試環境為ubuntu24.04.1 2、更新系統環境 3、安裝wget工具 4、下載miniconda安裝腳本 二、安裝步驟 1、安裝miniconda 2、source conda 3、驗證版本 4、配置pip源 三、conda用法 1、常用指令 一、環境說明 1、測試環境為ubuntu24.04.1 2、更…

Vscode+git筆記

1.U是untracked m是modify modified修改了的。 2.check out 查看觀察 3 status changed 暫存區 4.fetch v 取來拿來 5.orangion 起源代表遠程分支 git checkout就是可以理解為進入的意思。

模擬SIP終端向Freeswitch注冊用戶

1、簡介 使用go語言編寫一個程序&#xff0c;模擬SIP-T58終端在Freeswitch上注冊用戶 2、思路 以客戶端向服務端Freeswitch發起REGISTER請求&#xff0c;告知服務器當前的聯系地址構造SIP REGISTER請求 創建UDP連接&#xff0c;連接到Freeswitch的5060端口發送初始的REGISTER請…

DeepSeek實戰--LLM微調

1.為什么是微調 &#xff1f; 微調LLM&#xff08;Fine-tuning Large Language Models&#xff09; 是指基于預訓練好的大型語言模型&#xff08;如GPT、LLaMA、PaLM等&#xff09;&#xff0c;通過特定領域或任務的數據進一步訓練&#xff0c;使其適應具體需求的過程。它是將…

Docker與WSL2如何清理

文章目錄 Docker與WSL2如何清理一、docker占據磁盤空間核心原因分析1. WSL2 虛擬磁盤的動態擴展特性2. Docker 鏡像分層緩存與未清理資源 二、解決方案步驟 1&#xff1a;清理 Docker 未使用的資源步驟 2&#xff1a;手動壓縮 WSL2 虛擬磁盤1. 關閉 WSL2 和 Docker Desktop2. 定…

在 IDEA 中寫 Spark 程序:從入門到實踐

在大數據處理領域&#xff0c;Apache Spark 憑借其出色的性能和豐富的功能受到廣泛歡迎。而 IntelliJ IDEA 作為一款功能強大的 Java 集成開發環境&#xff0c;為編寫 Spark 程序提供了極大的便利。本文將詳細介紹如何在 IDEA 中搭建 Spark 開發環境并編寫運行 Spark 程序&…

Unity 使用 ADB 實時查看手機運行性能

Unity 使用 ADB 實時查看手機運行性能 前言操作步驟ADB工具下載ADB工具配置手機進入開發者模式并開啟USB調試使用ADB連接手機Unity打包設置使用Profiler實時查看性能情況優化建議 常見問題 前言 通過 ADB&#xff08;Android Debug Bridge&#xff09;連接安卓設備&#xff0c…

深入理解 HttpExchange_Java 中構建 HTTP 服務的基礎組件

1. 引言 1.1 Java 中的輕量級 HTTP 服務需求 隨著微服務、工具類應用和嵌入式系統的興起,開發者對輕量級 HTTP 服務的需求日益增長。相比引入龐大的框架(如 Spring Boot),使用 JDK 原生 API 構建 HTTP 服務成為一種快速、低依賴的替代方案。 JDK 提供了 com.sun.net.htt…

【RocketMQ NameServer】- NameServer 啟動源碼

文章目錄 1. 前言2. RocketMQ 通信架構3. NameServer 啟動流程3.1 創建 NameServerController3.2 啟動 NameServerController3.3 NamesrvController#initialize3.3.1 Netty 通信的整體流程3.3.2 創建 NettyRemotingServer 3.4 this.remotingServer.start()3.4.1 this.remotingS…

【算法題】荷蘭國旗問題[力扣75題顏色分類] - JAVA

一、題目 二、文字解釋 1.1 前言 本題是經典的「荷蘭國旗問題」&#xff0c;由計算機科學家 Edsger W. Dijkstra 首先提出。如同圖中所示的荷蘭國旗&#xff0c;其由紅、白、藍三色水平排列組成。在算法領域&#xff0c;該問題可類比為將一個由特定的三種元素&#xff08;可抽…

MySQL數據操作全攻略:DML增刪改與DQL高級查詢實戰指南

知識點4【MySQL的DDL】 DDL&#xff1a;主要管理數據庫、表、列等操作。 庫→表&#xff08;二維&#xff09;→列&#xff08;一維&#xff09; 數據表的第一行是 列名稱 數據庫是由一張或多張表組成 我們先學習在數據庫中創建數據表 0、常見的數據類型&#xff1a; 1、…

AtCoder AT_abc404_g [ABC404G] Specified Range Sums

前言 賽時想到了差分約束&#xff0c;隨手寫了個 SPFA 結果掛的很慘……還是太菜了&#xff0c;賽后 Bellman-Ford 又調了半天。 題目大意 給定整數 N , M N,M N,M 和長度為 M M M 的三個整數序列 L ( L 1 , L 2 , … , L M ) , R ( R 1 , R 2 , … , R M ) , S ( S 1…

如何基于HAL庫進行STM32開發

一、初識HAL庫 STM32 開發中常說的 HAL 庫開發&#xff0c;指的是利用 HAL 庫固件包里封裝好的 C 語言編寫的驅動文件&#xff0c;來實現對 STM32 內部和外圍設備的控制。但只有 HAL 庫還不能直接驅動一個 STM32 的芯片&#xff0c;其它的組件已經由 ARM 與眾多芯片硬件、軟件廠…