OneAPI向量数据库扩展:接入Milvus/PGVector实现RAG增强
OneAPI向量数据库扩展接入Milvus/PGVector实现RAG增强1. 引言为什么需要向量数据库扩展想象一下你有一个超级智能的AI助手它能回答各种问题但有时候它会忘记之前聊过的内容或者对专业领域的问题回答得不够准确。这就是大多数大模型面临的挑战——它们缺乏长期记忆和专业知识。OneAPI已经解决了多模型统一访问的问题让你可以通过标准的OpenAI API格式访问几乎所有主流大模型。但现在我们要让它更智能——通过接入向量数据库为AI系统装上长期记忆和专业知识库。本文将手把手教你如何为OneAPI扩展向量数据库功能使用Milvus和PGVector来实现RAG检索增强生成能力让你的AI应用不仅聪明还有专业知识储备。2. 环境准备与部署2.1 系统要求在开始之前请确保你的系统满足以下要求Linux/Windows/macOS 系统Docker 和 Docker Compose至少 4GB 内存推荐 8GB 或以上至少 20GB 可用存储空间2.2 安装必要的工具如果你还没有安装 Docker可以使用以下命令快速安装# 对于 Ubuntu/Debian 系统 curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # 安装 Docker Compose sudo curl -L https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose2.3 获取 OneAPIOneAPI 是开源的你可以直接从 GitHub 获取git clone https://github.com/songquanpeng/one-api.git cd one-api3. 向量数据库基础概念3.1 什么是向量数据库简单来说向量数据库是专门存储和检索向量数据一组数字的数据库。在AI领域文本、图片、音频都可以转换成向量这些向量就像数据的指纹或DNA。3.2 为什么需要向量数据库传统数据库擅长处理精确匹配比如找名字叫张三的人但不擅长处理相似性搜索比如找与这段话意思相近的内容。向量数据库专门解决这个问题。3.3 RAG 是什么RAGRetrieval-Augmented Generation即检索增强生成它的工作原理是将专业知识库转换成向量并存入数据库当用户提问时先从向量库中找到最相关的信息把这些相关信息和大模型的问题一起交给AIAI基于这些专业信息生成更准确的回答这样就解决了大模型胡编乱造的问题。4. 部署 Milvus 向量数据库4.1 使用 Docker Compose 部署 Milvus创建docker-compose-milvus.yml文件version: 3.5 services: etcd: container_name: milvus-etcd image: quay.io/coreos/etcd:v3.5.5 environment: - ETCD_AUTO_COMPACTION_MODErevision - ETCD_AUTO_COMPACTION_RETENTION1000 - ETCD_QUOTA_BACKEND_BYTES4294967296 - ETCD_SNAPSHOT_COUNT50000 volumes: - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd command: etcd -advertise-client-urlshttp://127.0.0.1:2379 -listen-client-urlshttp://0.0.0.0:2379 --data-dir /etcd minio: container_name: milvus-minio image: minio/minio:RELEASE.2023-03-20T20-16-18Z environment: MINIO_ACCESS_KEY: minioadmin MINIO_SECRET_KEY: minioadmin volumes: - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data command: minio server /minio_data --console-address :9001 healthcheck: test: [CMD, curl, -f, http://localhost:9000/minio/health/live] interval: 30s timeout: 20s retries: 3 standalone: container_name: milvus-standalone image: milvusdb/milvus:v2.3.3 command: [milvus, run, standalone] environment: ETCD_ENDPOINTS: etcd:2379 MINIO_ADDRESS: minio:9000 volumes: - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus ports: - 19530:19530 - 9091:9091 depends_on: - etcd - minio networks: default: name: milvus启动 Milvusdocker-compose -f docker-compose-milvus.yml up -d4.2 验证 Milvus 部署检查服务是否正常运行docker ps | grep milvus你应该看到三个容器都在运行状态。5. 部署 PGVector 向量数据库5.1 使用 Docker 部署 PGVectorPGVector 是 PostgreSQL 的扩展提供了向量搜索功能# 拉取 PGVector 镜像 docker pull ankane/pgvector # 运行 PGVector docker run --name pgvector \ -e POSTGRES_DBvectordb \ -e POSTGRES_USERvectoruser \ -e POSTGRES_PASSWORDvectorpass \ -p 5432:5432 \ -d ankane/pgvector5.2 创建向量扩展连接到数据库并启用向量扩展# 进入容器 docker exec -it pgvector psql -U vectoruser -d vectordb # 在 PostgreSQL 命令行中执行 CREATE EXTENSION IF NOT EXISTS vector;6. 集成向量数据库到 OneAPI6.1 安装必要的 Python 库OneAPI 需要额外的库来处理向量数据库连接pip install pymilvus pgvector psycopg2-binary sentence-transformers6.2 配置环境变量在 OneAPI 的配置文件.env中添加向量数据库配置# Milvus 配置 MILVUS_HOSTlocalhost MILVUS_PORT19530 # PGVector 配置 PGVECTOR_HOSTlocalhost PGVECTOR_PORT5432 PGVECTOR_DBvectordb PGVECTOR_USERvectoruser PGVECTOR_PASSWORDvectorpass # 向量模型配置 EMBEDDING_MODELsentence-transformers/all-MiniLM-L6-v26.3 创建向量数据库管理模块在 OneAPI 项目中创建新的模块文件utils/vector_db.pyimport logging from typing import List, Optional from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility from pgvector.psycopg2 import register_vector import psycopg2 import numpy as np from sentence_transformers import SentenceTransformer logger logging.getLogger(__name__) class VectorDBManager: def __init__(self): self.embedding_model SentenceTransformer(all-MiniLM-L6-v2) self.milvus_conn None self.pg_conn None def connect_milvus(self): 连接 Milvus 数据库 try: connections.connect( hostos.getenv(MILVUS_HOST, localhost), portos.getenv(MILVUS_PORT, 19530) ) self.milvus_conn connections logger.info(成功连接到 Milvus) except Exception as e: logger.error(f连接 Milvus 失败: {e}) def connect_pgvector(self): 连接 PGVector 数据库 try: self.pg_conn psycopg2.connect( hostos.getenv(PGVECTOR_HOST, localhost), portos.getenv(PGVECTOR_PORT, 5432), dbnameos.getenv(PGVECTOR_DB, vectordb), useros.getenv(PGVECTOR_USER, vectoruser), passwordos.getenv(PGVECTOR_PASSWORD, vectorpass) ) register_vector(self.pg_conn) logger.info(成功连接到 PGVector) except Exception as e: logger.error(f连接 PGVector 失败: {e}) def create_embeddings(self, texts: List[str]) - List[List[float]]: 创建文本嵌入向量 return self.embedding_model.encode(texts).tolist() # 更多向量数据库操作方法...7. 实现 RAG 功能增强7.1 创建知识库存储功能首先实现向向量数据库添加知识的功能def add_to_knowledge_base(self, collection_name: str, texts: List[str], metadata: List[dict] None): 将文本添加到知识库 # 生成嵌入向量 embeddings self.create_embeddings(texts) # 存储到 Milvus if not utility.has_collection(collection_name): # 创建集合 fields [ FieldSchema(nameid, dtypeDataType.INT64, is_primaryTrue, auto_idTrue), FieldSchema(nameembedding, dtypeDataType.FLOAT_VECTOR, dim384), FieldSchema(nametext, dtypeDataType.VARCHAR, max_length65535) ] schema CollectionSchema(fields, description知识库数据) collection Collection(collection_name, schema) # 创建索引 index_params { index_type: IVF_FLAT, metric_type: L2, params: {nlist: 128} } collection.create_index(embedding, index_params) else: collection Collection(collection_name) # 插入数据 entities [embeddings, texts] collection.insert(entities) collection.flush() logger.info(f成功将 {len(texts)} 条数据添加到知识库 {collection_name})7.2 实现检索功能实现从向量数据库检索相关内容的函数def retrieve_relevant_info(self, collection_name: str, query: str, top_k: int 5) - List[str]: 检索与查询相关的信息 # 生成查询向量 query_embedding self.create_embeddings([query])[0] # 从 Milvus 检索 collection Collection(collection_name) collection.load() search_params {metric_type: L2, params: {nprobe: 10}} results collection.search( data[query_embedding], anns_fieldembedding, paramsearch_params, limittop_k, output_fields[text] ) # 提取相关文本 relevant_texts [] for hits in results: for hit in hits: relevant_texts.append(hit.entity.get(text)) return relevant_texts7.3 集成到 OneAPI 的聊天接口修改 OneAPI 的聊天处理逻辑加入 RAG 功能async def rag_chat_completion(self, messages: List[dict], model: str, collection_name: str None): 支持 RAG 的聊天完成 # 提取最后一条用户消息 last_user_message None for message in reversed(messages): if message[role] user: last_user_message message[content] break if last_user_message and collection_name: # 检索相关知识 relevant_info self.vector_db.retrieve_relevant_info( collection_name, last_user_message ) if relevant_info: # 构建增强的提示词 enhanced_prompt f基于以下参考信息回答问题 参考信息 {chr(10).join(relevant_info)} 问题{last_user_message} 请根据参考信息回答问题如果参考信息中没有相关内容请如实告知。 # 替换最后一条用户消息 for i in range(len(messages)-1, -1, -1): if messages[i][role] user: messages[i][content] enhanced_prompt break # 调用原始的大模型接口 return await self.original_chat_completion(messages, model)8. 实际应用案例8.1 构建企业知识库假设你有一家科技公司可以将所有产品文档、技术手册、常见问题解答都存入向量数据库# 示例加载企业文档到知识库 documents [ 我们的产品支持多种支付方式包括信用卡、支付宝和微信支付, 技术支持服务时间为工作日9:00-18:00, 系统最低要求4GB内存20GB存储空间, # ... 更多文档内容 ] vector_db_manager.add_to_knowledge_base(company_kb, documents)8.2 智能客服增强当用户询问你们的支付方式有哪些时RAG系统会从向量库中找到最相关的支付方式信息将这些信息和大模型的问题组合大模型基于准确信息生成回答我们支持信用卡、支付宝和微信支付等多种支付方式8.3 技术文档问答对于技术性提问RAG能确保回答基于最新文档# 用户问题 question 系统需要多少存储空间 # RAG检索到的信息 [系统最低要求4GB内存20GB存储空间, 推荐配置8GB内存50GB存储空间] # 大模型生成的回答 根据我们的技术文档系统最低需要20GB存储空间推荐配置为50GB存储空间以获得更好性能。9. 性能优化与最佳实践9.1 向量索引优化根据数据量调整索引参数def optimize_index(self, collection_name: str, data_size: int): 根据数据量优化索引 collection Collection(collection_name) if data_size 10000: # 小数据量使用精确搜索 index_params {index_type: FLAT, metric_type: L2} else: # 大数据量使用近似搜索 nlist min(4096, data_size // 1000) index_params { index_type: IVF_FLAT, metric_type: L2, params: {nlist: nlist} } collection.create_index(embedding, index_params)9.2 批量处理优化对于大量数据使用批量处理提高效率def batch_add_documents(self, collection_name: str, documents: List[str], batch_size: int 100): 批量添加文档到知识库 for i in range(0, len(documents), batch_size): batch documents[i:ibatch_size] self.add_to_knowledge_base(collection_name, batch) logger.info(f已处理 {min(ibatch_size, len(documents))}/{len(documents)} 条文档)9.3 混合检索策略结合多种检索方式提高准确性def hybrid_retrieval(self, query: str, collection_name: str, top_k: int 5): 混合检索向量搜索 关键词搜索 # 向量搜索 vector_results self.retrieve_relevant_info(collection_name, query, top_k*2) # 简单关键词匹配示例 keyword_results [] query_keywords set(query.lower().split()) for text in vector_results: text_keywords set(text.lower().split()) if query_keywords.intersection(text_keywords): keyword_results.append(text) # 合并结果优先显示有关键词匹配的 combined_results keyword_results [ r for r in vector_results if r not in keyword_results ] return combined_results[:top_k]10. 总结通过为 OneAPI 集成 Milvus 和 PGVector 向量数据库我们成功实现了 RAG检索增强生成能力让大模型能够访问专业知识库并生成更准确的回答。关键收获统一访问OneAPI 提供了统一接口访问多种大模型知识增强向量数据库为AI系统添加了长期记忆和专业知识灵活部署支持 Milvus 和 PGVector 两种主流向量数据库开箱即用Docker 部署简单快捷适合生产环境性能优化提供了批量处理、索引优化等最佳实践实际价值企业可以构建智能客服系统回答准确率大幅提升开发者可以快速为应用添加专业知识问答功能研究人员可以方便地实验不同的检索增强策略现在你的 OneAPI 不仅是一个模型网关更是一个智能的知识增强平台。无论是客户服务、技术支持还是知识管理都能提供更准确、更专业的AI体验。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。