向量数据库对比以及Chroma操作

一、向量数据库与传统类型数据库

向量数据库(Vector Storage Engine)与传统类型的数据库如关系型数据库(MySQL)、文档型数据库(MongoDB)、键值存储(Redis)、全文搜索引擎(Elasticsearch,简称ES)等在设计理念、应用场景和技术实现上存在显著差异。以下是它们之间的对比:

1.1. 向量数据库

  • 设计理念:专门设计用于存储和查询高维向量数据,支持基于相似度的搜索,例如通过余弦相似度、欧氏距离等方式来查找最接近的向量。
  • 应用场景:主要用于机器学习模型输出的向量表示的高效检索,如图像识别、推荐系统、自然语言处理中的文本相似性搜索等。
  • 技术特性
    • 支持高效的近似最近邻(Approximate Nearest Neighbor, ANN)搜索。
    • 可以处理非常大规模的数据集,且对维度不敏感。
    • 提供了针对向量数据优化的索引结构。

1.2. 关系型数据库(MySQL)

  • 设计理念:基于表格形式组织数据,强调数据的一致性和事务处理能力。
  • 应用场景:适用于需要复杂查询、严格事务控制的应用场景,如金融交易系统、企业资源规划(ERP)等。
  • 技术特性
    • 支持SQL查询语言,便于进行复杂的联表查询和聚合操作。
    • 强调ACID属性(原子性、一致性、隔离性、持久性),适合于对数据一致性和完整性要求较高的场合。

1.3. 文档型数据库(MongoDB)

  • 设计理念:采用文档作为基本单位存储数据,文档可以嵌套,非常适合存储半结构化或非结构化数据。
  • 应用场景:适用于内容管理系统、物联网(IoT)数据存储、实时分析等场景。
  • 技术特性
    • 使用JSON-like格式存储数据,易于扩展字段。
    • 提供了灵活的数据模型,支持水平扩展。

1.4. 键值存储(Redis)

  • 设计理念:简单的键值对存储机制,强调高性能读写操作。
  • 应用场景:缓存、会话管理、实时分析等需要快速访问的小型数据集。
  • 技术特性
    • 内存中操作,提供了极高的读写速度。
    • 支持多种数据结构,如字符串、哈希表、列表、集合等。

1.5. 全文搜索引擎(Elasticsearch)

  • 设计理念:专注于全文搜索,能够快速检索大量文本数据并提供相关性排序。
  • 应用场景:日志分析、网站搜索、商业智能等领域。
  • 技术特性
    • 支持复杂的查询语法,包括模糊查询、短语匹配等。
    • 提供强大的分词和倒排索引功能,支持多语言文本搜索。

二、向量数据库 vs. 其他类型数据库对比

2.1. 数据模型与核心功能

数据库类型数据模型核心功能典型场景
向量数据库高维向量(如512维浮点数组)相似性搜索(余弦、欧氏距离等)图像/文本检索、推荐系统、AI模型嵌入
关系型数据库(MySQL)结构化表格(行与列)SQL查询、ACID事务、复杂关联查询金融交易、ERP系统、结构化数据管理
文档数据库(MongoDB)JSON/BSON文档(半结构化)灵活查询、嵌套文档存储日志存储、用户配置、内容管理系统
键值数据库(Redis)键-值对(简单数据结构)高速缓存、原子操作会话缓存、排行榜、实时计数器
搜索引擎(Elasticsearch)文本+倒排索引全文检索、模糊匹配、聚合分析日志分析、电商搜索、文本内容检索

2.2. 查询方式对比

数据库类型查询特点
向量数据库基于向量距离的近似最近邻(ANN)搜索,支持相似性排序(如 Top-K 结果)
关系型数据库基于SQL的精确查询,支持JOIN、GROUP BY等复杂操作,强调数据一致性
文档数据库基于文档字段的灵活查询(如嵌套查询、范围过滤),支持部分索引
键值数据库基于键的精确读写,支持简单范围查询(如 SCAN),但无复杂关联操作
搜索引擎基于关键词的全文检索,支持模糊匹配、分词、相关性评分(TF-IDF/BM25)

2.3. 性能与优化方向

数据库类型性能优化重点瓶颈
向量数据库高维向量索引(如HNSW、IVF-PQ)加速相似性搜索高维数据计算复杂度高,内存占用大
关系型数据库事务处理、索引优化(B+树)、锁机制复杂JOIN和大表查询的延迟
文档数据库文档结构灵活性、分片扩展性嵌套层级过深时的查询效率下降
键值数据库低延迟读写、内存优化数据持久化与内存成本的平衡
搜索引擎倒排索引压缩、分词效率、分布式查询高基数字段的聚合性能(如去重统计)

2.4. 适用场景示例

场景推荐数据库原因
人脸识别1:N检索向量数据库(如Milvus、Pinecone)需快速比对海量高维向量,支持ANN索引和GPU加速
电商订单管理关系型数据库(MySQL)需要事务支持、订单状态一致性及复杂关联查询
用户行为日志存储文档数据库(MongoDB)半结构化日志格式灵活,支持动态字段扩展
实时在线游戏排行榜键值数据库(Redis)低延迟读写,支持有序集合(ZSET)实现实时排名
新闻内容全文检索搜索引擎(Elasticsearch)支持分词、相关性排序、高亮显示等文本特性

2.5. 核心差异总结

维度向量数据库其他数据库
数据本质非结构化高维向量(AI生成)结构化或半结构化数据(文本、数值、文档等)
查询目标相似性匹配(模糊结果)精确匹配或范围查询
索引技术ANN索引(如HNSW、Faiss)B+树、倒排索引、哈希索引等
硬件依赖依赖GPU/高性能计算加速向量运算通常依赖CPU和内存优化
扩展性分布式向量索引,横向扩展集群分库分表(关系型)或分片(NoSQL)

三、选择参考

  • 若需处理高维向量相似性搜索(如AI模型输出),优先选择向量数据库。
  • 若需强一致性事务或复杂关联查询,关系型数据库更合适。
  • 半结构化数据(如日志、JSON文档)适合MongoDB,而全文检索场景应选Elasticsearch。
  • 混合架构:实际系统中常组合使用(如用Redis缓存热点数据,ES处理搜索,向量库支持AI功能)。

四、向量数据库对比

以下是几款知名向量数据库的对比分析,从是否收费、是否开源、适用场景及出品方等维度:

4.1. Milvus

  • 出品方:Zilliz(中国上海企业)
  • 开源情况:开源(Apache 2.0协议)
  • 收费模式:社区版免费;企业版收费
  • 适用场景
    • 企业级应用:支持分布式部署、多租户隔离,适用于大规模数据管理(如百亿级向量)。
    • 多模态检索:结合文本、图像、视频的混合检索,适合推荐系统、大模型知识库构建。
    • 高可用性需求:提供云原生支持(如Kubernetes),适合金融、医疗等敏感行业。
  • 特点:集成GPU加速,支持动态数据更新,与国产大模型生态深度兼容。

4.2. Pinecone

  • 出品方:Pinecone Systems(美国)
  • 开源情况:闭源(全托管商业服务)
  • 收费模式:按需付费(免费试用后收费,价格较高)
  • 适用场景
    • 快速部署:无需自建基础设施,适合初创企业或对运维要求低的场景。
    • 实时搜索:支持实时索引更新,适用于动态数据环境(如电商实时推荐)。
    • 企业级SLA:提供高可用性和数据持久化保障。
  • 特点:API简单易用,支持自动索引优化,但成本较高。

4.3. Chroma

  • 出品方:开源社区(主语言Rust,支持Python/JS)
  • 开源情况:开源(Apache 2.0协议)
  • 收费模式:免费(可自托管或使用托管服务,如AWS托管约15美元/月)
  • 适用场景
    • 轻量级开发:适合个人开发者或小团队快速构建AI应用(如语义搜索、RAG)。
    • 多媒体处理:支持音频、视频的向量化检索,适合内容推荐系统。
    • Jupyter集成:在Notebook中快速验证原型。
  • 特点:安装便捷(pip install即可),文档友好,但扩展性较弱。

4.4. Faiss

  • 出品方:Meta(Facebook AI Research)
  • 开源情况:开源(MIT协议)
  • 收费模式:免费
  • 适用场景
    • 高性能搜索:支持十亿级向量检索,适合图像/视频搜索(如Instagram内容推荐)。
    • GPU加速:利用多GPU并行计算提升效率。
    • 算法研究:提供多种索引类型(如IVF、PQ),供开发者灵活调优。
  • 特点:计算效率高,但需自行处理分布式部署和数据管理。

4.5. Weaviate

  • 出品方:SeMI Technologies(荷兰)
  • 开源情况:开源(BSD协议)
  • 收费模式:社区版免费;企业版需付费
  • 适用场景
    • 语义搜索:集成知识图谱,适合复杂语义理解(如法律文档分析)。
    • 多模态数据整合:支持文本、图像、音频的联合检索。
    • 实时更新:动态索引支持数据实时写入与查询。
  • 特点:模块化架构,支持自定义机器学习模型嵌入。

4.6. Qdrant

  • 出品方:开源社区(俄罗斯团队主导)
  • 开源情况:开源(Apache 2.0协议)
  • 收费模式:免费(托管服务收费)
  • 适用场景
    • 高精度检索:支持混合搜索(向量+元数据过滤),适合电商精准推荐。
    • 分布式部署:适合中大规模企业应用。
  • 特点:性能与Milvus接近,但社区生态较小。

4.7. 对比总结表

数据库开源收费模式适用场景出品方核心优势
Milvus社区免费/企业付费企业级大规模检索、多模态应用Zilliz(中国)分布式扩展、国产化支持
PineconeSaaS按需付费快速部署、实时搜索Pinecone(美国)全托管、易用性高
Chroma免费/托管收费轻量级开发、多媒体检索开源社区安装便捷、适合原型验证
Faiss免费高性能计算、算法研究MetaGPU加速、高计算效率
Weaviate社区免费/企业付费语义搜索、知识图谱集成SeMI Technologies模块化、多模态支持
Qdrant免费/托管收费高精度混合检索开源社区性能均衡、混合搜索支持
  • 初创团队/个人开发者:优先选择Chroma或Faiss,成本低且易上手。
  • 企业级应用:Milvus或Weaviate,满足分布式和高可用需求。
  • 全托管需求:Pinecone适合无运维团队的企业。

五、Chroma 基本操作

在这里插入图片描述

5.1. Chroma 安装

Chroma 可以通过 Python 的包管理工具 pip 来安装。首先确保你已经安装了 Python 和 pip。然后,在你的命令行工具中运行以下命令:

pip install chromadb

这将下载并安装最新版本的 Chroma 及其依赖项。

启动命令
命令行直接运行以下启动命令

# --path 指定数据文件存储目录./chromadb
chroma run --path ./chromadb --host=0.0.0.0 --port=8000

以下是启动成功的界面:
在这里插入图片描述

验证安装

为了验证 Chroma 是否成功安装,你可以尝试在 Python shell 或者你的 Python 脚本中导入 Chroma:

import chromadb
print(chromadb.__version__)
# 输出 0.6.1

如果这段代码能够顺利执行,并打印出 Chroma 的版本号,则说明安装成功。

5.2. Chroma 基本操作

使用 Python 操作Chroma向量数据库

创建连接

如果你在本地运行chroma,并且把数据存放在内存存储,可以这样创建客户端

from chromadb import Client
chroma_client = Client()

如果你在本地运行chroma,并且把数据存放在本地存储,可以这样创建客户端

from chromadb import Client
from chromadb import Settings
settings = Settings(persist_directory=r".\codes\chroma", is_persistent=True)
chroma_client = Client(settings=settings)

如果你在服务端运行chroma,服务器端存储数据,可以这样创建客户端

from chromadb import HttpClient
chroma_client = HttpClient(host='localhost', port=8000)

创建表

#创建或获取一个名为 "my_collection" 的集合
collection = chroma_client.create_collection(name="my_collection", get_or_create=True)
#或者
collection = chroma_client.get_or_create_collection(name="langchain")

添加数据

import uuid
def get_uuid():return str(uuid.uuid4())
ids=[get_uuid() for _ in range(2)]
documents = ["我今天去上学", "天气很好"]
collection.add(ids=ids, documents=documents)
collection.add(ids=get_uuid(), documents="外面下雨了")

查询数据

results = collection.get(include=["embeddings", "documents"])
collection.get()

删除数据

collection.delete(ids=['d687b743-b678-4124-8fef-15b5fd11c01e'])

更新数据

collection.update(ids=['8ad95c3e-57fb-498d-884e-84d52493983b'],documents=["我今天很高兴啊"])

六、向量数据库的基本原理

  1. 向量化:首先,通过某种方式(如使用预训练的语言模型)将非结构化数据(例如文本)转换成向量形式。每个向量代表了一个数据点(在这里是文本)在多维空间中的位置。

  2. 索引构建:为了加快查询速度,向量数据库会构建特殊的索引结构。这些索引结构允许快速检索与给定向量最接近的其他向量。常见的索引策略包括基于树的方法(如KD树)、哈希方法(如局部敏感哈希LSH),以及最近邻图(如HNSW)。对于非常大的数据集,通常采用近似最近邻(Approximate Nearest Neighbor, ANN)算法来平衡查询效率和准确性。

  3. 相似度计算:当执行查询时,向量数据库会计算查询向量与其他所有向量之间的距离或相似度(如余弦相似度、欧氏距离等)。然后根据相似度排序返回结果。

  4. 优化查询性能:为了提高查询性能,除了上述提到的索引机制外,还可以采取其他措施,比如分片(sharding)、缓存(caching)等。

以下以 Chroma 为例,说明其原理及文本相似性搜索的实现过程:

(1) 数据向量化

  • 文本嵌入模型: 使用预训练模型(如BERT、Sentence-BERT)将文本转换为固定维度的向量(如768维)。例如,句子 “A cat sits on the mat” 被映射为一个高维向量。
  • 语义捕捉: 相似语义的文本在向量空间中距离更近。例如,“猫坐在垫子上” 和 “垫子上有只猫” 的向量余弦相似度接近1。

(2) 向量存储与索引

  • 存储结构: 向量按列式存储(如内存数组或磁盘文件),支持批量读写。
  • 索引构建: 采用 近似最近邻(ANN)算法(如HNSW、IVF-PQ),构建多层索引结构,加速搜索:
    • HNSW(分层导航小世界图)
      构建分层的图结构,高层进行粗粒度导航,底层进行细粒度搜索,减少计算量。
    • IVF(倒排文件索引)
      将向量空间划分为多个聚类(Voronoi图),搜索时仅遍历目标聚类内的向量。

(3) 相似性度量

  • 距离计算: 使用余弦相似度、欧氏距离或内积评估向量相似性。Chroma默认使用余弦相似度,需向量归一化

(4) 查询处理

  • 输入查询向量:将待搜索文本转换为向量。
  • 索引快速检索:通过ANN算法找到Top-K相似向量。
  • 结果排序与返回:按相似度排序后返回原始数据(如文本或ID)。

为什么能实现高效文本相似性搜索

关键技术作用
ANN算法(如HNSW)将搜索复杂度从O(N)降至O(logN),支持十亿级数据毫秒响应。
语义向量化将文本语义编码为稠密向量,突破关键词匹配局限(如近义词、抽象概念)。
内存优化存储列式存储+SIMD指令加速向量运算,提升吞吐量。
并行计算多线程/GPU加速距离计算,适合高并发场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34132.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析对象存储及工作原理

在现代信息技术发展中,存储是一个永恒的话题。从最初的磁带、硬盘到现在的云存储,存储技术不断推陈出新。而其中,“对象存储”作为近年来备受关注的存储技术之一,凭借其高可扩展性和灵活性,逐渐成为企业级存储方案的首…

ctfshow-xxs-316-333-wp

316.反射型 XSS(-326都是反射型) js恶意代码是存在于某个参数中,通过url后缀进行get传入,当其他用户点进这个被精心构造的url链接时,恶意代码就会被解析,从而盗取用户信息。 来看题,先简单测试…

easypoi导入Excel兼容日期和字符串格式的日期和时间

问题场景 在使用easypoi导入Excel时,涉及到的常用日期会有yyyy-MM-dd HH:mm:ss、yyyy-MM-dd和HH:mm:ss,但是Excel上面的格式可不止这些,用户总会输入一些其他格式,如 如果在定义verify时用下面这种格式定义,那么总会…

基于yolo11+flask打造一个精美登录界面和检测系统

这个是使用flask实现好看登录界面和友好的检测界面实现yolov11推理和展示,代码仅仅有2个html文件和一个python文件,真正做到了用最简洁的代码实现复杂功能。 测试通过环境: windows x64 anaconda3python3.8 ultralytics8.3.81 flask1.1.…

R语言零基础系列教程-01-R语言初识与学习路线

代码、讲义、软件回复【R语言01】获取。 R语言初识 R是一个开放的统计编程环境,是一门用于统计计算和作图的语言。“一切皆是对象”,数据、函数、运算符、环境等等都是对象。易学,代码像伪代码一样简洁,可读性高强大的统计和可视…

AI重塑视觉艺术:DeepSeek与蓝耘通义万相2.1的图生视频奇迹

云边有个稻草人-CSDN博客 近年来,深度学习、计算机视觉和生成模型在多个领域取得了突破性进展。其中,DeepSeek与蓝耘通义万相2.1图生视频的结合为图像生成与视频生成技术提供了新的发展方向。DeepSeek作为一个图像和视频生成的工具,能够利用深…

ELK+Filebeat+Kafka+Zookeeper安装部署

1.安装zookeeper zookpeer下载地址:apache-zookeeper-3.7.1-bin.tar.gzhttps://link.csdn.net/?targethttps%3A%2F%2Fwww.apache.org%2Fdyn%2Fcloser.lua%2Fzookeeper%2Fzookeeper-3.7.1%2Fapache-zookeeper-3.7.1-bin.tar.gz%3Flogin%3Dfrom_csdn 1.1解压安装zookeeper软件…

历年云南大学计算机复试上机真题

历年云南大学计算机复试机试真题 在线评测:传送门:pgcode.cn 喝饮料 题目描述 商店里有 n 中饮料,第 i 种饮料有 mi 毫升,价格为 wi。 小明现在手里有 x 元,他想吃尽量多的饮料,于是向你寻求帮助&#x…

怎么有效降低知网AIGC率

在学术创作日益规范且数字化检测技术不断发展的当下,知网 AIGC 检测成为了众多创作者关注的焦点。许多人苦恼于如何有效降低知网 AIGC 率,让自己的作品在通过检测的同时,彰显出真实的创作水平与独特性。接下来,我们就深入探讨降低…

代码随想录day17 二叉树part05

654.最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums …

【Python入门】一篇掌握Python中的字典(创建、访问、修改、字典方法)【详细版】

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀《Python/PyTorch极简课》_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目…

LeetCode 环形链表II:为什么双指针第二次会在环的入口相遇?

快慢指针 为什么相遇后让快指针回到起点,再让快指针和慢指针都一步一步地走,它们就会在环的入口相遇? 复杂度 时间复杂度: O(n) 空间复杂度: O(1) public ListNode detectCycle(ListNode head) {ListNode slow head, fast head;ListNode …

HarmonyOS第24天:鸿蒙应用安全秘籍:如何为用户数据筑牢防线?

开篇引入 在数字化时代,我们的生活越来越依赖各种应用程序。从社交娱乐到移动支付,从健康管理到工作学习,应用已经渗透到生活的方方面面。然而,随着应用使用的日益频繁,用户隐私数据泄露的风险也在不断增加。 前几年&…

P2730 魔板 (写了巨久..有一些数字,字符,字符串之间的转换规则)

ac代码&#xff1a; #include<iostream> #include<map> #include<queue> using namespace std; map<string,int>mp1,mp2; map<string,string>mp3; queue<string>q; string str,res"12345678"; void pri(string str){if(resstr)…

Centos7使用docker搭建redis集群

前置准备&#xff1a; Centos7安装docker就不多说了… 本次目的是搭建3主3从&#xff08;当然你也可以按需扩展&#xff09;准备三台服务器&#xff0c;假定IP分别为&#xff1a;192.168.75.128、192.168.75.129、192.168.75.130安装 redis&#xff1a; #拉取redis docker p…

Java 用While语句判断密码是否输入正确

package com.MyJava; import java.util.Scanner;public class While {public static void main(String[] args) {Scanner Myscan new Scanner(System.in); int i 0,n 3; //n为有效密码次数System.out.print("请输入密码&#xff1a;");String Password Myscan.ne…

Browser Copilot 开源浏览器扩展,使用现有或定制的 AI 助手来完成日常 Web 应用程序任务。

一、软件介绍 文末提供源码和开源扩展程序下载 Browser Copilot 是一个开源浏览器扩展&#xff0c;允许您使用现有或定制的 AI 助手来帮助您完成日常 Web 应用程序任务。 目标是提供多功能的 UI 和简单的框架&#xff0c;以实现和使用越来越多的 copilots&#xff08;AI 助手&…

探索Maas平台与阿里 QWQ 技术:AI调参的魔法世界

摘要&#xff1a;本文介绍了蓝耘 Maas 平台在人工智能领域的表现及其核心优势&#xff0c;包括强大的模型支持、高效的资源调度和友好的操作界面。文章还探讨了蓝耘 Maas 平台与阿里 QWQ 技术的融合亮点及应用拓展实例&#xff0c;并提供了调参实战指南&#xff0c;最后对蓝耘 …

3.2 组件Props的TS高级类型校验模式

文章目录 1. 组件Props校验的核心价值2. 基础类型校验回顾2.1 基本类型声明2.2 类型系统限制3. 高级类型校验模式3.1 类型模板字面量3.2 条件类型约束3.3 递归类型结构4. 泛型组件模式4.1 基础泛型定义4.2 泛型约束扩展5. 高级联合类型应用5.1 动态表单校验5.2 状态机驱动类型6…

Vim软件使用技巧

目录 Demo Vim怎么看一个文件的行号&#xff0c;不用打开文件的前提下&#xff1f;进入文件后怎么跳转到某一行? 不打开文件查看行号&#xff08;查看文件的方法&#xff09; 方法1、使用命令行工具统计行数 方法2、通过vim的 - 参数查看文件信息 进入文件后跳转到指定行…