外观
向量数据库
约 4955 字大约 17 分钟
2025-09-04
向量数据库
向量数据库(Vector Database),也叫矢量数据库,是专为处理高维向量数据而设计的数据库系统,它能高效存储和查询由文本、图像、音频、视频等非结构化数据通过嵌入(Embedding)技术转换得到的向量。其核心价值在于能快速进行相似性搜索,非常适合人工智能时代的各种应用。
关键概念
- 向量(Vector):一组有序的数值,代表在高维空间中的点或方向,用于表示文本、图像等复杂对象的特征。
- 向量嵌入(Embedding):将非结构化数据(如文本、图像)通过模型(如 Word2Vec、BERT、CLIP)转化为向量的过程。嵌入向量能够捕捉数据的语义信息。
- 近似最近邻搜索(ANN, Approximate Nearest Neighbor):高维向量的精确搜索(如 KNN)计算成本高,向量数据库通过索引算法(如 HNSW、IVF、LSH)实现快速近似搜索,在精度和效率之间取得平衡。
工作流程
- 向量化:利用嵌入模型将原始数据(文本、图像等)转换为向量。
- 索引构建:为存储的向量集合构建专门的索引结构(如 HNSW、IVF-PQ),这是实现高速查询的关键。
- 查询处理:将查询输入(例如一段文字或一张图片)同样转化为向量,然后通过索引快速找到与查询向量最相似的 Top-K 个结果。
- 后处理:有些系统会对初步结果进行重新排序或过滤,以提升结果的相关性和准确性。
核心用途与应用场景
向量数据库的核心用途是进行相似性搜索,从而解锁了多种应用场景:
- 检索增强生成(RAG):这是当前大模型领域的杀手级应用。向量数据库为 LLM 提供外部知识库,使其生成的内容更准确、更相关。
- 语义搜索:实现“意思”上的搜索,而不仅仅是关键词匹配。例如,搜索“快乐的动物”,可能会返回包含“嬉笑的小狗”的图片或文档。
- 推荐系统:用户和物品(商品、电影等)都被表示为向量。通过计算用户向量与所有物品向量的相似度,为其推荐最感兴趣的物品。
- 内容检索与去重:包括以图搜图、以音搜音、人脸识别等。系统通过比较特征向量来找到相似的内容。
- 异常检测:在金融风控或工业质检中,正常操作的数据向量会聚集在特定区域。一个与正常向量距离很远的向量,很可能意味着异常事件的发生。
与传统数据库查询方面的区别
- 传统数据库的查询核心是 “精确匹配” 。它回答的是“有没有?”(是否存在某条记录)和“是多少?”(某条记录的具体值)这类问题。其价值在于保证数据的准确性和一致性。
- 向量数据库的查询核心是 “相似搜索” 。它回答的是“像什么?”(哪些内容与查询目标在语义或特征上接近)和“有多像?”(用相似度分数量化)这类问题。其价值在于理解和挖掘非结构化数据的内涵。
假设有一个电商平台:
- 传统数据库(MySQL)负责存储:
用户ID、订单号、商品SKU、价格、创建时间。- 查询:“查询用户 ID 为 12345 的所有订单” -> 快速返回精确结果。
- 向量数据库(Milvus)负责存储:
商品图片的特征向量、商品描述文本的特征向量。- 查询:“找一张沙发图片” -> 返回 visually similar(视觉上相似)的家具,如扶手椅、躺椅,并可按风格(北欧、中式)过滤。
向量 Vector
向量(Vector),也称为矢量,是数学、物理学和工程科学等多个学科中的基本概念。它本质上是一个同时具有大小(长度)和方向,且满足平行四边形法则的几何对象
向量数据库中的“向量”,远不止是简单的数字列表。它是将文本、图像、音频等非结构化数据,通过深度学习模型转换后得到的数值化表示,旨在捕捉数据的深层特征和语义信息
| 方面 | 说明 | 示例或备注 |
|---|---|---|
| 本质 | 一组有序的数值(通常是浮点数),代表对象在高维空间中的位置和特征。 | 在二维/三维空间中,可以直观理解为点或箭头;在高维空间中是抽象概念。 |
| 来源(嵌入) | 通过嵌入模型(如 BERT 用于文本、ResNet 用于图像)将非结构化数据(文本、图像、音频等)转换而来。 | 单词 "apple" 可能被表示为 [0.12, -0.45, 0.88, ...] 这样的数百维向量。 |
| 核心思想 | 语义相近的数据,其向量在空间中的距离也更近。 | "猫" 和 "狗" 的向量距离,会比 "猫" 和 "汽车" 的向量距离更近。 |
| 相似性度量(用途) | 通过计算向量间的“距离”或“相似度”来衡量数据的相关性。常用方法包括: | |
| ∟ 余弦相似度 | 衡量向量方向的差异,忽略其大小(模长)。范围[-1, 1],值越大越相似。 | 适用于文本等场景,关注语义而非出现频率。 |
| ∟ 欧几里得距离 (L2) | 衡量向量间的直线距离。距离越小越相似。 | 适用于需要考虑绝对数值差异的场景,如某些推荐系统。 |
| ∟ 点积相似度 | 计算结果对向量长度敏感。值越大越相似,但需注意向量归一化处理。 |
向量在数据库中的组织与检索
- 索引(Indexing):为了在海量向量中快速找到相似项,数据库会为向量集合构建索引。这就像是给书籍编目,常见的索引算法有HNSW(基于图)、IVF(基于聚类)、PQ(乘积量化) 等。它们通过牺牲少量精度来极大提升检索速度。
- 检索(Retrieval):用户提供一个查询向量(例如由问题文本生成),数据库通过索引快速找到最相似的向量,并返回其对应的原始数据。
向量嵌入
向量嵌入(Vector Embeddings)是现代机器学习,特别是处理文本、图像、音频等非结构化数据的核心概念。它通过一种巧妙的方式,将复杂信息转换为计算机能够理解和处理的数值形式。核心在于, 它将人类理解的“含义”或“语义相似性”转换成了计算机可以计算的“空间距离”。
| 嵌入类型 | 描述 | 示例与应用 |
|---|---|---|
| 词嵌入 | 将单个词语表示为向量,捕获语义关系和上下文信息 | Word2Vec, GloVe。用于机器翻译、文本分类基础 |
| 句子嵌入 | 将整个句子表示为向量,捕获句子的整体含义和上下文 | Universal Sentence Encoder (USE)。用于语义相似度计算、智能问答 |
| 文档嵌入 | 将整个文档(如文章、论文)表示为向量,捕获文档的语义信息和上下文 | Doc2Vec, 段落向量。用于文档检索、内容分析 |
| 图像嵌入 | 将图像转换为向量表示,捕获不同的视觉特征 | ResNet, VGG。用于图像分类、以图搜图、图像相似性 |
| 用户嵌入 | 将用户表示为向量,捕获用户偏好、行为和特征 | 用于个性化推荐、用户细分 |
| 产品嵌入 | 将产品表示为向量,捕获产品属性、功能和语义信息 | 用于电商推荐、产品比较 |
| 多模态嵌入 | 将不同模态(如文本和图像)的数据映射到同一向量空间,实现跨模态语义对齐 | CLIP, BGE-M3。用于图文互搜、跨模态检索 |
近似最近邻搜索
近似最近邻搜索(ANN, Approximate Nearest Neighbor Search)是一种用于在高维空间中快速查找与查询点“足够接近”而非绝对最近的数据点的技术。它通过在可接受的精度范围内牺牲少量准确性,来极大提升检索效率,特别适用于处理海量高维数据。
在电商领域,ANN 能帮助用户更快发现心仪商品。
"猜你喜欢"与个性化推荐:电商平台会将每个用户的行为(浏览、收藏、购买)和属性,以及每个商品的信息(标题、描述、图片)转换为向量。当你想获取个性化推荐时,系统并非遍历所有商品,而是将你的用户向量作为查询点,通过 ANN 快速在海量商品向量中查找最相似的几十个,从而生成你的“专属推荐”。这种基于向量相似度的推荐,比传统基于规则的推荐更能理解你的潜在偏好。
"以图搜图":看到心仪商品图片却不知如何描述?上传图片,系统通过深度学习模型提取图片特征并转换为向量,然后通过 ANN 在商品图片向量库中快速搜索视觉上最相似的图片及其对应商品。这背后就是 ANN 在支持毫秒级的相似图片检索。
相似性度量
相似性度量是机器学习和数据挖掘中的一个核心概念,它用数学方式量化对象、数据点或向量之间的相似性。理解并选择合适的相似性度量,对解决许多现实世界问题非常关键
相似性度量的核心在于以数学方式量化对象、数据点或向量之间的相似性。其基本思想是,两个对象越接近,它们的相似性度量值就越大(对于相似系数)或越小(对于距离函数)。
在机器学习中,我们通常将数据对象(如用户、商品、图片、文本)表示为特征向量。这些向量可以是数字、二进制值或其他形式的表示。相似性度量通过计算这些向量之间的某种“距离”或“相似系数”来评估其相似程度
余弦相似度
余弦相似度是一种用于衡量两个向量在方向上相似程度的指标,它广泛应用于文本分析、推荐系统、图像识别等领域,它通过忽略向量的长度,只关注其方向来衡量相似性。这使得它在文本分析、推荐系统等需要比较高维数据“形状”或“主题”而非绝对数值的领域尤为有效。
关键思路
| 方面 | 说明 |
|---|---|
| 核心思想 | 衡量两个向量的方向差异,而非它们的绝对距离或长度。只关心方向是否一致,对幅度不敏感。 |
| 取值范围 | -1 到 1 |
| • 1: 向量方向完全相同 • 0: 向量垂直(正交),无相关性 • -1: 向量方向完全相反 | |
| 计算公式 | ( \text\theta = \frac{A \cdot B}{|A| |B|} ) (其中 ( A \cdot B ) 表示点积,( |A| ) 和 ( |B| ) 分别表示向量的模(长度)) |
| 对向量长度的态度 | 不敏感。只要方向一致,无论向量长度差异多大,余弦相似度都接近 1。 |
| 主要应用领域 | 文本相似度分析、推荐系统、自然语言处理(NLP)、图像识别等。 |
应用场景
- 文本分析与自然语言处理 (NLP):这是余弦相似度最经典的应用领域。文档被表示为高维空间中的向量(如词频向量或 TF-IDF 向量),通过计算这些向量的余弦相似度,可以判断文档主题的相似性。
- 推荐系统:用于计算用户之间的兴趣相似度(基于用户的行为或评分向量)或物品之间的相似度(基于喜欢该物品的用户向量),从而进行基于用户的协同过滤或基于物品的协同过滤推荐。
- 图像识别:图像特征可以被编码为特征向量。通过计算这些特征向量之间的余弦相似度,可以衡量图像的相似性,用于图像检索或分类。
- 异常检测:通过计算一个数据点的特征向量与大部分数据点整体方向之间的余弦相似度,可以帮助识别出方向显著不同的异常点。
欧几里得距离
欧几里得距离(Euclidean Distance),也称欧氏距离,是衡量多维空间中两点之间直线距离的一种方法。它源于勾股定理,是我们最直观理解的距离概念,广泛应用于数学、物理学、计算机科学和人工智能等领域
| 方面 | 说明 |
|---|---|
| 核心思想 | 计算两点之间的直线距离(最短路径) |
| 取值范围 | [0, +∞),值越小表示两点越接近 |
| 计算公式(n 维) | d=∑i=1n(xi−yi)2 (其中 xi 和 yi 分别是两点在第 i 个维度上的坐标) |
| 主要优点 | 计算简单、直观易懂 |
| 主要缺点 | 对数据尺度敏感、对异常值敏感、高维数据下效果可能下降 |
点积相似度
点积相似度(Dot Product Similarity)是一种通过计算两个向量点积(内积)来衡量它们相似性的方法。它通过将两个向量对应元素相乘后求和,得到一个标量值。这个值越大,通常表示两个向量越相似
| 方面 | 说明 |
|---|---|
| 核心思想 | 通过计算两向量点积(对应元素相乘再求和)来衡量相似性,结果同时受向量长度和方向影响。 |
| 取值范围 | (-∞, +∞) |
| 值越大 | 表示向量越相似(尤其在向量各元素值非负时) |
| 计算公式(n 维) | A⋅B=∑i=1naibi (其中 ai 和 bi 分别是向量 A 和 B 在第 i 个维度上的值) |
| 主要特点 | 计算简单、未归一化(对向量长度敏感) |
| 与余弦相似度关系 | 余弦相似度是点积的归一化形式(除以模长),只关注方向,忽略长度。 |
向量数据库的选择
| 数据库名称 | 类型/背景 | 核心优势 | 典型应用场景 | 社区热度 (GitHub Stars 参考) |
|---|---|---|---|---|
| Milvus | 开源原生 | 高性能、可扩展架构,支持十亿级向量检索,支持多种索引和 GPU 加速 | 大规模图像/视频检索、推荐系统、自然语言处理 | 23k+ (社区活跃) |
| Zilliz Cloud | Milvus 商业托管版 | 企业级支持,高性能(宣称百亿向量毫秒级检索),免运维 | 需企业级支持和高稳定性的大规模 AI 应用 | - |
| Pinecone | 商业托管 | 全托管,开箱即用,实时数据更新,低延迟搜索 | 生成式 AI(如 ChatGPT 记忆存储)、快速原型、实时推荐系统 | - |
| Weaviate | 开源原生 | 支持多模态数据(文本、图像),向量+图数据库混合搜索,内置 NLP 模块 | 知识图谱、智能问答系统、多模态搜索 | 7.5k+ |
| Qdrant | 开源原生 | Rust 编写,高性能且内存效率高,支持过滤和地理位置查询 | 高并发实时推荐系统、生成式 AI 应用 | 13k+ |
| Chroma | 开源原生 | 轻量级,API简单易用,与Python 生态和 AI 框架(如 LangChain)集成紧密 | 小型项目原型开发、实验性语义搜索 | 8k+ |
| Faiss | Meta 开源库 | 由 Meta 开发,相似性搜索算法丰富高效,支持 CPU/GPU 加速 | 学术研究、底层算法优化、与其它数据库结合使用 | 22k+ |
| Pgvector | PostgreSQL 扩展 | 作为 PostgreSQL 扩展,兼容 SQL,支持混合查询(向量+关系数据) | 已有 PostgreSQL 的业务升级、中小规模向量检索 | - |
- 数据规模与性能:需处理十亿级以上向量且要求高性能,可考虑 Milvus、Zilliz Cloud。若数据量在百万级,Qdrant、Weaviate、Pgvector等也能胜任。
- 部署与运维:
- 希望免运维:Pinecone、Zilliz Cloud这类全托管服务更省心。
- 愿意自建和维护:开源选项如 Milvus、Weaviate、Qdrant 提供更多控制权。
- 功能特性:
- 需结合文本和向量进行混合搜索:Weaviate、Elasticsearch 有优势。
- 需强事务一致性或复杂关联查询:Pgvector(依托 PostgreSQL)、Oracle 向量扩展 更合适。
- 关注多模态检索(如图文互搜):Weaviate、Milvus。
- 成本:
- 预算有限或技术探索:优先考虑开源方案(如 Chroma、Milvus、Qdrant)。
- 商业项目且注重开发效率与稳定性:可评估托管服务(如 Pinecone、Zilliz Cloud)的付费模式。
- 团队技术栈:若团队熟悉 Python,Chroma 和 Qdrant 更易上手;若已有 PostgreSQL 基础,Pgvector 学习成本低。
- 特定需求:如边缘计算场景,可关注 LanceDB;需处理极高并发且延迟要求极低,RedisVL 是基于内存的选择。
编程语言的选择
| 编程语言 | 主要优势 | 主流向量数据库支持情况 | 典型应用场景 |
|---|---|---|---|
| Python | AI/ML 生态丰富、开发效率高、学习曲线平缓、社区资源庞大 | 所有主流数据库(Chroma, Milvus, Qdrant, Weaviate, Pinecone, Faiss, Pgvector 等)均提供官方 Python SDK或优先支持 | AI 原型开发、学术研究、数据科学、中小规模生产环境、快速验证想法 |
| JavaScript/TypeScript | 全栈开发、丰富的 Web 生态、非阻塞 I/O 模型适合 IO 密集型应用 | Qdrant, Weaviate, Pinecone, Milvus 等提供官方 JS/TS 客户端 | Web 应用集成(尤其是前后端都使用 JS 的全栈应用)、Node.js 后端服务、实时应用 |
| Go | 高性能、高并发、静态编译(部署简单)、强大的标准库 | Milvus(其分布式框架使用 Go 开发)、Qdrant、Weaviate、Vald 等提供官方 Go 客户端 | 高性能后端服务、微服务架构、需要高并发和处理大量请求的系统、CLI 工具 |
| Rust | 极致性能、内存安全(无 GC)、系统级控制能力 | Qdrant(其核心使用 Rust 编写)、LanceDB(使用 Rust 构建)提供原生 Rust 接口。Milvus 等也通过 gRPC 提供支持 | 对性能和资源控制有极致要求的系统、嵌入式环境、与 Rust 生态集成的项目 |
| Java | 企业级应用广泛、稳定性高、强大的 JVM 生态、多线程能力成熟 | Vespa(提供 Java API)、Milvus、Weaviate、Qdrant 等提供 Java 客户端 | 传统大型企业系统、Android 开发、已有 Java 技术栈的项目集成、Hadoop/Spark 生态集成 |
AI 原型、学术研究、数据科学、快速验证想法:Python 是首选。其丰富的库(如 NumPy、Pandas、PyTorch、TensorFlow)和所有向量数据库的优先支持,能让你快速上手和迭代。
构建 Web 应用、实时系统、全栈开发:JavaScript/TypeScript 很合适,尤其如果你的团队是全栈团队,或产品前后端都基于 JS/TS。
构建高性能后端、微服务、高并发系统:考虑 Go。其高性能、高并发特性适合构建需要处理大量向量检索请求的稳健后端服务。
追求极致性能、资源控制、系统级编程:Rust 是值得投资的选项,尤其在使用 Qdrant 或 LanceDB 时,可以获得最佳性能和内存安全保证。
现有 Java 技术栈、企业级应用、Android 开发:Java 依然是一个可靠的选择,可以很好地集成到现有 Java 生态中。