一.向量存储目标1.理解向量存储在RAG系统中的功能和重要性2.学会创建和管理向量数据库3.掌握如何将文本转化为向量并存入数据库4.理解混合检索与重排序的实现原理1.模块功能概述vector_store.py是EduRAG系统的核心模块之一,封装了与Milvus向量数据库的交互逻辑,它负责将文档转化为向量存储到数据库中,并提供高效的混合检索功能,通过结合BGE-M3嵌入模型和重排序机制,该模块确保系统能够快速检索到与用户查询最相关的文档VectorStore类提供了以下主要功能:初始化与集合管理:创建或加载Milvus向量数据库集合文档向量化与存储:将分块后的文档转换为向量并存储混合检索与重排序:结合稠密和稀疏向量进行检索,并通过重排序优化结果""" 实文档向量的存储功能 分为以下3个模块: 初始化与集合管理:创建或加载Milvus向量数据库集合 初始化方法:初始化VectorStore类的实例,设置基本参数并调用集合创建或加载方法 创建或加载集合方法:检查并创建或加载Milvus集合,定义字段结构和索引参数 文档向量化与存储:将分块后的文档转换为向量并存储 添加文档方法:将分块后的文档转换为向量并存储到Milvus集合 混合检索与重排序:结合稠密和稀疏向量进行检索,并通过重排序优化结果 """功能1: 向量写入功能2:查询以下将逐一讲解每个方法的实现细节导入必备工具包:# 导入 BGE-M3 嵌入函数,用于生成文档和查询的向量表示 from milvus_model.hybrid import BGEM3EmbeddingFunction # 导入 Milvus 相关类,用于操作向量数据库 from pymilvus import MilvusClient, DataType, AnnSearchRequest, WeightedRanker # 导入 Document 类,用于创建文档对象 from langchain_core.documents import Document # 导入 CrossEncoder,用于重排序和 NLI 判断 from sentence_transformers import CrossEncoder # 导入 hashlib 模块,用于生成唯一 ID 的哈希值 import hashlib from base.config import config from base.logger import logger import sys2.初始化方法(1).功能__init__方法初始化VectorStore类的实例,设置基本参数并调用集合创建或加载方法(2).代码示例思路:""" 需求:初始化VectorStore 思路步骤: 1. 构造milvus连接相关的参数: host、port、db、collection_name 2. 构造嵌入模型 3. 构造rerank模型 4. 创建或加载milvus集合,保证milvus表存在 """代码:""" 实文档向量的存储功能 分为以下3个模块: 初始化与集合管理:创建或加载Milvus向量数据库集合。 初始化方法:初始化VectorStore类的实例,设置基本参数并调用集合创建或加载方法 创建或加载集合方法:检查并创建或加载Milvus集合,定义字段结构和索引参数 文档向量化与存储:将分块后的文档转换为向量并存储。 添加文档方法:将分块后的文档转换为向量并存储到Milvus集合 混合检索与重排序:结合稠密和稀疏向量进行检索,并通过重排序优化结果。 """ # core/vector_store.py import datetime from attr.validators import max_len # 导入 BGE-M3 嵌入函数,用于生成文档和查询的向量表示 from milvus_model.hybrid import BGEM3EmbeddingFunction # 导入 Milvus 相关类,用于操作向量数据库 from pymilvus import MilvusClient, DataType, AnnSearchRequest, WeightedRanker # 导入 Document 类,用于创建文档对象 from langchain_core.documents import Document # 导入 CrossEncoder,用于重排序和 NLI 判断 from sentence_transformers import CrossEncoder # 导入 hashlib 模块,用于生成唯一 ID 的哈希值 import hashlib from base.config import single_config as config from base.logger import single_logger as logger import sys import os import torch # 定义 VectorStore 类,封装向量存储和检索功能 class VectorStore: """ 需求:初始化VectorStore 思路步骤: 1. 构造milvus连接相关的参数: host、port、db、collection_name 2. 构造嵌入模型 3. 构造rerank模型 4. 创建或加载milvus集合,保证milvus表存在 """ # 初始化方法,设置向量存储的基本参数 def __init__(self, milvus_host=config.MILVUS_HOST , milvus_port=config.MILVUS_PORT , milvus_database_name=config.MILVUS_DATABASE_NAME , milvus_collection_name=config.MILVUS_COLLECTION_NAME , dim=1024 ): # 1. 构造milvus连接相关的参数: host、port、db、collection_name. # 设置 Milvus 主机地址 self.milvus_host = milvus_host # 设置 Milvus 端口号 self.milvus_port = milvus_port # 设置 Milvus 数据库名称 self.milvus_database_name = milvus_database_name # 设置 Milvus 集合名称 self.milvus_collection_name = milvus_collection_name self.dim = dim # 等价于MilvusClient(地址) client.use_database(数据库名) self.milvus_client = MilvusClient(uri=f'http://{self.milvus_host}:{self.milvus_port}', db_name=self.milvus_database_name) # 创建或加载milvus集合,保证milvus表存在 self._create_or_load_collection() # 2. 构造嵌入模型 # 初始化 BGE-M3 嵌入函数,使用 CPU 设备,不启用 FP16 embedding_model_path = os.path.join(config.MODELS_DIR, 'bge-m3') # 构造bge-m3模型,通过路径加载的方式把模型加载到内存中 self.embedding_model = BGEM3EmbeddingFunction( # BGEM3EmbeddingFunction 是Milvus的包 # 传入模型名: 自动下载; 传入路径:直接加载 model_name_or_path=embedding_model_path, # f16: 半精度浮点数 这里取false相当于使用fp32 # TODO 是否开启半精度 use_fp16=False, # 推理(预测)设备 # TODO 专业卡:A100, H100, A800. 消费卡:RTX4090, RTX5090 device='cuda' if torch.cuda.is_available() else 'cpu' ) logger.info(f'加载embedding模型成功!') # 3. 构造rerank模型 # bge-reranker-large模型: 用于接收query + context, 输出分数, 但是排序需要手动排序 rerank_model_path = os.path.join(config.MODELS_DIR, 'bge-reranker-large') # 初始化 BGE-Reranker 模型,用于重排序检索结果 # TODO device代表设备: mps:m1系列的mac/ cpu: cpu / cuda: nvidia的gpu。和操作系统无关 # CrossEncoder: 交叉编码器, query 和context来做对比 self.rerank_model = CrossEncoder(rerank_model_path, device='cuda' if torch.cuda.is_available() else 'cpu') logger.info(f'加载rerank模型成功')(3).实现步骤1.参数设置:使用Config中的默认值初始化集合名称、主机、端口和数据库名称2.模型初始化:reranker:加载BGE-Reranker模型,用于后续重排序embedding_model:初始化BGE-M3嵌入模型,禁用FP16,使用CPU运行dim:获取稠密向量的维度3.客户端连接:创建MilvusClient实例,连接到指定主机和数据库4.集合管理: