在这里插入图片描述

在 RAG(检索增强生成)场景中,非结构化数据(文本、图像等)的高效检索是核心需求。传统关系型数据库难以胜任,而向量数据库通过将数据转化为向量、基于相似度快速匹配,成为 RAG 的关键支撑。本文聚焦主流向量数据库 Chroma 与 Milvus,解析其在 RAG 中的实战应用与底层原理。

一、Chroma 实战与底层原理

1. Chroma 简介

  • 定位:轻量级、易于使用的开源向量数据库。
  • 特点:安装便捷、API简洁、支持多种编程语言,适合快速开发和原型验证。

2. Chroma 安装

  • 对于Python开发者,通过pip命令即可轻松安装:
pip install chromadb

3. Chroma 基本操作

3.1 初始化客户端

  • 内存模式(开发阶段快速测试):
import chromadb
from chromadb.config import Settingsclient = chromadb.Client(Settings(persist_directory=None  # 数据不会持久化
))
  • 持久化模式(需指定目录):
client = chromadb.Client(Settings(persist_directory="./chroma_data"  # 数据持久化到该目录
))

3.2 创建集合(类似关系型数据库的表):

collection = client.create_collection(name="my_collection")

3.3 添加数据

  • 需提供文档(documents)、文档ID(ids),向量(embeddings)可选(不提供则用默认嵌入模型生成)。
documents = ["Chroma is a vector database","It is easy to use","Vector databases are useful for AI applications"
]
ids = ["doc1", "doc2", "doc3"]collection.add(documents=documents, ids=ids)

3.4 查询数据

  • 不提供查询向量时,默认嵌入模型为查询文本生成向量。
  • 结果包含相似文档ID、内容及相似度分数。
query = "What is Chroma?"
results = collection.query(query_texts=[query],n_results=2  # 返回最相似的2个结果
)print(results)

4. Chroma 底层原理

4.1 加速技术

  • 批量处理向量数据,减少磁盘I/O操作,提高读写效率。
  • 合理分配内存资源,将频繁访问的向量数据缓存到内存,加快查询响应。

4.2 支持的索引

  • Flat索引:存储原始向量,查询时计算与所有向量的距离,精度高但数据量大时速度慢,适合小规模数据。
  • HNSW(Hierarchical Navigable Small World)索引:基于图的近似最近邻搜索索引,构建多层导航图,在保证一定精度的前提下显著提高查询速度,适用于中大规模数据。

二、Milvus 实战与底层原理

1. Milvus 简介

  • 定位:高性能、高可用的开源向量数据库,专为海量向量数据的存储、检索和分析设计。
  • 特点:支持多种索引类型,能处理大规模向量数据,扩展性和容错性良好,适用于生产环境。

2. Milvus 安装

2.1 推荐使用Docker Compose,先安装Docker和Docker Compose。

2.2 下载配置文件:

wget https://github.com/milvus-io/milvus/releases/download/v2.3.4/milvus-standalone-docker-compose.yml -O docker-compose.yml

2.3 启动Milvus(服务在本地19530端口运行):

docker-compose up -d

3. Milvus 基本操作

3.1 安装Python SDK:

pip install pymilvus

3.2 连接到Milvus:

from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataTypeconnections.connect("default", host="localhost", port="19530")

3.3 创建集合

# 定义字段
id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True)
content_field = FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=512)
vector_field = FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=768)  # 向量维度为768# 定义集合schema
schema = CollectionSchema(fields=[id_field, content_field, vector_field], description="My collection")# 创建集合
collection = Collection(name="my_collection", schema=schema)

3.4 创建索引(以IVF_FLAT为例):

index_params = {"index_type": "IVF_FLAT","metric_type": "L2",  # 欧氏距离"params": {"nlist": 128}  # 聚类数量
}collection.create_index(field_name="vector", index_params=index_params)

3.5 插入数据

import random# 生成示例数据
data = [{"content": "Milvus is a vector database", "vector": [random.random() for _ in range(768)]},{"content": "It is high performance", "vector": [random.random() for _ in range(768)]},{"content": "It is suitable for large - scale data", "vector": [random.random() for _ in range(768)]}
]# 转换数据格式
contents = [d["content"] for d in data]
vectors = [d["vector"] for d in data]# 插入数据
mr = collection.insert([contents, vectors])
print("Inserted ids:", mr.primary_keys)

3.6 加载集合并查询

collection.load()# 生成查询向量
query_vector = [random.random() for _ in range(768)]# 查询参数
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}# 执行查询
results = collection.search(data=[query_vector],anns_field="vector",param=search_params,limit=2,  # 返回最相似的2个结果output_fields=["content"]  # 返回content字段
)for result in results[0]:print(f"ID: {result.id}, Distance: {result.distance}, Content: {result.entity.get('content')}")

4. Milvus 底层原理

4.1 加速技术

  • 分布式架构:将数据分布到多个节点并行处理,提高处理和查询效率。
  • 向量量化技术:将高维向量映射到低维空间,减少存储和计算开销。
  • 异步IO、预取等机制优化数据访问,提升系统性能。

4.2 支持的索引

  • IVF_FLAT:先聚类向量为多个簇,查询时在相似簇中搜索,精度较高,性能较好,适用于中大规模数据。
  • IVF_SQ8:在IVF_FLAT基础上对簇内向量标量量化,减少存储和计算开销,精度有一定损失,适合对存储和性能要求高的场景。
  • IVF_PQ:采用乘积量化,大幅减少存储和计算成本,精度较低,适用于大规模数据且对精度要求不高的场景。
  • HNSW:构建多层导航图,在查询速度和精度间平衡,适用于对查询速度要求高的场景。
  • RNSG:基于神经网络的索引结构,在高维向量场景下表现较好。

三、Chroma v.s. Milvus 对比

1. 易用性

  • Chroma:安装和使用简单,API简洁直观,适合初学者和快速开发。
  • Milvus:安装复杂,配置和操作需更多专业知识。

2. 性能与 scalability

  • Chroma:小规模数据场景性能不错,大规模数据处理和高并发能力较弱。
  • Milvus:能处理大规模向量数据,支持多种索引,水平扩展能力好,适合生产环境高并发、大数据量场景。

3. 功能丰富度

  • Chroma:注重简洁性,功能相对基础。
  • Milvus:功能丰富,支持多种索引、分区、数据备份与恢复等,满足复杂场景需求。

4. 底层技术差异

  • 加速技术:Chroma依赖批量处理和内存缓存;Milvus采用分布式架构、向量量化等更复杂高效的技术。
  • 索引支持:Milvus支持索引类型更多,适应场景更广;Chroma索引较简单,满足基础检索需求。

四、总结

Chroma和Milvus各有优势。
若需快速开发原型、处理小规模数据或对易用性要求高,选Chroma;
若需处理大规模数据、要求高性能高可用性并用于生产环境,选Milvus。
实际应用中,可依业务需求选择,同时关注两者更新,以更好发挥其作用。

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

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

相关文章

pytorch程序语句固定开销分析

深入探索PyTorch与Python的性能微观世界:量化基础操作的固定开销 在深度学习的性能优化工作中,开发者通常将目光聚焦于模型结构、算法效率和并行计算策略。然而,在这些宏观优化的背后,构成我们代码的每一条基础语句——无论是PyTo…

ABP VNext + CloudEvents:事件驱动微服务互操作性

ABP VNext CloudEvents:事件驱动微服务互操作性 🚀 📚 目录ABP VNext CloudEvents:事件驱动微服务互操作性 🚀一、引言 ✨☁️ TL;DR📚 背景与动机🏗️ 整体架构图二、环境准备与依赖安装 &am…

软件测试测评公司关于HTTP安全头配置与测试?

浏览器和服务器之间那几行看不见的HTTP安全头配置,往往是抵御网络攻击的关键防线。作为软件测试测评公司,我们发现超过六成的高危漏洞源于安全头缺失或误配。别小看这些响应头,它们能直接掐断跨站脚本、点击劫持、数据嗅探的攻击路径。五条命…

Mysql集成技术

目录 mysql的编译安装与部署 1.编译安装mysql 2.部署mysql mysql主从复制 什么是mysql主从复制? 1.配置master 2.配置slave 3.存在数据时添加slave2 4.GTID模式 什么是GTID模式? 配置GTID 5.延迟复制 6.慢查询日志 核心作用 开启慢查询日志…

《MySQL进阶核心技术剖析(一): 存储引擎》

目录 一、存储引擎 1.1 MySQL体系结构 1.2 存储引擎介绍 1). 建表时指定存储引擎 2). 查询当前数据库支持的存储引擎 1.3 存储引擎特点 1.3.1 InnoDB 1.3.2 MyISAM 1.3.3 Memory 1.3.4 区别及特点 1.4 存储引擎选择 一、存储引擎 1.1 MySQL体系结构 1). 连接层 最上…

sqli-labs:Less-26关卡详细解析

1. 思路🚀 本关的SQL语句为: $sql"SELECT * FROM users WHERE id$id LIMIT 0,1";注入类型:字符串型(单引号包裹)、GET操作提示:参数需以闭合关键参数:id php输出语句的部分代码&am…

Spring Boot 的事务注解 @Transactional 失效的几种情况

开发中我们经常会用到 Spring Boot 的事务注解,为含有多种操作的方法添加事务,做到如果某一个环节出错,全部回滚的效果。但是在开发中可能会因为不了解事务机制,而导致我们的方法使用了 Transactional 注解但是没有生效的情况&…

#C语言——刷题攻略:牛客编程入门训练(四):运算

🌟菜鸟主页:晨非辰的主页 👀学习专栏:《C语言刷题合集》 💪学习阶段:C语言方向初学者 ⏳名言欣赏:"代码行数决定你的下限,算法思维决定你的上限。" 目录 1. BC25 牛牛买电…

阻抗分析中的软件解调计算

接上篇 重温无功功率测量-CSDN博客 已知被测阻抗两端电压与流过 通过两个ADC同步采集到。 激励频率10k, 采样率1M, 每周期100个点 关键是:采样率除以激励频率, 得是4的倍数... 所以ADC不能自由运行, 得用一个timer来触发. 因为要进行同相分量正交分量计算。 1:直…

ubuntu 镜像克隆

一、克隆 1、准备 一个u盘(制作启动盘) 一个移动固态硬盘(大于要克隆系统盘的1.2倍) 2、使用 rufus生成系统启动盘 (1)下载ubuntu iso 桌面版 https://cn.ubuntu.com/download (2&#x…

Axure下拉菜单:从基础交互到高保真元件库应用

在Web端产品设计中,下拉菜单(Dropdown Menu) 是用户与系统交互的核心组件之一,它通过隐藏次要选项、节省页面空间的方式,提升信息密度与操作效率。无论是基础下拉菜单、图标式下拉菜单,还是复杂的多级下拉菜…

复现YOLOV5+训练指定数据集

一、复现YOLOV5代码 1.github下载:https://github.com/MIPIT-Team/SSA-YOLO 2.配置环境:创建虚拟环境yolo5 conda create -n yolo5 python3.9 #对应文件夹下pip install -r requirements.txt报错:ERROR: pips dependency resolver does no…

Agents-SDK智能体开发[4]之集成MCP入门

文章目录说明一 Agents SDK接入MCP1.1 MCP技术回顾1.2 MCP基础实践流程1.2.1 天气查询服务器Server创建流程1.2.2 服务器依赖安装和代码编写1.2.3 环境配置文件1.2.4 客户端代码编写1.3 测试运行二 MCPAgents SDK基础调用2.1 weather_server.py2.2 client_agent.py2.3 运行测试…

Camera相机人脸识别系列专题分析之十九:MTK ISP6S平台FDNode传递三方FFD到APP流程解析

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: Camera相机人脸识别系列专题分析之十九:MTK平台FDNode传递三方FFD到APP流程解析 目录 一、背景 二、:OcamMeta传递FFD到APP 2.1:OcamMeta 2.2 :OcamMeta::process更新FFD 2.…

【实时Linux实战系列】构建实时监测与报警系统

在实时系统中,监测与报警系统是确保系统正常运行和及时响应异常情况的关键组件。实时监测与报警系统能够实时收集系统数据,分析关键事件,并在检测到异常时发出警报。这种系统广泛应用于工业自动化、医疗设备监控、网络安全等领域。掌握实时监…

PHP入门及数据类型

PHP数据类型 PHP标记 //HTML风格 <?phpecho "hello world"; ?> //简短风格 <?echo "hello world"; ?>数据类型 PHP 最初源于 Perl 语言&#xff0c;与 Perl 类似&#xff0c;PHP 对数据类型采取较为宽松的态度。PHP 规定&#xff0c;变量数…

沸点 | 嬴图参加世界人工智能大会

2025 WAIC于 7 月 26 日至 28 日在上海举行。大会展览面积突破 7 万平方米&#xff0c;800 余家企业参展。嬴图作为图数据库领域的领先企业&#xff0c;携前沿技术与创新应用精彩亮相。​大会期间&#xff0c;嬴图创始人兼CEO孙宇熙与来自全球的顶尖学者、企业代表共同探讨人工…

2. 字符设备驱动

一、设备号 1.1. 什么是设备号 设备号是用来标记一类设备以及区分这类设备中具体个体的一组号码。 设备号由主设备号和次设备号组成。主设备号的作用为标记一类设备、用于标识设备驱动程序,而次设备号的作用是为了区分这类设备中的具体个体设备及用于标识同一驱动程序下的具…

uboot armv8 启动流程之 linker script

section 详细说明.text按如下顺序&#xff0c;中断向量表vectors, 启动入口代码start.o,普通text, glue &#xff08;arm thumb2 相互调用时自动生成的代码&#xff09;*(.vectors)CPUDIR/start.o (.text*)*(.text*)*(.glue*)__image_copy_start 标记为text 段入口&#xff0c;…

xxljob总结

XXL-Job 支持多种任务类型&#xff0c;以下是常见任务类型的示例 Demo&#xff0c;包含核心配置和代码片段&#xff0c;帮助快速理解用法&#xff1a;一、Bean模式任务&#xff08;最常用&#xff09;通过注解 XxlJob 定义任务方法&#xff0c;直接在 Spring 容器中管理&…