向量数据库 (Vector Database / Vector Store) 是一种专门设计用于高效存储、管理和检索向量嵌入 (Vector Embeddings) 的数据库。这些向量嵌入是高维的数值表示,由机器学习模型生成,能够捕捉文本、图像、音频或其他复杂数据的语义信息。向量数据库的核心能力在于通过计算向量之间的相似度 (Similarity) 来进行快速搜索,而非传统的精确匹配。

核心思想:将非结构化数据转化为机器可理解的低维或高维向量表示(嵌入),并在此基础上实现基于语义相似度的快速检索。它解决了传统数据库在处理语义搜索、推荐系统、多模态数据匹配等场景下的局限性。


一、什么是向量 (Vector)?

在深入了解向量数据库之前,我们必须先理解“向量”这个核心概念。

1.1 向量的数学定义

在数学和物理中,向量 (Vector) 是一个具有大小 (Magnitude)方向 (Direction) 的量。它可以被表示为一个有序的数值列表。

  • 一维向量:一个标量,如 [5]
  • 二维向量:表示平面上的一个点或从原点指向该点的箭头,如 [x, y]。例如,[3, 4]
  • 三维向量:表示空间中的一个点,如 [x, y, z]。例如,[1, -2, 5]
  • N维向量:由 N 个数值组成的有序列表,如 [v1, v2, ..., vN]

在计算机科学和人工智能领域,我们通常将高维向量视为一个固定长度的数值数组。这些数值是浮点数,每个数值对应向量空间中的一个维度。

1.2 向量在人工智能中的核心作用:嵌入 (Embeddings)

在人工智能特别是自然语言处理 (NLP) 和计算机视觉 (CV) 领域,向量被赋予了更深层的含义——它们是复杂数据的数值表示 (Numerical Representation),通常被称为嵌入 (Embeddings)

  1. 数据的数值化:计算机无法直接理解人类语言、图像像素或音频波形。嵌入模型的作用就是将这些非结构化数据转换成计算机可以处理的数值形式。
  2. 语义表示:最关键的是,这些嵌入向量不仅仅是简单的数值化,它们被设计来捕捉原始数据的语义信息。这意味着:
    • 语义相似的数据,其对应的向量在向量空间中的距离也更近。
    • 例如,在文本领域,“猫”和“小猫”的嵌入向量会比“猫”和“汽车”的向量在空间上更接近。
    • 在图像领域,两张包含相同物体(如狗)的图像,即使姿态、光线不同,它们的嵌入向量也会很相似。
  3. 高维度:为了捕获输入数据的丰富语义和复杂特征,这些嵌入向量的维度通常很高,从几十维到上千维不等(例如,text-embedding-ada-002 模型生成 1536 维的向量)。
  4. 生成方式:嵌入向量通常由专门的嵌入模型 (Embedding Model) 生成。这些模型是在海量数据上预训练的神经网络,它们学习如何将输入数据映射到一个语义空间中。
    • 文本嵌入模型:Word2Vec, GloVe, FastText, BERT, OpenAI 的 text-embedding-ada-002, Google 的 PaLM Embeddings 等。
    • 图像嵌入模型:ResNet 特征提取层、CLIP (Contrastive Language-Image Pre-training) 等。

Python 示例:使用 SentenceTransformer 生成文本嵌入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from sentence_transformers import SentenceTransformer
import numpy as np

# 加载一个预训练的文本嵌入模型
# 'all-MiniLM-L6-v2' 是一个常用且高效的模型,生成 384 维向量
model = SentenceTransformer('all-MiniLM-L6-v2')

# 原始文本数据
texts = [
"向量数据库是AI的核心基础设施。",
"大型语言模型可以生成高质量文本。",
"狗是一种常见的宠物。"
]

# 将文本编码成向量
embeddings = model.encode(texts)

print(f"生成的嵌入向量的形状: {embeddings.shape}") # (3, 384) 表示3个文本,每个是384维
print(f"第一个文本的嵌入向量 (前5维): {embeddings[0][:5]}")
print(f"第二个文本的嵌入向量 (前5维): {embeddings[1][:5]}")

# 计算第一个和第二个文本的相似度 (余弦相似度)
# 因为它们都与AI相关,所以相似度应该相对较高
similarity_ai_llm = np.dot(embeddings[0], embeddings[1]) / (np.linalg.norm(embeddings[0]) * np.linalg.norm(embeddings[1]))
print(f"第一个文本('向量数据库...')与第二个文本('大型语言模型...')的余弦相似度: {similarity_ai_llm:.4f}")

# 计算第一个和第三个文本的相似度
# 这两个文本语义相去甚远,相似度应该较低
similarity_ai_dog = np.dot(embeddings[0], embeddings[2]) / (np.linalg.norm(embeddings[0]) * np.linalg.norm(embeddings[2]))
print(f"第一个文本('向量数据库...')与第三个文本('狗是一种常见的宠物.')的余弦相似度: {similarity_ai_dog:.4f}")

从上面的例子中可以看出,语义相关的文本(AI相关)的向量相似度远高于语义不相关的文本。这就是向量数据库能够进行“语义搜索”的基石。

二、为什么需要向量数据库?传统数据库的局限性

传统数据库(关系型数据库、KV 存储、文档数据库)在处理以下现代 AI 和数据需求时存在显著局限性:

  1. 语义搜索的缺失:传统数据库主要依赖关键词的精确匹配或结构化查询语言 (SQL),无法理解查询的深层语义。例如,搜索“水果”不会自动返回“苹果”或“香蕉”。
  2. 非结构化数据处理的不足:虽然可以存储文本或二进制大对象 (BLOB),但传统数据库难以对这些非结构化数据的内容本身进行高效索引和语义查询。
  3. 大模型应用的驱动:大型语言模型 (LLM) 以向量嵌入的形式处理和生成信息。为了增强 LLM 的能力,如检索增强生成 (RAG),需要一个外部系统来存储和高效检索这些高维向量。
  4. 相似性匹配需求:在推荐系统、去重、异常检测等场景中,核心是找出与某个项目“相似”的其他项目,这正是向量相似度计算的强项。
  5. 性能与扩展性瓶颈:尽管有些传统数据库通过插件或扩展支持向量索引,但它们并非为高维向量的相似度搜索而从底层优化,其性能和可扩展性往往难以满足大规模、高并发的语义搜索需求。

向量数据库正是为了解决这些挑战而诞生的。

三、向量数据库的核心概念与技术

了解了向量之后,我们可以更深入地探讨向量数据库的关键技术。

3.1 相似度度量 (Similarity Metrics)

用于量化两个向量之间“相似性”的数学方法。

  • 余弦相似度 (Cosine Similarity)
    • 定义:衡量两个向量在 N 维空间中方向的夹角。值介于 -1 和 1 之间。
    • 特点:夹角越小,方向越一致,余弦值越接近 1,表示相似度越高。它对向量的长度不敏感,更关注方向。
    • 适用场景:文本语义相似度(因为文本的含义更多体现在词向量的方向上)。
  • 欧氏距离 (Euclidean Distance)
    • 定义:衡量两个向量在 N 维空间中的直线距离。
    • 特点:距离越小,相似度越高。它对向量的绝对值和长度都敏感。
    • 适用场景:图像特征、物理距离等。
  • 内积 / 点积 (Dot Product)
    • 定义:两个向量的对应元素相乘再求和。
    • 特点:内积越大,相似度越高。它结合了向量的大小和方向。当向量经过归一化(长度为1)后,内积就等同于余弦相似度。
    • 适用场景:推荐系统等。

3.2 高维向量空间与维数灾难 (Curse of Dimensionality)

  • 高维空间:向量数据库存储的向量维度通常很高(几百到几千维),以尽可能捕获原始数据的复杂特征。
  • 维数灾难:在高维空间中,数据点变得异常稀疏,并且所有数据点到任何查询点的距离都趋于相似。这导致简单的全量扫描计算距离的方式(精确最近邻搜索)变得极其低效和昂贵。

3.3 近似最近邻搜索 (Approximate Nearest Neighbor, ANN)

为了克服维数灾难,向量数据库普遍采用 ANN 算法进行近似搜索。

  • 为什么是近似?:精确最近邻 (Exact Nearest Neighbor, kNN) 搜索在高维空间中计算成本太高,需要比较查询向量与数据库中所有向量的距离。ANN 算法通过牺牲少量的搜索精度(可能不是严格意义上最近的,但也是非常近的),来大幅提升搜索速度和可扩展性。
  • 常见 ANN 算法类型
    • 基于哈希 (Hashing-based):如局部敏感哈希 (Locality Sensitive Hashing, LSH),将高维向量映射到低维哈希桶,期望相似向量落入同一桶。
    • 基于树 (Tree-based):如 KD-树、Ball-树,通过递归地划分空间来组织数据,但不适用于很高维的数据。
    • 基于量化 (Quantization-based):如乘积量化 (Product Quantization, PQ),通过将向量分解成子向量并在子向量上进行量化来压缩存储和加速计算。
    • 基于图 (Graph-based):如 HNSW (Hierarchical Navigable Small Worlds),目前最流行且高效的 ANN 算法之一。它构建一个多层图结构,上层图连接稀疏,用于快速导航到目标区域;下层图连接密集,用于精细搜索。

HNSW (Hierarchical Navigable Small Worlds) 概念图

说明:HNSW 算法通过构建一个多层导航图,上层图节点稀疏但相互连接很远,用于快速“跳跃”到达大致区域;下层图节点密集且连接较近,用于精确地搜索局部邻居。这种分层结构显著地加速了高维空间中的近似最近邻搜索。

四、向量数据库的工作流程

一个典型的向量数据库的工作流程包括以下几个关键步骤:

  1. 数据摄入 (Data Ingestion)

    • 原始的非结构化数据(文本、图像、音频、视频等)连同其元数据(如文档 ID、作者、创建日期、分类标签)被输入到系统中。
  2. 嵌入生成 (Embedding Generation)

    • 这是将原始数据转换为向量的核心步骤。使用预训练的嵌入模型将原始数据转换成具有丰富语义信息的高维向量嵌入。
    • 关键点:确保用于生成查询向量和数据库中存储向量的嵌入模型是相同的,以保证向量空间的一致性。
  3. 索引构建 (Index Building)

    • 将生成的向量嵌入(以及关联的元数据)存储到向量数据库中。
    • 向量数据库会根据用户选择的 ANN 算法(如 HNSW、IVF_FLAT 等)在后台构建高效的索引结构,以便后续的快速检索。
  4. 查询处理 (Query Processing)

    • 用户发起一个查询请求。这个查询可以是文本、图像、音频,甚至是另一个向量。
    • 查询向量化:将用户查询通过相同的嵌入模型转换为一个高维查询向量。
    • 近似最近邻搜索:向量数据库使用其内部的 ANN 算法(基于构建好的索引)在向量空间中查找与查询向量最相似的 K 个向量。
    • 结果返回:返回这些相似向量及其对应的原始数据或元数据。

Python 示例:使用 LangChainChroma 构建简单的 RAG 流程
这个例子展示了如何将向量数据库(Chroma)集成到 RAG 流程中,从而理解其作为 RAG 核心组件的角色。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import os
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings # 也可以使用 huggingface-hub 的本地模型
from langchain_community.vectorstores import Chroma

# 1. 准备数据和环境变量 (假设你有一个文本文件)
# 创建一个测试文件
with open("knowledge_base.txt", "w", encoding="utf-8") as f:
f.write("向量数据库是AI时代的核心基础设施。\n")
f.write("它们专门用于存储和检索高维向量嵌入。\n")
f.write("大型语言模型(LLM)的兴起推动了向量数据库的发展。\n")
f.write("RAG(检索增强生成)技术是向量数据库的一个重要应用场景。\n")
f.write("通过将原始数据转换为向量嵌入,可以实现语义搜索。\n")
f.write("余弦相似度是衡量向量方向相似度的一种常见度量方法。\n")
f.write("HNSW是一种高效的近似最近邻(ANN)搜索算法。\n")

# !!! 请设置你的 OpenAI API Key !!!
# os.environ["OPENAI_API_KEY"] = "sk-xxxxxxxxxxxxxxxxxxxxxxxx"

# 2. 数据摄入和分块 (Indexing Module的一部分)
loader = TextLoader("knowledge_base.txt", encoding="utf-8")
documents = loader.load()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
chunks = text_splitter.split_documents(documents)

print(f"原始文档数量: {len(documents)}")
print(f"切分后文本块数量: {len(chunks)}")
print(f"第一个文本块内容: {chunks[0].page_content}")

# 3. 嵌入生成和索引构建 (Storing Embeddings)
# 初始化嵌入模型
embeddings_model = OpenAIEmbeddings(model="text-embedding-ada-002") # 或者其他模型

# 将文本块及其嵌入存储到 Chroma 向量数据库 (内存版)
# Chroma.from_documents 会自动生成嵌入并构建索引
vectorstore = Chroma.from_documents(chunks, embeddings_model, persist_directory="./chroma_db_dir")
print("\n文本块已嵌入并存储到 Chroma 向量数据库。")

# 4. 查询处理 (Retrieval)
query_text = "什么是RAG技术?"

# 获取一个检索器实例,它将处理查询并返回相似文档
retriever = vectorstore.as_retriever(search_kwargs={"k": 2}) # 检索最相似的2个文本块

print(f"\n用户查询: '{query_text}'")
print("\n--- 开始在向量数据库中检索 ---")
retrieved_docs = retriever.invoke(query_text)

print("\n--- 检索到的最相似文档 ---")
for i, doc in enumerate(retrieved_docs):
print(f"文档 {i+1}:\n{doc.page_content}\n---")

# 清理测试文件和数据库目录
os.remove("knowledge_base.txt")
# import shutil
# if os.path.exists("./chroma_db_dir"):
# shutil.rmtree("./chroma_db_dir")

五、向量数据库的特点与优势

  1. 语义搜索能力:能够根据查询的深层含义而非简单关键词,返回最相关的结果。
  2. 非结构化数据友好:原生支持文本、图像、音频、视频等多模态数据的索引和检索。
  3. 高维数据优化:专为高维向量的存储和查询而优化,提供高效的 ANN 算法。
  4. 可扩展性:能够处理海量向量数据,支持分布式部署和高并发查询。
  5. 灵活性:通常支持丰富的元数据过滤和管理能力,可以与传统数据库的结构化查询结合。
  6. AI 原生:与 LLM、推荐系统等 AI 应用紧密集成,是现代 AI 基础设施的核心组件。
  7. 实时更新:许多向量数据库支持向量的实时增删改查,确保知识库的时效性。

六、向量数据库的典型应用场景

  1. RAG (Retrieval Augmented Generation):提供外部实时知识和事实依据,显著提升大语言模型 (LLM) 答案的准确性、时效性和可追溯性。
  2. 语义搜索 / 智能问答:构建智能搜索引擎、智能客服、文档问答系统,根据用户意图返回最精准的信息。
  3. 推荐系统:通过匹配用户偏好向量与物品向量,实现个性化商品、内容或服务的推荐。
  4. 图像/视频搜索:以图搜图、视频内容识别,根据视觉特征查找相似的媒体内容。
  5. 内容去重 / 抄袭检测:查找相似的文本、代码或图像内容,避免重复或识别抄袭。
  6. 异常检测:通过识别与大多数数据点“不相似”的向量模式,发现欺诈、入侵等异常行为。
  7. 多模态搜索:跨模态搜索,如用文本查询图像,或用图像查询相关文本。
  8. 药物发现与基因组学:在分子结构、蛋白质序列等高维生物数据中寻找相似模式。

七、主流向量数据库选型

市面上有多种向量数据库产品,各有其特点和适用场景:

产品名称 类型 主要特点 典型用例
Milvus 开源,云原生,分布式 高性能、高可用、高扩展性,支持 HNSW, IVF_FLAT 等多种索引 大规模数据,需要高吞吐量的 AI 应用,RAG, 推荐
Qdrant 开源,Rust 编写,支持云 轻量、高性能,提供 RESTful API,支持过滤和复杂查询 中小型规模,需要快速部署和灵活查询,RAG
Weaviate 开源,GraphQL API,支持云 自托管或云服务,支持实时数据导入和查询,语义搜索集成 知识图谱,RAG, 混合搜索
Pinecone 商业云服务 Fully managed,易用,高弹性和可扩展性,SaaS 产品 快速原型,生产环境,大规模部署
Chroma 开源,嵌入式 轻量级,零依赖,易于在本地或测试环境使用,Python-native 本地开发,小规模应用,教程,PoC
Faiss 开源库 (Non-DB) Facebook 开源的向量相似度搜索库,高性能 C++ 实现 作为其他数据库的插件,或自定义搜索系统底层
Redis 内存数据库 (with Modules) 通过 RediSearch 等模块支持向量搜索,利用 Redis 高速特点 实时推荐,低延迟场景
Elasticsearch 搜索引擎 (with Plugins) 通过 dense_vector 类型和插件支持向量搜索,结合文本搜索 日志分析,混合搜索,文档检索

选择建议

  • 初学者/本地开发/概念验证 (PoC)Chroma (Python 库) 或 Faiss。它们易于上手,适用于小规模数据。
  • 中小型应用/独立服务QdrantWeaviate。它们提供完整的数据库功能,易于部署和管理。
  • 大规模/生产级/分布式场景MilvusPinecone。它们为大规模数据和高并发需求提供了高性能和高可用性。
  • 已有 Redis/Elasticsearch 基础设施:考虑集成其向量搜索模块,可以利用现有资源。

八、总结

向量数据库是人工智能时代的一项关键创新,它通过高效存储和检索向量嵌入,极大地扩展了传统数据库处理复杂、非结构化数据的能力。通过深入理解向量作为数据语义表示的核心思想,以及向量数据库如何利用 ANN 算法实现快速相似度搜索,我们可以更好地利用这项技术来构建强大的 AI 应用。无论是为 LLM 赋能的 RAG 系统,还是智能推荐、语义搜索等领域,向量数据库都已成为构建下一代智能系统的不可或缺的基石。