引言:为什么你需要一个向量数据库?

随着大语言模型(LLM)的兴起,一个名为RAG (Retrieval-Augmented Generation,检索增强生成) 的技术正变得越来越重要。

RAG的核心思想是,在让LLM回答问题之前,先从我们自己的知识库(如PDF文档、公司内部wiki、网页等)中检索出最相关的几段信息,然后将这些信息连同问题一起交给LLM,让它基于这些“背景资料”来生成回答。这样做可以极大地提升LLM回答的准确性、时效性,并能有效减少“幻觉”(胡说八道)的产生。

而要在海量的文本资料中“检索出最相关的信息”,传统的关系型数据库力不从心。我们需要将文本转换成“向量”(可以理解为文本在数学空间中的坐标),然后比较问题向量和资料向量之间的“距离”,距离越近就越相关。

向量数据库就是专门用来高效存储、索引和查询这些“向量”的数据库。Chroma DB 因其开源、简单易用、对Python友好而成为许多开发者的入门首选。

这篇教程将告诉你,拥有一个自己的向量数据库有多简单!

方法一:Docker方式(推荐,最快)

这是在本地启动一个长期运行、可供多个应用访问的Chroma服务的最简单方式。

第1步:安装Docker

(如果你已经根据我们之前的教程安装过Docker,请跳过此步) 访问 Docker官网,下载并安装Docker Desktop。

第2步:运行Chroma容器

打开终端,执行以下命令:

docker run -d -p 8000:8000 --name my-chroma-db chromadb/chroma
  • -p 8000:8000: 将本地的8000端口映射到Chroma容器的8000端口。
  • chromadb/chroma: 这是Chroma DB的官方Docker镜像。

第3步:在Python中连接并使用

现在,Chroma服务已经在后台运行了。我们可以编写一个Python脚本来和它交互。

首先,安装Python客户端:

pip install chromadb

然后,编写 test_chroma.py:

import chromadb

# 连接到我们用Docker启动的Chroma服务
client = chromadb.HttpClient(host='localhost', port=8000)

# 创建一个Collection(类似数据库中的“表”)
# 如果已存在,会直接获取
collection = client.get_or_create_collection(name="my_first_collection")

# 添加数据(向量化和存储)
# Chroma会自动处理文本到向量的转换
collection.add(
    documents=["这是一篇关于苹果的文章。", "这是一篇关于香蕉的文章。"],
    metadatas=[{"source": "doc1"}, {"source": "doc2"}],
    ids=["id1", "id2"]
)

# 查询(最关键的一步)
results = collection.query(
    query_texts=["我想知道关于水果的信息"],
    n_results=1 # 返回1个最相关的结果
)

print(results)

运行脚本 python test_chroma.py,你将看到它成功查询出了与“水果”最相关的“苹果”那篇文章。

方法二:纯Python方式(最轻量)

如果你只是想在单个Python脚本或Jupyter Notebook中进行一些快速实验,你甚至不需要Docker。Chroma可以直接在内存或本地文件中运行。

第1步:安装库

pip install chromadb

第2步:修改Python脚本以持久化存储

这次,我们不使用 HttpClient,而是创建一个持久化的客户端,它会将数据存储在本地的一个文件夹里。

import chromadb

# 创建一个持久化客户端,数据将保存在 'chroma_storage' 文件夹
client = chromadb.PersistentClient(path="chroma_storage")

# 后续代码与Docker方式完全相同!
collection = client.get_or_create_collection(name="my_local_collection")

collection.add(
    documents=["这是一篇关于猫的文章。", "这是一篇关于狗的文章。"],
    ids=["cat1", "dog1"]
)

results = collection.query(
    query_texts=["我喜欢哪种宠物?"],
    n_results=1
)

print(results)

运行这个脚本,它会创建一个 chroma_storage目录来存放数据。下次再运行,数据依然存在。

总结

你已经成功在本地拥有并操作了一个向量数据库!无论是通过Docker启动一个共享服务,还是在Python中进行快速原型开发,Chroma都提供了极为简洁的接口。

这是你构建自己RAG应用,让LLM拥有“记忆”和“知识库”的关键第一步。现在,你可以开始尝试将自己的文档、网页数据加载进去,打造一个真正属于你的、聪明的AI应用了。