AI全栈知识07:向量数据库 - Milvus/Chroma实战 AI全栈知识07向量数据库 - Milvus/Chroma实战写在前面上一篇我们知道了RAG需要向量检索来搜相关文档。那向量存在哪怎么搜为什么不能用MySQL这篇帮你搞清楚向量数据库是什么、怎么选、怎么用。学完后你既能用Chroma快速开发也知道生产环境Milvus是怎么回事。为什么MySQL干不了这个活存可以搜不动。假设你有100万段文档每段转成1536个数字向量。存MySQL没问题100万行1536列。但搜索时出问题了用户问了一个问题转成向量 [0.12, -0.34, 0.78, ...] MySQL要找最相似的5段 第1步把100万行全部取出来 第2步逐行计算余弦相似度100万次浮点运算 第3步排序取前5 结果耗时几秒到几十秒向量数据库有专门的索引不需要逐行比对。就像MySQL有B树能快速定位某一行向量数据库有HNSW索引能快速定位附近的向量同样100万条 MySQL暴力搜索3-10秒 向量数据库有索引5-20毫秒差了几百倍。生活类比需求MySQL的做法向量数据库的做法“找一本叫《K8s权威指南》的书”在目录里按书名精确查找秒出结果不擅长这个“找跟容器故障排查相关的书”不会。只能搜标题里有没有这几个字理解语义把相关的都找出来MySQL像图书馆的电子目录按编号精确定位。向量数据库像一个懂内容的图书管理员按你的意思推荐相关的。两者不是替代关系是各干各的活。Chroma - 最简单的向量数据库为什么推荐先学它一个原因pip install就能用不需要装数据库服务。就像SQLite不需要装MySQL服务一样Chroma直接在Python代码里跑数据存本地文件。开发测试最方便。完整代码示例# 安装pip install chromadbimportchromadb# 1. 创建客户端数据存本地clientchromadb.Client()# 2. 创建集合类似MySQL的表collectionclient.create_collection(ops_docs)# 3. 添加文档Chroma自动把文字转成向量collection.add(documents[当容器内存超过limit时K8s会触发OOMKilled终止Pod,Pod处于Pending状态通常是因为资源不足或调度约束不满足,使用kubectl describe pod可以查看Pod的Events信息,K8s的HPA根据CPU或自定义指标自动扩缩Pod数量,Ingress是K8s中管理外部HTTP流量进入集群的资源,],ids[doc1,doc2,doc3,doc4,doc5])# 4. 语义搜索resultscollection.query(query_texts[为什么Pod一直重启],# 用户的问题n_results2# 返回最相似的2条)print(results[documents])# 输出[[当容器内存超过limit时...OOMKilled, 使用kubectl describe pod...]]就这么几行。存文档、自动转向量、语义搜索全搞定。Chroma做了什么你调collection.add()时Chroma在背后做了调内置的Embedding模型把文字转成向量建立索引存到本地文件你调collection.query()时把你的问题也转成向量用索引快速找到最近的向量返回对应的原始文档对你来说只需要关心存什么文档、搜什么问题、要几条结果。中间的向量转换和检索过程全自动。Milvus - 生产级向量数据库什么时候需要Milvus需求Chroma够吗需要Milvus几千条文档开发测试够不需要几十万条文档多人使用勉强建议用百万级以上生产环境不行必须用需要高可用/集群部署不支持支持需要持久化和备份简陋完善你们公司的FastGPT背后大概率就是Milvus或pgvector在存知识库的向量。Milvus的架构Milvus集群 三个组件配合 ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ | Milvus | | etcd | | MinIO | | (主程序) | | (元数据) | | (文件存储) | | 向量索引 | | 集合信息 | | 向量数据 | | 查询处理 | | Schema等 | | 索引文件 | └─────────────┘ └─────────────┘ └─────────────┘组件作用类比Milvus处理查询和索引MySQL主进程etcd存元数据有哪些集合、字段定义MySQL的information_schemaMinIO存实际的向量数据文件MySQL的数据目录Docker部署# docker-compose.yml最简单的单机部署version:3.5services:milvus-standalone:image:milvusdb/milvus:v2.4.0ports:-19530:19530-9091:9091volumes:-./milvus-data:/var/lib/milvusenvironment:ETCD_ENDPOINTS:etcd:2379MINIO_ADDRESS:minio:9000depends_on:-etcd-minioetcd:image:quay.io/coreos/etcd:v3.5.5environment:ETCD_AUTO_COMPACTION_MODE:revisionETCD_AUTO_COMPACTION_RETENTION:1000minio:image:minio/minio:RELEASE.2023-03-20T20-16-18Zenvironment:MINIO_ACCESS_KEY:minioadminMINIO_SECRET_KEY:minioadmincommand:minio server /minio_datadocker-composeup-d# 三个容器启动Milvus就绪Python使用示例frompymilvusimportconnections,Collection,FieldSchema,CollectionSchema,DataType# 连接Milvusconnections.connect(hostlocalhost,port19530)# 定义表结构Schemafields[FieldSchema(nameid,dtypeDataType.INT64,is_primaryTrue,auto_idTrue),FieldSchema(nametext,dtypeDataType.VARCHAR,max_length2000),FieldSchema(nameembedding,dtypeDataType.FLOAT_VECTOR,dim1536),]schemaCollectionSchema(fields,description运维知识库)# 创建集合collectionCollection(ops_knowledge,schema)# 创建索引很重要没索引会很慢collection.create_index(field_nameembedding,index_params{index_type:HNSW,# 索引类型metric_type:COSINE,# 相似度算法params:{M:16,efConstruction:256}})# 插入数据需要自己调Embedding模型转向量collection.insert([texts,embeddings])# 搜索collection.load()# 加载到内存resultscollection.search(data[query_embedding],anns_fieldembedding,param{metric_type:COSINE,params:{ef:64}},limit5,output_fields[text]# 同时返回原文)注意和Chroma的区别Milvus不会自动调Embedding你需要自己先把文字转成向量再存进去。Chroma vs Milvus对比维度ChromaMilvus定位开发/学习/小规模生产/大规模安装pip install chromadbDocker部署3个容器数据量几万到几十万亿级搜索速度毫秒级小数据时毫秒级大数据也快自动Embedding支持内置模型不支持自己调持久化本地文件MinIO分布式存储高可用不支持支持集群监控无有Prometheus指标适合K8sChat开发、学习FastGPT生产环境索引类型了解即可向量数据库的索引决定了搜索速度和精度索引类型原理类比特点FLAT挨个对比像翻字典每一页最精确但最慢IVF先分区再搜先找到对的书架再找书速度快有少量精度损失HNSW跳跃式搜索像六度人脉通过朋友的朋友快速找到人速度极快内存占用大结论大多数情况选HNSW就对了。运维Milvus要关心什么如果你的工作中需要运维Milvus集群关注点说明监控方式磁盘空间100万条x1536维 约 6GB看MinIO存储内存使用HNSW索引全部加载到内存看Milvus内存查询延迟正常应该在5-20msPrometheus指标集合大小单集合不建议超过1亿条定期检查数据备份备份MinIO中的数据定时任务etcd健康etcd挂了Milvus不可用etcd健康检查面试怎么说如果被问你了解向量数据库吗了解。向量数据库专门用于存储和检索高维向量核心能力是做语义相似度搜索。跟MySQL的区别是MySQL做精确匹配WHERE向量数据库做相似度匹配找最像的前K条。我用过Chroma做开发pip install就能用了解Milvus的生产部署etcdMinIOMilvus三组件。索引一般选HNSW相似度用余弦。我们公司的FastGPT知识库功能底层就是向量数据库在支撑检索。延伸思考问题答案pgvector能替代Milvus吗小规模可以几十万条以下大规模性能不如专用向量数据库向量数据库会不会被MySQL替代短期不会。MySQL加向量功能了但性能差距大Milvus和Elasticsearch能混用吗可以。ES做关键词搜索Milvus做向量搜索两路结果合并混合检索向量数据会不会很大100万条x1536维约6GB不算特别大。但索引加载到内存会占更多小结本篇核心收获MySQL做不了向量检索暴力搜太慢向量数据库有专用索引HNSWChromapip install就能用开发首选Milvus生产级Docker部署三组件MilvusetcdMinIOChroma自动转向量Milvus需要自己调Embedding索引选HNSW相似度用余弦大多数场景最佳运维Milvus关注内存索引加载、磁盘数据存储、延迟5-20ms正常下一篇预告AI全栈知识08Function Calling与工具调用下一篇我们将深入Agent的核心机制Function Calling到底是什么模型怎么决定调哪个工具完整的调用流程拆解K8sChat项目中Function Calling的实际应用参考链接Chroma官方文档Milvus官方文档Milvus Docker部署指南HNSW索引原理pymilvus Python SDK