首页 > 其他分享 >知识库的创建(1) - KnowledgeFile文件加载和分割

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

时间:2024-06-17 17:32:48浏览次数:32  
标签:splitter 知识库 docs self KnowledgeFile 文档 text 加载

文章目录


前言

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


一、 类的初始化方法 __init__

def __init__(
        self,
        filename: str,
        knowledge_base_name: str,
        loader_kwargs: Dict = {},
):
    '''
    对应知识库目录中的文件,必须是磁盘上存在的才能进行向量化等操作。
    '''
    self.kb_name = knowledge_base_name
    self.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_kwargs
    self.filepath = get_file_path(knowledge_base_name, filename)
    self.docs = None
    self.splited_docs = None
    self.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 = docs
    return 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 类提供了对知识库中文件的管理功能,包括文件的加载、文本的分割和处理等。通过该类,可以方便地对知识库中的文件进行操作,并进行进一步的自然语言处理和分析。

标签:splitter,知识库,docs,self,KnowledgeFile,文档,text,加载
From: https://blog.csdn.net/kljyrx/article/details/139749469

相关文章

  • 如何手撸一个自有知识库的RAG系统
    RAG通常指的是"Retrieval-AugmentedGeneration",即“检索增强的生成”。这是一种结合了检索(Retrieval)和生成(Generation)的机器学习模型,通常用于自然语言处理任务,如文本生成、问答系统等。我们通过一下几个步骤来完成一个基于京东云官网文档的RAG系统数据收集建立知识库向......
  • Chromium源码阅读:从页面加载到元素展示(1)
    ​从<p>helloworld</p>.html到界面上的helloworld今天,我们一起来看看一个html元素,是如何绘制到界面上。我们选择了最简单的场景,便于快速掌握总体的流程,加深之前阅读知识的印象。准备环境首先,我们保存这段html:<html><body><p>Helloworld</p></body><......
  • ZynqMP PL固件通过U-BOOT从指定位置加载FPGA BIT
    原因PL固件可能经常修改,而BOOT.BIN和文件系统、内核实际上基本不会变,在一个平台上可以用同一份。如果每次修改都要重新打包PL固件到BOOT.BIN,操作起来非常麻烦。所以希望PL的固件可以直接从指定位置加载。典型的可以从SD卡的FAT32分区加载。https://xilinx-wiki.atlassian.net/......
  • 用python写一个企业知识库算法
    企业知识库算法是一个用于管理和检索企业内部知识的系统。在这个例子中,我们将使用Python编写一个简单的企业知识库算法,该算法将实现以下功能:1.添加知识条目2.搜索知识条目我们将使用一个字典来存储知识库中的知识条目。每个知识条目都是一个字典,包含以下字段:-id:知识条......
  • Spring配置文件的加载、解析
    Spring的核心流程是读取配置文件,解析并封装成BeanDefinition,并将所有的BeanDefinition收集到一个叫DefaultListableBeanFactory的容器中。一、setConfigLocation设置配置路径方便后续对其进行解析二、refresh方法,解析并封装BeanDefinition该方法中有几个重要的方法1.obtainF......
  • JVM类加载机制
    类加载机制概述类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为连接(Link)。初始化的单例......
  • 开源项目QAnything:全能型本地知识库问答系统
    在当今信息爆炸的时代,如何高效地管理和检索大量数据成为了一个重要课题。网易有道推出的开源项目QAnything,正是为了解决这一问题而生。QAnything是一个本地知识库问答系统,支持多种文件格式和数据库,允许用户在离线状态下进行安装和使用。用户只需将任何格式的本地存储文件放入系......
  • 核心(Hutool-core)工具类(SPI加载工具-ServiceLoaderUtil)
    介绍SPI(ServiceProviderInterface),是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。更多介绍见:https://www.jianshu.com/p/3a3edbcd8f24使用定义一个接口:packagecn.hutool.test.spi;publicinterfaceSPIService......
  • 核心(Hutool-core)工具类(类加载工具-ClassLoaderUtil)
    介绍提供ClassLoader相关的工具类,例如类加载(Class.forName包装)等方法获取ClassLoadergetContextClassLoader获取当前线程的ClassLoader,本质上调用Thread.currentThread().getContextClassLoader()getClassLoader按照以下顺序规则查找获取ClassLoader:获取当前线程的Context......
  • mybatis-plus加载多个module的mapper踩坑记录
    背景 有一个多模块的项目,每个模块中都有自己的mapper.xml文件。但是在执行一次SQL查询中,mybatis却报出了下面的异常 排查过程第一步,先检查mapper扫描是否正确 先找到这个方法的位置 可以看到包名是com.pinming.security.responsibility.mapper 检查SpringBoot......