news 2026/6/23 2:28:09

8. 向量库存储

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
8. 向量库存储
# -*- coding: utf-8 -*-""" @Created on : 2026/6/16 17:00 @creator : er_nao @File :day_93.py @Description :向量库存储 """# ====================== 导入所有依赖库 ======================importfaissimportnumpyasnpimportjsonimportosfromtypingimportList,Dict# ====================== 核心配置区:替换成你自己的项目路径 ======================# 1. 文本向量结果文件路径VECTOR_JSON_PATH=r"C:\\Users\\hp\\Desktop\\NLP学习数据\\Day91_文本转向量结果.json"# 2. faiss索引文件保存路径(后续检索直接加载这个文件)INDEX_SAVE_PATH=r"F:\\RAG-Learning-Project\\vector-database\\rag_vector_index.faiss"# 3. 元数据文件保存路径(和索引一一对应,存储原文内容等信息)META_DATA_SAVE_PATH=r"F:\\RAG-Learning-Project\\vector-database\\rag_meta_data.json"# 4. 向量维度(和你之前生成的向量维度一致,通义模型是1536,BGE是384)VECTOR_DIM=1536# ==================================================================================# ====================== 核心函数1:加载文本向量结果 ======================defload_vector_result(json_path:str)->List[Dict]:""" 加载之前生成的文本向量结果JSON文件 :param json_path: 向量结果文件路径 :return: 结构化的向量结果列表 """# 校验文件是否存在ifnotos.path.exists(json_path):print(f"错误:向量结果文件不存在,路径:{json_path}")return[]try:withopen(json_path,"r",encoding="utf-8")asf:vector_result=json.load(f)print(f" 向量结果加载成功,共{len(vector_result)}个文本块向量")returnvector_resultexceptExceptionase:print(f"加载失败错误信息:{str(e)}")return[]# ====================== 核心函数2:创建faiss索引 ======================defcreate_faiss_index(vector_dim:int)->faiss.IndexFlatL2:""" 创建faiss索引,零基础首选IndexFlatL2,100%匹配精度 :param vector_dim: 向量维度,必须和你生成的向量维度完全一致 :return: 创建好的faiss索引对象 """# 创建L2距离的索引,最适合零基础、小项目场景index=faiss.IndexFlatL2(vector_dim)print(f" faiss索引创建成功,向量维度:{index.d}")returnindex# ====================== 核心函数3:批量向量入库 ======================defbatch_add_vector_to_index(index:faiss.IndexFlatL2,vector_result:List[Dict])->bool:ifnotindexornotvector_result:print("错误:索引或向量结果为空,无法入库")returnFalse# 提取所有向量,转换成faiss要求的numpy数组格式vector_list=[]foriteminvector_result:# 提取向量列表,转成float32类型(faiss要求必须是float32)vector=np.array(item["embedding_vector"],dtype=np.float32)# 校验向量维度是否和索引一致iflen(vector)!=index.d:print(f" 错误:向量维度不匹配,索引维度{index.d},当前向量维度{len(vector)}")returnFalsevector_list.append(vector)# 把向量列表转换成二维numpy数组,faiss要求的输入格式# 形状:(向量数量, 向量维度),比如(100, 1536)vector_np=np.array(vector_list)print(f" 待入库向量形状:{vector_np.shape},共{vector_np.shape[0]}个向量")# 批量添加向量到索引中try:index.add(vector_np)print(f" 批量向量入库完成,索引中当前总向量数:{index.ntotal}")returnTrueexceptExceptionase:print(f" 向量入库失败,错误信息:{str(e)}")returnFalse# ====================== 核心函数4:索引持久化存储到本地 ======================defsave_index_to_local(index:faiss.IndexFlatL2,save_path:str)->bool:""" 把faiss索引存储到本地硬盘文件,实现持久化,后续可直接加载使用 :param index: 完成入库的faiss索引对象 :param save_path: 索引文件保存路径 :return: 保存成功返回True,失败返回False """# 自动创建保存路径的文件夹save_dir=os.path.dirname(save_path)ifsave_dirandnotos.path.exists(save_dir):os.makedirs(save_dir)print(f"自动创建索引保存文件夹:{save_dir}")# 把索引写入本地文件try:faiss.write_index(index,save_path)print(f"索引持久化存储完成,文件路径:{save_path}")print(f"存储的索引总向量数:{index.ntotal},维度:{index.d}")returnTrueexceptExceptionase:print(f"索引存储失败,错误信息:{str(e)}")returnFalse# ====================== 核心函数5:元数据结构化存储 ======================defsave_meta_data(vector_result:List[Dict],save_path:str)->bool:""" 存储元数据,和索引一一对应,包含原文内容、ID等信息 faiss索引只存向量数字,必须单独存元数据,检索后才能找到原文内容 :param vector_result: 加载好的向量结果列表 :param save_path: 元数据文件保存路径 :return: 保存成功返回True,失败返回False """# 自动创建保存路径的文件夹save_dir=os.path.dirname(save_path)ifsave_dirandnotos.path.exists(save_dir):os.makedirs(save_dir)# 结构化元数据,只保留需要的内容,和索引的顺序完全一致meta_data_list=[]foridx,iteminenumerate(vector_result):meta_data_list.append({"index_id":idx,"chunk_id":item["chunk_id"],"paragraph_id":item.get("paragraph_id",0),"chunk_content":item["chunk_content"],"chunk_length":item.get("chunk_length",0),"create_time":item.get("create_time","")})# 保存元数据到JSON文件try:withopen(save_path,"w",encoding="utf-8")asf:json.dump(meta_data_list,f,ensure_ascii=False,indent=2)print(f" 元数据存储完成,文件路径:{save_path}")print(f" 共存储{len(meta_data_list)}条元数据,和索引一一对应")returnTrueexceptExceptionase:print(f" 元数据存储失败,错误信息:{str(e)}")returnFalse# ====================== 主函数:一键执行向量库存储全流程 ======================defmain_vector_storage_pipeline():print("="*80)print(" Day93 向量库存储全流程开始执行")print("="*80)# 1. 加载文本向量结果vector_result=load_vector_result(VECTOR_JSON_PATH)ifnotvector_result:print(" 全流程终止:向量结果加载失败")return# 2. 创建faiss索引index=create_faiss_index(VECTOR_DIM)# 3. 批量向量入库add_success=batch_add_vector_to_index(index,vector_result)ifnotadd_success:print(" 全流程终止:向量入库失败")return# 4. 索引持久化存储到本地save_index_success=save_index_to_local(index,INDEX_SAVE_PATH)ifnotsave_index_success:print(" 全流程终止:索引存储失败")return# 5. 元数据结构化存储save_meta_success=save_meta_data(vector_result,META_DATA_SAVE_PATH)ifnotsave_meta_success:print(" 全流程终止:元数据存储失败")returnprint("\n"+"="*80)print(" Day93 向量库存储全流程执行完成!")print("="*80)print(f" 最终成果:")print(f" - 成功入库向量总数:{index.ntotal}个")print(f" - 向量维度:{index.d}维")print(f" - 索引文件路径:{INDEX_SAVE_PATH}")print(f" - 元数据文件路径:{META_DATA_SAVE_PATH}")print(f" - 输出的向量库可直接用于后续的相似度检索环节")# ====================== 程序入口:一键运行全流程 ======================if__name__=="__main__":main_vector_storage_pipeline()

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 2:24:14

二次元发卡系统终极指南:如何快速搭建专业虚拟商品交易平台

二次元发卡系统终极指南:如何快速搭建专业虚拟商品交易平台 【免费下载链接】acg-faka 个人发卡源码,发卡系统,二次元发卡系统,二次元发卡源码,发卡程序,动漫发卡,PHP发卡源码,异次元…

作者头像 李华
网站建设 2026/6/23 2:22:24

Grok 4.1 API工程化落地:上下文解耦与隐性成本治理

1. Grok 4.1 不是“又一个大模型API”,而是工程侧的临界点突破Grok 4.1 API 这个名字在2026年初突然密集出现在技术社区、运维群和AI产品团队的周会纪要里,但很多人第一次看到时下意识反应是:“哦,X.ai又发新版了?”—…

作者头像 李华
网站建设 2026/6/23 2:20:14

2026腾讯地图LBS广告投放王者争霸榜

2026腾讯地图LBS广告投放王者争霸榜 一、LBS广告投放的生死擂台 本地生活服务行业的竞争在2026年已进入白热化阶段,80%的本地商家开始依赖小程序进行引流获客。然而,大量商家正面临一个残酷的现实:缺乏精准定位能力的本地服务小程序&#xff…

作者头像 李华
网站建设 2026/6/23 2:13:09

OpenCore Legacy Patcher:让老旧Mac重获新生的开源利器

OpenCore Legacy Patcher:让老旧Mac重获新生的开源利器 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否有一台被苹果官方抛弃的老Mac&#…

作者头像 李华
网站建设 2026/6/23 1:49:16

医疗AI特征工程:数值离散化与时间编码的实践指南

1. 项目概述:为什么医疗AI的“第一口饭”如此重要?在医疗AI模型开发的漫长链条中,数据预处理和输入表示常常被戏称为“脏活累活”,远不如模型架构创新那般引人注目。然而,我多年的实践经验反复验证了一个朴素的道理&am…

作者头像 李华
网站建设 2026/6/23 1:42:04

数据库慢查询根因定位:从执行计划到索引优化的全链路实战

数据库慢查询根因定位:从执行计划到索引优化的全链路实战一、慢查询的多层原因 生产环境中的慢查询问题通常涉及多个层面。监控显示的 SQL 执行时间只是表面现象,实际原因可能包括执行计划不当、索引结构问题、统计信息过期或锁竞争。例如,一…

作者头像 李华