使用faiss存储HuggingFaceBgeEmbeddings向量化处理数据及反序列化加载使用的例子

本文主要是介绍使用faiss存储HuggingFaceBgeEmbeddings向量化处理数据及反序列化加载使用的例子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

周末宅在家里无所事事,实验了一下如何使用bge对word文档进行向量化处理后并存储到faiss里面供后续反序列化加载使用,下面是具体实现代码。

一,加载word数据并读取内容进行向量化存储

import os
import docx
from tqdm import tqdm
from langchain.docstore.document import Document
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.text_splitter import RecursiveCharacterTextSplitter# 读取并处理.docx文档,并将表格转换为Markdown格式
def read_docx(file_path):doc = docx.Document(file_path)full_text = []for para in doc.paragraphs:full_text.append(para.text)for table in doc.tables:md_table = []for row in table.rows:md_row = "| " + " | ".join(cell.text.strip() for cell in row.cells) + " |"md_table.append(md_row)full_text.append("\n".join(md_table))return '\n'.join(full_text)def load_wordfile(filepath):# 提取文件名(不含扩展名)file_name = os.path.splitext(os.path.basename(file_path))[0]text=read_docx(filepath)    text_splitter =RecursiveCharacterTextSplitter(chunk_size=1024, chunk_overlap=128)document = Document(page_content=text, metadata={"source": filepath,"country":file_name,"datayear":2024})chunks = text_splitter.split_documents([document])print(f"Splitted documents into {len(chunks)} chunks")return chunksif __name__ == "__main__":# 文档目录和向量库路径docx_directory = 'e:/ai/doc/'vector_store_path = 'e:/ai/vector/data'# 读取目录中的所有.docx文件并进行处理documents = []file_list = [f for f in os.listdir(docx_directory) if f.endswith('.docx')]for file_name in tqdm(file_list, desc="读取文档中"):file_path = os.path.join(docx_directory, file_name)docs = load_wordfile(file_path) #load_file(file_path)documents.extend(docs)model_name = "E:/ai/bge-small-zh-v1.5"model_kwargs = {"device": "cpu"}encode_kwargs = {"normalize_embeddings": True}hf = HuggingFaceBgeEmbeddings(model_name=model_name, model_kwargs=model_kwargs, encode_kwargs=encode_kwargs)#使用faiss进行向量库构建vector_store =FAISS.from_documents(documents, hf)# 保存向量库vector_store.save_local(vector_store_path)

  我家里的电脑没有GPU,所以使用的是cpu进行向量化计算,如果是有cuda的环境,将上面代码中的cpu改成cuda就可以了。

 二、反序列化加载并提供检索api服务

import os
import pickle
from fastapi import FastAPI, Query
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from typing import List, Dict
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_community.vectorstores import FAISSapp = FastAPI()# 允许跨域访问
app.add_middleware(CORSMiddleware,allow_origins=["*"],  # 允许所有来源allow_credentials=True,allow_methods=["*"],  # 允许所有HTTP方法allow_headers=["*"],  # 允许所有HTTP头
)# 全球国家和地区列表
asian_countries = [# 东亚"中国", "日本", "韩国", "朝鲜", "蒙古",# 东南亚"印度尼西亚", "泰国", "马来西亚", "新加坡", "菲律宾", "越南", "缅甸", "柬埔寨", "老挝", "文莱", "东帝汶",# 南亚"印度", "巴基斯坦", "孟加拉国", "斯里兰卡", "尼泊尔", "不丹", "马尔代夫", "阿富汗",# 中亚"哈萨克斯坦", "乌兹别克斯坦", "土库曼斯坦", "吉尔吉斯斯坦", "塔吉克斯坦",# 西亚(中东)"土耳其", "伊朗", "伊拉克", "叙利亚", "约旦", "黎巴嫩", "以色列", "巴勒斯坦", "沙特阿拉伯", "阿联酋", "卡塔尔", "科威特", "阿曼", "巴林", "也门", "乔治亚", "亚美尼亚", "阿塞拜疆",# 北亚"俄罗斯"
]african_countries = ["阿尔及利亚", "安哥拉", "贝宁", "博茨瓦纳", "布基纳法索", "布隆迪", "佛得角", "喀麦隆", "中非共和国", "乍得", "科摩罗", "刚果(布)", "刚果(金)", "吉布提", "埃及", "赤道几内亚", "厄立特里亚", "斯威士兰", "埃塞俄比亚", "加蓬", "冈比亚", "加纳", "几内亚", "几内亚比绍", "科特迪瓦", "肯尼亚", "莱索托", "利比里亚", "利比亚", "马达加斯加", "马拉维", "马里", "毛里塔尼亚", "毛里求斯", "摩洛哥", "莫桑比克", "纳米比亚", "尼日尔", "尼日利亚", "卢旺达", "圣多美和普林西比", "塞内加尔", "塞舌尔", "塞拉利昂", "索马里", &

这篇关于使用faiss存储HuggingFaceBgeEmbeddings向量化处理数据及反序列化加载使用的例子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1085457

相关文章

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁