用途
向量数据库用于存储高维数值表示(嵌入),并支持快速相似度搜索。与匹配精确值的传统数据库不同,向量数据库查找与查询向量最接近的向量,从而实现语义匹配。本技能资料围绕嵌入、语义搜索和 RAG(检索增强生成)流水线展开,适合在用户提及“向量数据库”“嵌入”“语义搜索”“RAG”等场景时使用。
核心能力
- 将嵌入与元数据和原始内容一同存储
- 大规模执行近似最近邻(ANN)搜索
- 将元数据过滤与向量相似度结合
- 处理数百万到数十亿向量,查询时间达亚秒级
嵌入基础
嵌入是捕获语义含义的定长浮点数组。含义相似的文本在嵌入空间中会产生彼此接近的向量。
- 维度:向量长度。常见大小为 384、768、1536、3072。越高越精细,但成本也越高。
- 嵌入模型:将原始数据转换为向量。不同模型产生不同维度。
- 距离度量:衡量两个向量之间相似度的方式。
资料给出了使用 OpenAI、Sentence-Transformers(本地)和 Cohere 生成嵌入的代码示例。
主要工具
ChromaDB(本地,Python)
轻量级嵌入式向量数据库,适合原型开发及中小规模工作负载。安装命令为 pip install chromadb。可以创建内存客户端或持久化客户端,创建集合(可指定 cosine、l2 或 ip 距离空间),添加文档并可自动生成嵌入,也支持查询时进行元数据过滤。若使用预计算嵌入,可在 add() 和 query() 中传入 embeddings 参数(查询使用 query_embeddings)。
pgvector(PostgreSQL 扩展)
为 PostgreSQL 增加向量列类型和相似度操作符,适合已运行 Postgres 并希望将向量与关系数据放在一起的场景。示例展示了创建 vector 扩展、建表(content、embedding vector(1536)、metadata JSONB 等)、创建 HNSW 索引或 IVFFlat 索引,以及基于余弦距离排序并带元数据过滤的查询。操作符类包括 vector_cosine_ops (<=>)、vector_l2_ops (<->)、vector_ip_ops (<#>)。Python 可使用 psycopg 配合 pgvector.psycopg.register_vector(conn) 直接传向量参数。
Pinecone(托管云)
全托管向量数据库,无需维护基础设施,支持命名空间进行逻辑分区。安装命令为 pip install pinecone。示例展示创建索引(指定维度、metric 如 cosine/euclidean/dotproduct 以及 serverless 规格)、upsert 向量并附带元数据、以及带元数据过滤的查询。命名空间可在同一索引内分区数据,查询只在一个命名空间内搜索,可用于分隔租户、环境或文档类型。
Qdrant(自托管或云)
用 Rust 编写的高性能向量数据库,可通过 Docker 自托管或使用托管云。启动命令为 docker run -p 6333:6333 qdrant/qdrant,安装命令为 pip install qdrant-client。示例展示创建集合(指定向量大小与距离)、upsert 点(含 payload)、以及带过滤条件的 query_points 查询。
距离度量
- 余弦:范围 0 到 1(距离),适合文本相似度,方向重要、忽略大小,是最常见的默认选择。
- 欧几里得(L2):范围 0 到无穷,适合图像特征和空间数据,对大小敏感。
- 点积:范围 -inf 到 inf,适合已归一化的向量,速度最快,对单位向量等价于余弦。
建议:除非有特定理由,否则使用余弦;向量已单位归一化时使用点积;向量大小有意义时使用欧几里得。
索引类型
- Flat(暴力搜索):将查询与每个向量比较,召回完美但最慢,适用于 1 万向量以下。
- HNSW(分层可导航小世界):基于图的近似搜索,高召回(>95%)、查询快、内存占用较高,是通用最佳索引。关键参数:M(每节点连接数)、ef_construction(构建质量)、ef(搜索质量)。
- IVF(倒排文件索引):对向量聚类,只搜索邻近簇,构建比 HNSW 快、召回较低。关键参数:nlist(簇数量)。适合需要快速构建索引的场景。
分块策略
长文档在嵌入前必须切分:
- 固定大小:按 N 个 token 切分并保留重叠,简单可预测。
- 基于句子:使用 nltk.sent_tokenize() 按句子边界切分,保留语法单元。
- 递归字符切分:按段落、句子、单词逐级切分,保持语义相关文本在一起,LangChain 的 RecursiveCharacterTextSplitter 即采用此方式。
- 语义分块:按嵌入相似度对句子分组,相似度低于阈值时开始新块,结果最连贯但更慢更昂贵。
指南:256-512 token 是较好的默认块大小;使用 10-20% 重叠保留边界上下文;小块检索更精确,大块每条结果上下文更多;问答适合小块,摘要适合大块。
元数据过滤
主流向量数据库都支持将向量相似度与元数据过滤结合。常见操作包括:相等、范围、列表成员、布尔组合。预过滤可减少比较的向量数量并提升查询速度。
RAG 流水线模式
检索增强生成:嵌入查询 -> 向量搜索 -> 注入上下文 -> LLM 生成答案。资料给出了 rag_query 函数示例。要点:文档与查询始终使用同一嵌入模型;检索比预想更多的块,再由 LLM 过滤相关性;包含元数据(来源、页码)以便 LLM 引用来源。
常见模式
- 文档问答:分块(256-512 token 带重叠),嵌入并存储元数据(文档 ID、页码、章节),查询时取 top-k 交给 LLM。
- 代码搜索:解析为函数/类,嵌入代码和自然语言描述,使用元数据过滤语言/仓库/路径。
- 推荐引擎:按描述/特征嵌入物品,嵌入用户偏好或近期交互,搜索相似物品并过滤已看内容。
选型建议
- 原型、本地开发:ChromaDB
- 已在使用 PostgreSQL:pgvector
- 托管、零运维:Pinecone
- 自托管、高性能:Qdrant
- 大规模生产:Qdrant 或 Pinecone
- 预算紧张、中等规模:pgvector 或带持久化存储的 ChromaDB
限制
资料未提供各方案的具体收费与价格信息;未提供性能基准数据;未提供安装以外的完整部署与运维步骤;未提供除示例代码外的完整 API 参考。