
当大模型能够流畅地撰写文案、解答数学难题、生成代码时,知识固化与幻觉问题始终是一个致命短板制约着大模型的能力发挥。训练完成的大模型如同一个记忆定格的智者,既无法实时吸收新信息,又可能基于碎片化知识生成似是而非的答案。
在这样的背景下,向量数据库应运而生。它并非传统数据库的简单延伸,而是专为非结构化数据打造的语义存储器,通过将文本、图像、音频转化为高维向量,实现毫秒级相似性检索。当向量数据库与大模型强强联合,不仅能破解大模型的失忆难题,更能构建出可扩展、高精度的 AI 应用。今天我们将从技术本质、架构原理、实战案例三个维度,全面拆解向量数据库的核心价值,揭示其如何成为大模型建设的基础设施。

向量数据库重新定义数据的存储与检索,将传统的关键词匹配进阶为语义相似性检索,传统数据库以结构化数据为核心,依赖“行、列、主键”的逻辑存储,检索时需精准匹配关键词;而向量数据库的核心是高维向量,通过嵌入模型(Embedding Model)将非结构化数据的语义特征转化为一串数值数组,例如一段文本可转化为 768 维向量,一张图片可转化为 512 维向量。
向量数据库的检索逻辑不再是“关键词是否存在”,而是计算向量间的距离,一般常用余弦相似度、欧氏距离来判断,距离越近则语义相似度越高。这种特性使其能够实现 “用户问 A,系统返回语义相关的 B”,例如查询“如何优化大模型推理速度”,无需匹配 “模型量化”关键词,也能精准检索到相关技术文档。
术语是理解向量数据库的核心组件,通过几个关键术语加强我们的基础概念理解和作用分析:
核心特征:专为向量检索设计,支持分布式部署、高并发、动态数据更新,具备完善的索引管理与数据一致性保障。主流产品:
3.1.1 Milvus
3.1.2 Weaviate
3.1.3 Pinecone
核心特征:轻量级、无服务端,直接嵌入到应用程序进程中,适合边缘设备、本地应用或低延迟场景。主流产品:
3.2.1 FAISS
3.2.2 Chroma
向量数据库与关系型数据库(MySQL)、非关系型数据库(MongoDB)的核心差异,在于数据的组织方式与检索逻辑,通过以下维度我们进一步了解与传统数据库的差异:
向量索引是向量数据库的性能关键,其本质是通过 “降维” 或 “聚类” 减少相似性计算的次数,主流算法分为以下两类:
一个完整的向量数据库通常包含以下模块:
向量数据库的架构遵循 “数据输入 - 向量生成 - 存储索引 - 检索服务 - 应用输出” 的分层逻辑,其通用架构流程图如下,涵盖从原始数据到最终业务应用的全链路:

各分层核心功能详解
轻量化架构

对于中小型应用,如我们很多其然文章里面的本地 RAG 原型开发示例,都是基于FAISS的向量数据库,这种无需复杂的分布式架构,通过嵌入式向量数据库(如 Chroma、FAISS)采用“数据 - 索引 - 检索” 一体化的轻量化设计即可达到效果:
向量数据库并非孤立存在,其最大价值在于为大模型提供外部记忆,二者通过 RAG 架构形成互补。大模型擅长语义理解与内容生成,但存在知识固化、幻觉、上下文窗口有限三大痛点;向量数据库则能精准解决这些问题。
向量数据库可以实时更新大模型的知识库,大模型的训练数据是静态快照,无法实时吸收新信息。例如,2025 年发布的新政策,训练于 2024 年的大模型无法知晓。
为大模型提供权威依据,大模型在生成回答时,可能基于碎片化知识编造不存在的事实,就是我们所说的幻觉。例如,医疗大模型可能推荐不存在的药品。
突破大模型的记忆上限,大模型的上下文窗口是有限的,如 GPT-3.5 的 4k 窗口,无法处理超长文本。例如,让大模型直接分析万字的合同文档,会导致信息丢失。
以往的RAG示例我们都采用的是FAISS向量数据库,今天我们换ChromaDB来做示例解析,ChromaDB是轻量级、零依赖的嵌入式向量数据库,无需部署独立服务,一行代码即可启动,适合快速理解向量数据库的核心流程。以下是从环境搭建到完整检索的每一步操作,所有代码可直接复制运行。
第一步先初始化 Chroma 客户端,Chroma 支持内存模式,数据仅存于内存,关闭程序丢失,同时也支持持久化模式,数据可以保存到本地文件,我们先从最简单的内存模式开始:
# 导入ChromaDB核心库
import chromadb
# 1. 初始化内存模式客户端(最简方式)
# 特点:数据只在运行时存在,关闭程序后丢失,适合测试
client = chromadb.Client()
# (可选)持久化模式:数据保存到本地文件夹,下次运行可读取
# client = chromadb.PersistentClient(path="./my_chroma_data")
# 2. 创建/获取集合(Collection,类似数据库的“表”)
# 如果集合已存在,会自动获取;不存在则创建
collection = client.create_collection(name="my_first_collection")
# 查看集合是否创建成功(输出集合名称)
print("集合创建成功:", collection.name)输出结果:
集合创建成功: my_first_collection
Chroma 的核心优势是自动生成向量,无需手动调用嵌入模型,只需传入原始文本,底层会用默认模型(all-MiniLM-L6-v2)转为向量。我们插入 3 条简单文本数据:
# 继续在上述代码后添加
# 3. 插入数据:传入ID、文本内容(可选加元数据)
# - ids:每条数据的唯一标识(必须)
# - documents:原始文本(核心,Chroma会自动转为向量)
# - metadatas:可选元数据(如分类、标签,用于过滤检索)
collection.add(
ids=["id1", "id2", "id3"], # 自定义唯一ID
documents=[
"苹果是一种常见的水果,富含维生素C",
"香蕉富含钾元素,适合运动后食用",
"程序员常用Python语言开发人工智能应用"
],
metadatas=[ # 可选:给每条数据加分类标签
{"category": "水果"},
{"category": "水果"},
{"category": "编程"}
]
)
# 查看集合中的数据量(输出3)
print("插入数据量:", collection.count())输出结果:
插入数据量: 3
这是向量数据库的核心功能:输入一个查询文本,Chroma 会先将查询转为向量,再计算与库中所有向量的相似度,返回最相似的结果。
# 继续添加
# 4. 执行相似性检索
# query_texts:查询文本(支持批量,这里只传1条)
# n_results:返回最相似的前N条结果
# where:可选过滤条件(如只检索“水果”分类)
results = collection.query(
query_texts=["哪些水果富含营养?"], # 用户查询
n_results=2, # 返回前2条最相似的结果
# where={"category": "水果"} # 可选:只检索水果分类
)
# 5. 解析并打印结果
print("\n=== 检索结果 ===")
# results的结构:包含ids、documents、distances、metadatas等字段
for i in range(len(results["ids"][0])):
# 提取每条结果的信息
doc_id = results["ids"][0][i]
content = results["documents"][0][i]
distance = results["distances"][0][i] # 距离值(越小相似度越高)
similarity = 1 - distance # 转换为相似度(0~1,越大越相似)
metadata = results["metadatas"][0][i]
# 打印结果
print(f"排名{i+1}")
print(f"ID:{doc_id}")
print(f"内容:{content}")
print(f"相似度:{similarity:.4f}")
print(f"分类:{metadata['category']}\n")输出结果:
=== 检索结果 === 排名1 ID:id1 内容:苹果是一种常见的水果,富含维生素C 相似度:0.5620 分类:水果 排名2 ID:id2 内容:香蕉富含钾元素,适合运动后食用 相似度:0.1341 分类:水果
# 根据ID删除单条数据
collection.delete(ids=["id3"])
print("删除后数据量:", collection.count()) # 输出2输出结果:
删除后数据量: 2
# 更新id1的内容和元数据
collection.update(
ids=["id1"],
documents=["苹果是低热量水果,富含膳食纤维和维生素C"],
metadatas=[{"category": "水果-低热量"}]
)
# 重新检索验证更新
results = collection.query(query_texts=["低热量水果有哪些?"], n_results=1)
print("更新后检索结果:", results["documents"][0][0])输出结果:
更新后检索结果: 苹果是低热量水果,富含膳食纤维和维生素C
# 清空集合所有数据(谨慎使用)
ids = collection.get()["ids"]
if ids:
collection.delete(ids=ids)
print("清空后数据量:", collection.count()) # 输出0输出结果:
清空后数据量: 0
和基础示例做个基础进阶,初始化Chroma客户端并持久化存储,数据保存在本地chroma_db目录,使用本地的sentence-transformers的all-MiniLM-L6-v2模型替代Chroma默认模型。
import chromadb
from chromadb.utils import embedding_functions
# 1. 初始化Chroma客户端(持久化存储,数据保存在本地chroma_db目录)
client = chromadb.PersistentClient(path="./chroma_db")
# 2. 定义嵌入函数(用开源模型生成向量,替代Chroma默认模型)
# 使用sentence-transformers的all-MiniLM-L6-v2模型(轻量、效果好)
sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction(
model_name="D:/modelscope/hub/models/sentence-transformers/all-MiniLM-L6-v2"
)
# 3. 创建/获取集合(类似数据库的“表”,存储向量+元数据)
# 如果集合已存在,直接获取;不存在则创建
collection = client.get_or_create_collection(
name="my_first_collection",
embedding_function=sentence_transformer_ef, # 绑定嵌入函数
metadata={"hnsw:space": "cosine"} # 相似度计算方式:余弦相似度
)准备示例文本数据,转为向量后存入 Chroma:
# 示例数据:6条技术文档片段
documents = [
"Python中列表(list)的append()方法用于在末尾添加元素",
"NumPy的ndarray是高性能数值计算的核心数据结构",
"Pandas的DataFrame可以方便地处理结构化表格数据",
"Milvus是开源分布式向量数据库,支持亿级向量检索",
"Chroma是轻量级嵌入式向量数据库,适合LLM原型开发",
"向量数据库通过余弦相似度计算文本语义相似性"
]
# 每条数据的唯一ID(自定义)
ids = [f"doc_{i}" for i in range(len(documents))]
# 可选:元数据(用于过滤检索)
metadatas = [
{"category": "Python基础"},
{"category": "Python数据科学"},
{"category": "Python数据科学"},
{"category": "向量数据库"},
{"category": "向量数据库"},
{"category": "向量数据库"}
]
# 插入数据(Chroma自动调用嵌入函数生成向量,无需手动转换)
collection.add(
documents=documents,
ids=ids,
metadatas=metadatas
)
# 查看集合信息
print("集合数据量:", collection.count()) # 输出:6输出结果:
Insert of existing embedding ID: doc_0 Insert of existing embedding ID: doc_1 Insert of existing embedding ID: doc_2 Insert of existing embedding ID: doc_3 Insert of existing embedding ID: doc_4 Insert of existing embedding ID: doc_5 Add of existing embedding ID: doc_0 Add of existing embedding ID: doc_1 Add of existing embedding ID: doc_2 Add of existing embedding ID: doc_3 Add of existing embedding ID: doc_4 Add of existing embedding ID: doc_5 集合数据量: 6
输入查询语句,检索语义最相似的文本:
# 目标查询:“Python如何处理表格数据?”
query_text = "Python如何处理表格数据?"
# 执行检索:返回Top3最相似结果
results = collection.query(
query_texts=[query_text], # 查询文本(支持批量)
n_results=3, # 返回Top3
# 可选:元数据过滤(仅检索“Python数据科学”分类)
# where={"category": "Python数据科学"}
)
# 解析结果
print("=== 相似检索结果 ===")
for i, (doc, score) in enumerate(zip(results["documents"][0], results["distances"][0])):
# Chroma返回的是“距离值”,值越小相似度越高(余弦距离=1-余弦相似度)
similarity = 1 - score # 转换为相似度(0~1)
print(f"排名{i+1} | 相似度:{similarity:.4f} | 内容:{doc}")输出结果:
=== 相似检索结果 === 排名1 | 相似度:0.6185 | 内容:Python中列表(list)的append()方法用于在末尾添加元素 排名2 | 相似度:0.5372 | 内容:NumPy的ndarray是高性能数值计算的核心数据结构 排名3 | 相似度:0.4304 | 内容:Pandas的DataFrame可以方便地处理结构化表格数据
实际场景中常需 “按分类检索 + 语义相似”,例如仅检索 “向量数据库” 相关内容:
query_text = "如何快速部署向量数据库?"
results = collection.query(
query_texts=[query_text],
n_results=2,
where={"category": "向量数据库"} # 过滤条件
)
print("=== 过滤后检索结果 ===")
for doc, score in zip(results["documents"][0], results["distances"][0]):
print(f"相似度:{1-score:.4f} | 内容:{doc}")输出结果:
=== 过滤后检索结果 === 相似度:0.5319 | 内容:向量数据库通过余弦相似度计算文本语义相似性 相似度:0.5244 | 内容:Milvus是开源分布式向量数据库,支持亿级向量检索
向量数据库的出现填补了非结构化数据语义检索的空白。当大模型的生成能力遇上向量数据库的记忆能力,二者协同构建的 RAG 架构,正在重塑 AI 应用的底层逻辑。其核心价值在于连接非结构化数据与大模型,通过高效的相似性检索,解决大模型的知识时效性、幻觉、上下文窗口有限等问题,从企业知识库到个性化推荐,从医疗诊断到金融风控,向量数据库的多元化生态,正在满足不同场景的需求。
# 导入ChromaDB核心库
import chromadb
# 1. 初始化内存模式客户端(最简方式)
# 特点:数据只在运行时存在,关闭程序后丢失,适合测试
client = chromadb.Client()
# (可选)持久化模式:数据保存到本地文件夹,下次运行可读取
# client = chromadb.PersistentClient(path="./my_chroma_data")
# 2. 创建/获取集合(Collection,类似数据库的“表”)
# 如果集合已存在,会自动获取;不存在则创建
collection = client.create_collection(name="my_first_collection")
# 查看集合是否创建成功(输出集合名称)
print("集合创建成功:", collection.name)# 继续在上述代码后添加
# 3. 插入数据:传入ID、文本内容(可选加元数据)
# - ids:每条数据的唯一标识(必须)
# - documents:原始文本(核心,Chroma会自动转为向量)
# - metadatas:可选元数据(如分类、标签,用于过滤检索)
collection.add(
ids=["id1", "id2", "id3"], # 自定义唯一ID
documents=[
"苹果是一种常见的水果,富含维生素C",
"香蕉富含钾元素,适合运动后食用",
"程序员常用Python语言开发人工智能应用"
],
metadatas=[ # 可选:给每条数据加分类标签
{"category": "水果"},
{"category": "水果"},
{"category": "编程"}
]
)
# 查看集合中的数据量(输出3)
print("插入数据量:", collection.count())
# 继续添加
# 4. 执行相似性检索
# query_texts:查询文本(支持批量,这里只传1条)
# n_results:返回最相似的前N条结果
# where:可选过滤条件(如只检索“水果”分类)
results = collection.query(
query_texts=["哪些水果富含营养?"], # 用户查询
n_results=2, # 返回前2条最相似的结果
# where={"category": "水果"} # 可选:只检索水果分类
)
# 5. 解析并打印结果
print("\n=== 检索结果 ===")
# results的结构:包含ids、documents、distances、metadatas等字段
for i in range(len(results["ids"][0])):
# 提取每条结果的信息
doc_id = results["ids"][0][i]
content = results["documents"][0][i]
distance = results["distances"][0][i] # 距离值(越小相似度越高)
similarity = 1 - distance # 转换为相似度(0~1,越大越相似)
metadata = results["metadatas"][0][i]
# 打印结果
print(f"排名{i+1}")
print(f"ID:{doc_id}")
print(f"内容:{content}")
print(f"相似度:{similarity:.4f}")
print(f"分类:{metadata['category']}\n")
# 根据ID删除单条数据
collection.delete(ids=["id3"])
print("删除后数据量:", collection.count()) # 输出2
# 更新id1的内容和元数据
collection.update(
ids=["id1"],
documents=["苹果是低热量水果,富含膳食纤维和维生素C"],
metadatas=[{"category": "水果-低热量"}]
)
# 重新检索验证更新
results = collection.query(query_texts=["低热量水果有哪些?"], n_results=1)
print("更新后检索结果:", results["documents"][0][0])
# 清空集合所有数据(谨慎使用)
ids = collection.get()["ids"]
if ids:
collection.delete(ids=ids)
print("清空后数据量:", collection.count()) # 输出0import chromadb
from chromadb.utils import embedding_functions
# 1. 初始化Chroma客户端(持久化存储,数据保存在本地chroma_db目录)
client = chromadb.PersistentClient(path="./chroma_db")
# 2. 定义嵌入函数(用开源模型生成向量,替代Chroma默认模型)
# 使用sentence-transformers的all-MiniLM-L6-v2模型(轻量、效果好)
sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction(
model_name="D:/modelscope/hub/models/sentence-transformers/all-MiniLM-L6-v2"
)
# 3. 创建/获取集合(类似数据库的“表”,存储向量+元数据)
# 如果集合已存在,直接获取;不存在则创建
collection = client.get_or_create_collection(
name="my_first_collection",
embedding_function=sentence_transformer_ef, # 绑定嵌入函数
metadata={"hnsw:space": "cosine"} # 相似度计算方式:余弦相似度
)
# 示例数据:6条技术文档片段
documents = [
"Python中列表(list)的append()方法用于在末尾添加元素",
"NumPy的ndarray是高性能数值计算的核心数据结构",
"Pandas的DataFrame可以方便地处理结构化表格数据",
"Milvus是开源分布式向量数据库,支持亿级向量检索",
"Chroma是轻量级嵌入式向量数据库,适合LLM原型开发",
"向量数据库通过余弦相似度计算文本语义相似性"
]
# 每条数据的唯一ID(自定义)
ids = [f"doc_{i}" for i in range(len(documents))]
# 可选:元数据(用于过滤检索)
metadatas = [
{"category": "Python基础"},
{"category": "Python数据科学"},
{"category": "Python数据科学"},
{"category": "向量数据库"},
{"category": "向量数据库"},
{"category": "向量数据库"}
]
# 插入数据(Chroma自动调用嵌入函数生成向量,无需手动转换)
collection.add(
documents=documents,
ids=ids,
metadatas=metadatas
)
# 查看集合信息
print("集合数据量:", collection.count()) # 输出:6
# 目标查询:“Python如何处理表格数据?”
query_text = "Python如何处理表格数据?"
# 执行检索:返回Top3最相似结果
results = collection.query(
query_texts=[query_text], # 查询文本(支持批量)
n_results=3, # 返回Top3
# 可选:元数据过滤(仅检索“Python数据科学”分类)
# where={"category": "Python数据科学"}
)
# 解析结果
print("=== 相似检索结果 ===")
for i, (doc, score) in enumerate(zip(results["documents"][0], results["distances"][0])):
# Chroma返回的是“距离值”,值越小相似度越高(余弦距离=1-余弦相似度)
similarity = 1 - score # 转换为相似度(0~1)
print(f"排名{i+1} | 相似度:{similarity:.4f} | 内容:{doc}")
query_text = "如何快速部署向量数据库?"
results = collection.query(
query_texts=[query_text],
n_results=2,
where={"category": "向量数据库"} # 过滤条件
)
print("=== 过滤后检索结果 ===")
for doc, score in zip(results["documents"][0], results["distances"][0]):
print(f"相似度:{1-score:.4f} | 内容:{doc}") 原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。