AGENT学习-8.向量数据库

发布时间:2026/9/6 5:11:52
AGENT学习-8.向量数据库 向量数据库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暴力检索遍历所有向量逐一计算相似度。维度说明原理遍历所有向量逐一计算相似度优点结果 100% 精确缺点数据量大时极慢O(n) 复杂度适用数据量小于 10 万对精度要求极高IVF倒排文件索引IVF 索引原理先聚类再在桶内搜索VF 执行步骤训练阶段用 K-Means 将所有向量聚成 N 个簇记录每个簇的中心查询阶段先找出距离最近的几个簇的中心再只在这些簇内做精确搜索HNSW分层导航小世界图HNSW 是目前最主流的向量索引算法兼顾速度和精度。HNSW 核心思路构建多层图结构顶层稀疏底层密集查询时从顶层入口开始做跳格游戏每层贪心地往更近的节点跳再下探到下一层大幅减少需要比较的节点数时间复杂度近似 O(log n)其他索引算法索引类型特点适用场景Flat暴力精确但慢小数据集、精度优先IVF_Flat聚类后精确搜索速度快中大规模内存充足IVF_PQ量化压缩节省内存超大规模内存受限HNSW速度快、精度高内存占用高最常用推荐首选ScaNNGoogle 出品优化吞吐量高并发生产环境构建一个文档语义搜索系统用 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. 创建集合类似关系库里的表──────────────────────── collection client.get_or_create_collection( namemy_documents, # 集合名称 embedding_functionopenai_ef, # 绑定嵌入函数 metadata{hnsw:space: cosine} # 使用余弦相似度 ) ​ # ─── 3. 插入文档 ────────────────────────────────────────────── documents [ Python 是一种面向对象的解释型编程语言广泛用于数据科学和 AI 开发, #//这里放文档内容 机器学习是人工智能的子领域让计算机从数据中学习规律, 深度学习使用多层神经网络在图像识别和 NLP 任务中表现优异, 向量数据库专门存储高维向量支持语义相似度搜索, PostgreSQL 是功能强大的开源关系型数据库, Redis 是基于内存的高性能键值数据库常用于缓存, Docker 容器化技术让应用可以在任何环境中一致运行, Git 是分布式版本控制系统是现代软件开发的基础工具, ] ​ 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 开发中均有广泛应用], 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 维 ); ​ -- 创建 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;应用场景性能优化技巧1. 批量插入一次插入多条避免频繁单条写入# 推荐批量插入 collection.add(documentsdocs_list, idsids_list) ​ # 不推荐循环单条每次都重新索引效率极低 # 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几行代码跑起来 │ ├─── 需要生产级部署性能优先数据量 500 万 ~ 1 亿 │ └── 用 QdrantRust 实现性能强 │ ├─── 超大规模 1 亿有 K8s 运维能力 │ └── 用 Milvus分布式功能最全 │ └─── 团队没有运维能力愿意付费 └── 用 Pinecone 云服务开箱即用嵌入模型的选择需求推荐模型中英文文本高质量OpenAItext-embedding-3-small中文文本本地离线BAAI/bge-large-zh-v1.5多语言通用paraphrase-multilingual-MiniLM-L12-v2图文多模态OpenAICLIP系列常见问题与解决方案问题说明解决方案嵌入模型要统一插入和查询必须用同一个模型在配置文件中固定模型版本维度不匹配换了模型但没重建集合换模型时删除重建集合文本过长大多数模型有 token 限制512~8192超长文本先分块chunking相似度不准确文本没有分块语义被稀释按段落或固定长度切分文档冷启动慢数据量大时首次加载索引耗时提前预热或使用持久索引