开启左侧

向量数据库概述以及chroma 向量数据库简单使用教程

[复制链接]
AI小编 发表于 1 小时前 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
作者:CSDN博客
一、向量数据库概述

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 客户端:
  1. pip install chromadb
复制代码
注意:Chroma 默认使用本地嵌入式数据库,不依赖外部服务。
向量数据库概述以及chroma 向量数据库简单使用教程-1.png


如果只需要使用 Chroma 的客户端功能,可以安装轻量级的客户端库:
  1. pip install chromadb-client
复制代码
2.3、快速上手


  • 初始化 Chroma 客户端
    1. import chromadb
    2. from chromadb.config import Settings
    3. client = chromadb.PersistentClient(path="./chroma_db")# 数据保存路径
    复制代码
    本地持久化客户端:将数据保存到本地指定路径,并在启动时自动加载。
    HTTP 客户端:连接到运行中的 Chroma 服务器。
    1. chroma_client = chromadb.HttpClient(host='localhost', port=8000)
    复制代码
  • 创建集合(Collection)
    1. collection = client.create_collection(name="my_collection")# 或者
    2. 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 参数自定义嵌入空间的距离方法,例如:
    1. collection = client.create_collection(
    2.     name="collection_name",
    3.     metadata={"hnsw:space":"cosine"}# 使用余弦相似度)
    复制代码
  • 添加数据
    向集合中添加数据时,需要提供以下内容:
      ids:唯一标识。
      documents:数据本体,通常是文本。若未提供 embeddings,Chroma 会自动从 documents 生成嵌入向量。
      metadatas(可选):数据的额外描述,可用于后续的过滤查询。
    • embeddings(可选):手动传入的嵌入向量。
      1. collection.add(
      2.     documents=["今天天气真好","人工智能正在改变世界"],
      3.     metadatas=[{"source":"note1"},{"source":"note2"}],
      4.     ids=["doc1","doc2"])
      复制代码
      documents: 文本数据,会自动进行嵌入(默认使用 SentenceTransformer 模型)
      metadatas: 自定义的元信息(可用于过滤)
      ids: 文档唯一标识符


  • 查询相似文本
    1. results = collection.query(
    2.     query_texts=["天气怎么样"],
    3.     n_results=2# 返回最相关的 2 个结果)print(results)
    复制代码
    1. {'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:查询向量与匹配向量之间的距离,越小越接近

  • 使用 Embedding 向量查询(可选)
    你也可以使用预计算好的向量:
    1. # 假设你已有向量
    2. vector =[0.1]*384
    3. results = collection.query(
    4.     query_embeddings=[vector],
    5.     n_results=2# 返回最相关的 2 个结果)
    复制代码
  • 过滤查询:可以通过元数据或文档内容进行过滤查询。
    1. results = collection.query(
    2.     query_texts=["天气怎么样"],
    3.     n_results=2,# 返回最相关的 2 个结果
    4.     where={"source":"note1"}# 按元数据过滤)
    复制代码
  • 指定返回字段:在查询时可以通过 include 参数指定返回的字段,例如:
    1. results = collection.query(
    2.     query_texts=["天气怎么样"],
    3.     n_results=2,# 返回最相关的 2 个结果
    4.     where={"source":"note1"},# 按元数据过滤
    5.     include=["documents","metadatas"])
    复制代码
  • 持久化数据
    1. chromadb.PersistentClient(path=r"./chroma_db")
    复制代码
    数据会自动保存到这个目录,不需要再手动
    下次启动时只需重新连接目录即可:
    1. client = chromadb.Client(Settings(persist_directory="./chroma_db"))
    2. collection = client.get_collection("my_collection")
    复制代码
    删除文档
    1. collection.delete(ids=["doc1"])
    复制代码
  • 更新文档(先删后增)
    1. collection.update(
    2.     ids=["doc2"],
    3.     documents=["AI 正在迅速发展"])
    复制代码

原文地址:https://blog.csdn.net/qq_44732146/article/details/158967826
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
阅读排行更多+

Powered by Discuz! X3.4© 2001-2013 Discuz Team.( 京ICP备17022993号-3 )