【AI大模型】RAG系統組件:向量數據庫(ChromaDB)

?RAG 系統中的關鍵組件:向量數據庫(Vector Database),并以?ChromaDB?為例進行說明。

什么是向量數據庫?

  • 核心概念:?向量數據庫是一種專門設計用于高效存儲、索引和檢索高維向量的數據庫。

  • 向量是什么??在 AI 和機器學習領域,文本、圖像、音頻等非結構化數據通常會被嵌入模型(如文本嵌入模型)轉換為高維數值向量(通常幾百到幾千維)。這些向量捕獲了數據的語義信息。

  • 為什么需要??傳統關系型數據庫(如 MySQL, PostgreSQL)或 NoSQL 數據庫在處理高維向量的相似性搜索(如最近鄰搜索)時效率非常低,無法滿足 RAG 等實時應用的需求。

  • 關鍵能力:

    • 高效相似性搜索:?快速找到與查詢向量最相似的向量(基于余弦相似度、歐幾里得距離等)。

    • 高維索引:?使用專門算法(如 HNSW, Annoy, IVF-PQ 等)對海量高維向量建立索引,加速搜索。

    • 元數據存儲與過濾:?存儲與向量關聯的原始數據(文本片段)及其元數據(來源、日期、作者等),并支持在相似性搜索的同時進行元數據過濾(如 "查找與查詢相似的、發布于 2023 年之后的文檔片段")。

    • 可擴展性:?能夠處理數十億級別的向量。

向量數據庫在 RAG 系統中的作用

RAG(Retrieval-Augmented Generation)系統通過在生成答案前從知識庫中檢索相關信息,顯著提升了大語言模型(LLM)的知識準確性和時效性。向量數據庫是 RAG?檢索階段的核心引擎:

  1. 知識庫向量化:

    • 將 RAG 知識庫中的所有文檔切分成較小的文本片段(Chunks)。

    • 使用嵌入模型將每個文本片段轉換為其對應的向量表示(Embedding Vector)

    • 將這些向量及其關聯的文本片段(和元數據)存儲到向量數據庫中。

  2. 用戶查詢向量化:

    • 當用戶提出查詢(Query)時,使用同一個嵌入模型將該查詢轉換為一個查詢向量(Query Vector)

  3. 相似性檢索:

    • 向量數據庫執行最近鄰搜索:在存儲的所有向量中,快速查找與查詢向量最相似的 K 個向量(K 通常由應用決定)。

    • 相似性衡量的是查詢與知識片段在語義空間上的接近程度。

  4. 返回相關上下文:

    • 向量數據庫返回與這 K 個最相似向量關聯的原始文本片段(以及可能的元數據)。

    • 這些文本片段就是 RAG 系統認為與用戶查詢最相關的上下文信息。

  5. LLM 生成答案:

    • RAG 系統將用戶查詢和檢索到的相關文本片段一起輸入給大語言模型(LLM)。

    • LLM 基于查詢和提供的上下文信息,生成最終的回答。

總結其在 RAG 中的角色:向量數據庫是 RAG 系統的“記憶”和“搜索引擎”,負責快速、準確地根據語義相似性從海量知識片段中找出最相關的信息,供 LLM 參考生成答案。

ChromaDB:一個輕量級、開源的向量數據庫

ChromaDB 是一個專門為 AI 應用(尤其是 LLM 應用)設計的開源嵌入向量數據庫。它因其簡單性、易用性和與 Python/Javascript 生態的良好集成而受到歡迎,非常適合快速原型開發和中小規模應用。

ChromaDB 的核心特性

  1. 輕量級 & 嵌入式:

    • 核心是一個 Python/JS 庫,可以直接集成到你的應用程序代碼中運行,無需復雜的獨立服務器部署(也支持客戶端/服務器模式)。

    • 依賴少,安裝 (pip install chromadb) 和啟動非常快速。

  2. 簡單易用的 API:

    • 提供直觀的 Python 和 Javascript API,設計簡潔,學習曲線平緩。核心操作集中在幾個主要概念上(Collection, Document, Embedding, Query)。

  3. 內存優先:

    • 默認在內存中運行,性能極高,非常適合開發和測試。

    • 支持持久化到磁盤(如本地文件、ClickHouse),方便保存狀態。

  4. 內置嵌入函數支持:

    • 預集成了一些流行的開源文本嵌入模型(如?all-MiniLM-L6-v2,?multi-qa-MiniLM-L6-cos-v1),開箱即用。

    • 也允許輕松集成任何自定義嵌入模型或第三方 API(如 OpenAI Embeddings)。

  5. 元數據存儲與過濾:

    • 可以為每個文檔存儲豐富的元數據(字典形式)。

    • 支持在執行相似性搜索時,根據元數據進行高效的過濾(where?條件)。

  6. LangChain & LlamaIndex 集成:

    • 與流行的 LLM 應用框架 LangChain 和 LlamaIndex 深度集成,可以非常方便地將其用作 RAG 或其他鏈(Chains)的檢索器(Retriever)。

  7. 支持多種距離函數:?如余弦相似度、L2 歐幾里得距離等。

  8. 開源 (Apache 2.0):?代碼公開,社區驅動,可自由使用和修改。

ChromaDB 的核心概念

  1. Collection:

    • 是 ChromaDB 中組織數據的主要容器,類似于關系數據庫中的“表”。

    • 一個 Collection 包含:

      • Embeddings:?存儲的向量。

      • Documents:?與向量關聯的原始文本(字符串)。每個向量對應一個文檔。

      • Metadatas:?與每個文檔關聯的元數據(字典列表)。用于過濾。

      • IDs:?每個文檔/向量的唯一標識符(字符串列表)。

  2. Document:

    • 指存儲在 Collection 中的一段文本數據及其關聯信息(ID, Metadata)。

  3. Embedding:

    • 指文本數據通過嵌入模型轉換后的高維向量表示。

  4. Query:

    • 向 Collection 提交查詢。包括:

      • query_texts?或?query_embeddings: 查詢文本(會被自動嵌入)或直接提供查詢向量。

      • n_results: 要返回的最相似結果數量。

      • where: 用于過濾結果的元數據條件字典。

ChromaDB 的基本工作流程 (以 RAG 知識庫構建和查詢為例)

  1. 初始化客戶端 & 創建/獲取 Collection:

    import chromadb
    client = chromadb.Client()  # 默認使用內存模式
    # 創建或獲取一個名為 "rag_knowledge_base" 的 collection
    collection = client.create_collection(name="rag_knowledge_base")
    # 或者獲取已存在的 collection: collection = client.get_collection(name="rag_knowledge_base")

  2. 添加文檔到知識庫 (Indexing):

    # 假設你有文本片段列表 `texts`, 對應的 ID 列表 `ids`, 和元數據列表 `metadatas` (可選)
    documents = ["This is a document about cats.", "Another document about dogs.", ...]
    ids = ["doc1", "doc2", ...]
    metadatas = [{"source": "book1", "page": 10}, {"source": "article2", "author": "Alice"}, ...]# 添加文檔。ChromaDB 會自動使用默認或指定的嵌入模型將它們轉換為向量存儲。
    collection.add(documents=documents,metadatas=metadatas,ids=ids
    )

  3. 查詢知識庫 (Retrieval for RAG):

    user_query = "What are the characteristics of Siamese cats?"# 執行查詢:查找與用戶查詢最相似的 3 個文檔片段
    results = collection.query(query_texts=[user_query],n_results=3,# 可選:添加元數據過濾,例如只搜索來源是 "book1" 的內容# where={"source": "book1"}
    )# results 是一個字典,包含匹配的文檔、距離、元數據、ID 等
    retrieved_documents = results['documents'][0]  # 因為query_texts是單元素列表,取第一個結果集
    retrieved_metadatas = results['metadatas'][0]
    print(retrieved_documents)  # 打印出最相關的三個文本片段

  4. (RAG后續步驟) 將?user_query?和?retrieved_documents?一起喂給 LLM 生成最終答案。

ChromaDB 的優勢與適用場景

  • 優勢:

    • 極速上手:?安裝簡單,API 直觀,幾分鐘內就能跑通一個 RAG 示例。

    • 開發效率高:?嵌入式設計讓開發和調試無縫銜接。

    • 輕量靈活:?資源占用小,適合原型、實驗和中小規模應用。

    • 與 AI 生態融合好:?對 LangChain/LlamaIndex 的支持使其易于融入現有 LLM 應用棧。

    • 開源免費:?無商業限制或費用。

  • 適用場景:

    • 快速構建 RAG 原型或 Demo。

    • 個人項目或小型團隊應用。

    • 本地開發、測試和實驗環境。

    • 需要輕量級、嵌入式向量存儲的場景。

    • 作為學習向量數據庫和 RAG 原理的入門工具。

ChromaDB 的局限性與考慮因素

  1. 可擴展性與生產就緒性:

    • 默認內存模式限制了數據集大小(受可用 RAM 限制)。

    • 雖然支持持久化(本地文件系統、ClickHouse),但其分布式能力、高可用性、企業級運維工具相比 Pinecone, Weaviate, Qdrant, Milvus/Zilliz Cloud 等成熟的托管或自托管向量數據庫還有差距。對于超大規模(十億級以上向量)、超高 QPS 或嚴格的生產 SLA 要求,需要仔細評估或考慮其他方案。

  2. 高級功能:

    • 相比一些競爭對手,可能缺少某些高級功能,如更復雜的多模態支持、更精細的訪問控制、更強大的分布式架構、更豐富的監控指標等。

  3. 性能優化:

    • 在極端大規模數據下,索引構建速度和查詢延遲可能不如專為大規模優化的數據庫。

  4. 管理界面:?原生缺乏圖形化管理界面(不過社區有提供一些工具)。

總結

向量數據庫是 RAG 系統的基石,負責高效存儲知識庫的語義表示(向量)并執行核心的語義相似性檢索。ChromaDB?作為一個輕量級、開源、易用的嵌入式向量數據庫,是快速構建 RAG 原型、進行本地開發和小規模應用的絕佳選擇。它大大降低了使用向量數據庫的門檻,并與 Python/JS 生態和 LangChain/LlamaIndex 等框架深度集成。

選擇建議:

  • 需要快速原型驗證、本地開發測試、學習研究、或構建中小規模應用??-> ChromaDB 是非常理想的選擇。

  • 需要部署大規模、高并發、高可用的生產級 RAG 系統??-> 需要評估 ChromaDB 的持久化方案(如 ClickHouse)是否滿足需求,或考慮 Pinecone, Weaviate, Qdrant, Milvus/Zilliz Cloud 等更側重于生產環境的向量數據庫解決方案。

理解 ChromaDB 的工作原理和特性,能幫助你更好地設計和實現 RAG 系統中的檢索模塊。

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

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

相關文章

006_測試評估與安全實踐

測試評估與安全實踐 目錄 建立成功標準評估方法測試策略安全最佳實踐隱私保護性能監控 建立成功標準 定義原則 1. 具體明確 清晰定義精確目標避免模糊表述如"良好性能"制定可操作的標準 不好的標準: 模型應該表現良好好的標準: 情感分…

時序預測 | Pytorch實現CNN-KAN電力負荷時間序列預測模型

預測效果 代碼功能 該代碼實現了一個結合卷積神經網絡(CNN)和Kolmogorov–Arnold網絡(KAN)的混合模型(CNN-KAN),用于時間序列預測任務。核心功能包括: 數據加載與預處理&#xff1…

UI前端與數字孿生結合實踐探索:智慧物流的倉儲優化與管理系統

hello寶子們...我們是艾斯視覺擅長ui設計和前端數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言:倉儲管理的 “數字孿生革命”傳統物流倉儲正面臨 “效率瓶頸、可視化差、響應滯…

【Android】在平板上實現Rs485的數據通訊

前言 在工業控制領域,Android 設備通過 RS485 接口與 PLC(可編程邏輯控制器)通信是一種常見的技術方案。最近在實現一個項目需要和plc使用485進行通訊,記錄下實現的方式。 我這邊使用的從平的Android平板,從平里面已經…

MySQL技術筆記-備份與恢復完全指南

目錄 前言 一、備份概述 (一)備份方式 (二)備份策略 二、物理備份及恢復 (一)備份操作 (二)恢復操作 三、邏輯備份及恢復 (一)邏輯備份 &#xff0…

SpringBoot或OpenFeign中 Jackson 配置參數名蛇形、小駝峰、大駝峰、自定義命名

SpringBoot或OpenFeign中 Jackson 配置參數名蛇形、小駝峰、大駝峰、自定義命名 前言 在調用外部接口時,對方給出的接口文檔中,入參參數名一會大寫加下劃線,一會又是駝峰命名。 示例如下: {"MOF_DIV_CODE": "xx…

uni-app 途徑站點組件開發與實現分享

在移動應用開發中,涉及到出行、物流等場景時,途徑站點的展示是一個常見的需求。本文將為大家分享一個基于 uni-app 開發的途徑站點組件,該組件能夠清晰展示路線中的各個站點信息,包括站點名稱、到達時間、是否已到達等狀態&#x…

kotlin中集合的用法

從一個實際應用看起以下kotlin中代碼語法正確嗎 var testBeanAIP0200()var testList:List<AIP0200> ArrayList()testList.add(testBean)這段Kotlin代碼存在語法錯誤&#xff0c;主要問題在于&#xff1a;List<AIP0200> 是Kotlin中的不可變集合接口&#xff0c;不能…

深入理解 Java Map 與 Set

文章目錄前言1. 搜索樹1.1 什么是搜索樹1.2 查找1.3 插入1.4 刪除情況一&#xff1a;cur 沒有子節點&#xff08;即為葉子節點&#xff09;情況二&#xff1a;cur 只有一個子節點&#xff08;只有左子樹或右子樹&#xff09;情況三&#xff1a;cur 有兩個子節點&#xff08;左右…

excel如何只保留前幾行

方法一&#xff1a;手動刪除多余行 選中你想保留的最后一行的下一行&#xff08;比如你只保留前10行&#xff0c;那選第11行&#xff09;。按住 Shift Ctrl ↓&#xff08;Windows&#xff09;或 Shift Command ↓&#xff08;Mac&#xff09;&#xff0c;選中從第11行到最…

實時連接,精準監控:風丘科技數據遠程顯示方案提升試驗車隊管理效率

風丘科技推出的數據遠程實時顯示方案更好地滿足了客戶對于試驗車隊遠程實時監控的需求&#xff0c;并真正實現了試驗車隊的遠程管理。隨著新的數據記錄儀軟件IPEmotion RT和相應的跨平臺顯示解決方案的引入&#xff0c;讓我們的客戶端不僅可在線訪問記錄器系統狀態&#xff0c;…

灰盒級SOA測試工具Parasoft SOAtest重新定義端到端測試

還在為脆弱的測試環境、強外部依賴和低效的測試復用拖慢交付而頭疼&#xff1f;尤其在銀行、醫療、制造等關鍵領域&#xff0c;傳統的端到端測試常因環境不穩、接口難模擬、用例難共享而舉步維艱。 灰盒級SOA測試工具Parasoft SOAtest以可視化編排簡化復雜測試流程&#xff0c…

OKHttp 核心知識點詳解

OKHttp 核心知識點詳解 一、基本概念與架構 1. OKHttp 簡介 類型&#xff1a;高效的HTTP客戶端特點&#xff1a; 支持HTTP/2和SPDY&#xff08;多路復用&#xff09;連接池減少請求延遲透明的GZIP壓縮響應緩存自動恢復網絡故障2. 核心組件組件功能OkHttpClient客戶端入口&#…

從“被動巡檢”到“主動預警”:塔能物聯運維平臺重構路燈管理模式

從以往的‘被動巡檢’轉變至如今的‘主動預警’&#xff0c;塔能物聯運維平臺對路燈管理模式展開了重新構建。城市路燈屬于極為重要的市政基礎設施范疇&#xff0c;它的實際運行狀態和市民出行安全以及城市形象有著直接且緊密的關聯。不過呢&#xff0c;傳統的路燈管理模式當下…

10. 常見的 http 狀態碼有哪些

總結 1xx: 正在處理2xx: 成功3xx: 重定向&#xff0c;302 重定向&#xff0c;304 協商緩存4xx: 客戶端錯誤&#xff0c;401 未登錄&#xff0c;403 沒權限&#xff0c;404 資源不存在5xx: 服務器錯誤常見的 HTTP 狀態碼詳解 HTTP 狀態碼&#xff08;HTTP Status Code&#xff0…

springBoot對接第三方系統

yml文件 yun:ip: port: username: password: controller package com.ruoyi.web.controller.materials;import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.materials.service.IYunService; import o…

【PTA數據結構 | C語言版】車廂重排

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 一列掛有 n 節車廂&#xff08;編號從 1 到 n&#xff09;的貨運列車途徑 n 個車站&#xff0c;計劃在行車途中將各節車廂停放在不同的車站。假設 n 個車站的編號從 1 到 n&#xff0c;貨運列車按照…

量子計算能為我們做什么?

科技公司正斥資數十億美元投入量子計算領域&#xff0c;盡管這項技術距離實際應用還有數年時間。那么&#xff0c;未來的量子計算機將用于哪些方面&#xff1f;為何眾多專家堅信它們會帶來顛覆性變革&#xff1f; 自 20 世紀 80 年代起&#xff0c;打造一臺利用量子力學獨特性質…

BKD 樹(Block KD-Tree)Lucene

BKD 樹&#xff08;Block KD-Tree&#xff09;是 Lucene 用來存儲和快速查詢 **多維數值型數據** 的一種磁盤友好型數據結構&#xff0c;可以把它想成&#xff1a;> **“把 KD-Tree 分塊壓縮后落到磁盤上&#xff0c;既能做磁盤順序讀&#xff0c;又能像內存 KD-Tree 一樣做…

【Mysql作業】

第一次作業要求1.首先打開Windows PowerShell2.連接到MYSQL服務器3.執行以下SQL語句&#xff1a;-- 創建數據庫 CREATE DATABASE mydb6_product;-- 使用數據庫 USE mydb6_product;-- 創建employees表 CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(50) NOT NULL,ag…