知识库的创建(1) - KnowledgeFile文件加载和分割

文章目录

  • 前言
  • 一、 类的初始化方法 `__init__`
    • 1. 参数解析
    • 2. 初始化步骤
  • 二、 方法 `file2docs`
    • 1. 功能
    • 2. 参数
    • 3. 步骤
  • 三、 方法 `docs2texts`
    • 1. 功能
    • 2. 参数
    • 3. 步骤
  • 四、 方法 `file2text`
    • 1. 功能
    • 2. 参数
    • 3. 步骤
  • 五、 方法 `file_exist`
    • 1. 功能
    • 2. 返回
    • 3. 方法 `get_mtime`
    • 4. 功能
    • 5. 返回
  • 六、 方法 `get_size`
  • 1. 功能
  • 2. 返回
  • 总结


前言

前几篇讲了向量库的创建和索引的创建,我们可以去langchain-chatchat里看看,作者实现的类是怎么写的,可以学习一下作者的封装方法。我们可以先来看看KnowledgeFile类。
KnowledgeFile 类用于管理知识库目录中的文件,提供文件加载、文本分割等功能。它需要文件存在于磁盘上才能进行向量化等操作。以下是对该类的详细解析:


一、 类的初始化方法 __init__

def __init__(self,filename: str,knowledge_base_name: str,loader_kwargs: Dict = {},
):'''对应知识库目录中的文件,必须是磁盘上存在的才能进行向量化等操作。'''self.kb_name = knowledge_base_nameself.filename = str(Path(filename).as_posix())self.ext = os.path.splitext(filename)[-1].lower()if self.ext not in SUPPORTED_EXTS:raise ValueError(f"暂未支持的文件格式 {self.filename}")self.loader_kwargs = loader_kwargsself.filepath = get_file_path(knowledge_base_name, filename)self.docs = Noneself.splited_docs = Noneself.document_loader_name = get_LoaderClass(self.ext)self.text_splitter_name = TEXT_SPLITTER_NAME

1. 参数解析

  • filename: 文件名。
  • knowledge_base_name: 知识库的名称。
  • loader_kwargs: 加载器的额外参数。

2. 初始化步骤

  1. 设置知识库名称 (kb_name)。
  2. 将文件名转换为 POSIX 路径格式 (filename)。
  3. 获取文件扩展名并转换为小写 (ext)。
  4. 检查文件扩展名是否受支持,不支持则抛出异常。
  5. 设置加载器的额外参数 (loader_kwargs)。
  6. 生成文件路径 (filepath)。
  7. 初始化文档内容 (docs) 和分割后的文档 (splited_docs) 为 None
  8. 根据文件扩展名获取相应的加载器类名 (document_loader_name)。
  9. 设置文本分割器名称 (text_splitter_name)。

二、 方法 file2docs

def file2docs(self, refresh: bool = False):if self.docs is None or refresh:logger.info(f"{self.document_loader_name} used for {self.filepath}")loader = get_loader(loader_name=self.document_loader_name,file_path=self.filepath,loader_kwargs=self.loader_kwargs)self.docs = loader.load()return self.docs

1. 功能

将文件加载为文档对象。

2. 参数

  • refresh: 是否重新加载文档。

3. 步骤

1) 如果 docsNonerefreshTrue,则重新加载文档。
2) 记录加载器使用日志。
3) 根据加载器名称和文件路径获取加载器实例。
4) 使用加载器加载文档并存储在 docs 属性中。
5) 返回加载的文档。

三、 方法 docs2texts

def docs2texts(self,docs: List[Document] = None,zh_title_enhance: bool = ZH_TITLE_ENHANCE,refresh: bool = False,chunk_size: int = CHUNK_SIZE,chunk_overlap: int = OVERLAP_SIZE,text_splitter: TextSplitter = None,
):docs = docs or self.file2docs(refresh=refresh)if not docs:return []if self.ext not in [".csv"]:if text_splitter is None:text_splitter = make_text_splitter(splitter_name=self.text_splitter_name, chunk_size=chunk_size,chunk_overlap=chunk_overlap)if self.text_splitter_name == "MarkdownHeaderTextSplitter":docs = text_splitter.split_text(docs[0].page_content)else:docs = text_splitter.split_documents(docs)if not docs:return []print(f"文档切分示例:{docs[0]}")if zh_title_enhance:docs = func_zh_title_enhance(docs)self.splited_docs = docsreturn self.splited_docs

1. 功能

将文档对象分割为更小的文本块,并可进行中文标题增强。

2. 参数

  • docs: 文档列表,如果为 None 则调用 file2docs 加载文档。
  • zh_title_enhance: 是否进行中文标题增强。
  • refresh: 是否重新加载文档。
  • chunk_size: 文本块大小。
  • chunk_overlap: 文本块重叠大小。
  • text_splitter: 文本分割器实例。

3. 步骤

1) 如果未提供 docs,则调用 file2docs 方法加载文档。
2) 如果 docs 为空,返回空列表。
3) 如果文件扩展名不是 .csv,则进行文本分割:
- 如果未提供 text_splitter,则根据配置创建文本分割器。
- 根据文本分割器名称选择分割方法。
4) 如果分割后的文档为空,返回空列表。
5) 输出文档切分示例。
6) 如果启用中文标题增强,则调用 func_zh_title_enhance 方法。
7) 将分割后的文档存储在 splited_docs 属性中并返回。

四、 方法 file2text

def file2text(self,zh_title_enhance: bool = ZH_TITLE_ENHANCE,refresh: bool = False,chunk_size: int = CHUNK_SIZE,chunk_overlap: int = OVERLAP_SIZE,text_splitter: TextSplitter = None,
):if self.splited_docs is None or refresh:docs = self.file2docs()self.splited_docs = self.docs2texts(docs=docs,zh_title_enhance=zh_title_enhance,refresh=refresh,chunk_size=chunk_size,chunk_overlap=chunk_overlap,text_splitter=text_splitter)return self.splited_docs

1. 功能

将文件加载并分割为文本块。

2. 参数

  • zh_title_enhance: 是否进行中文标题增强。
  • refresh: 是否重新加载文档。
  • chunk_size: 文本块大小。
  • chunk_overlap: 文本块重叠大小。
  • text_splitter: 文本分割器实例。

3. 步骤

1) 如果 splited_docsNonerefreshTrue,则重新加载并分割文档:
- 调用 file2docs 加载文档。
- 调用 docs2texts 分割文档。
2) 返回分割后的文档。

五、 方法 file_exist

def file_exist(self):return os.path.isfile(self.filepath)

1. 功能

检查文件是否存在。

2. 返回

  • bool: 文件存在返回 True,否则返回 False

3. 方法 get_mtime

def get_mtime(self):return os.path.getmtime(self.filepath)

4. 功能

获取文件的修改时间。

5. 返回

  • float: 文件的修改时间(时间戳)。

六、 方法 get_size

def get_size(self):return os.path.getsize(self.filepath)

1. 功能

获取文件大小。

2. 返回

  • int: 文件大小(字节数)。

总结

KnowledgeFile 类提供了对知识库中文件的管理功能,包括文件的加载、文本的分割和处理等。通过该类,可以方便地对知识库中的文件进行操作,并进行进一步的自然语言处理和分析。

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

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

相关文章

高考没考好焦虑怎么选计算机专业!一篇告诉你,推荐三个风口专业!想学计算机怎么选大学专业

高考成绩揭晓,几家欢喜几家愁。对于那些未能如愿考取理想分数的同学来说,未来似乎蒙上了一层阴影。尤其是在计算机专业如此热门的今天,低分考生是否还有机会在这个领域找到一席之地?本文将为你揭秘,即使高考成绩不理想…

Drake 机器人仿真

sudo apt-get install,pip3 install,sudo apt install这些命令是在Linux系统中用于安装软件包或Python库的不同方法,它们分别属于不同的包管理系统和工具。 sudo apt-get install: 这是在Debian、Ubuntu等基于Debian的系统上用于从…

Linux下C程序的编写

Linux下C程序的编写 第一部分&#xff1a;编写C程序并使用gcc编译器 首先&#xff0c;我们编写一个简单的C程序hello_gcc.c&#xff0c;用于在屏幕上输出“Hello gcc&#xff01;”。 // hello_gcc.c #include <stdio.h> int main() { printf("Hello gcc!\n&…

牛客周赛 C-苗苗的气球

原题链接&#xff1a;C-苗苗的气球 题目大意&#xff1a;n种气球&#xff0c;给出每种气球的个数&#xff0c;二种不同的气球相碰会爆炸&#xff0c;问最后留下来的气球有几种可能性。 思路&#xff1a;从特殊到一般&#xff0c;如果是一种气球&#xff0c;那么答案肯定是1&a…

mysql [Err] 1118 - Row size too large (> 8126).

1.找到my.ini文件 1.1 控制台输入以下指令&#xff0c;打开服务 services.msc1.2 查看mysql服务的属性 2.停止mysql服务&#xff0c;修改my.ini文件并且保存 innodb_strict_mode03.重启mysql服务 4.验证是否关闭成功 show variables like %innodb_strict_mode%; show vari…

【华为免费实战课】基于ENSP实现企业园区网组网项目实战

带你一起走进网工的世界&#xff01; 2024年G-LAB【华为实战公开课】即将开始啦&#xff01;华为实战千万别错过&#xff01; 公开课为期四天&#xff0c;6月18日-6月21日晚20&#xff1a;00开始 关注 工 仲 好&#xff1a;IT运维大本营&#xff0c;私信glab-mary&#xff0…

算法课程笔记——线段树维护哈希

算法课程笔记——线段树维护哈希 提前空出来

FastAdmin后台开发框架 lang 任意文件读取漏洞复现

0x01 产品简介 FastAdmin是一款基于PHPBootstrap的开源后台框架&#xff0c;专为开发者精心打造。它基于ThinkPHP和Bootstrap两大主流技术构建&#xff0c;拥有完善的权限管理系统和一键生成CRUD等强大功能。FastAdmin致力于提高开发效率&#xff0c;降低开发成本&#xff0c;…

git error: does not have a commit checked out fatal: adding files failed

git add net error: net/ does not have a commit checked out fatal: adding files failed这个错误是因为尝试将一个尚未被提交的文件夹添加到Git中。解决这个问题的方法是先将文件夹中的文件提交到Git仓库中&#xff0c;然后再将文件夹添加到Git中。 首先&#xff0c;需要进…

苏州辰安塑业携塑料托盘、塑料物流箱解决方案亮相2024杭州快递物流展

苏州辰安塑业携塑料托盘、吹塑托盘、塑料卡板箱、塑料周转箱、塑料物流箱、塑料垃圾桶解决方案盛装亮相2024杭州快递物流展&#xff01; 展位号&#xff1a;3C馆A51 苏州辰安塑业有限公司&#xff0c;是一家专业从事塑料托盘、吹塑托盘、塑料卡板箱、塑料周转箱、塑料物流箱、…

【计算机毕业设计】235基于微信小程序点餐系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

CentOS搭建kubernetes集群详细过程(yum安装方式)

kubernetes集群搭建详细过程&#xff08;yum安装方式&#xff09; Kubernetes&#xff0c;也被称为K8s&#xff0c;是一个多功能的容器管理工具&#xff0c;它不仅能够协调和调度容器的部署&#xff0c;而且还能监控容器的健康状况并自动修复常见问题。这个平台是在谷歌十多年…

减肥药实质利好服装业:身材好了,更时尚了 1-5月份,新建商品房销售面积同比下降20.3%

减肥药实质利好服装业&#xff1a;身材好了&#xff0c;更时尚了 减肥成功的顾客纷纷瞄准性感look&#xff0c;不但促进了销售&#xff0c;还给服装品牌节省了成本&#xff0c;因为小尺寸的衣服使用的面料更少。大码女装&#xff0c;可能是下一个被 GLP-1减肥神药杀死的行业。…

基于ChatGPT-4o自然科学研究全流程实践技术应用

自然科学研究遵循严谨的科学方法论&#xff0c;包括文献调研、问题综述、试验设计、提出假设、数据清洗、统计诊断、大数据分析、经典统计模型&#xff08;回归模型、混合效应模型、结构方程模型、Meta分析模型&#xff09;、参数优化、机器/深度学习、大尺度模型构建与模拟、论…

万字长文详述 - 带你了解Jvm虚拟机运行时数据区

JVM虚拟机&#xff0c;对大部分Java程序员而言&#xff0c;是既熟悉又陌生的存在&#xff0c;Java程序在虚拟机的自动内存管理机制帮助下&#xff0c;减少了绝大部分的内存管理工作。但也正是因为如此&#xff0c;虚拟机如果出现了内存溢出或者泄露的情况&#xff0c;问题排查、…

C++ SIMD性能优化

// 使用SIMD指令优化的向量加法 //<mmintrin.h> MMX //<xmmintrin.h> SSE //<emmintrin.h> SSE2 //<pmmintrin.h> SSE3 //<tmmintrin.h> SSSE3 //<smmintrin.h> SSE4.1 //<nmmintrin.h> SSE4.2 //<wmmintrin.h> AES //<imm…

一文细谈SNN的基本数学原理,LIF模型,STDP与STBP学习方法

首先本文是读完 如何看待第三代神经网络SNN&#xff1f;详解脉冲神经网络的架构原理、数据集和训练方法 原创-CSDN博客 一文通俗入门脉冲神经网络(SNN)第三代神经网络-CSDN博客 两篇文章的总结&#xff0c;文章仅用于学习。 本文主要讨论STDP和STBP方法。 我们都知道&…

JavaEE、SSM基础框架、JavaWeb、MVC(认识)

目录 一、引言 &#xff08;0&#xff09;简要介绍 &#xff08;1&#xff09;主要涉及的学习内容 &#xff08;2&#xff09;学习的必要性 &#xff08;3&#xff09;适用学习的人群&#xff08;最好有这个部分的知识基础&#xff09; &#xff08;4&#xff09;这个基础…

FFmpeg中内存分配和释放相关的源码:av_malloc函数、av_mallocz函数、av_free函数和av_freep函数分析

一、av_malloc函数分析 &#xff08;一&#xff09;av_malloc函数的声明 av_malloc函数的声明放在在FFmpeg源码&#xff08;本文演示用的FFmpeg源码版本为5.0.3&#xff0c;该ffmpeg在CentOS 7.5上通过10.2.1版本的gcc编译&#xff09;的头文件libavutil/mem.h中&#xff1a;…

Science | 稀土开采威胁马来西亚的生物多样性

马来西亚是一个生物多样性热点地区&#xff0c;拥有超过17万种物种&#xff0c;其中1600多种处于濒临灭绝的风险。马来西亚的热带雨林蕴藏了大部分的生物多样性&#xff0c;并为全球提供重要的生态系统效益&#xff0c;同时为土著社区带来经济和文化价值。同时马来西亚具有可观…