使用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

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时