
向量數據庫Vector Database概念ai用的數據庫就是向量數據庫 向量數據庫Vector Database是一種專門用于存儲、索引和檢索高維向量數據的數據庫系統。傳統數據庫通過精確匹配來查詢WHERE name Alice向量數據庫通過相似度來查詢找到和這張圖最相似的 10 張圖。嵌入嵌入Embedding是將現實世界的對象文字、圖片、音頻等轉換成向量的過程和結果。這個轉換由嵌入模型完成其核心思想是語義相近的對象其向量在空間中的距離也更近。主流向量數據庫算法相似度計算向量數據庫Vector Database | 菜鳥教程余弦相似度Cosine Similarity余弦相似度衡量兩個向量的方向角忽略長度。這是最常用的方法尤其適合文本場景結果范圍-1 到 1值越大越相似適用場景文本語義搜索、文檔相似度歐氏距離Euclidean Distance歐氏距離衡量兩點之間的直線距離距離越小越相似。結果范圍0 到 ∞值越小越相似適用場景圖像檢索、地理位置相關應用點積Dot Product點積是向量相乘求和結合了方向和長度信息。適用場景推薦系統向量已歸一化時等價于余弦相似度PYTHON代碼實現import numpy as np ? # 余弦相似度衡量方向相似性 def cosine_similarity(a, b): return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) ? # 歐氏距離衡量絕對位置差異 def euclidean_distance(a, b): return np.linalg.norm(a - b) ? # 點積結合方向與長度 def dot_product(a, b): return np.dot(a, b) ? # 示例向量 v1 np.array([0.12, -0.54, 0.87, 0.03]) v2 np.array([0.10, -0.50, 0.90, 0.05]) v3 np.array([-0.80, 0.20, -0.30, 0.70]) ? print(fv1 vs v2 余弦相似度: {cosine_similarity(v1, v2):.4f}) # 約 0.9997非常相似 print(fv1 vs v3 余弦相似度: {cosine_similarity(v1, v3):.4f}) # 約 -0.55不相似v1 vs v2 余弦相似度: 0.9997 v1 vs v3 余弦相似度: -0.5512向量索引算法數據量大時百萬、億級對每一條數據做相似度計算暴力檢索太慢。向量數據庫使用專門的索引算法來加速查詢。暴力檢索Flat / Brute-force暴力檢索遍歷所有向量逐一計算相似度。維度說明原理遍歷所有向量逐一計算相似度優(yōu)點結果 100% 精確缺點數據量大時極慢O(n) 復雜度適用數據量小于 10 萬對精度要求極高IVF倒排文件索引IVF 索引原理先聚類再在桶內搜索VF 執(zhí)行步驟訓練階段用 K-Means 將所有向量聚成 N 個簇記錄每個簇的中心查詢階段先找出距離最近的幾個簇的中心再只在這些簇內做精確搜索HNSW分層導航小世界圖HNSW 是目前最主流的向量索引算法兼顧速度和精度。HNSW 核心思路構建多層圖結構頂層稀疏底層密集查詢時從頂層入口開始做跳格游戲每層貪心地往更近的節(jié)點跳再下探到下一層大幅減少需要比較的節(jié)點數時間復雜度近似 O(log n)其他索引算法索引類型特點適用場景Flat暴力精確但慢小數據集、精度優(yōu)先IVF_Flat聚類后精確搜索速度快中大規(guī)模內存充足IVF_PQ量化壓縮節(jié)省內存超大規(guī)模內存受限HNSW速度快、精度高內存占用高最常用推薦首選ScaNNGoogle 出品優(yōu)化吞吐量高并發(fā)生產環(huán)境構建一個文檔語義搜索系統用 Chroma最易入門演示完整的增刪改查流程。1. ChromaDBAI 領域最常用簡稱 Chroma 輕量級開源向量數據庫專門用于大模型 RAG、語義檢索。 ? ? Chroma RAG架構 作用存儲文本 / 圖片生成的Embedding 嵌入向量快速做相似度搜索 特點開箱即用Python 一行安裝支持內存模式 / 本地持久化 / 服務端部署 安裝pip install chromadb 典型場景本地知識庫問答、LLM 外掛記憶、文檔檢索 定位新手做 RAG 首選對比 Milvus、Pinecone 更輕量化。1.安裝pip install chromadb openai第三方嵌入api2.文件內容import chromadb from chromadb.utils import embedding_functions ? # ─── 1. 初始化客戶端 ─────────────────────────────────────────── # 持久化到本地推薦 client chromadb.PersistentClient(path./my_vector_db) ? # 使用 OpenAI 嵌入模型也可換成本地模型 openai_ef embedding_functions.OpenAIEmbeddingFunction( api_keyyour-openai-api-key, # 必填替換為你的 API Key //api的配置 model_nametext-embedding-3-small # 1536 維性價比高 ) ? # ─── 2. 創(chuàng)建集合類似關系庫里的表──────────────────────── collection client.get_or_create_collection( namemy_documents, # 集合名稱 embedding_functionopenai_ef, # 綁定嵌入函數 metadata{hnsw:space: cosine} # 使用余弦相似度 ) ? # ─── 3. 插入文檔 ────────────────────────────────────────────── documents [ Python 是一種面向對象的解釋型編程語言廣泛用于數據科學和 AI 開發(fā), #//這里放文檔內容 機器學習是人工智能的子領域讓計算機從數據中學習規(guī)律, 深度學習使用多層神經網絡在圖像識別和 NLP 任務中表現優(yōu)異, 向量數據庫專門存儲高維向量支持語義相似度搜索, PostgreSQL 是功能強大的開源關系型數據庫, Redis 是基于內存的高性能鍵值數據庫常用于緩存, Docker 容器化技術讓應用可以在任何環(huán)境中一致運行, Git 是分布式版本控制系統是現代軟件開發(fā)的基礎工具, ] ? ids [fdoc_{i} for i in range(len(documents))] ? # 批量插入Chroma 自動調用嵌入模型轉為向量后存儲 collection.add( documentsdocuments, idsids, metadatas[{source: tutorial, index: i} for i in range(len(documents))] ) ? print(f已插入 {len(documents)} 條文檔) # //已插入 8 條文檔 # ─── 4. 語義搜索 ────────────────────────────────────────────── query 如何用 Python 做人工智能 ? results collection.query( query_texts[query], n_results3, # 返回最相似的 3 條 include[documents, distances, metadatas] ) ? print(f\n查詢{query}) print(- * 50) for i, (doc, dist) in enumerate(zip( results[documents][0], results[distances][0] )): similarity 1 - dist # 余弦距離轉相似度 #//查詢如何用 Python 做人工智能 print(f第 {i1} 名相似度 {similarity:.4f}) --------------------------------- print(f {doc}) #第 1 名相似度 0.9231Python 是一種面向對象的解釋型編程語言... print() #第 2 名相似度 0.8874機器學習是人工智能的子領域... # ─── 5. 帶過濾條件的搜索元數據過濾─────────────────────── # 第 3 名相似度 0.8612深度學習使用多層神經網絡... results_filtered collection.query( query_texts[數據庫技術], n_results2, where{source: tutorial}, # 只在 sourcetutorial 的文檔里搜索 include[documents, distances] ) ? # ─── 6. 更新文檔 ────────────────────────────────────────────── collection.update( ids[doc_0], documents[Python 是目前最流行的編程語言在 AI、數據分析、Web 開發(fā)中均有廣泛應用], metadatas[{source: tutorial, index: 0, updated: True}] ) ? # ─── 7. 刪除文檔 ────────────────────────────────────────────── collection.delete(ids[doc_7]) # 刪除 Git 相關文檔 ? # ─── 8. 查看集合統計 ────────────────────────────────────────── print(f當前集合文檔數{collection.count()})本地嵌入模型離線運行或者不使用第三方嵌入 API只使用本地嵌入模型完全離線運行import chromadb from sentence_transformers import SentenceTransformer ? # 使用本地嵌入模型無需 API Key完全離線 model SentenceTransformer(paraphrase-multilingual-MiniLM-L12-v2) # 支持中文 ? client chromadb.Client() collection client.create_collection(local_demo) ? texts [今天天氣很好, 陽光明媚適合出門, 股市大漲了, 明天可能會下雨] ? # 手動生成向量后插入 embeddings model.encode(texts).tolist() collection.add( embeddingsembeddings, documentstexts, ids[fid_{i} for i in range(len(texts))] ) ? # 查詢 query_embedding model.encode([今天天氣怎么樣]).tolist() results collection.query(query_embeddingsquery_embedding, n_results2) print(results[documents]) # 輸出: [[今天天氣很好, 陽光明媚適合出門]]PostgreSQL輕量接入還有一種方式使用PostgreSQLpgvector 是最輕量的接入方式適用于PostgreSQL 用戶-- 安裝擴展 CREATE EXTENSION IF NOT EXISTS vector; ? -- 建表存儲文章標題及其向量1536維 CREATE TABLE articles ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, content TEXT, embedding vector(1536) -- 向量列1536 維 ); ? -- 創(chuàng)建 HNSW 索引加速查詢 CREATE INDEX ON articles USING hnsw (embedding vector_cosine_ops) WITH (m 16, ef_construction 64); ? -- 插入數據向量由應用層生成后傳入 INSERT INTO articles (title, embedding) VALUES (Python 入門指南, [0.12, -0.54, 0.87, ...]::vector); ? -- 語義搜索找最相似的 5 篇文章 SELECT id, title, 1 - (embedding [0.10, -0.50, 0.90, ...]::vector) AS similarity FROM articles ORDER BY embedding [0.10, -0.50, 0.90, ...]::vector LIMIT 5;應用場景性能優(yōu)化技巧1. 批量插入一次插入多條避免頻繁單條寫入# 推薦批量插入 collection.add(documentsdocs_list, idsids_list) ? # 不推薦循環(huán)單條每次都重新索引效率極低 # for doc, id in zip(docs_list, ids_list): # collection.add(documents[doc], ids[id])2.向量歸一化使用余弦相似度前提前歸一化向量可加速計算。import numpy as np def normalize(v): 對向量做 L2 歸一化使模長為 1 return v / np.linalg.norm(v)3. 合理設置 n_results不要無腦設置很大的 top_k一般 RAG 場景 3~10 條足夠4..善用元數據過濾在搜索時配合 where 條件縮小搜索范圍。# 只在技術文檔分類里搜索縮小范圍提升精度 collection.query( query_texts[Python 異常處理], where{category: tech_doc}, n_results5 )5.定期重建索引數據量增長后適時重建 HNSW 索引以維持查詢性能。實例選擇向量數據庫的選擇你的情況是什么 │ ├─── 已有 PostgreSQL且數據量 500 萬 │ └── 用 pgvector無縫集成零額外運維 │ ├─── 做 AI/LLM 應用原型快速驗證 │ └── 用 Chroma幾行代碼跑起來 │ ├─── 需要生產級部署性能優(yōu)先數據量 500 萬 ~ 1 億 │ └── 用 QdrantRust 實現性能強 │ ├─── 超大規(guī)模 1 億有 K8s 運維能力 │ └── 用 Milvus分布式功能最全 │ └─── 團隊沒有運維能力愿意付費 └── 用 Pinecone 云服務開箱即用嵌入模型的選擇需求推薦模型中英文文本高質量OpenAItext-embedding-3-small中文文本本地離線BAAI/bge-large-zh-v1.5多語言通用paraphrase-multilingual-MiniLM-L12-v2圖文多模態(tài)OpenAICLIP系列常見問題與解決方案問題說明解決方案嵌入模型要統一插入和查詢必須用同一個模型在配置文件中固定模型版本維度不匹配換了模型但沒重建集合換模型時刪除重建集合文本過長大多數模型有 token 限制512~8192超長文本先分塊chunking相似度不準確文本沒有分塊語義被稀釋按段落或固定長度切分文檔冷啟動慢數據量大時首次加載索引耗時提前預熱或使用持久索引