Milvus 入门:一个向量数据库,管好你的 AI 记忆

张开发
2026/4/10 10:18:36 15 分钟阅读

分享文章

Milvus 入门:一个向量数据库,管好你的 AI 记忆
导读 你的 AI 应用上线了用户量上来了FAISS 开始喘不上气了……本文带你认识 Milvus——一个生产级向量数据库让 AI 的记忆也能扛住大流量。零基础友好 | 附完整代码 | 含动图讲解一、从一次翻车说起想象你开发了一个 AI 知识助手用 FAISS 存了几万条向量跑得飞快自我感觉良好。然后有一天Boss 说“我们要上线预计日活几十万。”你微笑着打开代码……然后发现FAISS 是单机的不能水平扩展 重启服务要重新加载全部向量到内存半分钟起步 没有权限管理没有数据持久化没有监控 这时候你需要的不是向量存储工具而是一个向量数据库。而 Milvus就是这个领域的扛把子。二、Milvus 是什么三句话说清楚 一句话定义Milvus 是一个开源的、专为海量向量相似性搜索设计的云原生数据库天生为生产环境而生。你可以把它理解成这样FAISS 你书桌上的便利贴堆 → 找东西快但一多就乱也没法共享Milvus 一座现代化图书馆 → 有馆员调度器、有书架标签索引、有借阅记录持久化还支持多人同时进馆分布式从诞生背景看Milvus 是由 Zilliz 公司开源现在是 LF AI Data 基金会的顶级项目背书够硬社区也够活跃。官网https://milvus.io/三、装起来5 分钟跑通 Milvus不折腾理论了先把它跑起来。Milvus 官方推荐用 Docker 部署单机版步骤超简单。第一步下载配置文件# macOS / Linux wget https://github.com/milvus-io/milvus/releases/download/v2.5.14/milvus-standalone-docker-compose.yml -O docker-compose.yml# Windows PowerShell Invoke-WebRequest -Uri https://github.com/milvus-io/milvus/releases/download/v2.5.14/milvus-standalone-docker-compose.yml -OutFile docker-compose.yml第二步一键启动docker compose up -dDocker 会帮你拉起三个容器容器名职责milvus-standalone核心服务处理所有请求milvus-etcd元数据仓库记住你有哪些集合、字段等milvus-minio对象存储持久化向量文件等容器都变成Up状态Milvus 就在19530端口等你了。停止服务docker compose down保留数据彻底清除docker compose down -v数据也删四、核心概念Milvus 的图书馆哲学这是本文最重要的一节。Milvus 的设计哲学一点都不神秘用图书馆类比5 分钟全懂。Milvus 核心概念图动图Collection → Partition → Entity 的层级关系逐层展开Collection层级动图动图Milvus 数据层级结构——从图书馆到一本书的逐层拆解慢速8秒4.1 Collection集合≈ 一座图书馆Collection集合 是 Milvus 里最顶层的数据容器相当于关系型数据库里的一张表。每个 Collection 有一个 Schema模式就像图书馆的入馆规则——来的数据必须符合规定的字段格式。Schema 通常包含三类字段 主键字段每条数据的唯一 ID相当于书的 ISBN 号 向量字段核心存放 Embedding 向量相当于书的语义坐标 标量字段附加元数据如书名、作者、价格用于过滤检索4.2 Partition分区≈ 图书馆的分区一个 Collection 可以划分为多个 Partition分区就像图书馆分了科技区、“小说区”。为什么分区 查询时只搜特定分区扫描的数据量大幅减少速度自然快。最多支持 1024 个分区合理使用是性能优化的重要手段。4.3 Alias别名≈ 动态的推荐书单Alias别名 是给 Collection 取的外号。这个功能听起来鸡肋但在生产中超级实用场景你需要更新 Collection 里的全量数据比如重新索引怎么做到不停服更新答案就是别名1. 建一个新的collection_v2导入并索引好新数据2. 把指向旧集合的别名my_app切换到collection_v23. 用户完全无感零停机 ✅五、索引检索速度的秘密武器光有数据还不够向量检索之所以快靠的是索引Index。索引就像图书馆的检索目录——不是挨本翻书而是先查目录定位区域再精确找书。索引选型象限图Milvus 提供了 4 种主要向量索引类型索引类型核心原理优点缺点适用场景FLAT暴力搜索全量对比100% 召回率速度慢内存大数据量小、要求精准IVF 系列先聚类分桶再桶内搜速度快吞吐高召回率 100%通用大规模高吞吐HNSW多层邻近图层层定位速度极快召回率高内存占用大实时推荐、低延迟DiskANN图索引 SSD 优化支持超大规模数据延迟略高于内存数十亿级向量怎么选 记住这个口诀追求准确率数据不大 →FLAT追求性能平衡通用场景 →IVF_FLAT/IVF_SQ8追求极速低延迟内存够用 → ✅HNSW大多数场景首选数据超出内存上限 →DiskANN动图4 种索引查找方式对比——FLAT 逐一扫描 vs HNSW 图中飞速跳跃慢速10秒索引对比动图六、检索进阶不止找最相似的Milvus 的检索能力远不止找 Top-K 相似向量还有几个杀手级功能6.1 过滤检索语义 条件双管齐下场景找和这双鞋最像的商品但价格要低于300元且有库存这就是过滤检索Filtered Search——先用标量字段筛出候选集再在候选集里做向量检索。比单纯向量检索精准了不止一个档次。6.2 范围检索设定相似度阈值场景人脸识别系统找所有相似度 0.9的人脸范围检索Range Search 不关心排名只关心距离是否在区间内。在安全验证、异常检测场景非常好用。6.3 混合检索多向量一起上这是 Milvus 最强的功能之一。现代 RAG 应用常见模式同时用密集向量捕捉语义 稀疏向量精确关键词两路并发检索结果用 RRF互惠排名融合 算法合并——效果比任何一路单独检索都好。多模态场景同理用户输入文字 图片系统同时检索文本向量和图像向量最终融合排序。七、代码实战从零构建多模态图片检索说了这么多理论来跑代码。本节演示一个完整的图文多模态检索引擎——给定一张图片 一段文字从图库中找出最匹配的图片。用到的模型Visualized-BGE能同时理解图片和文字输出统一的向量动图多模态检索完整流程——图片文字输入 → 编码为向量 → Milvus 检索 → 相似图片返回慢速12秒多模态检索流程动图步骤一初始化工具# 步骤1导入库定义常量 import os from tqdm import tqdm # 进度条让你知道跑到哪了 from glob import glob # 批量匹配文件路径 import torch from visual_bge.visual_bge.modeling import Visualized_BGE # 多模态编码模型 from pymilvus import MilvusClient, FieldSchema, CollectionSchema, DataType import numpy as np import cv2 from PIL import Image # ------------------------------------------------------- # 【按你自己的环境修改这里】 # ------------------------------------------------------- # 模型名称Hugging Face 上的基础语言模型 ID不用改 # 它是 BGE 的文本理解部分Visualized_BGE 内部会用到它 MODEL_NAME BAAI/bge-base-en-v1.5 # 模型权重文件路径Visualized_BGE 的视觉部分权重.pth 文件 # 下载地址https://huggingface.co/BAAI/bge-visualized # 改成你本地实际存放 .pth 文件的路径 MODEL_PATH ./models/Visualized_base_en_v1.5.pth # 图片数据目录存放待检索图片的文件夹路径 # 目录下需要有一个 dragon/ 子文件夹里面放若干 .png 图片 # 改成你本地的图片目录 DATA_DIR ./data/dragon_images # Collection 名称相当于数据库里的表名随意起英文下划线即可 COLLECTION_NAME multimodal_demo # Milvus 服务地址本地 Docker 启动后默认是这个不用改 # 如果你用云托管 MilvusZilliz Cloud改成对应的 URI MILVUS_URI http://localhost:19530 # ------------------------------------------------------- # 步骤2封装编码器 class Encoder: 把图片/文字变成向量的工具人 原理Visualized_BGE 是一个多模态模型 它能把图片和文字都翻译成同一个向量空间里的坐标 这样图片和文字就可以直接比较相似度了。 def __init__(self, model_name: str, model_path: str): # 加载模型model_name 是文本理解骨干model_path 是视觉权重 self.model Visualized_BGE(model_name_bgemodel_name, model_weightmodel_path) self.model.eval() # 切换到推理模式关闭 dropout 等训练专用层 def encode_query(self, image_path: str, text: str) - list[float]: 图文混合编码用于查询时 同时输入一张图 一段文字输出一个融合了两者语义的向量 with torch.no_grad(): # 不计算梯度推理时不需要可以省内存 query_emb self.model.encode(imageimage_path, texttext) return query_emb.tolist()[0] # 返回 Python list方便存入 Milvus def encode_image(self, image_path: str) - list[float]: 纯图片编码用于入库时 只输入图片输出该图片的语义向量 with torch.no_grad(): query_emb self.model.encode(imageimage_path) return query_emb.tolist()[0]步骤二创建 Collection# 步骤3连接 Milvus设计 Schema # 初始化编码器加载模型第一次运行会比较慢耐心等待 encoder Encoder(MODEL_NAME, MODEL_PATH) # 连接本地 Milvus 服务确保 Docker 容器已启动 milvus_client MilvusClient(uriMILVUS_URI) # 如果同名集合已存在先删掉重建开发调试时方便重跑 # 生产环境中要小心别误删真实数据 if milvus_client.has_collection(COLLECTION_NAME): milvus_client.drop_collection(COLLECTION_NAME) print(f⚠️ 已删除旧集合{COLLECTION_NAME}) # 随机取一张图片编码自动探测向量维度 # BGE base 模型输出 768 维large 模型输出 1024 维 # 这样写的好处换模型时维度自动适配不用手动改 image_list glob(os.path.join(DATA_DIR, *.png)) # 获取目录下所有 .png 图片 dim len(encoder.encode_image(image_list[0])) print(f 检测到向量维度{dim}) # 定义 Schema告诉 Milvus 每条数据长什么样 # 类比相当于建一张有三列的表 fields [ # 主键自增 ID唯一标识每一条数据Milvus 自动生成无需手动赋值 FieldSchema(nameid, dtypeDataType.INT64, is_primaryTrue, auto_idTrue), # 向量字段核心存放图片的 Embeddingdim 是向量维度 FieldSchema(namevector, dtypeDataType.FLOAT_VECTOR, dimdim), # 标量字段存图片的文件路径方便检索到结果后能找到原图 # max_length512 表示路径字符串最长 512 个字符 FieldSchema(nameimage_path, dtypeDataType.VARCHAR, max_length512), ] schema CollectionSchema(fields, description多模态图文检索) # 创建集合相当于在数据库里建表 milvus_client.create_collection(collection_nameCOLLECTION_NAME, schemaschema) print(f✅ Collection {COLLECTION_NAME} 创建成功向量维度{dim})运行结果✅ Collection multimodal_demo 创建成功向量维度768步骤三插入数据 创建索引# 步骤4把图片编码后写入 Milvus # 遍历所有图片逐一编码成向量 # tqdm 会显示进度条图片多的时候很有用 data_to_insert [] for image_path in tqdm(image_list, desc生成图像嵌入): vector encoder.encode_image(image_path) # 图片 → 768 维向量 # 每条数据是一个字典key 对应 Schema 里的字段名 # 注意id 字段不需要填Milvus 会自动生成 data_to_insert.append({vector: vector, image_path: image_path}) # 批量写入 Milvus比逐条插入效率高很多 result milvus_client.insert(collection_nameCOLLECTION_NAME, datadata_to_insert) print(f✅ 插入 {result[insert_count]} 条数据) # 步骤5创建 HNSW 索引加载到内存 # 准备索引参数 index_params milvus_client.prepare_index_params() index_params.add_index( field_namevector, # 对哪个字段建索引向量字段 index_typeHNSW, # 索引类型多层图结构速度快、召回率高推荐首选 metric_typeCOSINE, # 距离度量余弦相似度值越接近1表示越相似 params{ M: 16, # 每个节点最多连接 16 个邻居越大越准但越占内存 efConstruction: 256, # 建索引时的搜索范围越大索引质量越高但越慢 } ) # 构建索引类比给书架建目录首次建立需要一点时间 milvus_client.create_index(collection_nameCOLLECTION_NAME, index_paramsindex_params) # 加载到内存Milvus 只有 load 之后才能被检索 # 类比图书馆开门前把常用书区搬到前台备查 milvus_client.load_collection(collection_nameCOLLECTION_NAME) print(✅ 索引创建完成Collection 已加载到内存可以开始检索了)运行结果生成图像嵌入: 100%|████████████████| 5/5 [00:0300:00, 1.52it/s] ✅ 插入 5 条数据 ✅ 索引创建完成Collection 已加载到内存可以开始检索了步骤四执行多模态检索# 步骤6图文混合查询 # 查询图片路径放一张你想以图搜图的图片 # 这里用 DATA_DIR 目录下的 query.png 作为查询图 query_image_path os.path.join(DATA_DIR, query.png) # 查询文字描述你在找什么和图片一起送进编码器 # 图文的组合查询比单独用图或单独用文字效果更好 query_text 一条龙 # 把图片文字一起编码成一个查询向量 # 这个向量同时包含了图片的视觉信息和文字的语义信息 query_vector encoder.encode_query(image_pathquery_image_path, textquery_text) # 在 Milvus 里搜索最相似的 5 张图 search_results milvus_client.search( collection_nameCOLLECTION_NAME, # 在哪个集合里搜 data[query_vector], # 查询向量列表格式支持批量查询 output_fields[image_path], # 搜到结果后额外返回哪些字段这里要图片路径 limit5, # 返回最相似的前 5 个结果即 Top-K 的 K5 search_params{ metric_type: COSINE, # 距离度量要和建索引时保持一致 params: {ef: 128} # HNSW 检索时的搜索范围越大越准但越慢128 是个好默认值 } )[0] # search 返回的是二维列表支持批量[0] 取第一个查询的结果 print(检索结果) for i, hit in enumerate(search_results): # hit[distance] 是余弦相似度范围 0~1越接近 1 越相似 # hit[entity] 是我们在 output_fields 里指定要返回的字段 print(f Top {i1}: 相似度{hit[distance]:.4f} 路径{hit[entity][image_path]})运行结果检索结果 Top 1: 相似度0.9411 路径...dragon/dragon01.png Top 2: 相似度0.5818 路径...dragon/dragon02.png Top 3: 相似度0.5731 路径...dragon/dragon05.png Top 4: 相似度0.4894 路径...dragon/dragon04.png Top 5: 相似度0.4100 路径...dragon/dragon03.pngTop 1 的相似度高达 0.9411正是查询图片本身——说明整个检索流程完全正确步骤五清理资源# 步骤7用完释放内存删掉 Collection milvus_client.release_collection(collection_nameCOLLECTION_NAME) milvus_client.drop_collection(COLLECTION_NAME) print(✅ 资源已释放)八、总结学完本文你已经掌握了✅ Milvus 是什么生产级向量数据库云原生、高可用、可扩展✅ 怎么理解它Collection图书馆→ Partition分区→ Schema规则→ Entity数据✅ 索引怎么选大多数场景选 HNSW超大数据量选 DiskANN✅ 怎么用代码从创建集合到插入数据到多模态检索一套流程跑通进阶路线阶段方向要掌握的入门本地单机MilvusClient HNSW 基础 ANN 检索进阶混合检索密集稀疏向量 RRF 重排生产分布式部署Milvus Distributed 分区策略 监控这里给大家精心整理了一份全面的AI大模型学习资源包括AI大模型全套学习路线图从入门到实战、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等资料免费分享扫码免费领取全部内容1. 成长路线图学习规划要学习一门新的技术作为新手一定要先学习成长路线图方向不对努力白费。这里我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。2. 大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF3. 大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。4. 2026行业报告行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。5. 大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。6. 大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。7. 资料领取全套内容免费抱走学 AI 不用再找第二份不管你是 0 基础想入门 AI 大模型还是有基础想冲刺大厂、了解行业趋势这份资料都能满足你现在只需按照提示操作就能免费领取扫码免费领取全部内容

更多文章