使用 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.mzph.cn/bicheng/66576.shtml

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

相关文章

攻防世界 wtf.sh-150

点进去,发现是一个类似于论坛的网站,并且对报错等做了处理 用御剑扫描一下 ​ 发现是php形式的文件,但点进去访问不了。看看wp,发现此题存在路径穿越漏洞,就是(如果应用程序使用用户可控制的数据&#xff0…

Vue3组件通讯——自定义事件(子->父)

需求如下: 1.在子组件中,当用户点击提交按钮后,更新数据库 2.数据更新成功后,子组件通知父组件getUserInfo函数,重新获取数据,同步更新 3.子组件等待getUserInfo函数执行完毕后,调用init函数…

mongodb配置文件详解

mongodb 配置文件采用yaml格式,配置文件的选项还是比较多的,下面是一些配置文件解释。 下面提供一份MongoDB副本集在生产环境中的配置 # mongod.conf # # systemLog: systemLog: destination: file logAppend: true path: /data/mongodb/mongodb-vr-2701…

【已解决】如何让容器内的应用程序使用代理?

首先,按照这种配置方法,即通过在 /etc/systemd/system/docker.service.d/http-proxy.conf 中设置代理,它只会影响 Docker 守护进程本身,并不会自动影响 Docker 容器内部的软件或容器中的网络行为。 这意味着: Docker …

2025年:AI化浪潮中的社会变迁与商业革新

随着人工智能(AI)技术的迅猛发展,2025年将成为一个转折点。这一年,AI不仅将深入到日常生活和商业运营的各个角落,还将引发一系列深刻的社会、经济和技术变革。以下是对未来一年可能出现的“AI化”现象的预测与展望。 AI进入主流文化的标志 超级碗广告:在2025年的超级碗上…

Windows 11 上配置VSCode 使用 Git 和 SSH 完整步骤

在 Windows 11 上,通过 VSCode 使用 Git 和 SSH 克隆 GitHub 仓库的完整优化步骤如下: 1. 安装必备工具 下载并安装 Git: 访问 Git 官网 下载最新版本。安装时,选择以下选项: Default editor for Git: Use Visual Stud…

【Spring】Redis缓存+ehcache

文章目录 基于Spring的RedisehcacheRedis 缓存配置Cacheable 注解CacheEvict 注解缓存配置 基于Spring的Redisehcache Redis 缓存配置 在项目中添加 Redis 的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

UE5 打包要点

------------------------- 1、需要环境 win sdk &#xff0c;大约3G VS&#xff0c;大约10G 不安装就无法打包&#xff0c;就是这么简单。 ----------------------- 2、打包设置 编译类型&#xff0c;开发、调试、发行 项目设置-地图和模式&#xff0c;默认地图 项目…

小程序textarea组件键盘弹起会遮挡住输入框

<textarea value"{{remark}}" input"handleInputRemark" ></textarea> 如下会有遮挡&#xff1a; 一行代码搞定 cursor-spacing160 修改后代码 <textarea value"{{remark}}" input"handleInputRemark" cursor-spacin…

用python 进行雷电接口检测

雷电接口检测工具说明文档 功能概述 这个Python脚本用于检测系统的雷电(Thunderbolt)接口支持情况&#xff0c;包括&#xff1a; 检测系统是否有雷电控制器检测Type-C/雷电端口识别雷电接口版本&#xff08;Thunderbolt 1-5&#xff09;显示理论传输速度列出已连接的雷电设备…

卷积神经网络 (CNN, Convolutional Neural Network) 算法详解与PyTorch实现

卷积神经网络 (CNN, Convolutional Neural Network) 算法详解与PyTorch实现 目录 卷积神经网络 (CNN, Convolutional Neural Network) 算法详解与PyTorch实现1. 卷积神经网络 (CNN) 算法概述1.1 图像处理1.2 CNN的优势2. CNN的核心技术2.1 卷积层2.2 池化层2.3 全连接层2.4 激活…

《深度学习模型在鸿蒙分布式框架下的跨设备高效之旅》

在人工智能领域&#xff0c;深度学习模型的训练与推理通常需要强大的计算资源和大量的数据支持。而鸿蒙系统的分布式框架为解决这一问题提供了新的思路和方法&#xff0c;使得深度学习模型能够在多个设备之间实现高效的训练与推理。 鸿蒙分布式框架概述 鸿蒙系统是一款面向万…

git的rebase和merge的区别?

B分支从A分支拉出 1.git merge 处于A分支执行&#xff0c;git merge B分支:相当于将commit X、commit Y两次提交&#xff0c;作为了新的commit Z提交到了A分支上。能溯源它真正提交的信息。 2.git rebase 处于B分支&#xff0c;执行git rebase A分支&#xff0c;B分支那边复…

Cadence——virtuous生成的symbol其端口自动添加注释

新换的工艺库&#xff0c;环境变量也会发生变化&#xff0c;毕竟每一家PDK下的.cdsinit 和 .cdsenv文件不尽相同。 这次新换的PDK&#xff0c;搭建完Schcematic之后&#xff0c;再生成的Symbol&#xff0c;发现其pin口&#xff0c;也就是端口没有自动生成注释&#xff0c;我就…

Ruby语言的正则表达式

Ruby语言的正则表达式详解 正则表达式&#xff08;Regular Expressions&#xff0c;简称Regex&#xff09;是一种强大的文本处理工具&#xff0c;它可以用来匹配、搜索、替换字符串中的模式。在Ruby语言中&#xff0c;正则表达式的使用非常灵活&#xff0c;并且具有良好的可读…

CClinkIEfield Basic转Modbus TCP网关模块连接三菱FX5U PLC

捷米特JM-CCLKIE-TCP是自主研发的一款CCLINK IE FB从站功能的通讯网关。该产品主要功能是将各种 MODBUS-TCP 设备接入到 CCLINK IE FB网络中。 捷米特JM-CCLKIE-TCP网关连接到CCLINK IE FB总线中做为从站使用&#xff0c;连接到 MODBUS-TCP 总线中做为主站或从站使用。 为了打破…

《分布式光纤测温:解锁楼宇安全的 “高精度密码”》

在楼宇建筑中&#xff0c;因其内部空间庞大&#xff0c;各类电器设施众多&#xff0c;如何以一种既高效又稳定&#xff0c;兼具低成本与高覆盖特性的方式&#xff0c;为那些关键线路节点开展温度监测&#xff0c;是目前在安全监测领域一项重点研究项目&#xff0c;而无锡布里渊…

Docker 专栏 —— Dockerfile 指令详解

文章目录 ADD 复制文件COPY 复制文件ARG 设置构建参数CMD 容器启动命令ENTRYPOINT ⼊⼝点ENV 设置环境变量EXPOSE 声明暴露的端⼝FROM 指定基础镜像LABEL 为镜像添加元数据MAINTAINER 指定维护者的信息RUN 执⾏命令USER 设置⽤户VOLUME 指定挂载点WORKDIR 指定⼯作⽬录 ADD 复制…

开关电源设计中的穿越频率选取

摘要 在开关电源设计之中&#xff0c;穿越频率是一个相当重要的指标。在文中从就开关电源设计中的环路反馈控制方法、环路增益作用进行了阐述。并在此基础上就穿越频率选取的限制条件进行分析&#xff0c;为开关电源设计中的穿越频率选取提供借鉴。 开关电源设计过程中&#x…

探索 INFINI Console:提升 Elasticsearch 管理效率的新利器

1、常见的 Elasticsearch 可视化客户端介绍 1.1 Head 插件 这是一个非常老牌的 Elasticsearch 可视化插件&#xff08;现在改名了 Multi Elasticsearch Heads&#xff09;&#xff0c;通常以 Chrome 插件或网页形式存在&#xff0c;用来查看集群的节点状态、索引元数据&#x…