5 分钟极速入门:用 Python 和 ChromaDB 体验向量数据库的魅力

在进入大模型(LLM)开发时代后,"向量数据库(Vector Database)"成为了一个高频出现的词汇。如果你正在学习如何让 AI 具备"长记忆",或者尝试搭建属于自己的 RAG(检索增强生成)应用,那么向量数据库是你绝对绕不开的核心组件。

今天,我们将通过一个非常简单的 Python 示例,带你零门槛体验本地轻量级开源向量数据库 ChromaDB,并通俗地解释一下它与传统搜索的区别。

1. 灵魂拷问:有了 ES,为什么我们还需要向量数据库?

传统我们在做搜索应用时(例如 Elasticsearch 分词查询),底层依赖的是倒排索引。它的本质是**"字面匹配"**。

  • 痛点:如果你搜"iPhone",但文章里只写了"苹果智能终端",因为没有任何相同的字眼,系统就搜不到(除非你维护庞大的同义词库)。

而向量数据库完全抛弃了字面匹配,它基于**"语义相似度"**。 它的工作原理分为极其优雅的两步:

  1. 降维打击成数字(Embedding) :调用 AI 模型理解文本的深层意思,并将其转换成多维空间中的一个"坐标点"(数字数组),这就叫向量。意思越接近的废话,它们在空间坐标里离得就越近。
  2. 计算距离:查询时,把问题也变成坐标,然后用数学公式计算周边最近的坐标。

因为是在数学空间里找邻居,所以哪怕问题和文档没任何相同的字,也能被精准匹配出来!

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...


相关推荐
袋鱼不重5 小时前
Hermes Agent 安装与实战:从安装到与 OpenClaw 全方位对比
前端·后端·ai编程
石工记5 小时前
Agent 应用与图状态编排框架LangGraph
python·ai编程
程序员鱼皮5 小时前
SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程
ai·程序员·开源·编程·ai编程
踩着两条虫5 小时前
目录:VTJ.PRO 在线应用开发平台技术揭秘
vue.js·低代码·ai编程
hello world 9996 小时前
Cursor开发实战应用
c++·ai编程·cursor
不凡的凡7 小时前
AI 编程工具对比
ai编程
袋鱼不重7 小时前
Hermes 把 “技能 + 记忆 + 配置” 存在哪?如何进行技能同步?
openai·ai编程
wusfe7 小时前
MCP OAuth 2.0 认证
ai编程