当前位置: 首页 > news >正文

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-compose

2.3 获取 OneAPI

OneAPI 是开源的,你可以直接从 GitHub 获取:

git clone https://github.com/songquanpeng/one-api.git cd one-api

3. 向量数据库基础概念

3.1 什么是向量数据库?

简单来说,向量数据库是专门存储和检索向量数据(一组数字)的数据库。在AI领域,文本、图片、音频都可以转换成向量,这些向量就像数据的"指纹"或"DNA"。

3.2 为什么需要向量数据库?

传统数据库擅长处理"精确匹配"(比如找名字叫"张三"的人),但不擅长处理"相似性搜索"(比如找与这段话意思相近的内容)。向量数据库专门解决这个问题。

3.3 RAG 是什么?

RAG(Retrieval-Augmented Generation)即检索增强生成,它的工作原理是:

  1. 将专业知识库转换成向量并存入数据库
  2. 当用户提问时,先从向量库中找到最相关的信息
  3. 把这些相关信息和大模型的问题一起交给AI
  4. AI基于这些专业信息生成更准确的回答

这样就解决了大模型"胡编乱造"的问题。

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_MODE=revision - ETCD_AUTO_COMPACTION_RETENTION=1000 - ETCD_QUOTA_BACKEND_BYTES=4294967296 - ETCD_SNAPSHOT_COUNT=50000 volumes: - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls=http://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

启动 Milvus:

docker-compose -f docker-compose-milvus.yml up -d

4.2 验证 Milvus 部署

检查服务是否正常运行:

docker ps | grep milvus

你应该看到三个容器都在运行状态。

5. 部署 PGVector 向量数据库

5.1 使用 Docker 部署 PGVector

PGVector 是 PostgreSQL 的扩展,提供了向量搜索功能:

# 拉取 PGVector 镜像 docker pull ankane/pgvector # 运行 PGVector docker run --name pgvector \ -e POSTGRES_DB=vectordb \ -e POSTGRES_USER=vectoruser \ -e POSTGRES_PASSWORD=vectorpass \ -p 5432:5432 \ -d ankane/pgvector

5.2 创建向量扩展

连接到数据库并启用向量扩展:

# 进入容器 docker exec -it pgvector psql -U vectoruser -d vectordb # 在 PostgreSQL 命令行中执行 CREATE EXTENSION IF NOT EXISTS vector;

6. 集成向量数据库到 OneAPI

6.1 安装必要的 Python 库

OneAPI 需要额外的库来处理向量数据库连接:

pip install pymilvus pgvector psycopg2-binary sentence-transformers

6.2 配置环境变量

在 OneAPI 的配置文件(.env)中添加向量数据库配置:

# Milvus 配置 MILVUS_HOST=localhost MILVUS_PORT=19530 # PGVector 配置 PGVECTOR_HOST=localhost PGVECTOR_PORT=5432 PGVECTOR_DB=vectordb PGVECTOR_USER=vectoruser PGVECTOR_PASSWORD=vectorpass # 向量模型配置 EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2

6.3 创建向量数据库管理模块

在 OneAPI 项目中创建新的模块文件utils/vector_db.py

import 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( host=os.getenv('MILVUS_HOST', 'localhost'), port=os.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( host=os.getenv('PGVECTOR_HOST', 'localhost'), port=os.getenv('PGVECTOR_PORT', '5432'), dbname=os.getenv('PGVECTOR_DB', 'vectordb'), user=os.getenv('PGVECTOR_USER', 'vectoruser'), password=os.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(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True), FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=384), FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=65535) ] 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_field="embedding", param=search_params, limit=top_k, output_fields=["text"] ) # 提取相关文本 relevant_texts = [] for hits in results: for hit in hits: relevant_texts.append(hit.entity.get('text')) return relevant_texts

7.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系统会:

  1. 从向量库中找到最相关的支付方式信息
  2. 将这些信息和大模型的问题组合
  3. 大模型基于准确信息生成回答:"我们支持信用卡、支付宝和微信支付等多种支付方式"

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:i+batch_size] self.add_to_knowledge_base(collection_name, batch) logger.info(f"已处理 {min(i+batch_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(检索增强生成)能力,让大模型能够访问专业知识库并生成更准确的回答。

关键收获

  1. 统一访问:OneAPI 提供了统一接口访问多种大模型
  2. 知识增强:向量数据库为AI系统添加了长期记忆和专业知识
  3. 灵活部署:支持 Milvus 和 PGVector 两种主流向量数据库
  4. 开箱即用:Docker 部署简单快捷,适合生产环境
  5. 性能优化:提供了批量处理、索引优化等最佳实践

实际价值

  • 企业可以构建智能客服系统,回答准确率大幅提升
  • 开发者可以快速为应用添加专业知识问答功能
  • 研究人员可以方便地实验不同的检索增强策略

现在你的 OneAPI 不仅是一个模型网关,更是一个智能的知识增强平台。无论是客户服务、技术支持还是知识管理,都能提供更准确、更专业的AI体验。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

http://www.jsqmd.com/news/521313/

相关文章:

  • 从原理到实战:Linux内核Tracepoint的深度剖析与应用指南
  • 业务数据分析选哪种?参数估计vs非参数估计的7个实战场景对比
  • FlaUI实战:如何高效捕获WinForm和WPF窗体(附避坑指南)
  • Rust入门避坑指南:新手用Cargo创建第一个项目常犯的5个错误及解决方法
  • 基于LSTM改进的CTC语音唤醒模型时序处理能力分析
  • Visual Studio项目打包实战:从代码到可安装客户端的完整指南
  • 别再手动填Token了!Knife4j 4.4.0集成OAuth2密码模式,实现一键授权
  • VIVADO 2023.1闪退后Launcher Time Out?360误杀恢复全记录
  • EZPROM:嵌入式EEPROM面向对象管理库
  • Qwen-VL效果实测分享:Qwen-Image镜像在OCR增强型图文问答任务中的准确率表现
  • Nanbeige 4.1-3B效果展示:流式渲染延迟测试(CPU/GPU/量化版)对比数据图
  • Python实战:手把手教你用cell2location分析空间单细胞转录组数据(附完整代码)
  • 嵌入式C语言底层机制与内存级优化实践
  • 从CAN到CANFD:手把手教你用CANFDNET-200U-UDP网关配置混合网络(附避坑指南)
  • Qt实战:基于QCustomPlot的动态瀑布图实现与性能优化
  • 2026年口碑好的铝塑共挤门品牌推荐:铝塑共挤系统门窗用户口碑认可参考(高评价) - 行业平台推荐
  • 如何高效使用Ryujinx:从零开始的Switch游戏模拟器完整指南
  • 高压差分探头避坑指南:从选型到校准的全流程实操(附安全注意事项)
  • Qwen-Image-2512-SDNQ Web服务参数详解:CFG Scale、步数、种子对画质影响分析
  • PowerShell脚本运行被阻止?3种安全解除限制的方法(附详细步骤)
  • FastSurfer大脑MRI分割终极指南:如何在5分钟内完成专业级脑部影像分析
  • 别再只会用JMeter内置函数了!用Groovy脚本在JSR223预处理程序里实现动态签名和加密,效率翻倍
  • 2026年质量好的莱赛尔砂洗空气层推荐:兰精莫代尔砂洗空气层高性价比推荐 - 行业平台推荐
  • 从PSIM到硬件:手把手教你用仿真生成DSP代码,快速验证数字电源控制环路
  • 2026年评价高的针织面料品牌推荐:阳离子面料厂家实力参考 - 行业平台推荐
  • 手机玩转Linux数据分析:Termux中Bash脚本读取txt文件并计算平均值的避坑指南
  • BME280传感器驱动开发与低功耗工程实践指南
  • Unity Socket实时画面传输避坑指南:如何解决多线程与主线程冲突问题
  • 2026年企业座机来电显示名称认证服务商盘点 - 企业服务推荐
  • RSSHub Radar终极指南:3分钟打造你的信息雷达系统