【大模型_向量数据库_Milvus-Milvus快速入门】

【大模型_向量数据库_Milvus-Milvus快速入门】 Milvus 是当前最主流的开源向量数据库2.x 版本已完全云原生、生产可用本教程基于Milvus 2.4 稳定版 Python SDK编写从环境搭建到可运行Demo全流程覆盖新手10分钟即可跑通。一、前置准备方式1本地Docker部署推荐新手零成本Milvus 官方提供了单节点Standalone版本的Docker镜像一键启动即可# 1. 拉取镜像并启动容器挂载本地目录持久化数据避免容器删除后数据丢失dockerrun-d\--namemilvus-standalone\-p19530:19530\# Milvus默认gRPC端口客户端连接用-p9091:9091\# 监控端口可选-v/tmp/milvus:/var/lib/milvus\# 数据持久化到本地/tmp/milvus目录milvusdb/milvus:v2.4.0 milvus run standalone# 2. 验证容器是否启动成功dockerps|grepmilvus# 看到milvus-standalone容器状态为Up即成功方式2云托管部署免运维适合快速验证直接用Zilliz CloudMilvus官方云服务的免费实例注册后创建免费实例会得到集群连接地址、用户名、密码无需本地部署。二、环境安装安装Python SDK和依赖库建议用Python 3.8版本# 安装Milvus Python SDK版本和Milvus服务端保持一致2.4.xpipinstallpymilvus2.4.0 numpy三、完整Demo商品语义检索我们用「商品向量检索」场景演示全流程把商品信息向量化存入Milvus后续输入query可以检索到语义最相似的商品同时支持类似MySQL的价格过滤。完整可运行代码frompymilvusimportconnections,Collection,FieldSchema,CollectionSchema,DataType,utilityimportnumpyasnp# ---------------------- 步骤1连接Milvus服务 ----------------------# 本地部署用localhost云服务替换为集群地址用户名密码connections.connect(aliasdefault,hostlocalhost,port19530# 云服务需要额外加# useryour_username,# passwordyour_password)# ---------------------- 步骤2创建集合相当于MySQL的表 ----------------------# 2.1 定义集合的字段结构fields[FieldSchema(nameid,dtypeDataType.INT64,is_primaryTrue,auto_idTrue),# 主键自增FieldSchema(nameproduct_name,dtypeDataType.VARCHAR,max_length100),# 商品名称FieldSchema(namecategory,dtypeDataType.VARCHAR,max_length50),# 商品分类FieldSchema(nameprice,dtypeDataType.FLOAT),# 商品价格FieldSchema(nameembedding,dtypeDataType.FLOAT_VECTOR,dim128)# 向量字段维度128可根据Embedding模型调整]# 2.2 定义集合Schema添加描述schemaCollectionSchema(fieldsfields,description商品向量检索集合)# 2.3 创建集合如果已存在则先删除仅Demo用生产环境不要随便删collection_nameproduct_demoifutility.has_collection(collection_name):utility.drop_collection(collection_name)collectionCollection(namecollection_name,schemaschema)print(f集合{collection_name}创建成功)# ---------------------- 步骤3插入模拟数据 ----------------------# 模拟6个商品数据实际使用时需要把文本通过Embedding模型转为向量products[{product_name:iPhone 15,category:手机,price:5999},{product_name:小米14,category:手机,price:3999},{product_name:索尼WH-1000XM5,category:耳机,price:2499},{product_name:AirPods Pro 2,category:耳机,price:1899},{product_name:MacBook Pro 14,category:电脑,price:14999},{product_name:联想小新Pro14,category:电脑,price:4999}]# 生成模拟向量Demo用实际需要替换为真实Embedding# 实际使用时用Embedding模型把商品描述转为128/1536维向量defget_embedding(text):# 这里用随机向量模拟实际替换为真实Embedding逻辑returnnp.random.rand(128).tolist()# 组装插入数据insert_data[[p[product_name]forpinproducts],[p[category]forpinproducts],[p[price]forpinproducts],[get_embedding(f{p[category]}{p[product_name]})forpinproducts]]# 执行插入collection.insert(insert_data)collection.flush()# 强制刷盘确保数据可见print(f插入{len(products)}条商品数据成功)# ---------------------- 步骤4创建向量索引加速检索 ----------------------# Milvus默认用暴力检索数据量超过1万后必须建索引才能毫秒级返回index_params{index_type:HNSW,# 最常用的ANN索引平衡精度和速度metric_type:COSINE,# 距离度量余弦相似度适合语义检索params:{M:16,efConstruction:64}# 索引参数新手用默认即可}collection.create_index(field_nameembedding,index_paramsindex_params)print(向量索引创建成功)# ---------------------- 步骤5加载集合到内存检索前必须执行 ----------------------collection.load()print(集合加载到内存成功)# ---------------------- 步骤6向量检索 ----------------------# 模拟用户query想要找「便宜的无线耳机」实际使用时把query转为向量query_vectorget_embedding(便宜的无线耳机)# 基础检索返回Top3最相似的商品print(\n 基础向量检索结果 )resultscollection.search(data[query_vector],# 查询向量支持批量查询anns_fieldembedding,# 指定检索的向量字段param{metric_type:COSINE,params:{ef:64}},# 检索参数ef越大精度越高速度越慢limit3,# 返回Top3output_fields[product_name,category,price]# 需要返回的标量字段)# 打印结果forhitinresults[0]:print(f商品{hit.entity.product_name}分类{hit.entity.category}价格{hit.entity.price}元相似度{hit.distance:.4f})# ---------------------- 步骤7混合检索向量标量过滤类似MySQL的WHERE ----------------------# 场景找「价格低于5000元」的相似商品结合向量相似度和结构化过滤print(\n 带价格过滤的混合检索结果 )resultscollection.search(data[query_vector],anns_fieldembedding,param{metric_type:COSINE,params:{ef:64}},limit3,output_fields[product_name,category,price],filterprice 5000# 标量过滤条件语法类似MySQL的WHERE)forhitinresults[0]:print(f商品{hit.entity.product_name}分类{hit.entity.category}价格{hit.entity.price}元相似度{hit.distance:.4f})# ---------------------- 步骤8资源清理Demo必做避免内存泄漏 ----------------------collection.release()# 释放内存中的集合collection.drop()# 删除集合connections.disconnect(default)# 断开连接print(\n资源清理完成)四、Demo运行说明1. 为什么Demo用随机向量上面的Demo为了简化流程用了随机向量模拟Embedding实际生产使用时需要把文本/图片通过Embedding模型转为真实向量替换get_embedding函数即可比如用国内开源的BGE模型# 安装Embedding模型依赖pipinstallsentence-transformersfromsentence_transformersimportSentenceTransformer# 加载BGE向量模型会把文本转为768维向量注意和集合的dim参数一致modelSentenceTransformer(BAAI/bge-base-zh)# 替换原来的get_embedding函数defget_embedding(text):returnmodel.encode(text).tolist()2. 云服务部署的连接修改如果用Zilliz Cloud免费实例只需要修改connections.connect部分的参数替换为实例的地址、用户名、密码即可其余代码完全一致。五、核心概念回顾呼应之前和MySQL的对比概念对应MySQL概念说明Collection集合表存储同类型数据的容器Field字段列集合的属性比如商品名、价格、向量主键主键唯一标识每条数据索引索引加速向量检索的结构类似MySQL的B树索引但针对高维向量优化标量过滤WHERE条件支持对结构化字段做过滤和MySQL逻辑一致向量检索无对应输入向量返回TopK最相似的结果是向量数据库的核心能力六、常见问题排查连接失败检查Docker容器是否启动、端口19530是否被占用、防火墙是否开放端口。检索报错collection not loaded忘记执行collection.load()检索前必须把集合加载到内存。检索结果不准检查向量维度是否和集合定义的一致、距离度量类型余弦/欧氏是否和建索引时一致。检索速度慢数据量超过10万后可以调大HNSW的efConstruction和ef参数或者用IVF索引替代HNSW。