向量数据库这东西,原理说穿了不复杂,但很多入门教程上来就扔一堆数学公式,搞得好像不懂线性代数就学不了似的。
向量是什么?
忘掉数学课本里的向量定义,在这个语境下,向量就是一串数字,用来表示一个东西的特征。
举个最直觉的例子,假设我要描述一杯咖啡,可以用几个维度来量化它:
- 苦度:0.8(满分1)
- 酸度:0.3
- 甜度:0.1
- 浓度:0.9
那这杯咖啡就可以用一个向量来表示:[0.8, 0.3, 0.1, 0.9]。
另一杯咖啡是 [0.7, 0.4, 0.2, 0.8]。
直觉上就能感觉到这两杯咖啡比较像,因为它们每个维度的数值都比较接近。而一杯奶茶可能是 [0.1, 0.1, 0.8, 0.5],跟前面两杯咖啡差别就很大了。
这就是向量检索的核心思想:把东西变成一串数字,然后通过计算数字之间的距离来判断它们是不是相似。

文本怎么变成向量?
咖啡的例子容易理解,因为维度是人定义的。但文本怎么变成向量?
“今天天气真好”这句话怎么变成一串数字?
这就是 Embedding 模型干的事。把一段文本丢给 Embedding 模型,它会输出一个高维向量,比如一个 1536 维的浮点数数组:
“今天天气真好” → [0.021, -0.037, 0.089, ..., 0.015] (1536个数)
“天气不错啊” → [0.019, -0.041, 0.092, ..., 0.013] (1536个数)
“数据库怎么优化” → [-0.052, 0.073, -0.011, ..., 0.068] (1536个数)
不需要理解这 1536 个数每一个具体代表什么含义。说实话,也没人能完全解释清楚,这是模型在大量文本数据上训练出来的一种语义编码。
咱只需要知道两个关键结论:
语义相近的文本,向量也相近。 “今天天气真好”和“天气不错啊”的向量距离会很小,虽然字面上用的词完全不一样。
语义不相关的文本,向量距离很远。 “今天天气真好”和“数据库怎么优化”的向量距离会很大。
这就是为什么向量检索能做到语义搜索,传统的关键词搜索只能匹配字面一样的词,但向量检索能理解 降本增效 和 成本优化 说的是一回事。
向量之间的距离怎么算?
两个向量之间有多相似,需要一个量化的计算方式。常用的有三种,不用记公式,理解思路就行。
余弦相似度
看两个向量的方向是不是一致。方向越一致,越相似。不关心长度,只关心方向。这是最常用的一种,大部分场景用它就够了。
打个比方:两个人都往东北方向走,一个走了 100 米一个走了 200 米,余弦相似度认为他们是一样的,因为方向一样。
欧氏距离
就是初中学的两点之间的直线距离,推广到高维空间。距离越小越相似。
内积
既考虑方向也考虑长度。在某些场景下,比如推荐系统里向量的模长有实际含义(代表热度或权重),会用到。
实际用的时候,大部分向量数据库在创建索引时会让你选一种距离度量方式,选余弦相似度基本不会错。
为什么需要专门的向量数据库?
假设你有 10 万段文本,全部转成了向量。用户来了一个查询,也转成向量。现在要找最相似的 5 段文本。
最笨的办法:把用户的向量跟这 10 万个向量逐一计算距离,然后排序取前 5 个。这叫暴力搜索(Brute Force)。10 万条数据还凑合,100 万条就明显慢了,1 亿条就完全不可用了。
向量数据库的核心价值就是:在海量向量中快速找到最相似的那几个,而且不需要逐一比较。它靠的是一系列近似最近邻(ANN)算法来加速检索。
主流的 ANN 算法有几种,简单说下思路:
HNSW(分层导航小世界图)
把向量组织成一个多层的图结构,有点像跳表,先在顶层粗定位,再逐层细化。查询速度快、精度高,是目前最主流的算法,大部分向量数据库默认用的就是这个。
IVF(倒排文件索引)
先把所有向量用聚类算法分成很多组(簇),查询时先找到最可能的几个组,然后只在这几个组内搜索。速度快但精度略低,适合数据量特别大的场景。
PQ(乘积量化)
把高维向量压缩成低维的编码,牺牲一点精度换内存和速度,经常跟 IVF 配合使用。
这些算法找到的是“近似最近邻”,不保证是精确的最近邻。但在实际使用中,95% 以上的准确率已经完全够用了,速度却能快几个数量级。
怎么动手入门?
说了这么多原理,讲讲实际怎么上手。我的建议是先跑通再深入。
第一步:跑一个最小可用的 Demo
别一上来就研究底层原理和算法细节,先跑通一个端到端的流程,感受一下。
推荐用 Python + ChromaDB,Chroma 是最容易上手的向量数据库,不需要单独部署服务,pip install 就能用:
import chromadb
from chromadb.utils import embedding_functions
# 1. 创建客户端和集合
client = chromadb.Client()
ef = embedding_functions.DefaultEmbeddingFunction()
collection = client.create_collection("my_docs", embedding_function=ef)
# 2. 添加文档(Chroma 会自动调用 embedding 模型把文本转成向量)
collection.add(
documents=[
"Python 是一种解释型的高级编程语言",
"Java 是一种面向对象的编程语言",
"今天的午饭是红烧肉盖饭",
"机器学习是人工智能的一个子领域",
],
ids=["doc1", "doc2", "doc3", "doc4"]
)
# 3. 查询:语义搜索
results = collection.query(
query_texts=["有什么好用的编程语言"],
n_results=2
)
print(results["documents"])
# 输出大概率是 Python 和 Java 相关的那两条,而不是红烧肉
跑完这个 Demo 你就会有一个直观的感受:查询和文档的字面完全不一样,但向量检索确实能找到语义相关的内容,这个感觉比看十篇原理文章都有用。
第二步:理解 RAG 的完整流程
向量数据库目前最主要的应用场景就是 RAG(检索增强生成),在上面的 Demo 基础上,加一个 LLM 调用,就是一个最简单的 RAG 系统:
# 伪代码,展示 RAG 的核心流程
def rag_answer(question):
# 1. 检索:从向量库里找最相关的文档
results = collection.query(query_texts=[question], n_results=3)
context = "\n".join(results["documents"][0])
# 2. 生成:把检索到的文档作为上下文,让 LLM 回答
prompt = f"根据以下参考资料回答问题。\n\n参考资料:\n{context}\n\n问题:{question}"
answer = call_llm(prompt)
return answer
整个 RAG 的流程就这么简单:用户提问 → 转向量 → 在向量库里检索最相关的文档 → 把文档和问题一起给 LLM → LLM 基于文档内容生成回答
别看这几行伪代码,市面上绝大部分企业知识库、智能客服、AI 问答系统,核心流程都是这个。
第三步:换一个生产级的向量数据库
ChromaDB 适合学习和小规模实验。如果要做生产级的项目,建议了解一下这几个:
- Milvus:开源、功能全、社区活跃,国内用的人多,中文资料丰富。适合需要自己部署的场景。
- Qdrant:Rust 写的,性能好,API 设计友好,支持丰富的过滤条件。
- Pinecone:全托管的云服务,不需要自己运维,适合不想操心基础设施的团队。
- Weaviate:支持多种向量化方式,内置了 Embedding 模型的集成。
我自己入门的时候用的 Milvus,主要是中文文档和社区讨论比较多,遇到问题容易搜到解决方案。
第四步:深入理解才需要看的东西
等你跑通了基础的 Demo,实际做过一两个小项目之后,再去啃这些:
- 文档分块策略:按固定长度切、按段落切、按语义切,不同策略效果差别很大
- Embedding 模型选型:OpenAI 的
text-embedding-3 系列、开源的 BGE 系列、Sentence-Transformers,各有优劣
- 混合检索:向量检索 + 关键词检索(BM25)配合使用,很多场景下效果比纯向量检索好
- 索引调优:HNSW 的参数(
ef_construction、M)怎么调,IVF 的 nlist 和 nprobe 怎么设
这些都是做了才知道为什么重要的东西,没做过项目之前看了也记不住。
入门时容易踩的几个坑
别一上来就纠结选哪个向量数据库!
入门阶段用哪个都行,核心概念是通用的。等你真正有了生产需求,再根据数据量、部署方式、团队技术栈来选也不迟。
别忽视 Embedding 模型的选择!
很多人把精力全花在向量数据库上,但检索效果的上限其实是由 Embedding 模型决定的。同样的文档,用一个好的 Embedding 模型和一个差的,召回率差距可能有 20 个百分点以上。
别以为向量检索能解决所有搜索问题!
精确匹配(搜一个特定的错误码)、数值过滤(筛选某个时间范围的数据)、排序(按时间倒序),这些传统数据库擅长的事情,向量数据库做起来反而别扭。实际生产中好的搜索系统,通常是向量检索 + 传统检索混合使用。
别跳过动手环节直接啃论文!
HNSW、IVF-PQ 这些算法的论文确实值得看,但那是你做了实际项目、对性能和精度有了直观体感之后再看才有意义。一上来就看论文,大概率看完就忘,因为没有实际问题去驱动理解。
说在最后
向量数据库没有很多教程渲染得那么高深。说白了就三件事:把数据变成向量、把向量存起来、用向量快速找相似的。
先动手跑起来,遇到问题再回头补原理,这个顺序比反过来高效得多。这篇文章的 Demo 代码,复制下来十分钟就能跑通,与其收藏吃灰,不如现在就试试。
在 云栈社区 上,你还能找到更多关于 Python 和人工智能的实战讨论,帮助你把向量数据库真正用到自己的项目里。