習(xí)-8.向量數(shù)據(jù)庫)
向量數(shù)據(jù)庫Vector Database概念ai用的數(shù)據(jù)庫就是向量數(shù)據(jù)庫 向量數(shù)據(jù)庫Vector Database是一種專門用于存儲、索引和檢索高維向量數(shù)據(jù)的數(shù)據(jù)庫系統(tǒng)。傳統(tǒng)數(shù)據(jù)庫通過精確匹配來查詢WHERE name Alice向量數(shù)據(jù)庫通過相似度來查詢找到和這張圖最相似的 10 張圖。嵌入嵌入Embedding是將現(xiàn)實(shí)世界的對象文字、圖片、音頻等轉(zhuǎn)換成向量的過程和結(jié)果。這個(gè)轉(zhuǎn)換由嵌入模型完成其核心思想是語義相近的對象其向量在空間中的距離也更近。主流向量數(shù)據(jù)庫算法相似度計(jì)算向量數(shù)據(jù)庫Vector Database | 菜鳥教程余弦相似度Cosine Similarity余弦相似度衡量兩個(gè)向量的方向角忽略長度。這是最常用的方法尤其適合文本場景結(jié)果范圍-1 到 1值越大越相似適用場景文本語義搜索、文檔相似度歐氏距離Euclidean Distance歐氏距離衡量兩點(diǎn)之間的直線距離距離越小越相似。結(jié)果范圍0 到 ∞值越小越相似適用場景圖像檢索、地理位置相關(guān)應(yīng)用點(diǎn)積Dot Product點(diǎn)積是向量相乘求和結(jié)合了方向和長度信息。適用場景推薦系統(tǒng)向量已歸一化時(shí)等價(jià)于余弦相似度PYTHON代碼實(shí)現(xiàn)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) ? # 點(diǎn)積結(jié)合方向與長度 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向量索引算法數(shù)據(jù)量大時(shí)百萬、億級對每一條數(shù)據(jù)做相似度計(jì)算暴力檢索太慢。向量數(shù)據(jù)庫使用專門的索引算法來加速查詢。暴力檢索Flat / Brute-force暴力檢索遍歷所有向量逐一計(jì)算相似度。維度說明原理遍歷所有向量逐一計(jì)算相似度優(yōu)點(diǎn)結(jié)果 100% 精確缺點(diǎn)數(shù)據(jù)量大時(shí)極慢O(n) 復(fù)雜度適用數(shù)據(jù)量小于 10 萬對精度要求極高IVF倒排文件索引IVF 索引原理先聚類再在桶內(nèi)搜索VF 執(zhí)行步驟訓(xùn)練階段用 K-Means 將所有向量聚成 N 個(gè)簇記錄每個(gè)簇的中心查詢階段先找出距離最近的幾個(gè)簇的中心再只在這些簇內(nèi)做精確搜索HNSW分層導(dǎo)航小世界圖HNSW 是目前最主流的向量索引算法兼顧速度和精度。HNSW 核心思路構(gòu)建多層圖結(jié)構(gòu)頂層稀疏底層密集查詢時(shí)從頂層入口開始做跳格游戲每層貪心地往更近的節(jié)點(diǎn)跳再下探到下一層大幅減少需要比較的節(jié)點(diǎn)數(shù)時(shí)間復(fù)雜度近似 O(log n)其他索引算法索引類型特點(diǎn)適用場景Flat暴力精確但慢小數(shù)據(jù)集、精度優(yōu)先IVF_Flat聚類后精確搜索速度快中大規(guī)模內(nèi)存充足IVF_PQ量化壓縮節(jié)省內(nèi)存超大規(guī)模內(nèi)存受限HNSW速度快、精度高內(nèi)存占用高最常用推薦首選ScaNNGoogle 出品優(yōu)化吞吐量高并發(fā)生產(chǎn)環(huán)境構(gòu)建一個(gè)文檔語義搜索系統(tǒng)用 Chroma最易入門演示完整的增刪改查流程。1. ChromaDBAI 領(lǐng)域最常用簡稱 Chroma 輕量級開源向量數(shù)據(jù)庫專門用于大模型 RAG、語義檢索。 ? ? Chroma RAG架構(gòu) 作用存儲文本 / 圖片生成的Embedding 嵌入向量快速做相似度搜索 特點(diǎn)開箱即用Python 一行安裝支持內(nèi)存模式 / 本地持久化 / 服務(wù)端部署 安裝pip install chromadb 典型場景本地知識庫問答、LLM 外掛記憶、文檔檢索 定位新手做 RAG 首選對比 Milvus、Pinecone 更輕量化。1.安裝pip install chromadb openai第三方嵌入api2.文件內(nèi)容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 維性價(jià)比高 ) ? # ─── 2. 創(chuàng)建集合類似關(guān)系庫里的表──────────────────────── collection client.get_or_create_collection( namemy_documents, # 集合名稱 embedding_functionopenai_ef, # 綁定嵌入函數(shù) metadata{hnsw:space: cosine} # 使用余弦相似度 ) ? # ─── 3. 插入文檔 ────────────────────────────────────────────── documents [ Python 是一種面向?qū)ο蟮慕忉屝途幊陶Z言廣泛用于數(shù)據(jù)科學(xué)和 AI 開發(fā), #//這里放文檔內(nèi)容 機(jī)器學(xué)習(xí)是人工智能的子領(lǐng)域讓計(jì)算機(jī)從數(shù)據(jù)中學(xué)習(xí)規(guī)律, 深度學(xué)習(xí)使用多層神經(jīng)網(wǎng)絡(luò)在圖像識別和 NLP 任務(wù)中表現(xiàn)優(yōu)異, 向量數(shù)據(jù)庫專門存儲高維向量支持語義相似度搜索, PostgreSQL 是功能強(qiáng)大的開源關(guān)系型數(shù)據(jù)庫, Redis 是基于內(nèi)存的高性能鍵值數(shù)據(jù)庫常用于緩存, Docker 容器化技術(shù)讓應(yīng)用可以在任何環(huán)境中一致運(yùn)行, Git 是分布式版本控制系統(tǒng)是現(xiàn)代軟件開發(fā)的基礎(chǔ)工具, ] ? ids [fdoc_{i} for i in range(len(documents))] ? # 批量插入Chroma 自動(dòng)調(diào)用嵌入模型轉(zhuǎn)為向量后存儲 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 # 余弦距離轉(zhuǎn)相似度 #//查詢?nèi)绾斡?Python 做人工智能 print(f第 {i1} 名相似度 {similarity:.4f}) --------------------------------- print(f {doc}) #第 1 名相似度 0.9231Python 是一種面向?qū)ο蟮慕忉屝途幊陶Z言... print() #第 2 名相似度 0.8874機(jī)器學(xué)習(xí)是人工智能的子領(lǐng)域... # ─── 5. 帶過濾條件的搜索元數(shù)據(jù)過濾─────────────────────── # 第 3 名相似度 0.8612深度學(xué)習(xí)使用多層神經(jīng)網(wǎng)絡(luò)... results_filtered collection.query( query_texts[數(shù)據(jù)庫技術(shù)], n_results2, where{source: tutorial}, # 只在 sourcetutorial 的文檔里搜索 include[documents, distances] ) ? # ─── 6. 更新文檔 ────────────────────────────────────────────── collection.update( ids[doc_0], documents[Python 是目前最流行的編程語言在 AI、數(shù)據(jù)分析、Web 開發(fā)中均有廣泛應(yīng)用], metadatas[{source: tutorial, index: 0, updated: True}] ) ? # ─── 7. 刪除文檔 ────────────────────────────────────────────── collection.delete(ids[doc_7]) # 刪除 Git 相關(guān)文檔 ? # ─── 8. 查看集合統(tǒng)計(jì) ────────────────────────────────────────── print(f當(dāng)前集合文檔數(shù){collection.count()})本地嵌入模型離線運(yùn)行或者不使用第三方嵌入 API只使用本地嵌入模型完全離線運(yùn)行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 [今天天氣很好, 陽光明媚適合出門, 股市大漲了, 明天可能會下雨] ? # 手動(dòng)生成向量后插入 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 用戶-- 安裝擴(kuò)展 CREATE EXTENSION IF NOT EXISTS vector; ? -- 建表存儲文章標(biāo)題及其向量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); ? -- 插入數(shù)據(jù)向量由應(yīng)用層生成后傳入 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īng)用場景性能優(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.向量歸一化使用余弦相似度前提前歸一化向量可加速計(jì)算。import numpy as np def normalize(v): 對向量做 L2 歸一化使模長為 1 return v / np.linalg.norm(v)3. 合理設(shè)置 n_results不要無腦設(shè)置很大的 top_k一般 RAG 場景 3~10 條足夠4..善用元數(shù)據(jù)過濾在搜索時(shí)配合 where 條件縮小搜索范圍。# 只在技術(shù)文檔分類里搜索縮小范圍提升精度 collection.query( query_texts[Python 異常處理], where{category: tech_doc}, n_results5 )5.定期重建索引數(shù)據(jù)量增長后適時(shí)重建 HNSW 索引以維持查詢性能。實(shí)例選擇向量數(shù)據(jù)庫的選擇你的情況是什么 │ ├─── 已有 PostgreSQL且數(shù)據(jù)量 500 萬 │ └── 用 pgvector無縫集成零額外運(yùn)維 │ ├─── 做 AI/LLM 應(yīng)用原型快速驗(yàn)證 │ └── 用 Chroma幾行代碼跑起來 │ ├─── 需要生產(chǎn)級部署性能優(yōu)先數(shù)據(jù)量 500 萬 ~ 1 億 │ └── 用 QdrantRust 實(shí)現(xiàn)性能強(qiáng) │ ├─── 超大規(guī)模 1 億有 K8s 運(yùn)維能力 │ └── 用 Milvus分布式功能最全 │ └─── 團(tuán)隊(duì)沒有運(yùn)維能力愿意付費(fèi) └── 用 Pinecone 云服務(wù)開箱即用嵌入模型的選擇需求推薦模型中英文文本高質(zhì)量OpenAItext-embedding-3-small中文文本本地離線BAAI/bge-large-zh-v1.5多語言通用paraphrase-multilingual-MiniLM-L12-v2圖文多模態(tài)OpenAICLIP系列常見問題與解決方案問題說明解決方案嵌入模型要統(tǒng)一插入和查詢必須用同一個(gè)模型在配置文件中固定模型版本維度不匹配換了模型但沒重建集合換模型時(shí)刪除重建集合文本過長大多數(shù)模型有 token 限制512~8192超長文本先分塊chunking相似度不準(zhǔn)確文本沒有分塊語義被稀釋按段落或固定長度切分文檔冷啟動(dòng)慢數(shù)據(jù)量大時(shí)首次加載索引耗時(shí)提前預(yù)熱或使用持久索引