一、向量数据库概述

1.1 为什么要用向量数据库?

要理解为什么需要向量数据库,我们得先明白一个核心概念:“向量”到底解决了什么问题?

从“精确匹配”到“语义理解”:想象一下传统的数据库,比如MySQL 。它像一个管理得井井有条的Excel表格,数据都是结构化的,比如:

商品ID 商品名称价格
101苹果iPhone 155999
102华为Mate 606999
103苹果MacBook Pro14999

你可以用非常精确的SQL查询:SELECT * FROM products WHERE 商品名称 = '苹果iPhone 15'。数据库会快速、准确地找到ID为101的那一行。

但是,这种“精确匹配”在现实世界的智能应用中,能力非常有限。 如果我搜索“水果手机”,传统数据库会一脸懵,因为它不认识“水果手机”就是“iPhone”的俗称。如果我搜索“我想买一个苹果的最新款手机”,它也无能为力,因为它不理解“最新款”是什么意思。

这就是传统数据库的 “语义鸿沟”:它只能匹配字符,无法理解文字背后的含义和意图

1.2 如何让机器理解“意思”?

现代AI,特别是深度学习模型,提供了一种革命性的解决方案。它们可以把任何非结构化数据(文本、图片、声音、视频)转换成一串数字,这串数字就是向量(Vector),也叫嵌入(Embedding)
这个过程就像是给AI提供了一个“万能翻译器”:

文本:“苹果手机” -> [0.12, -0.45, 0.78, ..., 0.33] (一个768维或更高维的数组)
文本:“水果手机” -> [0.13, -0.44, 0.77, ..., 0.34]
图片:一张iPhone的图片 -> [0.11, -0.46, 0.79, ..., 0.32]

这个向量不是随机的,它有一个神奇的特性:在向量空间中,意思越相近的东西,它们的向量距离就越近。
想象一个三维空间,北京和上海的坐标点会很近,而北京和纽约的坐标点会很远。高维向量空间也是同理,只不过维度更高(几百到几千维)。“苹果手机”和“水果手机”的向量几乎挨在一起,而它们和“华为手机”的向量距离稍远,但和“笔记本电脑”的向量距离就非常远了。

这就是向量的核心价值:它将模糊的、基于“语义”的相似性问题,转化成了精确的、可计算的数学问题。

1.3 为什么传统数据库“不行”?

现在我们有了向量,能用MySQL存吗?可以,存一个长字符串或者JSON 就行。但问题来了:如何高效地查询?
假设数据库里有100万个商品向量,用户输入一个查询向量,我们要找到最相似的10个。最笨的办法是“暴力计算”:把用户的向量和100万个向量逐一计算距离,然后排序。这在数据量大的时候,慢到无法接受。

传统数据库的索引(如B-Tree)是为精确匹配和范围查询设计的,它们完全无法处理“在N维空间里找最近的邻居”这种问题。它们就像一本按拼音排序的字典,你很难用它来查找“所有和‘苹果’意思相近的词”。

1.4 向量数据库——为“相似性”而生

向量数据库正是为了解决这个痛点而生的。它像一个专门为“相似性搜索”优化的超级图书馆。它的核心能力不是“存”,而是 “高效地查”。它通过一种叫做“近似最近邻搜索”(ANN , Approximate Nearest Neighbor)的技术来实现这一点

ANN算法(如HNSW, IVF, PQ等)就像是在高维空间里建立了一套智能的“高速公路网”或“聚类索引”。它不需要计算所有点,而是通过一些巧妙的策略,快速“跳到”最有可能存在最近邻的区域,然后用极小的计算量就找到结果。

所以,向量数据库的本质是: 一个专门用于存储和高效检索高维向量,以解决“语义相似性”问题的数据库系统。它填补了传统数据库在处理非结构化数据和语义理解上的巨大鸿沟。

1.5 5种常用向量数据库对比

数据库核心优势最佳适用场景部署方式
Pinecone省心、易用、云原生快速开发、标准RAG、SaaS应用全托管云服务
Milvus/Zilliz功能强大、高性能、可扩展海量数据、企业级核心应用自建/私有云/托管云
Weaviate语义化、混合查询知识图谱、复杂业务逻辑自建/托管云
Chroma轻量、简单、Pythonic 学习、个人项目、快速原型本地/内存
Qdrant极致性能、内存安全实时系统、高并发、资源敏感自建/托管云

建议:

  • 如果你是初学者,想快速上手:从 Chroma 开始,在本地玩明白RAG的整个流程。
  • 如果你要做一个正经的项目,不想折腾运维:直接上 Pinecone,把时间花在业务逻辑上。
  • 如果你在一家大公司,要处理海量数据,或有定制化需求:深入研究 Milvus,它几乎能满足所有苛刻的要求。
  • 如果你的应用场景很复杂,需要把传统搜索和语义搜索结合起来:Weaviate 的混合查询会是你的救星。

二、chroma 向量数据库简单使用教程

2.1什么是 Chroma?

Chroma是一个 本地运行的开源向量数据库,专为 AI 应用场景设计,比如文档检索、RAG(Retrieval-Augmented Generation)等。它支持嵌入向量的存储与检索,可以和 OpenAI、LangChain 等无缝集成。

2.2、安装 Chroma

你可以通过 pip 安装 Chroma 的 Python 客户端:

pip install chromadb

注意:Chroma 默认使用本地嵌入式数据库,不依赖外部服务。

在这里插入图片描述

如果只需要使用 Chroma 的客户端功能,可以安装轻量级的客户端库:

pip install chromadb-client

2.3、快速上手

  1. 初始化 Chroma 客户端

    import chromadb
    from chromadb.config import Settings
    
    client = chromadb.PersistentClient(path="./chroma_db") # 数据保存路径
    

    本地持久化客户端:将数据保存到本地指定路径,并在启动时自动加载。

    HTTP 客户端:连接到运行中的 Chroma 服务器。

    chroma_client = chromadb.HttpClient(host='localhost', port=8000)
    
  2. 创建集合(Collection)

    collection = client.create_collection(name="my_collection")
    # 或者
    collection = client.get_or_create_collection(name="my_collection")
    

    集合是向量数据的容器,相当于数据库中的“表”。

    集合名称有以下限制:长度 3 到 63 个字符,开头和结尾只能是小写字母或数字,不能包含两个连续的点,不能是有效的 IP 地址。
    可以通过 embedding_function 参数指定嵌入函数,若不指定则使用默认的 all-MiniLM-L6-v2 模型,路径: C:\Users\用户\.cache\chroma\onnx_models\all-MiniLM-L6-v2
    也可以通过 metadata 参数自定义嵌入空间的距离方法,例如:

    collection = client.create_collection(
        name="collection_name",
        metadata={"hnsw:space": "cosine"}  # 使用余弦相似度
    )
    
  3. 添加数据
    向集合中添加数据时,需要提供以下内容:

    • ids:唯一标识。

    • documents:数据本体,通常是文本。若未提供 embeddings,Chroma 会自动从 documents 生成嵌入向量。

    • metadatas(可选):数据的额外描述,可用于后续的过滤查询。

    • embeddings(可选):手动传入的嵌入向量。

      collection.add(
          documents=["今天天气真好", "人工智能正在改变世界"],
          metadatas=[{"source": "note1"}, {"source": "note2"}],
          ids=["doc1", "doc2"]
      )
      

      documents: 文本数据,会自动进行嵌入(默认使用 SentenceTransformer 模型)
      metadatas: 自定义的元信息(可用于过滤)
      ids: 文档唯一标识符

  4. 查询相似文本

    results = collection.query(
        query_texts=["天气怎么样"],
        n_results=2 # 返回最相关的 2 个结果
    )
    
    print(results)
    
    {'ids': [['doc1', 'doc2']], 'embeddings': None, 'documents': [['今天天气真好', '人工智能正在改变世界']], 'uris': None, 'included': ['metadatas', 'documents', 'distances'], 'data': None, 'metadatas': [[{'source': 'note1'}, {'source': 'note2'}]], 'distances': [[0.2812778055667877, 0.9028313159942627]]}
    

    查询结果是一个字典,包含以下字段:
    ids:匹配到的数据的 ID。
    documents:匹配到的数据内容。
    metadatas:匹配到的数据的元数据。
    distances:查询向量与匹配向量之间的距离,越小越接近

  5. 使用 Embedding 向量查询(可选)
    你也可以使用预计算好的向量:

    # 假设你已有向量
    vector = [0.1] * 384
    
    results = collection.query(
        query_embeddings=[vector],
        n_results=2 # 返回最相关的 2 个结果
    )
    
  6. 过滤查询:可以通过元数据或文档内容进行过滤查询。

    results = collection.query(
        query_texts=["天气怎么样"],
        n_results=2, # 返回最相关的 2 个结果
        where={"source": "note1"}  # 按元数据过滤
    )
    
  7. 指定返回字段:在查询时可以通过 include 参数指定返回的字段,例如:

    results = collection.query(
        query_texts=["天气怎么样"],
        n_results=2, # 返回最相关的 2 个结果
        where={"source": "note1"},  # 按元数据过滤
        include=["documents", "metadatas"]
    )
    
  8. 持久化数据

    chromadb.PersistentClient(path=r"./chroma_db")
    

    数据会自动保存到这个目录,不需要再手动

    下次启动时只需重新连接目录即可:

    client = chromadb.Client(Settings(persist_directory="./chroma_db"))
    collection = client.get_collection("my_collection")
    
  9. 删除文档

    collection.delete(ids=["doc1"])
    
  10. 更新文档(先删后增)

    collection.update(
        ids=["doc2"],
        documents=["AI 正在迅速发展"]
    )
    
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐