当前位置: 首页 > news >正文

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

相关文章:

  • 震坤行与洛轴集团展开深化合作 以满足客户不断变化的需求
  • AI写代码,CS还有前途吗?加州大学伯克利分校:CDSS申请人数激增48%!
  • CesiumJS【Basic】- #006 浏览器控制台查看位置角度
  • “Redis中的持久化:深入理解RDB与AOF机制“
  • 深度学习训练——batch_size参数设置过大反而训练更耗时的原因分析
  • HCIA6以太网基础基于MAC划分VLAN
  • 数据库-数据定义和操纵-DDL语言的使用
  • 线性表嘻嘻嘻
  • LLM中表格处理与多模态表格理解
  • 万字长文详述 - 带你了解Jvm虚拟机运行时数据区
  • git 如何强制下拉某个分支
  • 微调大模型 - 面向学术论文的AI大模型
  • redis 笔记2之哨兵
  • 太速科技-FMC213V3-基于FMC兼容1.8V IO的Full Camera Link 输入子卡
  • 实施细则!2024年四川省科学技术奖励办法申报条件、要求、对象及材料整理
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • canvas 绘制双线技巧
  • Docker下部署自己的LNMP工作环境
  • HTTP请求重发
  • JavaScript设计模式之工厂模式
  • javascript数组去重/查找/插入/删除
  • js面向对象
  • Lsb图片隐写
  • Mybatis初体验
  • Python 反序列化安全问题(二)
  • Python利用正则抓取网页内容保存到本地
  • React的组件模式
  • Theano - 导数
  • ubuntu 下nginx安装 并支持https协议
  • WePY 在小程序性能调优上做出的探究
  • 笨办法学C 练习34:动态数组
  • 彻底搞懂浏览器Event-loop
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 全栈开发——Linux
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • Java性能优化之JVM GC(垃圾回收机制)
  • 第二十章:异步和文件I/O.(二十三)
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​iOS安全加固方法及实现
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​香农与信息论三大定律
  • #QT(智能家居界面-界面切换)
  • #QT项目实战(天气预报)
  • #预处理和函数的对比以及条件编译
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (pojstep1.3.1)1017(构造法模拟)
  • (安卓)跳转应用市场APP详情页的方式
  • (二)JAVA使用POI操作excel
  • (附源码)python房屋租赁管理系统 毕业设计 745613