文章目录
- 前言
- 一、 类的初始化方法 `__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. 初始化步骤
- 设置知识库名称 (
kb_name
)。 - 将文件名转换为 POSIX 路径格式 (
filename
)。 - 获取文件扩展名并转换为小写 (
ext
)。 - 检查文件扩展名是否受支持,不支持则抛出异常。
- 设置加载器的额外参数 (
loader_kwargs
)。 - 生成文件路径 (
filepath
)。 - 初始化文档内容 (
docs
) 和分割后的文档 (splited_docs
) 为None
。 - 根据文件扩展名获取相应的加载器类名 (
document_loader_name
)。 - 设置文本分割器名称 (
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) 如果 docs
为 None
或 refresh
为 True
,则重新加载文档。
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_docs
为 None
或 refresh
为 True
,则重新加载并分割文档:
- 调用 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
类提供了对知识库中文件的管理功能,包括文件的加载、文本的分割和处理等。通过该类,可以方便地对知识库中的文件进行操作,并进行进一步的自然语言处理和分析。