使用 SQL 和表格数据进行问答和 RAG(7)—将表格数据(CSV 或 Excel 文件)加载到向量数据库(ChromaDB)中

将表格数据(CSV 或 Excel 文件)加载到向量数据库(ChromaDB)中。这里定义的类 PrepareVectorDBFromTabularData,它的主要功能是读取表格数据文件到DataFrame中、生成嵌入向量、并将这些数据存储在向量数据库的集合中,同时对注入的数据进行验证。


代码结构与功能分析

1. 类的简介
  • 目标:将 CSV 或 Excel 文件的数据转换为向量并存储到 ChromaDB 中。
  • 主要方法
    • run_pipeline:运行整个数据处理管道。
    • _load_dataframe:加载数据文件为 Pandas DataFrame。
    • _prepare_data_for_injection:根据文件内容生成向量和相关元数据。
    • _inject_data_into_chromadb:将数据注入到 ChromaDB 中。
    • _validate_db:验证向量数据库的集合内容。

2. 初始化 (__init__)
def __init__(self, file_directory:str) -> None:self.APPCFG = LoadConfig()self.file_directory = file_directory
  • 参数
    • file_directory:待处理文件的路径。
  • 功能
    • 加载配置对象 self.APPCFG,其中包含数据库和嵌入生成器的实例。
    • 初始化文件路径 file_directory

3. 运行数据处理管道 (run_pipeline)
def run_pipeline(self):self.df, self.file_name = self._load_dataframe(file_directory=self.file_directory)self.docs, self.metadatas, self.ids, self.embeddings = self._prepare_data_for_injection(df=self.df, file_name=self.file_name)self._inject_data_into_chromadb()self._validate_db()
  • 功能
    • 加载数据文件(调用 _load_dataframe)。
    • 准备向量和相关元数据(调用 _prepare_data_for_injection)。
    • 将数据注入到 ChromaDB 集合中(调用 _inject_data_into_chromadb)。
    • 验证注入是否成功(调用 _validate_db)。

4. 加载数据文件 (_load_dataframe)
def _load_dataframe(self, file_directory: str):file_names_with_extensions = os.path.basename(file_directory)file_name, file_extension = os.path.splitext(file_names_with_extensions)if file_extension == ".csv":df = pd.read_csv(file_directory)return df, file_nameelif file_extension == ".xlsx":df = pd.read_excel(file_directory)return df, file_nameelse:raise ValueError("The selected file type is not supported")
  • 参数
    • file_directory:待加载的文件路径。
  • 功能
    • 根据文件扩展名(.csv.xlsx),将文件加载为 Pandas DataFrame。
    • 返回加载的数据和文件名(不带扩展名)。
  • 异常
    • 如果文件类型不被支持,则抛出 ValueError

5. 准备数据 (_prepare_data_for_injection)
def _prepare_data_for_injection(self, df:pd.DataFrame, file_name:str):docs = []metadatas = []ids = []embeddings = []for index, row in df.iterrows():output_str = ""for col in df.columns:output_str += f"{col}: {row[col]},\n"response = self.APPCFG.OpenAIEmbeddings.embed_documents(output_str)[0]embeddings.append(response)docs.append(output_str)metadatas.append({"source": file_name})ids.append(f"id{index}")return docs, metadatas, ids, embeddings
  • 参数
    • df:待处理的 Pandas DataFrame。
    • file_name:文件名,用于生成元数据。
  • 功能
    • 遍历 DataFrame 的每一行,将行数据格式化为字符串 output_str
    • 使用 OpenAIEmbeddings.embed_documents 为字符串生成向量。
    • 保存生成的文档、元数据、唯一 ID 和向量。
  • 返回值
    • 文档列表、元数据列表、ID 列表和向量列表。

6. 注入数据到 ChromaDB (_inject_data_into_chromadb)
def _inject_data_into_chromadb(self):chroma_client = self.APPCFG.chroma_clientexisting_collections = chroma_client.list_collections()collection_name = self.APPCFG.collection_nameexisting_collection_names = [collection.name for collection in existing_collections]if collection_name in existing_collection_names:collection = chroma_client.get_collection(name=collection_name)print(f"Retrieved existing collection: {collection_name}")else:collection = chroma_client.create_collection(name=collection_name)print(f"Created new collection: {collection_name}")collection.add(documents=self.docs,metadatas=self.metadatas,embeddings=self.embeddings,ids=self.ids)print("Data is stored in ChromaDB.")
  • 功能
    • 检查集合是否已存在。如果存在,则获取;否则,创建新集合。
    • 将文档、元数据、嵌入向量和 ID 添加到集合中。
  • 异常处理
    • 避免重复创建集合。

7. 验证数据库内容 (_validate_db)
def _validate_db(self):vectordb = self.APPCFG.chroma_client.get_collection(name=self.APPCFG.collection_name)print("Number of vectors in vectordb:", vectordb.count())
  • 功能
    • 获取集合并打印其中向量的数量,确认数据是否注入成功。

代码运行结果:
在这里插入图片描述

总结

这段代码的整体流程如下:

  1. 加载 CSV 或 Excel 文件,转换为 Pandas DataFrame。
  2. 遍历 DataFrame 的每一行,生成文档、元数据和嵌入向量。
  3. 将生成的数据注入到 ChromaDB 的集合中。
  4. 验证数据库集合中的向量数量,确保注入成功。

需要注意文件格式支持、嵌入生成器和 ChromaDB 客户端的兼容性问题。

完整代码:

import os
import pandas as pd
from utils.load_config import LoadConfig
import pandas as pdclass PrepareVectorDBFromTabularData:"""This class is designed to prepare a vector database from a CSV and XLSX file.It then loads the data into a ChromaDB collection. The process involvesreading the CSV file, generating embeddings for the content, and storing the data in the specified collection.Attributes:APPCFG: Configuration object containing settings and client instances for database and embedding generation.file_directory: Path to the CSV file that contains data to be uploaded."""def __init__(self, file_directory:str) -> None:"""Initialize the instance with the file directory and load the app config.Args:file_directory (str): The directory path of the file to be processed."""self.APPCFG = LoadConfig()self.file_directory = file_directorydef run_pipeline(self):"""Execute the entire pipeline for preparing the database from the CSV.This includes loading the data, preparing the data for injection, injectingthe data into ChromaDB, and validating the existence of the injected data."""self.df, self.file_name = self._load_dataframe(file_directory=self.file_directory)self.docs, self.metadatas, self.ids, self.embeddings = self._prepare_data_for_injection(df=self.df, file_name=self.file_name)self._inject_data_into_chromadb()self._validate_db()def _load_dataframe(self, file_directory: str):"""Load a DataFrame from the specified CSV or Excel file.Args:file_directory (str): The directory path of the file to be loaded.Returns:DataFrame, str: The loaded DataFrame and the file's base name without the extension.Raises:ValueError: If the file extension is neither CSV nor Excel."""file_names_with_extensions = os.path.basename(file_directory)print(file_names_with_extensions)file_name, file_extension = os.path.splitext(file_names_with_extensions)if file_extension == ".csv":df = pd.read_csv(file_directory)return df, file_nameelif file_extension == ".xlsx":df = pd.read_excel(file_directory)return df, file_nameelse:raise ValueError("The selected file type is not supported")def _prepare_data_for_injection(self, df:pd.DataFrame, file_name:str):"""Generate embeddings and prepare documents for data injection.Args:df (pd.DataFrame): The DataFrame containing the data to be processed.file_name (str): The base name of the file for use in metadata.Returns:list, list, list, list: Lists containing documents, metadatas, ids, and embeddings respectively."""docs = []metadatas = []ids = []embeddings = []for index, row in df.iterrows():output_str = ""# Treat each row as a separate chunkfor col in df.columns:output_str += f"{col}: {row[col]},\n"response = self.APPCFG.OpenAIEmbeddings.embed_documents(output_str)[0]embeddings.append(response)docs.append(output_str)metadatas.append({"source": file_name})ids.append(f"id{index}")return docs, metadatas, ids, embeddingsdef _inject_data_into_chromadb(self):"""Inject the prepared data into ChromaDB.Raises an error if the collection_name already exists in ChromaDB.The method prints a confirmation message upon successful data injection."""chroma_client = self.APPCFG.chroma_client# 列出所有集合的名称existing_collections = chroma_client.list_collections()collection_name = self.APPCFG.collection_name #"titanic_small"# 获取所有集合existing_collections = chroma_client.list_collections()# 提取集合名称existing_collection_names = [collection.name for collection in existing_collections]if collection_name in existing_collection_names:# 如果集合存在,获取它collection = chroma_client.get_collection(name=collection_name)print(f"Retrieved existing collection: {collection_name}")else:# 如果集合不存在,创建它collection = chroma_client.create_collection(name=collection_name)print(f"Created new collection: {collection_name}")collection.add(documents=self.docs,metadatas=self.metadatas,embeddings=self.embeddings,ids=self.ids)print("==============================")print("Data is stored in ChromaDB.")     def _validate_db(self):"""Validate the contents of the database to ensure that the data injection has been successful.Prints the number of vectors in the ChromaDB collection for confirmation."""vectordb =  self.APPCFG.chroma_client.get_collection(name=self.APPCFG.collection_name)print("==============================")print("Number of vectors in vectordb:", vectordb.count())print("==============================")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/505865.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【git】-2 分支管理

目录 一、分支的概念 二、查看、创建、切换分支 1、查看分支-git branch 2、创建分支- git branch 分支名 3、切换分支- git checkout 分支名 三、git指针 -实现分支和版本间的切换 四、普通合并分支 git merge 文件名 五、冲突分支合并 ​​​​​​【git】-初始gi…

搜广推面经五

饿了么推荐算法 一、介绍InfoNCE Loss、InfoNCE温度系数的作用 InfoNCE Loss(Information Noise Contrastive Estimation Loss)是一种常用于自监督学习和对比学习中的损失函数,特别是在信息论和无监督学习中有广泛应用。 它的核心思想是通过…

如何选择适合的证件照制作软件,让您的照片制作更轻松

在当今数字化的时代,制作证件照不再需要专门前往照相馆。选择一款合适的证件照制作软件,您可以在家中轻松完成标准证件照的拍摄与制作。然而,面对市面上琳琅满目的软件,找到最适合您需求的软件并不简单。本文将为您详细介绍选择证…

【数据库】一、数据库系统概述

文章目录 一、数据库系统概述1 基本概念2 现实世界的信息化过程3 数据库系统内部体系结构4 数据库系统外部体系结构5 数据管理方式 一、数据库系统概述 1 基本概念 数据:描述事物的符号记录 数据库(DB):长期存储在计算机内的、…

安卓硬件加速hwui

安卓硬件加速 本文基于安卓11。 从 Android 3.0 (API 级别 11) 开始,Android 2D 渲染管道支持硬件加速,这意味着在 View 的画布上执行的所有绘图操作都使用 GPU。由于启用硬件加速所需的资源增加,你的应用程序将消耗更多内存。 软件绘制&am…

第R4周:LSTM-火灾温度预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 文章目录 一、代码流程1、导入包,设置GPU2、导入数据3、数据集可视化4、数据集预处理5、设置X,y6、划分数据集7、构建模型8、定义训练函…

Spring 设计模式:经典设计模式

Spring 设计模式:经典设计模式 引言 Spring 框架广泛使用了经典设计模式。 这些模式在 Spring 内部发挥着重要作用。 通过理解这些设计模式在 Spring 中的应用,开发者可以更深入地掌握 Spring 框架的设计哲学和实现细节。 经典设计模式 控制反转&am…

现代企业架构白皮书(可以在线阅读完整PDF文件)

数据架构元模型综述 数据架构的内容元模型包括“结构”、“端口”两个部分,如下图所示: 结构部分用来对数据模型、数据处理建模,其中包括数据对象、数据组件 端口部分用来对数据模型的边界建模,其中包括数据服务 数据架构元模型…

krpano 实现文字热点中的三角形和竖杆

krpano 实现文字热点中的三角形和竖杆 实现文字热点中的三角形和竖杆 一个后端写前端真的是脑阔疼 一个后端写前端真的是脑阔疼 一个后端写前端真的是脑阔疼 实现文字热点中的三角形和竖杆 上图看效果 v:2549789059

Win10本地部署大语言模型ChatGLM2-6B

鸣谢《ChatGLM2-6B|开源本地化语言模型》作者PhiltreX 作者显卡为英伟达4060 安装程序 打开CMD命令行,在D盘新建目录openai.wiki if not exist D:\openai.wiki mkdir D:\openai.wiki 强制切换工作路径为D盘的openai.wiki文件夹。 cd /d D:\openai.wik…

互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅

本文将给出关于互联网架构演进的一个不同视角。回顾一下互联网的核心理论基础产生的背景: 左边是典型的集中控制通信网络,很容易被摧毁,而右边的网络则没有单点问题,换句话说它很难被全部摧毁,与此同时,分…

priority_queue优先队列

目录 1. 最短路径算法(Dijkstra算法) 应用场景: 优先队列的作用: 2. 最小生成树算法(Prim算法) 应用场景: 优先队列的作用: 3. 哈夫曼编码(Huffman Coding&#x…

vs2022编译webrtc步骤

1、主要步骤说明 概述:基础环境必须有,比如git,Powershell这些,就不写到下面了。 1.1 安装vs2022 1、选择使用C的桌面开发 2、 Windows 10 SDK安装10.0.20348.0 3、勾选MFC及ATL这两项 4、 安装完VS2022后,必须安…

如何评价deepseek-V3 VS OpenAI o1 自然语言处理成Sql的能力

DeepSeek-V3 介绍 在目前大模型主流榜单中,DeepSeek-V3 在开源模型中位列榜首,与世界上最先进的闭源模型不分伯仲。 准备工作: 笔者只演示实例o1 VS DeepSeek-V3两个模型,大家可以自行验证结果或者实验更多场景,同时…

9.4 visualStudio 2022 配置 cuda 和 torch (c++)

一、配置torch 1.Libtorch下载 该内容看了【Libtorch 一】libtorchwin10环境配置_vsixtorch-CSDN博客的博客,作为笔记用。我自己搭建后可以正常运行。 下载地址为windows系统下各种LibTorch下载地址_libtorch 百度云-CSDN博客 下载解压后的目录为: 2.vs…

Mysql--基础篇--多表查询(JOIN,笛卡尔积)

在MySQL中,多表查询(也称为联表查询或JOIN操作)是数据库操作中非常常见的需求。通过多表查询,你可以从多个表中获取相关数据,并根据一定的条件将它们组合在一起。MySQL支持多种类型的JOIN操作,每种JOIN都有…

gesp(C++四级)(11)洛谷:B4005:[GESP202406 四级] 黑白方块

gesp(C四级)(11)洛谷:B4005:[GESP202406 四级] 黑白方块 题目描述 小杨有一个 n n n 行 m m m 列的网格图,其中每个格子要么是白色,要么是黑色。对于网格图中的一个子矩形,小杨认为它是平衡的…

易于上手难于精通---关于游戏性的一点思考

1、小鸟、狙击、一闪,都是通过精准时机来逼迫玩家练习, 而弹道、出招时机等玩意,不是那么容易掌握的,需要反复的观察、反应与行动, 这也正是游戏性的体现, 玩家能感觉到一些朦胧的东西,但又不…

微信小程序——创建滑动颜色条

在微信小程序中,你可以使用 slider 组件来创建一个颜色滑动条。以下是一个简单的示例,展示了如何实现一个颜色滑动条,该滑动条会根据滑动位置改变背景颜色。 步骤一:创建小程序项目 首先,使用微信开发者工具创建一个新…

JVM实战—12.OOM的定位和解决

大纲 1.如何对系统的OOM异常进行监控和报警 2.如何在JVM内存溢出时自动dump内存快照 3.Metaspace区域内存溢出时应如何解决(OutOfMemoryError: Metaspace) 4.JVM栈内存溢出时应如何解决(StackOverflowError) 5.JVM堆内存溢出时应该如何解决(OutOfMemoryError: Java heap s…