向量数据库是存储和管理文本、图像等数据向量的专用数据库,能实现语义级检索。它将非结构化数据转换为高维向量,通过相似度计算快速找到相关内容。相比传统数据库,它更理解语义关系,是RAG系统的核心组件。文章从基础概念到实践应用,详细介绍了向量数据库的工作原理、索引算法、相似度计算方法及主流工具选型,帮助读者快速掌握这一关键技术。
说起向量数据库,我得先聊聊最开始在做RAG项目时遇到的一个头疼问题。当时我有几万份技术文档需要检索,用传统的关键词搜索总是找不到我想要的内容。比如我搜"机器学习",但文档里写的是"AI算法",结果就错过了。
后来我才知道,这就需要用到向量数据库这个神器了。简单来说,如果把嵌入技术比作是给文字拍照片(把文字转成数字),那向量数据库就像是一个超级聪明的相册管理员,不仅能存这些"照片",还能帮你快速找到最相似的那几张。
利用嵌入技术,将文章中的段落、句子等信息转换成一系列数字。利用向量存储技术,我们就能从数十亿个向量中迅速找出最相关的片段。该技术专门负责优化这部分检索流程,尽可能以最快、更精准,并且最节省资源的方式达到检索目的。
一、向量数据库到底是个啥?
刚接触这个概念时,我也是一脸懵。什么叫 “多维向量”,刚听起来概念很模糊吧?
其实你可以这么理解:嵌入(Embedding) 就像是给每个词、每句话都分配一个专属的"身份证号码",只不过这个号码不是简单的数字,而是一串包含了语义信息的数字数组。比如"苹果"可能是 [0.1, -0.3, 0.8, …],"水果"可能是 [0.2, -0.2, 0.7, …],你会发现它们的数字挺相近的,因为语义也相近。
向量数据库呢,就是专门用来存储和管理这些"身份证号码"的地方。最牛的是,它不是简单的存储,而是能够理解这些数字背后的语义关系。当你问它"找一些关于水果的内容",它能智能地把"苹果"、“香蕉”、"橘子"这些相关的内容都找出来,即使你的原文里压根没出现"水果"这个词。
二、传统数据库哪里不够用了?
传统数据库:一个严格的图书管理员。 你必须说出准确书名,比如《Python编程》,他才能找到。如果你说《蟒蛇语言开发指南》,即使内容一样,他也会告诉你“找不到”。他擅长处理订单、商品这类格式规整的信息。
向量数据库:一个懂你的朋友。 你说“找点Python相关的”,他会把关于“蟒蛇语言”、“编程开发”和“代码实战”的内容都找给你,因为他理解这些词在意思上是相通的。
为什么这很重要?
因为像ChatGPT这样的大模型,知识是“过时”的,就像一本去年的百科全书,它不知道最新发生的事,更不懂你公司的内部文件。
解决方法就是RAG(检索增强生成):简单说,就是给大模型配一个由向量数据库组成的“外挂大脑”。提问时,先用这个“大脑”找到相关资料,然后让大模型参考这些资料来回答。
所以向量数据库在现代应用程序中的作用越来越重要。其技术栈也不仅仅局限于"保存向量",还涵盖了向量索引和检索的优化机制。后面,我们将详细探讨这部分内容。
三、动手实践:让你10分钟搞懂向量存储
接下来我们用Faiss库来实际体验一下向量数据库的魅力。Faiss是Facebook AI 开源的向量检索库,在学术界和工业界都很受欢迎,性能强悍且使用相对简单。
我们来建一个简单的文档检索系统,你就能直观感受到向量数据库是怎么工作的了:
# 需要安装的依赖包
# pip install faiss-cpu sentence-transformers numpy
import numpy as np
import faiss
from sentence_transformers import SentenceTransformer
class SimpleVectorDB:
def __init__(self):
"""
初始化向量数据库
"""
# 这个数组用来保存原始文本,检索时要返回给用户看
# 我刚开始忘了这步,结果只能返回向量,用户根本看不懂
self.texts = []
# 加载预训练模型,这里用的是中文优化的BGE模型
# 选这个是因为对中文支持比较好,你也可以试试其他的
self.model = SentenceTransformer("BAAI/bge-small-zh-v1.5")
# 获取模型的向量维度
self.dimension = self.model.get_sentence_embedding_dimension()
# 创建Faiss索引 - 使用L2距离(欧几里得距离)
self.index = faiss.IndexFlatL2(self.dimension)
def add_documents(self, documents):
"""
步骤1: 批量将文本转换为向量,并添加到向量数据库
"""
print("=== 开始向量化 ===")
vectors = []
for i, doc inenumerate(documents):
print(f"正在处理第 {i+1} 个文档(总共{len(documents)}个):")
# 这一步就是把文字"翻译"成数字的过程
# 第一次看到一句话变成512个小数点,还挺震撼的
vector = self.model.encode([doc])
print(f"原文: '{doc}'")
print(f"向量维度: {vector.shape} - 一句话变成了{vector.shape[1]}个数字!")
print(f"向量前10个值: {vector[0][:10]} - 看起来很随机,但其实包含了语义信息")
print(f"向量数据类型: {vector.dtype}")
print("-" * 50)
vectors.append(vector[0])
self.texts.append(doc)
# 转换为numpy数组(Faiss要求的格式)
vectors_array = np.array(vectors, dtype=np.float32)
print(f"所有向量的形状: {vectors_array.shape}")
print(f"向量矩阵大小: {vectors_array.nbytes} 字节")
"""
步骤2 索引构建,添加到Faiss索引中
"""
self.index.add(vectors_array)
print(f"索引中的向量数量: {self.index.ntotal}")
return vectors_array
def search(self, query, k=3):
"""
步骤3: 向量检索
"""
print(f"\n=== 向量检索过程 ===")
print(f"查询: '{query}'")
# 将查询文本转换为向量
query_vector = self.model.encode([query])[0]
query_vector = query_vector.reshape(1, -1).astype(np.float32)
# 在索引中搜索最相似的k个向量
distances, indices = self.index.search(query_vector, k)
print(f"搜索结果:")
results = []
for i inrange(k):
idx = indices[0][i]
distance = distances[0][i]
similarity = 1 / (1 + distance) # 转换距离为相似度分数
results.append(
{
"text": self.texts[idx],
"distance": float(distance),
"similarity": float(similarity),
"index": int(idx),
}
)
print(
f" {i+1}. 相似度: {similarity:.4f} | 距离: {distance:.4f} | 文本: '{self.texts[idx]}'"
)
return results
def show_storage_details(self):
"""
展示存储细节
"""
print(f"\n=== 向量存储详情 ===")
print(f"索引类型: {type(self.index).__name__}")
print(f"向量维度: {self.dimension}")
print(f"存储的向量数量: {self.index.ntotal}")
print(
f"索引大小估算: {self.index.ntotal * self.dimension * 4} 字节"
) # float32 = 4字节
# 展示向量在内存中的存储形式
if self.index.ntotal > 0:
# 重构第一个向量来展示存储形式
first_vector = self.index.reconstruct(0)
print(f"第一个向量的存储形式:")
print(f" 类型: {type(first_vector)}")
print(f" 形状: {first_vector.shape}")
print(f" 前5个值: {first_vector[:5]}")
print(f" 后5个值: {first_vector[-5:]}")
def main():
# 示例文档集合
documents = [
"苹果是一种营养丰富的水果",
"Python是一种编程语言",
"机器学习是人工智能的重要分支",
"香蕉含有丰富的钾元素",
"深度学习使用神经网络进行训练",
"橙子富含维生素C",
"自然语言处理是AI的应用领域",
]
# 创建向量数据库
vector_db = SimpleVectorDB()
# 存储文档
vectors = vector_db.add_documents(documents)
# 显示存储详情
vector_db.show_storage_details()
# 执行检索
queries = ["什么水果比较健康?", "编程相关的内容", "人工智能技术"]
for query in queries:
vector_db.search(query, k=3)
if __name__ == "__main__":
main()
向量数据库存储原理解析
通过上面的代码,我们能够了解向量数据库的工作流程:
-
- 数据向量化过程
原始文本 → 预训练模型 → 数字向量 "苹果是营养水果" → [0.1, -0.3, 0.8, ...] (512个数字) -
- 向量的实际存储形式
# 每个向量实际上就是一个数字数组 vector = [0.12, -0.34, 0.56, 0.78, ...] # 512个float32数字 # 在内存中占用: 512 × 4字节 = 2,048字节 -
- Faiss中的存储结构
向量矩阵 (n × d): 文档1: [0.1, -0.2, 0.3, ...] 文档2: [0.4, 0.1, -0.5, ...] 文档3: [0.2, 0.7, 0.1, ...] ↑ ↑ ↑ 第1维 第2维 第3维 ... -
- 检索工作原理
- • 查询向量化: 查询文本转换为同样512维的向量
- • 距离计算: 计算查询向量与所有存储向量的欧几里得距离
- • 排序返回: 返回距离最小的k个结果
-
- 为什么向量存储有效?
- • 语义表示: 相似含义的文本在向量空间中距离更近
- • 快速检索: 数学运算比文本匹配快得多
四、向量数据库中的索引算法
根据上面的代码示例,我们能够了解向量数据库的工作流程:
-
- 数据存储: 将转化为高维向量有用、有意义的数据存入向量数据库。
-
- 索引构建: 这些"有意义"的向量被存储在索引中,用于执行智能相似性搜索。
-
- 查询检索: 接收查询请求后,向量数据库利用相似度度量方法(余弦相似度、欧几里得距离或点积)来比较查询向量与索引中的向量,确定最邻近向量。
为了使搜索准确且快速,我们需要关注更高效的搜索方法。在向量相似性搜索中,索引用于存储数据的向量表示。向量索引的灵活性是实现高效搜索的关键,因为没有"一刀切"的索引方案适用于所有相似性搜索用例。
在相似性索引中,搜索速度和搜索质量(准确性)之间总是存在权衡的。为了提高搜索速度,主要是两个方向:
-
- 减小向量大小: 通过降维减少向量值表示的位数。
-
- 减小搜索范围: 过聚类或根据特定属性、相似性或距离将向量组织成树状结构,并将搜索限制在最近的簇或通过最相似的分支进行过滤。
采用这些方法意味着不再执行穷尽的最近邻搜索,而是执行近似最近邻(ANN)搜索,因为不再搜索整个数据集。
接下来将以Faiss库为例,介绍几种常见的最近邻索引类型及其特点:
FLAT:最笨但最准确的方法
我的使用感受: 这就像是最原始的查找方法——把每个向量都比较一遍。听起来很笨,但结果绝对靠谱。
什么时候用:
- • 数据量不大(几千到几万条)的时候
- • 对准确性要求极高的场景
- • 刚开始做项目,还在验证效果的阶段
性能特点: 搜索质量100分,速度嘛…就别指望了。内存占用还算合理。
工作原理: 不对输入的向量进行任何修改,因此没有近似或聚类,产生最准确的结果。在执行查询时,FLAT通过计算查询向量与数据库中每一个向量之间的相似或距离来进行比较,然后返回最近的 k 个匹配项(k-最近邻搜索)。

LSH:速度快但精度有限
特点: LSH的优点是检索速度快,算法简单,易于实现。然而,它的缺点是精确性相对较低,只适用于近似检索场景。而且随着数据分布不同,LSH的性能可能也会发生显著变化。
工作原理: 通过构建一组哈希函数,将相似的高维向量分组到同一哈希桶中,该函数最大化哈希冲突,而不是像传统哈希函数那样最小化冲突。这是为了将相似的对象分组在一起,极大化减少了计算量。
什么时候用: 最适合低维度向量和小型索引。如果向量维度较大(例如 128),或者索引较大,则应避免使用 LSH。

HNSW:多层高速路的智能检索
简单理解: 你可以把HNSW想象成一个多层的高速公路系统。最上层是高速干道,能快速跨越远距离;下面几层是省道、市道,逐渐细分;最底层是小区道路,精确定位。
工作原理: 查找时先从最上层的"高速路"开始,快速锁定大概区域,然后一层层往下,路越来越细,定位越来越准。这样既避免了"全城扫街"的笨方法,又保证了找到目标的准确性。
性能体验: 根据Faiss官方文档,HNSW在大数据集上的查询速度通常比FLAT快几十到上百倍,同时能保持90%+的召回率。但内存消耗会增加2-3倍。
什么时候选它: 数据量大、对速度有要求、内存充足的时候,HNSW绝对是首选。

IVF:通过聚类加速检索
特点: IVF通过将向量数据聚类来减少查询时需要比较的向量数量,从而显著加快检索速度。它是一种非常流行的索引,易于使用。
工作原理: 通过聚类减少搜索范围。它基于 Voronoi 图的概念,将高维向量置于一个空间中,并根据它们所属的"单元格"或"簇"进行分配。当查询向量落入某个单元格时,搜索范围被限制在该单元格内。为了解决查询向量落在单元格边缘时可能错过相邻单元格中最近数据点的问题(“边缘问题”),可以通过增加 nprobe 值来扩展搜索范围。
什么时候用: 是一个很好的可扩展选项,在合理的内存使用下提供高质量和合理的速度。


五、相似度计算的几种方法
说到相似度计算,我刚开始也是被一堆数学公式搞得头大。但其实你可以把它想象成教机器判断两个东西有多"像"的过程。
比如你问机器:"苹果"和"香蕉"像不像?机器不能像人一样凭直觉判断,它只能通过计算两个向量之间的"距离"或"角度"来给出答案。就像你用尺子量两个点的距离一样,只不过这里是在512维的空间里量距离。
听起来很抽象?没关系,我们来看看几种常用的计算方法,每种都有自己的"个性":
欧几里得距离(L2):最直观的"直线距离"
人话解释: 就是你在地图上用直尺量两点间距离的方法,只不过现在是在高维空间里量。距离越小,说明两个向量越相似。
什么时候用:
- • 处理图像、音频这些连续数据时特别好用
- • 当你关心的是向量各个维度的绝对差异时
我的踩坑经验: 刚开始我用欧几里得距离处理文本,发现长文本总是比短文本距离更远,不是因为语义不同,而是因为长文本的向量"更长"。后来才知道文本更适合用余弦相似度。
计算公式:

实际应用: 在我做的图像检索项目中,欧几里得距离效果就很不错,能准确找到相似的图片。
余弦相似度:关注"方向"而非"长度"
最佳比喻: 想象两个人都在指向远方,余弦相似度关心的不是他们胳膊有多长,而是指的方向有多接近。即使一个人胳膊长、一个胳膊短,只要指向同一个方向,相似度就很高。
为什么文本处理爱用它:
- • 不受文本长度影响:一篇长文章和一句短话,只要说的是同一个意思,相似度就高
- • 专注语义方向:更关心"说的是什么",而不是"说了多少"
我的实战经验: 在做文档检索时,余弦相似度救了我的命。之前用欧几里得距离,长文档总是被排到后面,用了余弦相似度后,不管文档长短,只要内容相关,都能准确找到。
计算公式:

选择建议: 做文本、推荐系统?首选余弦相似度。做图像、声音?考虑欧几里得距离。
内积(IP):既看"方向"也看"强度"
简单理解: 如果说余弦相似度只关心方向,那内积就是既关心方向,也关心"力度"。两个向量不仅要指向同一个方向,而且"力量"越大,相似度越高。
实际应用场景:
- • 推荐系统:用户不仅喜欢某类商品,而且喜欢程度很高
- • 情感分析:不仅是正面情感,而且情感很强烈
什么时候选它: 当向量的"大小"本身就有意义的时候。比如用户评分向量,[5,5,5]肯定比[1,1,1]更"强烈",内积能很好地体现这种差异。
计算公式:

注意事项: 内积可能是负数!如果两个向量方向相反,内积就是负的,这时候相似度就很低了。
汉明距离:二进制世界的度量
计算公式:

其中
是一个指示函数,当 ai 不等于 bi 时为 1,否则为 0。
适用场景: 衡量二进制向量之间不同位的数量,适用于二进制数据。
杰卡德相似度:集合相似度的经典方法
计算公式:

适用场景: 衡量两个集合的相似度,通过计算交集与并集的比值来表示,适用于集合或稀疏数据。
六、主流向量数据库选型

Milvus:开源界的"老大哥"
我的印象: 功能最全面,社区最活跃,但学习曲线有点陡峭。
适合场景:
- • 企业级应用,数据量巨大(百万级以上)
- • 需要高可用、集群部署
- • 团队有一定技术实力
部署体验: 得益于详细的官方文档和Docker支持,Milvus的部署其实挺友好的。Docker一键启动,配置文件也有很多示例可以参考。
性能表现: PB级数据支持不是吹的,我见过有公司用它处理十亿级向量,查询速度依然很快。
Pinecone:云端的"傻瓜式"选择
我的印象: 最省心的选择,注册就能用,但钱包要准备好。
适合场景:
- • 初创公司、快速原型开发
- • 不想花时间在运维上
- • 数据量中等(千万级以下)
真实体验: 我用它做过几个项目的MVP,从注册到第一次查询,半小时搞定。但随着数据量增长,账单也蹭蹭上涨。
性价比: 小项目香,大项目贵。
Qdrant:性能与易用性的平衡
我的印象: 用Rust写的,性能很不错,API设计也很友好。
适合场景:
- • 中小型项目,需要自己部署
- • 对性能有要求,但不想学习复杂的配置
- • 喜欢尝试新技术的团队
使用体验: Docker一键部署,RESTful API调用简单,文档写得也不错。我用它做过几个项目,印象挺好的。
特色功能: 支持向量过滤,这个功能在很多场景下很有用。
Faiss:科研和原型的首选
我的印象: Facebook AI开源的库,不是完整的数据库,但在算法研究方面无可替代。
适合场景:
- • 学术研究、算法验证
- • 需要自定义索引算法
- • 项目预算有限,愿意自己开发
学习建议: 如果你是新手,强烈建议先从Faiss开始学,能帮你理解向量检索的底层原理。
Weaviate:语义搜索的专家
特色功能: 内置了很多预训练模型,支持多模态搜索,对新手比较友好。
适合场景: 需要快速搭建语义搜索应用,不想花太多时间调参。
Chroma:轻量级的实用选择
我的印象: 轻量、简单,特别适合小规模应用和学习使用。
适合场景: 个人项目、学习向量数据库概念、快速原型验证。
Elasticsearch:老牌搜索引擎的向量化
我的印象: 如果你已经在用ES,那向量搜索功能是个不错的补充。
适合场景: 已有ES基础设施,希望添加向量搜索能力。
PGVector:PostgreSQL的向量扩展
我的印象: 如果你的项目已经重度依赖PostgreSQL,这个扩展能让你无缝集成向量搜索。
适合场景: 基于PostgreSQL的项目,不想引入额外的数据库。
我的选择建议
- • 刚入门? 先玩玩Faiss,理解原理
- • 快速验证想法? Pinecone,贵但省心
- • 中小项目? Qdrant,性价比高
- • 企业级应用? Milvus,功能最全
- • 已有PostgreSQL? 试试PGVector,成本最低
写在最后:向量数据库的学习之路
写完这篇文章,回想起我第一次接触向量数据库的懵逼状态,到现在能在项目中熟练运用,这一路踩了不少坑,也有不少收获。
给新手的建议:
-
- 先跑通一个简单例子:理论再多,不如动手试一试
-
- 选择合适的工具:别一上来就搞最复杂的,从简单的开始
-
- 理解业务场景:技术是为业务服务的,想清楚你要解决什么问题
-
- 多试试不同的相似度计算方法:没有银弹,要根据数据特点选择
下一步可以做什么:
- • 试试把这篇文章的内容用向量数据库存起来,做个简单的问答系统
- • 了解一下RAG的完整流程,向量数据库只是其中一环
- • 关注一下最新的embedding模型,模型越好,向量质量越高
向量数据库这个领域发展很快,但核心思想不会变:让机器理解语义,让检索更智能。
希望这篇文章能帮你快速入门向量数据库,如果有疑问,欢迎讨论!
大模型未来如何发展?普通人能从中受益吗?
在科技日新月异的今天,大模型已经展现出了令人瞩目的能力,从编写代码到医疗诊断,再到自动驾驶,它们的应用领域日益广泛。那么,未来大模型将如何发展?普通人又能从中获得哪些益处呢?
通用人工智能(AGI)的曙光:未来,我们可能会见证通用人工智能(AGI)的出现,这是一种能够像人类一样思考的超级模型。它们有可能帮助人类解决气候变化、癌症等全球性难题。这样的发展将极大地推动科技进步,改善人类生活。
个人专属大模型的崛起:想象一下,未来的某一天,每个人的手机里都可能拥有一个私人AI助手。这个助手了解你的喜好,记得你的日程,甚至能模仿你的语气写邮件、回微信。这样的个性化服务将使我们的生活变得更加便捷。
脑机接口与大模型的融合:脑机接口技术的发展,使得大模型与人类的思维直接连接成为可能。未来,你可能只需戴上头盔,心中想到写一篇工作总结”,大模型就能将文字直接投影到屏幕上,实现真正的心想事成。
大模型的多领域应用:大模型就像一个超级智能的多面手,在各个领域都展现出了巨大的潜力和价值。随着技术的不断发展,相信未来大模型还会给我们带来更多的惊喜。赶紧把这篇文章分享给身边的朋友,一起感受大模型的魅力吧!
那么,如何学习AI大模型?
在一线互联网企业工作十余年里,我指导过不少同行后辈,帮助他们得到了学习和成长。我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑。因此,我坚持整理和分享各种AI大模型资料,包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频。
学习阶段包括:
1.大模型系统设计
从大模型系统设计入手,讲解大模型的主要方法。包括模型架构、训练过程、优化策略等,让读者对大模型有一个全面的认识。

2.大模型提示词工程
通过大模型提示词工程,从Prompts角度入手,更好发挥模型的作用。包括提示词的构造、优化、应用等,让读者学会如何更好地利用大模型。

3.大模型平台应用开发
借助阿里云PAI平台,构建电商领域虚拟试衣系统。从需求分析、方案设计、到具体实现,详细讲解如何利用大模型构建实际应用。

4.大模型知识库应用开发
以LangChain框架为例,构建物流行业咨询智能问答系统。包括知识库的构建、问答系统的设计、到实际应用,让读者了解如何利用大模型构建智能问答系统。

5.大模型微调开发
借助以大健康、新零售、新媒体领域,构建适合当前领域的大模型。包括微调的方法、技巧、到实际应用,让读者学会如何针对特定领域进行大模型的微调。



6.SD多模态大模型
以SD多模态大模型为主,搭建文生图小程序案例。从模型选择、到小程序的设计、到实际应用,让读者了解如何利用大模型构建多模态应用。

7.大模型平台应用与开发
通过星火大模型、文心大模型等成熟大模型,构建大模型行业应用。包括行业需求分析、方案设计、到实际应用,让读者了解如何利用大模型构建行业应用。


学成之后的收获👈
• 全栈工程实现能力:通过学习,你将掌握从前端到后端,从产品经理到设计,再到数据分析等一系列技能,实现全方位的技术提升。
• 解决实际项目需求:在大数据时代,企业和机构面临海量数据处理的需求。掌握大模型应用开发技能,将使你能够更准确地分析数据,更有效地做出决策,更好地应对各种实际项目挑战。
• AI应用开发实战技能:你将学习如何基于大模型和企业数据开发AI应用,包括理论掌握、GPU算力运用、硬件知识、LangChain开发框架应用,以及项目实战经验。此外,你还将学会如何进行Fine-tuning垂直训练大模型,包括数据准备、数据蒸馏和大模型部署等一站式技能。
• 提升编码能力:大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握将提升你的编码能力和分析能力,使你能够编写更高质量的代码。
学习资源📚
- AI大模型学习路线图:为你提供清晰的学习路径,助你系统地掌握AI大模型知识。
- 100套AI大模型商业化落地方案:学习如何将AI大模型技术应用于实际商业场景,实现技术的商业化价值。
- 100集大模型视频教程:通过视频教程,你将更直观地学习大模型的技术细节和应用方法。
- 200本大模型PDF书籍:丰富的书籍资源,供你深入阅读和研究,拓宽你的知识视野。
- LLM面试题合集:准备面试,了解大模型领域的常见问题,提升你的面试通过率。
- AI产品经理资源合集:为你提供AI产品经理的实用资源,帮助你更好地管理和推广AI产品。
👉获取方式: 😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】

948

被折叠的 条评论
为什么被折叠?



