作者:CSDN博客
一、向量数据库概述
1.1 为什么要用向量数据库?
要理解为什么需要向量数据库,我们得先明白一个核心概念:“向量”到底解决了什么问题?
从“精确匹配”到“语义理解”:想象一下传统的数据库,比如MySQL 。它像一个管理得井井有条的Excel表格,数据都是结构化的,比如:
| 商品I | D 商品名称 | 价格 | | 101 | 苹果iPhone 15 | 5999 | | 102 | 华为Mate 60 | 6999 | | 103 | 苹果MacBook Pro | 14999 | 你可以用非常精确的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 客户端:注意:Chroma 默认使用本地嵌入式数据库,不依赖外部服务。
如果只需要使用 Chroma 的客户端功能,可以安装轻量级的客户端库:- pip install chromadb-client
复制代码 2.3、快速上手
- 初始化 Chroma 客户端
- import chromadb
- from chromadb.config import Settings
- client = chromadb.PersistentClient(path="./chroma_db")# 数据保存路径
复制代码本地持久化客户端:将数据保存到本地指定路径,并在启动时自动加载。
HTTP 客户端:连接到运行中的 Chroma 服务器。- chroma_client = chromadb.HttpClient(host='localhost', port=8000)
复制代码 - 创建集合(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"}# 使用余弦相似度)
复制代码 - 添加数据
向集合中添加数据时,需要提供以下内容:
ids:唯一标识。
documents:数据本体,通常是文本。若未提供 embeddings,Chroma 会自动从 documents 生成嵌入向量。
metadatas(可选):数据的额外描述,可用于后续的过滤查询。
- embeddings(可选):手动传入的嵌入向量。
- collection.add(
- documents=["今天天气真好","人工智能正在改变世界"],
- metadatas=[{"source":"note1"},{"source":"note2"}],
- ids=["doc1","doc2"])
复制代码documents: 文本数据,会自动进行嵌入(默认使用 SentenceTransformer 模型)
metadatas: 自定义的元信息(可用于过滤)
ids: 文档唯一标识符
- 查询相似文本
- 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:查询向量与匹配向量之间的距离,越小越接近
- 使用 Embedding 向量查询(可选)
你也可以使用预计算好的向量:- # 假设你已有向量
- vector =[0.1]*384
- results = collection.query(
- query_embeddings=[vector],
- n_results=2# 返回最相关的 2 个结果)
复制代码 - 过滤查询:可以通过元数据或文档内容进行过滤查询。
- results = collection.query(
- query_texts=["天气怎么样"],
- n_results=2,# 返回最相关的 2 个结果
- where={"source":"note1"}# 按元数据过滤)
复制代码 - 指定返回字段:在查询时可以通过 include 参数指定返回的字段,例如:
- results = collection.query(
- query_texts=["天气怎么样"],
- n_results=2,# 返回最相关的 2 个结果
- where={"source":"note1"},# 按元数据过滤
- include=["documents","metadatas"])
复制代码 - 持久化数据
- chromadb.PersistentClient(path=r"./chroma_db")
复制代码数据会自动保存到这个目录,不需要再手动
下次启动时只需重新连接目录即可:- client = chromadb.Client(Settings(persist_directory="./chroma_db"))
- collection = client.get_collection("my_collection")
复制代码 删除文档- collection.delete(ids=["doc1"])
复制代码 - 更新文档(先删后增)
- collection.update(
- ids=["doc2"],
- documents=["AI 正在迅速发展"])
复制代码
原文地址:https://blog.csdn.net/qq_44732146/article/details/158967826 |