任意做别的公司网站销售产品违法吗做网站简单还是做app简单
任意做别的公司网站销售产品违法吗,做网站简单还是做app简单,以3d全景做的网站,wordpress json api authBGE-Large-Zh向量数据库集成指南#xff1a;MilvusPgvector对比
1. 引言
你是不是也遇到过这样的问题#xff1a;手头有大量的文本数据#xff0c;想要快速找到相似的内容#xff0c;但传统的关键词搜索总是差强人意#xff1f;比如在电商平台搜索适合夏天穿的轻薄…BGE-Large-Zh向量数据库集成指南MilvusPgvector对比1. 引言你是不是也遇到过这样的问题手头有大量的文本数据想要快速找到相似的内容但传统的关键词搜索总是差强人意比如在电商平台搜索适合夏天穿的轻薄外套系统却给你返回一堆厚重棉衣。这就是语义搜索能够大显身手的地方。今天我们要聊的BGE-Large-Zh模型就是一个专门为中文优化的语义向量模型它能将文本转换成高维向量让计算机真正理解文本的含义。但光有模型还不够我们还需要一个高效存储和查询这些向量的地方——这就是向量数据库的作用。在众多向量数据库中Milvus和Pgvector是两个备受关注的选择。Milvus是专门为向量搜索而生的分布式系统而Pgvector则是PostgreSQL的扩展让传统关系数据库也能处理向量数据。到底该选哪个这就是本文要帮你解决的问题。2. 环境准备与快速部署2.1 安装BGE-Large-Zh模型首先让我们把BGE模型准备好这是整个技术栈的核心# 安装必要的Python包 pip install torch transformers sentence-transformers # 如果你打算用FlagEmbedding库 pip install FlagEmbedding2.2 安装向量数据库Milvus安装使用Docker最简单# 拉取最新版本 docker pull milvusdb/milvus:latest # 启动单机版 docker run -d --name milvus \ -p 19530:19530 \ -p 9091:9091 \ milvusdb/milvus:latestPgvector安装# 如果你用Docker运行PostgreSQL docker run -d --name postgres \ -e POSTGRES_PASSWORDyour_password \ -p 5432:5432 \ pgvector/pgvector:latest # 或者在现有PostgreSQL中安装扩展 CREATE EXTENSION vector;3. 基础概念快速入门3.1 什么是向量嵌入简单来说向量嵌入就是把文字变成一串数字。比如我喜欢吃苹果这句话通过BGE模型会变成类似[0.12, -0.45, 0.78, ..., 0.93]这样的1024维向量。语义相近的文本它们的向量在空间中的距离也更近。3.2 为什么需要向量数据库想象一下你有100万篇文章每篇文章都转换成了1024维的向量。当用户输入一个查询时你需要从这100万个向量中找出最相似的几个。如果用传统方法逐个比较速度会慢得无法接受。向量数据库使用各种索引技术让这个搜索过程变得飞快。4. BGE模型与向量数据库集成4.1 生成文本向量先用BGE模型把文本转换成向量from FlagEmbedding import FlagModel # 加载模型 model FlagModel(BAAI/bge-large-zh, query_instruction_for_retrieval为这个句子生成表示以用于检索相关文章) # 生成向量 sentences [机器学习算法, 深度学习模型, 人工智能技术] embeddings model.encode(sentences) print(f生成{len(embeddings)}个向量每个维度{len(embeddings[0])})4.2 Milvus集成示例from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility # 连接Milvus connections.connect(default, hostlocalhost, port19530) # 定义集合结构 fields [ FieldSchema(nameid, dtypeDataType.INT64, is_primaryTrue, auto_idTrue), FieldSchema(nametext, dtypeDataType.VARCHAR, max_length500), FieldSchema(nameembedding, dtypeDataType.FLOAT_VECTOR, dim1024) ] schema CollectionSchema(fields, 文档向量集合) collection Collection(documents, schema) # 创建索引 index_params { index_type: IVF_FLAT, metric_type: L2, params: {nlist: 128} } collection.create_index(embedding, index_params) # 插入数据 entities [ [这是第一篇文档, 这是第二篇文档], # 文本 [embeddings[0].tolist(), embeddings[1].tolist()] # 向量 ] collection.insert(entities) collection.load() # 加载到内存4.3 Pgvector集成示例import psycopg2 import numpy as np # 连接数据库 conn psycopg2.connect( hostlocalhost, databasepostgres, userpostgres, passwordyour_password ) cur conn.cursor() # 创建表 cur.execute( CREATE TABLE IF NOT EXISTS documents ( id SERIAL PRIMARY KEY, text TEXT, embedding vector(1024) ) ) # 插入数据 for i, (text, embedding) in enumerate(zip(sentences, embeddings)): # 将numpy数组转换为Pgvector格式 embedding_str [ ,.join(map(str, embedding)) ] cur.execute( INSERT INTO documents (text, embedding) VALUES (%s, %s::vector), (text, embedding_str) ) conn.commit() # 创建索引 cur.execute( CREATE INDEX ON documents USING ivfflat (embedding vector_l2_ops) WITH (lists 100) ) conn.commit()5. 查询性能对比5.1 Milvus查询示例# 转换查询文本为向量 query_text AI技术 query_vector model.encode([query_text])[0] # 在Milvus中搜索 search_params {metric_type: L2, params: {nprobe: 10}} results collection.search( data[query_vector.tolist()], anns_fieldembedding, paramsearch_params, limit5, output_fields[text] ) for hits in results: for hit in hits: print(f相似度: {1 - hit.distance:.4f}, 文本: {hit.entity.get(text)})5.2 Pgvector查询示例# 在Pgvector中搜索 query_vector_str [ ,.join(map(str, query_vector)) ] cur.execute( SELECT text, 1 - (embedding - %s::vector) as similarity FROM documents ORDER BY embedding - %s::vector LIMIT 5 , (query_vector_str, query_vector_str)) results cur.fetchall() for text, similarity in results: print(f相似度: {similarity:.4f}, 文本: {text})6. 批量导入优化技巧6.1 Milvus批量导入def batch_insert_milvus(texts, batch_size1000): 批量插入数据到Milvus total len(texts) for i in range(0, total, batch_size): batch_texts texts[i:ibatch_size] batch_embeddings model.encode(batch_texts) entities [batch_texts, batch_embeddings.tolist()] collection.insert(entities) print(f已插入 {min(ibatch_size, total)}/{total} 条数据) collection.flush() print(批量插入完成)6.2 Pgvector批量导入def batch_insert_pgvector(texts, batch_size1000): 批量插入数据到Pgvector total len(texts) for i in range(0, total, batch_size): batch_texts texts[i:ibatch_size] batch_embeddings model.encode(batch_texts) # 准备批量插入数据 values [] for text, embedding in zip(batch_texts, batch_embeddings): embedding_str [ ,.join(map(str, embedding)) ] values.append((text, embedding_str)) # 使用execute_values提高性能 from psycopg2.extras import execute_values execute_values( cur, INSERT INTO documents (text, embedding) VALUES %s, values, template(%s, %s::vector) ) print(f已插入 {min(ibatch_size, total)}/{total} 条数据) conn.commit() print(批量插入完成)7. 实战对比与选择建议7.1 性能对比总结特性MilvusPgvector查询速度⭐⭐⭐⭐⭐⭐⭐⭐扩展性⭐⭐⭐⭐⭐⭐⭐⭐易用性⭐⭐⭐⭐⭐⭐⭐⭐功能丰富度⭐⭐⭐⭐⭐⭐⭐⭐⭐社区生态⭐⭐⭐⭐⭐⭐⭐⭐⭐7.2 选择建议选择Milvus当数据量超过千万级别需要极低的查询延迟需要分布式部署专注于向量搜索场景选择Pgvector当数据量在百万级别以内已经在使用PostgreSQL需要事务支持想要同时处理结构化和向量数据7.3 混合架构建议对于大型项目其实可以考虑混合架构用Pgvector处理 metadata 小规模向量查询用Milvus处理大规模纯向量搜索通过唯一ID关联两种数据库中的数据8. 常见问题解决问题1向量维度不匹配# 检查向量维度 assert len(embedding) 1024, f向量维度应为1024实际为{len(embedding)}问题2内存不足Milvus调整cache.cache_size配置Pgvector使用分区表分批处理问题3查询速度慢调整索引参数nlist、nprobe等考虑使用GPU加速9. 总结实际用下来BGE-Large-Zh与向量数据库的集成其实没有想象中那么复杂。Milvus在纯向量搜索场景下确实表现惊艳特别是数据量大的时候速度优势很明显。Pgvector则胜在简单易用如果你已经在用PostgreSQL加上vector扩展就能直接上手学习成本低很多。从开发体验来看两种方案都挺成熟的社区资料也丰富。我个人建议可以先从Pgvector开始毕竟上手快等数据量真的上来了再考虑迁移到Milvus。毕竟技术选型没有绝对的好坏只有适合与否。如果你刚开始接触向量数据库建议先小规模试试水跑通整个流程后再逐步扩大规模。这样既能积累经验又能避免一开始就陷入复杂架构的泥潭。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。