【大模型实战】向量数据库实战 - Chroma & Milvus

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

一、Chroma 实战与底层原理

1. Chroma 简介

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

2. Chroma 安装

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

3. Chroma 基本操作

3.1 初始化客户端

  • 内存模式(开发阶段快速测试):
python 复制代码
import chromadb
from chromadb.config import Settings

client = chromadb.Client(Settings(
    persist_directory=None  # 数据不会持久化
))
  • 持久化模式(需指定目录):
python 复制代码
client = chromadb.Client(Settings(
    persist_directory="./chroma_data"  # 数据持久化到该目录
))

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

python 复制代码
collection = client.create_collection(name="my_collection")

3.3 添加数据

  • 需提供文档(documents)、文档ID(ids),向量(embeddings)可选(不提供则用默认嵌入模型生成)。
python 复制代码
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、内容及相似度分数。
python 复制代码
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 下载配置文件:

bash 复制代码
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端口运行):

bash 复制代码
docker-compose up -d

3. Milvus 基本操作

3.1 安装Python SDK:

bash 复制代码
pip install pymilvus

3.2 连接到Milvus:

python 复制代码
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType

connections.connect("default", host="localhost", port="19530")

3.3 创建集合

python 复制代码
# 定义字段
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为例):

python 复制代码
index_params = {
    "index_type": "IVF_FLAT",
    "metric_type": "L2",  # 欧氏距离
    "params": {"nlist": 128}  # 聚类数量
}

collection.create_index(field_name="vector", index_params=index_params)

3.5 插入数据

python 复制代码
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 加载集合并查询

python 复制代码
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。

实际应用中,可依业务需求选择,同时关注两者更新,以更好发挥其作用。

相关推荐
珠海西格电力16 小时前
西格电力零碳园区管理系统:核心功能全解析,赋能园区低碳智能化落地
大数据·运维·网络·人工智能·信息可视化·能源
深盾科技_Virbox16 小时前
软件授权工具静默安装实践
java·运维·数据库·安全·软件需求
ZPC821016 小时前
model bingxing
网络·人工智能·网络协议·机器人
甲维斯16 小时前
Fable5手搓“美图秀秀”和“QQ截图”
人工智能
xo1988201116 小时前
鸿蒙 AI 自动化开发:让 AI 学会自己编译、自己调试
人工智能·自动化·harmonyos
heroboyluck16 小时前
AI工程师第四课 - 深度学习入门
人工智能·python·深度学习·llama
武子康16 小时前
OpenAI 把 Codex 接进 Claude Code:Coding Agent 从单兵工具进入协作系统
人工智能·openai·claude
延凡科技16 小时前
延凡科技综合监控预警处置平台—— 一体化视频AI安防闭环系统设计与功能实现[特殊字符]️
数据库·人工智能·科技·安全·能源
老马聊技术16 小时前
Rocky Linux 9.0 安装 MySQL8.x详细教程
linux·数据库
王莎莎16 小时前
论文命中不是终点,Related Works 才是科研 Agent 的第二跳
人工智能·设计