【大模型實戰】向量數據庫實戰 - Chroma Milvus

在這里插入圖片描述

在 RAG(檢索增強生成)場景中,非結構化數據(文本、圖像等)的高效檢索是核心需求。傳統關系型數據庫難以勝任,而向量數據庫通過將數據轉化為向量、基于相似度快速匹配,成為 RAG 的關鍵支撐。本文聚焦主流向量數據庫 Chroma 與 Milvus,解析其在 RAG 中的實戰應用與底層原理。

一、Chroma 實戰與底層原理

1. Chroma 簡介

  • 定位:輕量級、易于使用的開源向量數據庫。
  • 特點:安裝便捷、API簡潔、支持多種編程語言,適合快速開發和原型驗證。

2. Chroma 安裝

  • 對于Python開發者,通過pip命令即可輕松安裝:
pip install chromadb

3. Chroma 基本操作

3.1 初始化客戶端

  • 內存模式(開發階段快速測試):
import chromadb
from chromadb.config import Settingsclient = chromadb.Client(Settings(persist_directory=None  # 數據不會持久化
))
  • 持久化模式(需指定目錄):
client = chromadb.Client(Settings(persist_directory="./chroma_data"  # 數據持久化到該目錄
))

3.2 創建集合(類似關系型數據庫的表):

collection = client.create_collection(name="my_collection")

3.3 添加數據

  • 需提供文檔(documents)、文檔ID(ids),向量(embeddings)可選(不提供則用默認嵌入模型生成)。
documents = ["Chroma is a vector database","It is easy to use","Vector databases are useful for AI applications"
]
ids = ["doc1", "doc2", "doc3"]collection.add(documents=documents, ids=ids)

3.4 查詢數據

  • 不提供查詢向量時,默認嵌入模型為查詢文本生成向量。
  • 結果包含相似文檔ID、內容及相似度分數。
query = "What is Chroma?"
results = collection.query(query_texts=[query],n_results=2  # 返回最相似的2個結果
)print(results)

4. Chroma 底層原理

4.1 加速技術

  • 批量處理向量數據,減少磁盤I/O操作,提高讀寫效率。
  • 合理分配內存資源,將頻繁訪問的向量數據緩存到內存,加快查詢響應。

4.2 支持的索引

  • Flat索引:存儲原始向量,查詢時計算與所有向量的距離,精度高但數據量大時速度慢,適合小規模數據。
  • HNSW(Hierarchical Navigable Small World)索引:基于圖的近似最近鄰搜索索引,構建多層導航圖,在保證一定精度的前提下顯著提高查詢速度,適用于中大規模數據。

二、Milvus 實戰與底層原理

1. Milvus 簡介

  • 定位:高性能、高可用的開源向量數據庫,專為海量向量數據的存儲、檢索和分析設計。
  • 特點:支持多種索引類型,能處理大規模向量數據,擴展性和容錯性良好,適用于生產環境。

2. Milvus 安裝

2.1 推薦使用Docker Compose,先安裝Docker和Docker Compose。

2.2 下載配置文件:

wget https://github.com/milvus-io/milvus/releases/download/v2.3.4/milvus-standalone-docker-compose.yml -O docker-compose.yml

2.3 啟動Milvus(服務在本地19530端口運行):

docker-compose up -d

3. Milvus 基本操作

3.1 安裝Python SDK:

pip install pymilvus

3.2 連接到Milvus:

from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataTypeconnections.connect("default", host="localhost", port="19530")

3.3 創建集合

# 定義字段
id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True)
content_field = FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=512)
vector_field = FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=768)  # 向量維度為768# 定義集合schema
schema = CollectionSchema(fields=[id_field, content_field, vector_field], description="My collection")# 創建集合
collection = Collection(name="my_collection", schema=schema)

3.4 創建索引(以IVF_FLAT為例):

index_params = {"index_type": "IVF_FLAT","metric_type": "L2",  # 歐氏距離"params": {"nlist": 128}  # 聚類數量
}collection.create_index(field_name="vector", index_params=index_params)

3.5 插入數據

import random# 生成示例數據
data = [{"content": "Milvus is a vector database", "vector": [random.random() for _ in range(768)]},{"content": "It is high performance", "vector": [random.random() for _ in range(768)]},{"content": "It is suitable for large - scale data", "vector": [random.random() for _ in range(768)]}
]# 轉換數據格式
contents = [d["content"] for d in data]
vectors = [d["vector"] for d in data]# 插入數據
mr = collection.insert([contents, vectors])
print("Inserted ids:", mr.primary_keys)

3.6 加載集合并查詢

collection.load()# 生成查詢向量
query_vector = [random.random() for _ in range(768)]# 查詢參數
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}# 執行查詢
results = collection.search(data=[query_vector],anns_field="vector",param=search_params,limit=2,  # 返回最相似的2個結果output_fields=["content"]  # 返回content字段
)for result in results[0]:print(f"ID: {result.id}, Distance: {result.distance}, Content: {result.entity.get('content')}")

4. Milvus 底層原理

4.1 加速技術

  • 分布式架構:將數據分布到多個節點并行處理,提高處理和查詢效率。
  • 向量量化技術:將高維向量映射到低維空間,減少存儲和計算開銷。
  • 異步IO、預取等機制優化數據訪問,提升系統性能。

4.2 支持的索引

  • IVF_FLAT:先聚類向量為多個簇,查詢時在相似簇中搜索,精度較高,性能較好,適用于中大規模數據。
  • IVF_SQ8:在IVF_FLAT基礎上對簇內向量標量量化,減少存儲和計算開銷,精度有一定損失,適合對存儲和性能要求高的場景。
  • IVF_PQ:采用乘積量化,大幅減少存儲和計算成本,精度較低,適用于大規模數據且對精度要求不高的場景。
  • HNSW:構建多層導航圖,在查詢速度和精度間平衡,適用于對查詢速度要求高的場景。
  • RNSG:基于神經網絡的索引結構,在高維向量場景下表現較好。

三、Chroma v.s. Milvus 對比

1. 易用性

  • Chroma:安裝和使用簡單,API簡潔直觀,適合初學者和快速開發。
  • Milvus:安裝復雜,配置和操作需更多專業知識。

2. 性能與 scalability

  • Chroma:小規模數據場景性能不錯,大規模數據處理和高并發能力較弱。
  • Milvus:能處理大規模向量數據,支持多種索引,水平擴展能力好,適合生產環境高并發、大數據量場景。

3. 功能豐富度

  • Chroma:注重簡潔性,功能相對基礎。
  • Milvus:功能豐富,支持多種索引、分區、數據備份與恢復等,滿足復雜場景需求。

4. 底層技術差異

  • 加速技術:Chroma依賴批量處理和內存緩存;Milvus采用分布式架構、向量量化等更復雜高效的技術。
  • 索引支持:Milvus支持索引類型更多,適應場景更廣;Chroma索引較簡單,滿足基礎檢索需求。

四、總結

Chroma和Milvus各有優勢。
若需快速開發原型、處理小規模數據或對易用性要求高,選Chroma;
若需處理大規模數據、要求高性能高可用性并用于生產環境,選Milvus。
實際應用中,可依業務需求選擇,同時關注兩者更新,以更好發揮其作用。

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

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

相關文章

pytorch程序語句固定開銷分析

深入探索PyTorch與Python的性能微觀世界:量化基礎操作的固定開銷 在深度學習的性能優化工作中,開發者通常將目光聚焦于模型結構、算法效率和并行計算策略。然而,在這些宏觀優化的背后,構成我們代碼的每一條基礎語句——無論是PyTo…

ABP VNext + CloudEvents:事件驅動微服務互操作性

ABP VNext CloudEvents:事件驅動微服務互操作性 🚀 📚 目錄ABP VNext CloudEvents:事件驅動微服務互操作性 🚀一、引言 ??? TL;DR📚 背景與動機🏗? 整體架構圖二、環境準備與依賴安裝 &am…

軟件測試測評公司關于HTTP安全頭配置與測試?

瀏覽器和服務器之間那幾行看不見的HTTP安全頭配置,往往是抵御網絡攻擊的關鍵防線。作為軟件測試測評公司,我們發現超過六成的高危漏洞源于安全頭缺失或誤配。別小看這些響應頭,它們能直接掐斷跨站腳本、點擊劫持、數據嗅探的攻擊路徑。五條命…

Mysql集成技術

目錄 mysql的編譯安裝與部署 1.編譯安裝mysql 2.部署mysql mysql主從復制 什么是mysql主從復制? 1.配置master 2.配置slave 3.存在數據時添加slave2 4.GTID模式 什么是GTID模式? 配置GTID 5.延遲復制 6.慢查詢日志 核心作用 開啟慢查詢日志…

《MySQL進階核心技術剖析(一): 存儲引擎》

目錄 一、存儲引擎 1.1 MySQL體系結構 1.2 存儲引擎介紹 1). 建表時指定存儲引擎 2). 查詢當前數據庫支持的存儲引擎 1.3 存儲引擎特點 1.3.1 InnoDB 1.3.2 MyISAM 1.3.3 Memory 1.3.4 區別及特點 1.4 存儲引擎選擇 一、存儲引擎 1.1 MySQL體系結構 1). 連接層 最上…

sqli-labs:Less-26關卡詳細解析

1. 思路🚀 本關的SQL語句為: $sql"SELECT * FROM users WHERE id$id LIMIT 0,1";注入類型:字符串型(單引號包裹)、GET操作提示:參數需以閉合關鍵參數:id php輸出語句的部分代碼&am…

Spring Boot 的事務注解 @Transactional 失效的幾種情況

開發中我們經常會用到 Spring Boot 的事務注解,為含有多種操作的方法添加事務,做到如果某一個環節出錯,全部回滾的效果。但是在開發中可能會因為不了解事務機制,而導致我們的方法使用了 Transactional 注解但是沒有生效的情況&…

#C語言——刷題攻略:牛客編程入門訓練(四):運算

🌟菜鳥主頁:晨非辰的主頁 👀學習專欄:《C語言刷題合集》 💪學習階段:C語言方向初學者 ?名言欣賞:"代碼行數決定你的下限,算法思維決定你的上限。" 目錄 1. BC25 牛牛買電…

阻抗分析中的軟件解調計算

接上篇 重溫無功功率測量-CSDN博客 已知被測阻抗兩端電壓與流過 通過兩個ADC同步采集到。 激勵頻率10k, 采樣率1M, 每周期100個點 關鍵是:采樣率除以激勵頻率, 得是4的倍數... 所以ADC不能自由運行, 得用一個timer來觸發. 因為要進行同相分量正交分量計算。 1:直…

ubuntu 鏡像克隆

一、克隆 1、準備 一個u盤(制作啟動盤) 一個移動固態硬盤(大于要克隆系統盤的1.2倍) 2、使用 rufus生成系統啟動盤 (1)下載ubuntu iso 桌面版 https://cn.ubuntu.com/download (2&#x…

Axure下拉菜單:從基礎交互到高保真元件庫應用

在Web端產品設計中,下拉菜單(Dropdown Menu) 是用戶與系統交互的核心組件之一,它通過隱藏次要選項、節省頁面空間的方式,提升信息密度與操作效率。無論是基礎下拉菜單、圖標式下拉菜單,還是復雜的多級下拉菜…

復現YOLOV5+訓練指定數據集

一、復現YOLOV5代碼 1.github下載:https://github.com/MIPIT-Team/SSA-YOLO 2.配置環境:創建虛擬環境yolo5 conda create -n yolo5 python3.9 #對應文件夾下pip install -r requirements.txt報錯:ERROR: pips dependency resolver does no…

Agents-SDK智能體開發[4]之集成MCP入門

文章目錄說明一 Agents SDK接入MCP1.1 MCP技術回顧1.2 MCP基礎實踐流程1.2.1 天氣查詢服務器Server創建流程1.2.2 服務器依賴安裝和代碼編寫1.2.3 環境配置文件1.2.4 客戶端代碼編寫1.3 測試運行二 MCPAgents SDK基礎調用2.1 weather_server.py2.2 client_agent.py2.3 運行測試…

Camera相機人臉識別系列專題分析之十九:MTK ISP6S平臺FDNode傳遞三方FFD到APP流程解析

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: Camera相機人臉識別系列專題分析之十九:MTK平臺FDNode傳遞三方FFD到APP流程解析 目錄 一、背景 二、:OcamMeta傳遞FFD到APP 2.1:OcamMeta 2.2 :OcamMeta::process更新FFD 2.…

【實時Linux實戰系列】構建實時監測與報警系統

在實時系統中,監測與報警系統是確保系統正常運行和及時響應異常情況的關鍵組件。實時監測與報警系統能夠實時收集系統數據,分析關鍵事件,并在檢測到異常時發出警報。這種系統廣泛應用于工業自動化、醫療設備監控、網絡安全等領域。掌握實時監…

PHP入門及數據類型

PHP數據類型 PHP標記 //HTML風格 <?phpecho "hello world"; ?> //簡短風格 <?echo "hello world"; ?>數據類型 PHP 最初源于 Perl 語言&#xff0c;與 Perl 類似&#xff0c;PHP 對數據類型采取較為寬松的態度。PHP 規定&#xff0c;變量數…

沸點 | 嬴圖參加世界人工智能大會

2025 WAIC于 7 月 26 日至 28 日在上海舉行。大會展覽面積突破 7 萬平方米&#xff0c;800 余家企業參展。嬴圖作為圖數據庫領域的領先企業&#xff0c;攜前沿技術與創新應用精彩亮相。?大會期間&#xff0c;嬴圖創始人兼CEO孫宇熙與來自全球的頂尖學者、企業代表共同探討人工…

2. 字符設備驅動

一、設備號 1.1. 什么是設備號 設備號是用來標記一類設備以及區分這類設備中具體個體的一組號碼。 設備號由主設備號和次設備號組成。主設備號的作用為標記一類設備、用于標識設備驅動程序,而次設備號的作用是為了區分這類設備中的具體個體設備及用于標識同一驅動程序下的具…

uboot armv8 啟動流程之 linker script

section 詳細說明.text按如下順序&#xff0c;中斷向量表vectors, 啟動入口代碼start.o,普通text, glue &#xff08;arm thumb2 相互調用時自動生成的代碼&#xff09;*(.vectors)CPUDIR/start.o (.text*)*(.text*)*(.glue*)__image_copy_start 標記為text 段入口&#xff0c;…

xxljob總結

XXL-Job 支持多種任務類型&#xff0c;以下是常見任務類型的示例 Demo&#xff0c;包含核心配置和代碼片段&#xff0c;幫助快速理解用法&#xff1a;一、Bean模式任務&#xff08;最常用&#xff09;通過注解 XxlJob 定義任務方法&#xff0c;直接在 Spring 容器中管理&…