
前言近幾年隨著大模型和 AI 應用的爆發向量數據庫Vector Database這個概念頻繁出現在技術視野中。很多開發者的第一個疑問就是向量數據庫里的數據長什么樣能像 MySQL 一樣打開一個圖形化界面看到一行行數據嗎本文從零開始徹底講清楚向量數據庫的存儲原理、數據結構、查詢方式、主流產品以及可視化工具。一、先搞懂什么是向量1.1 向量就是一組數字在數學里向量Vector就是一組有序的數字[0.12, -0.34, 0.56, 0.78, -0.91, ...]這組數字可以有 128 維、768 維、1536 維甚至更多每一維代表某種特征。1.2 為什么要把數據變成向量現實世界中的文本、圖片、音頻等非結構化數據計算機無法直接理解和比較。通過 Embedding 模型可以把這些數據轉換為高維向量今天天氣真好 → [0.12, -0.34, 0.56, ...] 今天陽光明媚 → [0.13, -0.32, 0.55, ...] 我喜歡吃火鍋 → [-0.87, 0.45, -0.23, ...]語義相近的文本生成的向量在空間中距離更近語義相差大的距離更遠。這就是向量數據庫存在的意義——基于語義相似度進行檢索。二、向量數據庫 vs 傳統數據庫核心區別2.1 一張對比表說清楚對比維度MySQL關系型數據庫向量數據庫存儲內容結構化數據字符串、數字、日期高維浮點數數組向量查詢方式WHERE name 張三精確匹配“找和這個向量最像的 Top 10”相似度搜索索引原理B 樹、哈希索引ANN 近似最近鄰索引HNSW、IVF 等核心能力精確查詢、范圍查詢、聚合計算相似度計算、最近鄰搜索典型場景用戶管理、訂單系統、ERP以圖搜圖、語義搜索、推薦系統、RAG返回結果完全匹配的行相似度最高的 N 條記錄附帶相似度分數2.2 一個直觀的例子假設你有一個圖片庫想搜索和這只貓最像的圖片用 MySQL 的做法SELECT*FROMimagesWHEREtag貓ANDcolor橘色;→ 依賴人工打標簽搜的是關鍵詞匹配找不到標簽沒打全的圖。用向量數據庫的做法resultsvector_db.search(query_vectorencode(一只橘色的貓),# 把查詢轉成向量top_k10# 返回最相似的 10 張)→ 理解語義/視覺特征即使圖片標簽不全只要視覺特征接近就能找到。三、向量數據庫里到底存了什么3.1 一條數據長什么樣向量數據庫中的一條記錄通常包含{ id: doc_001, // 唯一標識 vector: [0.12, -0.34, 0.56, ...], // 向量核心用于相似度計算 metadata: { // 元數據可選用于過濾 source: 技術文檔, category: 數據庫, created_at: 2024-01-15, title: MySQL索引原理 }, document: MySQL使用B樹作為索引結構... // 原始文本可選用于返回給用戶 }3.2 用表格思維來理解如果把它翻譯成 MySQL 的表結構大概是這樣的CREATETABLEvectors(idVARCHAR(64)PRIMARYKEY,vectorBLOB,-- 存儲高維向量768維浮點數 768 × 4字節 ≈ 3KBsourceVARCHAR(255),-- 元數據字段categoryVARCHAR(255),created_atDATE,titleVARCHAR(255),documentTEXT-- 原始文本);關鍵區別vector這個字段存的是一坨浮點數你直接看是看不懂的它不像name 張三這樣有可讀性。3.3 向量到底有多大一條向量的存儲大小取決于維度768 維 × 4 字節float32 3,072 字節 ≈ 3 KB / 條 1536 維 × 4 字節 6,144 字節 ≈ 6 KB / 條一百萬條 768 維的向量僅向量數據就需要約3 GB存儲空間不含索引。四、向量數據庫是怎么搜索的4.1 暴力搜索精確但慢最樸素的方式把查詢向量和庫里的每一條向量逐一計算距離。查詢向量 Q [0.12, -0.34, ...] │ ┌───────────┼───────────┐ ↓ ↓ ↓ 向量A 向量B 向量C ... 一百萬條全部算一遍 距離0.85 距離0.23 距離0.67 │ 排序取 Top K問題一百萬條數據全部算一遍太慢了線上不可接受。4.2 近似最近鄰ANN—— 真正的解決方案向量數據庫的精髓在于索引結構用近似算法大幅提升搜索速度犧牲極少量精度換取數量級的性能提升。主流的 ANN 索引算法HNSWHierarchical Navigable Small World┌─ 最高層稀疏少量節點─────────────────┐ │ 入口節點 → 快速定位大致區域 │ └──────────────┬──────────────────────────────┘ ↓ ┌─ 中間層 ──────────────────────────────────┐ │ 逐步縮小范圍 │ └──────────────┬──────────────────────────────┘ ↓ ┌─ 底層稠密所有節點─────────────────────┐ │ 精確找到最近的鄰居 │ └───────────────────────────────────────────┘原理類似跳表Skip List從頂層快速定位到底層精確結果搜索時間復雜度O(log N)一百萬條數據通常只需比較幾百到幾千條就能找到近似最優結果IVFInverted File Index先把所有向量聚類分成 N 個桶比如 1024 個 搜索時 1. 先找到查詢向量最近的幾個桶比如最近的 4 個桶 2. 只在這 4 個桶里做精確搜索 3. 返回 Top K 效果從搜索 100萬 條 → 變成搜索 ~4000 條4.3 搜索過程的完整鏈路用戶輸入: MySQL索引優化 │ ↓ Embedding 模型如 OpenAI text-embedding-3-small │ ↓ 查詢向量: [0.023, -0.156, 0.089, ...] 1536 維 │ ↓ 向量數據庫使用 HNSW 索引快速搜索 │ ↓ 返回 Top 5 最相似的結果 ┌────┬──────────────────────┬──────────┐ │ #1 │ MySQL B樹索引詳解 │ 相似度 0.92 │ │ #2 │ 數據庫查詢性能調優 │ 相似度 0.88 │ │ #3 │ InnoDB索引結構分析 │ 相似度 0.85 │ │ #4 │ SQL慢查詢優化指南 │ 相似度 0.81 │ │ #5 │ PostgreSQL索引對比 │ 相似度 0.78 │ └────┴──────────────────────┴──────────┘五、主流向量數據庫產品一覽產品類型特點適合場景Milvus專用向量數據庫開源、高性能、分布式、功能完善大規模生產環境Qdrant專用向量數據庫開源、Rust 實現、支持豐富的過濾條件中小規模、需要復雜過濾Weaviate專用向量數據庫開源、內置 Embedding 模塊、GraphQL API快速上手、語義搜索Pinecone云托管向量數據庫全托管、開箱即用、按量付費不想運維、快速上線Chroma輕量級向量數據庫超輕量、Python 原生、適合嵌入應用原型開發、小項目、RAGFAISS向量檢索庫非數據庫Meta 開源、純 C/Python 庫、極致性能離線研究、嵌入到應用中pgvectorPostgreSQL 擴展給 PG 加向量能力、SQL 兼容已有 PG 的團隊、數據量不大Elasticsearch搜索引擎擴展8.0 支持向量搜索、生態成熟已有 ES 的團隊、混合檢索六、重點回答能像 MySQL 一樣圖形化查看數據嗎答案可以但體驗和 MySQL 不完全一樣6.1 向量數據庫的 GUI 工具現狀Milvus —— Attu官方圖形化工具Milvus 官方提供了一個叫Attu的 GUI 管理工具┌─────────────────────────────────────────────────────┐ │ Attu - Milvus 管理界面 │ ├─────────────────────────────────────────────────────┤ │ │ │ 左側 │ │ Collections集合/相當于MySQL的數據庫 │ │ ├── my_documents │ │ ├── product_embeddings │ │ └── image_vectors │ │ │ │ 右側選中某個 Collection 后 │ │ ┌─────────────────────────────────────────────┐ │ │ │ Schema表結構 │ │ │ │ ├── id: INT64 (主鍵) │ │ │ │ ├── vector: FLOAT_VECTOR (dim768) │ │ │ │ ├── title: VARCHAR │ │ │ │ ├── category: VARCHAR │ │ │ │ └── created_at: INT64 │ │ │ ├─────────────────────────────────────────────┤ │ │ │ 數據預覽Query Tab │ │ │ │ ┌──────┬─────────────┬────────┬──────────┐ │ │ │ │ │ id │ title │ category│ vector │ │ │ │ │ ├──────┼─────────────┼────────┼──────────┤ │ │ │ │ │ 1 │ MySQL索引 │ 數據庫 │ [0.12,..│ │ │ │ │ │ 2 │ Python入門 │ 編程 │ [-0.3,. │ │ │ │ │ │ 3 │ K8s部署 │ 運維 │ [0.45,. │ │ │ │ │ └──────┴─────────────┴────────┴──────────┘ │ │ │ └─────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────┘關鍵體驗差異vector列顯示的是一長串數字不像 MySQL 的字段那樣一目了然。但其他元數據字段標題、分類等和 MySQL 一樣正常顯示。Qdrant —— 自帶 Web DashboardQdrant 內置了一個 Web UI默認端口 6333/dashboardhttp://localhost:6333/dashboard 功能 - 查看所有 Collections - 查看 Collection 的 Schema、向量維度、索引配置 - 瀏覽數據payload 即元數據可讀vector 字段顯示為 [float, float, ...] - 執行向量搜索輸入向量或隨機生成查看 Top K 結果 - 查看集群狀態Weaviate —— 內置 GraphQL Playgroundhttp://localhost:8080/v1/graphql 可通過 GraphQL 查詢 { Get { Article( nearVector: { vector: [0.12, -0.34, ...] } limit: 5 ) { title content _additional { distance } } } }Chroma —— 目前沒有官方 GUIChroma 比較輕量官方沒有提供圖形界面。但可以通過 Python 代碼查看importchromadb clientchromadb.PersistentClient(path./my_db)collectionclient.get_collection(my_docs)# 查看所有數據resultscollection.get()print(f共{len(results[ids])}條數據)fori,doc_idinenumerate(results[ids]):print(fID:{doc_id})print(f文檔:{results[documents][i][:100]}...)print(f向量維度:{len(results[embeddings][i])})print(f元數據:{results[metadatas][i]})print(---)pgvector —— 直接用 pgAdmin / DBeaver因為 pgvector 是 PostgreSQL 的擴展所以可以用任何 PostgreSQL 的 GUI 工具查看-- 在 DBeaver / pgAdmin / Navicat 中執行SELECTid,title,category,substring(vector::text,1,50)||...asvector_previewFROMdocumentsLIMIT10;結果idtitlecategoryvector_preview1MySQL索引詳解數據庫[0.1234,-0.5678,0.9012,…2Python入門教程編程[-0.3456,0.7891,-0.1234,…3Docker部署指南運維[0.4567,-0.2345,0.6789,…這可能是和 MySQL 體驗最接近的方案。6.2 各產品的 GUI 支持情況匯總產品官方 GUI第三方 GUI體驗接近 MySQL 的程度MilvusAttu-★★★★☆Qdrant內置 Dashboard-★★★★☆WeaviateGraphQL Playground-★★★☆☆Pinecone云端控制臺-★★★★☆Chroma無社區工具有限★★☆☆☆pgvector用 PG 的 GUI 即可DBeaver/Navicat/pgAdmin★★★★★FAISS無純庫-★☆☆☆☆ElasticsearchKibana-★★★★☆6.3 為什么體驗和 MySQL 不完全一樣即使有 GUI 工具你看到的界面和 MySQL 還是有以下不同1. 向量列不可讀MySQL 看到的是 張三 | 28 | 北京市朝陽區 向量數據庫看到的是[0.1234, -0.5678, 0.9012, -0.3456, 0.7890, ... ] 768 個浮點數肉眼無法獲取任何信息2. 查詢方式不同MySQL SELECT * FROM users WHERE name 張三 精確匹配 向量庫 給我找和 [0.12, -0.34, ...] 最像的 10 條 相似度搜索 或者用元數據過濾category 數據庫 AND 相似度 0.83. 沒有 SQL大多數情況大部分向量數據庫不使用 SQL而是用自己的 API 或 SDK# Milvus 示例collection.search(vectors[[0.12,-0.34,...]],anns_fieldvector,param{metric_type:COSINE,params:{nprobe:10}},limit10,output_fields[title,category])七、手把手體驗用代碼感受向量數據庫7.1 用 Chroma最簡單5 分鐘上手# 安裝: pip install chromadbimportchromadb# 1. 創建數據庫數據存在本地目錄clientchromadb.PersistentClient(path./my_vectordb)# 2. 創建一個 Collection相當于 MySQL 的表collectionclient.get_or_create_collection(nametech_docs,metadata{hnsw:space:cosine}# 使用余弦相似度)# 3. 插入數據collection.add(ids[doc1,doc2,doc3,doc4,doc5],documents[MySQL使用B樹作為索引結構支持范圍查詢和排序,PostgreSQL支持多種索引類型包括GIN、GiST和BRIN,Redis是一個基于內存的鍵值存儲系統常用于緩存,Docker使用容器化技術實現應用的快速部署和隔離,Kubernetes是容器編排平臺管理大規模容器集群],metadatas[{category:database,level:basic},{category:database,level:advanced},{category:cache,level:basic},{category:devops,level:basic},{category:devops,level:advanced}])# 4. 語義搜索Chroma 會自動用內置 Embedding 模型把文本轉成向量resultscollection.query(query_texts[數據庫索引是怎么工作的],n_results3)# 5. 查看結果fori,(doc,dist)inenumerate(zip(results[documents][0],results[distances][0])):print(fTop{i1}:{doc})print(f 距離:{dist:.4f}越小越相似)print()輸出Top 1: MySQL使用B樹作為索引結構支持范圍查詢和排序 距離: 0.1234越小越相似 Top 2: PostgreSQL支持多種索引類型包括GIN、GiST和BRIN 距離: 0.2567越小越相似 Top 3: Redis是一個基于內存的鍵值存儲系統常用于緩存 距離: 0.7891越小越相似看到了嗎查詢的是數據庫索引是怎么工作的雖然沒有任何一條數據包含這幾個字但向量數據庫通過語義理解找到了最相關的結果。7.2 用 Qdrant有 Web 界面可看# 用 Docker 啟動 Qdrantdockerrun-p6333:6333-p6334:6334\-v$(pwd)/qdrant_storage:/qdrant/storage\qdrant/qdrant啟動后訪問http://localhost:6333/dashboard就能看到圖形化界面。# pip install qdrant-clientfromqdrant_clientimportQdrantClientfromqdrant_client.modelsimportVectorParams,Distance,PointStruct# 連接clientQdrantClient(hostlocalhost,port6333)# 創建 Collectionclient.create_collection(collection_nametech_docs,vectors_configVectorParams(size4,distanceDistance.COSINE)# 這里用 4 維方便演示實際常用 768 或 1536 維)# 插入數據這里手動給向量實際中由 Embedding 模型生成client.upsert(collection_nametech_docs,points[PointStruct(id1,vector[0.9,0.1,0.2,0.3],payload{title:MySQL索引詳解,category:database}),PointStruct(id2,vector[0.85,0.15,0.25,0.28],payload{title:PostgreSQL索引對比,category:database}),PointStruct(id3,vector[0.1,0.9,0.1,0.8],payload{title:Docker容器化實踐,category:devops}),PointStruct(id4,vector[0.12,0.88,0.15,0.75],payload{title:K8s集群部署指南,category:devops}),])# 搜索找和 [0.9, 0.1, 0.2, 0.35] 最相似的 2 條resultsclient.search(collection_nametech_docs,query_vector[0.9,0.1,0.2,0.35],limit2)forrinresults:print(fID:{r.id}, 標題:{r.payload[title]}, 相似度:{r.score:.4f})# 輸出# ID: 1, 標題: MySQL索引詳解, 相似度: 0.9998# ID: 2, 標題: PostgreSQL索引對比, 相似度: 0.9979然后在 Qdrant Dashboard 中可以? 看到 collection 列表 ? 看到每條數據的 payload元數據可讀 ? 看到向量維度和配置 ? 執行向量搜索并查看結果 ? 查看集群狀態和性能指標八、實際項目中的典型使用場景8.1 RAG檢索增強生成這是當前最火的應用場景用戶提問: 公司的年假政策是什么 │ ↓ Embedding 模型把問題轉成向量 │ ↓ 向量數據庫搜索找到最相關的內部文檔片段 │ ↓ Top 3 結果 1. 員工入職滿一年享有5天年假... 相似度 0.94 2. 年假可以分次使用但... 相似度 0.89 3. 未休年假按日工資300%補償... 相似度 0.85 │ ↓ 把這些文檔片段 用戶問題 一起發給大模型 │ ↓ 大模型生成回答根據公司政策入職滿一年享有5天年假...8.2 以圖搜圖上傳一張鞋子照片 → 轉成圖像向量 → 在向量數據庫中搜索 → 找到最相似的商品8.3 語義搜索搜索: 如何處理高并發 ↓ 返回: 1. Redis緩存雪崩的解決方案 關鍵詞完全不同但語義相關 2. Nginx負載均衡配置指南 3. 數據庫連接池優化九、常見問題 FAQQ1: 向量數據庫能替代 MySQL 嗎不能。它們解決的是完全不同的問題MySQL精確存儲和查詢結構化數據向量數據庫基于語義相似度檢索非結構化數據實際項目中通常兩者配合使用MySQL 存業務數據向量數據庫存 Embedding 向量。Q2: 一條數據的向量能看懂嗎不能。向量是一組高維浮點數人眼無法理解每一維代表什么。它更像是數據的數字指紋只有通過數學計算距離/相似度才能比較。Q3: 我的數據量很小幾千條需要用向量數據庫嗎可以用FAISS純 Python 庫無需部署服務或Chroma輕量嵌入式甚至直接在 Python 里用 NumPy 做暴力搜索都夠用importnumpyasnp# 1000 條 768 維向量暴力搜索毫秒級完成vectorsnp.random.rand(1000,768).astype(float32)querynp.random.rand(1,768).astype(float32)distancesnp.linalg.norm(vectors-query,axis1)top_knp.argsort(distances)[:10]# 找最近的 10 條Q4: Embedding 模型和向量數據庫是什么關系Embedding 模型負責把數據翻譯成向量編碼器 向量數據庫負責存儲和檢索這些向量倉庫 搜索引擎 關系就像 翻譯官Embedding把各種語言翻譯成統一的數字語言 圖書館向量數據庫按這些數字的相似度整理書架方便你找書十、總結向量數據庫的核心要點可以歸納為以下六點1. 存什么高維浮點數向量 元數據標簽、分類等結構化信息 原始數據文本、圖片鏈接等。其中向量是核心元數據用于輔助過濾原始數據用于最終返回給用戶。2. 怎么查以相似度搜索為主本質就是給一個向量找出庫里和它最接近的 N 條記錄返回的結果會附帶一個相似度分數。3. 怎么快依靠 ANN近似最近鄰索引算法主流的有 HNSW多層跳表式檢索和 IVF先聚類再搜索用極小的精度損失換取搜索速度的數量級提升。4. 能看嗎部分產品提供了 GUI 工具例如 Milvus 的 Attu、Qdrant 內置的 Dashboard可以在界面上瀏覽集合、查看元數據、執行搜索。但向量列本身是一長串浮點數肉眼無法直接理解能看懂的只有元數據字段和原始文本。5. 和 MySQL 的關系互補而非替代。MySQL 負責精確存儲和查詢結構化業務數據向量數據庫負責基于語義相似度的檢索。實際項目中兩者通常配合使用。6. 最火的應用場景RAG檢索增強生成、語義搜索、以圖搜圖、推薦系統以及大模型應用中的知識庫問答。向量數據庫并不神秘本質上就是一個專門為高維向量設計的檢索引擎。理解了這一點再去學具體的 API 和使用方式就會非常順暢。