本文适合对 AI 应用有基础了解、想搞清楚向量数据库到底是什么以及怎么用的技术人员和产品/运营同学。全文约 1500 字,阅读时间约 6 分钟。

一、先说清楚:我们为什么需要向量数据库

2023 年 ChatGPT 爆火之后,很多人在聊”大模型幻觉”问题——大模型会一本正经地胡说八道。业内主流的解法有两个:一个是靠提示词工程(Prompt Engineering)约束它,另一个就是给大模型接一个外部知识库,让它在回答之前先去检索真实资料。

这个”检索真实资料”的动作,就是向量数据库的核心价值所在。

但等等——普通的 Elasticsearch、MySQL 也支持全文检索,为什么要单独搞一个向量数据库?

核心区别在于:传统数据库做的是”精确匹配”或”关键词匹配”,而向量数据库做的是”语义相似度匹配”。

举个例子:你搜索”苹果”,传统数据库只能告诉你包含”苹果”这个字的结果。但如果你用向量数据库搜索”水果”,它同样能把”苹果”“香蕉”“橙子”的记录找出来——因为在语义空间里,这些词的距离是近的。

这就是向量数据库最根本的价值:理解”意思”,而不是匹配”字面”


二、向量、Embedding、索引——三个必须搞清楚的概念

1. 什么是向量(Vector)?

向量本质上就是一串数字。在数学上可以理解为一个 n 维空间里的一个点。

举一个最直观的例子:假设我们把”食物”这个概念压缩成两个维度——甜度和酸度。那么:

  • 苹果 → [0.7, 0.3]
  • 柠檬 → [0.2, 0.9]
  • 纯净水 → [0.0, 0.0]

把这两个维度画在坐标系里,你会发现苹果和柠檬的距离很远,但都在”食物”的象限里;纯净水则几乎在原点附近。这就是向量表达语义的基本思路。

真实的 Embedding 模型(比如 OpenAI 的 text-embedding-3-large,或者开源的 BGE系列)输出的向量维度要高得多——通常是 768 维、1024 维甚至 1536 维。维度越高,能捕捉的语义细节就越丰富。

2. 什么是 Embedding(嵌入)?

Embedding 就是把文本、图片、音频这类非结构化数据,转换成固定维度向量表示的过程。这个转换由专门的模型完成,我们叫它 Embedding Model 或 Embedding API

以文本为例,一个典型的 Embedding 调用是这样的:

# 使用 OpenAI API 获取文本向量
from openai import OpenAI

client = OpenAI()

response = client.embeddings.create(
    input="向量数据库是 AI 时代的基础设施",
    model="text-embedding-3-small"  # 1536维,体积小成本低
)

vector = response.data[0].embedding
print(f"向量维度: {len(vector)}")
print(f"前5个维度: {vector[:5]}")
# 输出: [0.012, -0.028, 0.041, 0.005, -0.019, ...]

生成出来的向量本身没有任何可读性,但机器可以拿它去做距离计算。

如果你用的是开源方案,也可以用 Hugging Face 上的 BGE 模型:

from sentence_transformers import SentenceTransformer

model = SentenceTransformer('BAAI/bge-small-zh-v1.5')  # 中文优化模型
query = "向量数据库的核心原理是什么"
vectors = model.encode(query)
print(f"维度: {vectors.shape}")  # (384,)

3. 什么是向量索引(Index)?

假设你有 1000 万条文本,每条都生成了一个 1536 维的向量。如果每次查询都要和所有数据做距离计算,时间复杂度是 O(n),在数据量大的情况下完全不可用。

向量索引解决的就是这个问题。它通过构建特定的数据结构,让你在不遍历全量数据的情况下找到最相似的 K 个结果。主流算法包括:

算法

代表库

特点

HNSW

Qdrant、Weaviate、Milvus

速度快,精度高,内存占用大

IVF-PQ

Faiss

适合超大规模,精度略有损失

ScaNN

Google

Google 内部算法,开源版本是 ScaNN

这里不展开讲算法的数学原理,只需要知道一个核心结论:向量数据库的核心竞争壁垒之一,就是索引算法的效率和精度平衡


三、最小可用示例:用 Qdrant 搭建一个本地向量检索系统

说一千道一万,不如跑通一个真实案例。下面用 Python + Qdrant 演示一个完整的向量检索流程,从建库、写入到查询,控制在 50 行代码以内。

# 1. 安装依赖(Qdrant Client + 向量化模型)
pip install qdrant-client sentence-transformers

# 2. 完整示例代码
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
from sentence_transformers import SentenceTransformer
from uuid import uuid4

# --- Step 1: 连接 Qdrant(本地模式,无需部署服务)---
client = QdrantClient(":memory:")  # 内存模式,适合开发调试

# --- Step 2: 创建 Collection(相当于表)---
client.recreate_collection(
    collection_name="tech_articles",
    vectors_config=VectorParams(size=384, distance=Distance.COSINE)
)
print("Collection 创建成功")

# --- Step 3: 准备数据并生成向量---
model = SentenceTransformer('BAAI/bge-small-zh-v1.5')

articles = [
    "向量数据库通过计算向量之间的相似度来实现语义检索",
    "HNSW 是一种高效的近似最近邻搜索算法",
    "Milvus 是开源的分布式向量数据库",
    "Embedding 模型将文本转换为稠密向量表示",
    "大模型结合向量数据库可以有效缓解幻觉问题"
]

# 批量生成向量
vectors = model.encode(articles).tolist()

# 构建 Point(记录)
points = [
    PointStruct(id=str(uuid4()), vector=vec, payload={"text": text})
    for vec, text in zip(vectors, articles)
]

# 写入数据
client.upsert(collection_name="tech_articles", points=points)
print(f"已写入 {len(points)} 条记录")

# --- Step 4: 执行语义检索 ---
query_text = "什么是向量索引"
query_vector = model.encode([query_text]).tolist()[0]

results = client.search(
    collection_name="tech_articles",
    query_vector=query_vector,
    limit=3  # 返回最相似的3条
)

print(f"\n查询:「{query_text}\n最相似结果:")
for r in results:
    print(f"  相似度 {r.score:.4f}: {r.payload['text']}")

运行结果大概是这个样子:

Collection 创建成功
已写入 5 条记录

查询:「什么是向量索引」
最相似结果:
  相似度 0.8342: HNSW 是一种高效的近似最近邻搜索算法
  相似度 0.7618: Embedding 模型将文本转换为稠密向量表示
  相似度 0.6891: 向量数据库通过计算向量之间的相似度来实现语义检索

注意这里检索的是”向量索引”,但最匹配的结果是”HNSW 算法”那条——因为在语义空间里,讨论索引原理的内容和”向量索引”这个词在语义上最接近。这是传统关键词检索做不到的。


四、向量数据库的核心应用场景

基于上面的技术原理,向量数据库主要在以下场景发挥作用:

RAG(检索增强生成):这是目前最热门的场景。大模型在回答用户问题之前,先从向量数据库中检索相关知识片段,然后一起喂给大模型。这么做能大幅降低幻觉率,让回答有据可查。

语义搜索/智能问答:比传统 ES 搜索更能理解用户真实意图。比如电商场景,用户搜”给爸妈用的操作简单的手机”,向量数据库能理解这是在找”老年机/入门级智能手机”,而不是字面上包含”父母”和”手机”的商品。

图片/音视频检索:把图片用 CLIP 等模型转成向量,然后在向量空间里以图搜图。内容审核、图片去重、产品相似度比对都属于这类。

推荐系统:把用户行为和内容都 Embedding 到同一个向量空间,用户的历史行为向量和候选内容的向量做相似度匹配,比传统协同过滤更鲁棒。

欺诈检测/异常发现:在某些金融场景里,把交易行为转成向量,异常交易会和正常模式在向量空间里偏离较远,可以被快速发现。


五、避坑指南:向量数据库不是银弹

写到这里,我必须泼一盆冷水。向量数据库解决的是”语义相似度匹配”这个问题,但它不是万能的。

第一,向量检索不等于精确匹配。你搜”苹果手机最新款”,它可能返回的是关于苹果这种水果在农业领域最新研究进展的记录——如果你的知识库里没有手机相关的内容,检索结果再好也无济于事。向量数据库的效果上限,取决于你的 Embedding 数据质量和知识库的覆盖度。

第二,过滤查询(Filtered Search)很关键。实际业务中几乎都需要加条件过滤,比如”只检索 2024 年以后的文章”“只检索上海地区的门店”。大多数向量数据库的过滤查询性能不如纯向量检索,这一点在选型时需要重点考察。

第三,数据库选型要匹配业务规模。Chroma 在本地开发时体验很好,但数据量超过百万级就会遇到性能瓶颈。如果你的业务规划是千万级向量起步,直接上 Milvus 或 Qdrant 会更稳妥,改架构的成本比选错库高得多。


六、总结

向量数据库本质上是把”语义”量化为数字,然后在数字空间里做高效搜索的工具。它不是要替代传统数据库,而是补足了传统数据库在 AI 应用时代的短板——处理非结构化数据、理解语义、支撑大规模相似度检索。

大模型+RAG 的组合让向量数据库从一个小众的技术组件,走到了 AI 应用架构的核心位置。但技术选型永远要回到业务场景:数据规模有多大?实时性要求高不高?团队有没有运维能力?把这些问题回答清楚了,选型决策就不会太难。

如果你看完这篇文章想动手试试,建议从国产库入手如电科金仓这类的相对性价比较高的数据库开始,跑通上面的示例代码,建立一个直观的体感,再逐步深入。技术的理解往往是先动手、再迭代的。

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐