在进入大模型(LLM)开发时代后,"向量数据库(Vector Database)"成为了一个高频出现的词汇。如果你正在学习如何让 AI 具备"长记忆",或者尝试搭建属于自己的 RAG(检索增强生成)应用,那么向量数据库是你绝对绕不开的核心组件。
今天,我们将通过一个非常简单的 Python 示例,带你零门槛体验本地轻量级开源向量数据库 ChromaDB,并通俗地解释一下它与传统搜索的区别。
1. 灵魂拷问:有了 ES,为什么我们还需要向量数据库?
传统我们在做搜索应用时(例如 Elasticsearch 分词查询),底层依赖的是倒排索引。它的本质是**"字面匹配"**。
- 痛点:如果你搜"iPhone",但文章里只写了"苹果智能终端",因为没有任何相同的字眼,系统就搜不到(除非你维护庞大的同义词库)。
而向量数据库完全抛弃了字面匹配,它基于**"语义相似度"**。 它的工作原理分为极其优雅的两步:
- 降维打击成数字(Embedding) :调用 AI 模型理解文本的深层意思,并将其转换成多维空间中的一个"坐标点"(数字数组),这就叫向量。意思越接近的废话,它们在空间坐标里离得就越近。
- 计算距离:查询时,把问题也变成坐标,然后用数学公式计算周边最近的坐标。
因为是在数学空间里找邻居,所以哪怕问题和文档没任何相同的字,也能被精准匹配出来!
2. 认识 ChromaDB
Chroma 是一个专为 AI 而生的开源向量数据库。 相比主流的重量级产品,它最大的优势是:不用配置服务器、不用部署 Docker 容器,直接 pip install 就能在本地代码里跑起来! 非常适合学习和原型开发。
3. 安装依赖
打开你的终端,执行以下命令:
bash
pip3 install chromadb
4. 核心示例代码 (Python)
下面是用 ChromaDB 实现文本入库到语义搜索的全过程,核心只有 4 个步骤:
python
import chromadb
def main():
# 1. 初始化 Chroma 客户端
# 这里我们使用内存模式。如果你想把数据持久化到本地硬盘,可以使用:
# client = chromadb.PersistentClient(path="./my_chroma_data")
print("正在初始化 ChromaDB 客户端...")
client = chromadb.Client()
# 2. 创建集合 (Collection),相当于关系型数据库里的"一张表"
collection_name = "demo_collection"
# 为了演示便利,如果遇到旧的集合则先清理掉异常
try:
client.delete_collection(name=collection_name)
except Exception:
pass
collection = client.create_collection(name=collection_name)
print(f"成功创建集合: {collection_name}")
# 3. 添加文档数据
# 🔥 最爽的一点:你不需要自己调 API 获取向量!
# Chroma 会在本地自动下载轻量级开源模型 (all-MiniLM-L6-v2) 完成所有文本到向量的转换。
print("正在添加数据,首次运行由于下载模型可能需要片刻...")
collection.add(
documents=[
"草莓是一种非常甜美的水果,富含维生素C。",
"人工智能(AI)正在改变我们的工作和生活方式。",
"今天的天气非常适合去户外爬山。",
"香蕉是猴子最喜欢吃的食物。",
"深度学习是大语言模型的核心技术。"
],
# 可以附加上级元数据供后期过滤
metadatas=[
{"category": "fruit"},
{"category": "tech"},
{"category": "weather"},
{"category": "fruit"},
{"category": "tech"}
],
# 别忘了给每条数据一个唯一主键
ids=["doc1", "doc2", "doc3", "doc4", "doc5"]
)
print("文档入库成功!\n")
# 4. 语义查询体验
query_text = "有什么好吃的水果?"
print(f"--- 搜索查询: '{query_text}' ---")
# 输入查询,去数据库里提取最相关的 N 条结果
results = collection.query(
query_texts=[query_text],
n_results=2
)
# 打印返回结果
for i in range(len(results['documents'][0])):
doc = results['documents'][0][i]
meta = results['metadatas'][0][i]
distance = results['distances'][0][i] # 数值越小代表语义越贴近
print(f"[{i+1}] {doc} \n (类别: {meta['category']} | 数学距离: {distance:.4f})")
if __name__ == "__main__":
main()
5. 总结
在上面的演示中可以看到,当我们查询 "有什么好吃的水果?" 时,系统能准确地把关于"草莓"和"香蕉"的句子匹配出来,因为在向量空间中,它们代表相似的上下文。
当你掌握了这四步:初始化 -> 建集合 -> 入库向量化 -> 相似度检索,你就已经踏入了现代 AI RAG 架构的大门了。如果我们要接上大语言模型,只需要把查出来的这两句话组装进提示词里丢给 GPT 或者 DeepSeek,它们就能根据你本地的资料做智能回答了!
本文是个人学习大模型与向量数据库时的实战小记,希望对准备入门 AI 开发的大家有所启发。
感谢关注,我会持续更新,欢迎查看其他知识点学习记录:
github.com/start007-sm...