Skip to content

knowledge

Matrix-X edited this page Aug 26, 2024 · 4 revisions

知识库

Indexing

创建知识库的过程包括内容的抽取、分段逻辑的应用、向量化检索的建立,以及向量化存储的实现。以下是详细步骤:

解析不同文件类型(Parsing)

根据不同的文件类型,你需要有很多解析器来支持,还好这些都有成熟的工具,而且Langchain和LLamaIndex都有自己的加载器来支持不同文件了行

内容抽取(Extract)

在这一步,我们将从不同类型的文档中提取内容,内容可以是:

  • 非结构化文档:如PDF、Word等。
  • 结构化文档:如Excel、CSV等。

抽取范围

  • 按照预设的规则,抽取文档中的内容。content 可以是PDF中的一页,也可以是长段的文本。
  • 可以通过 process_ruleextract 规则来约定抽取的具体范围。

解析内容

  • 对提取出的 content 进行解析,将其分为 TextBlock(文本块)、ImageBlock(图像块)和 TableBlock(表格块)等不同类型的块。

这里有自定义的解析规范,基于Block,也可以依赖于Langchain或者LLamaIndex的方法提供

分段逻辑(Split)

在内容抽取完成后,进行内容的重新分段。默认使用Langchain的RecursiveCharactorTextSplitter的拆分策略

清洗

按照处理规则,进行清洗,比如邮件信息,url等,可选清除。

排序与分段

  • 根据 blockrect.Y0 进行排序,生成一个内容列表。
  • 通过 process_rule 对列表进行分段,生成 DocumentSegment。每个 segment 会映射为两种类型的向量对象:TextNodeImageNode

分段策略

  1. 文档类型分析

    • 根据文档类型选择分割策略,如按段落、章节或句子进行分割。
  2. 文本长度控制

    • 检查分割后的每个 Segment 长度,太短的可以与相邻的 Segment 合并,太长的则进一步细分。
  3. 语义完整性

    • 确保在句子或语义紧密连接处不会进行分割,以保持每个 Segment 的语义完整性。
  4. 特殊结构处理

    • 对文档中的列表、表格、图像等特殊结构进行独立分割,并附带相关元数据。
  5. 元数据附加

    • 为每个 Segment 添加元数据,如来源页码、位置索引、类型标签等,以便后续检索和分析。
  6. 特定需求定制

    • 根据应用场景调整分割策略,如为问答系统选择更细粒度的分割,以精确匹配问题和答案。
然后判断每段是否超过了固定长度,比如800字符。如果超过了,则需要按照800字符内,最后一个句号来二次切分,如果有图片或者表格,则需要保证不会被切割破坏。

建立向量化检索(Indexing)

  • DocumentSegment 列表进行向量化处理。
  • 使用预设的 embedding model 将内容转化为向量表示,便于后续检索。

向量化存储(VectorStore)

  • 通过不同的向量数据库将向量数据存储起来。
  • 系统封装了驱动,可以根据需求使用不同的框架或SDK来实现存储功能。

召回知识

1. 基于向量化检索

  • 使用向量化检索功能,从已存储的知识库中召回相关数据。
  • 通过相似度匹配,快速找到最相关的内容。

缓存机制

alt text

alt text

Clone this wiki locally