大模型的训练与应用 | 七、进阶的RAG技术(上篇):分块和矢量化、搜索的索引、Rerank和过滤_agi

一、分块和矢量化

在处理自然语言处理(NLP)任务时,特别是在使用transformer模型进行文本分析和搜索时,分块和矢量化是两个关键步骤。

  • 向量索引和查询向量:首先,需要将文档内容转换成向量形式,这通常通过使用预训练的transformer模型来实现。这些向量可以被存储在一个索引中,以便快速检索与查询向量最接近的语义。
  • 分块技术:由于transformer模型有固定的输入序列长度限制,因此需要将长文本分割成较小的块,以便模型能够有效处理。这些块应该是语义上完整的单元,如句子或段落,而不是随意切分的片段。
    (简单来说:计算机一次只能处理一定量的词,所以我们需要把长文章分成小段,比如一个个句子。这样,计算机就可以一段一段地理解文章了。)
  • NodeParser:在LlamaIndex中,NodeParser是一个工具,它允许用户定义文本的分割方式,包括自定义文本分割器、处理元数据以及定义节点或块之间的关系。
  • 数据块大小:块的大小取决于所使用的嵌入模型和它的token容量。例如,BERT模型通常限制在512个token以内,而OpenAI的ada-002模型可以处理更长的序列,达到8191个token。选择块的大小需要在保持足够上下文以供模型推理和确保文本嵌入有效性之间找到平衡。
  • 嵌入模型的选择:为了生成块的嵌入,可以选择专门的搜索优化模型,如bge-large或E5系列。这些模型可能在特定任务上进行了优化,以提供更好的搜索结果。
  • MTEB排行榜:MTEB(Model The Efficient BERT)排行榜是一个资源,可以提供关于最新和最有效的NLP模型的信息,这些模型可能用于文本嵌入和搜索任务。

在实际应用中,选择合适的分块策略和嵌入模型对于提高搜索的准确性和效率至关重要。此外,还需要考虑如何将分块后的向量与查询向量进行比较,以找到最相关的结果。这通常涉及到距离度量(如余弦相似度)和可能的后处理步骤,以优化搜索结果的相关性。


二、搜索的索引

面向RAG的大模型应用的关键部分是用于搜索的索引,它存储前面得到的向量化内容。

  • 向量化内容的索引:在处理大型模型(如RAG)的应用时,需要一个索引来存储文本内容的向量化形式。这允许快速检索与查询向量最接近的语义内容。
  • 查询和块的向量化:在搜索过程中,查询首先被向量化,然后系统在索引中查找与这些查询向量距离最近的块向量。
  • 平铺索引:最基本的索引实现是平铺索引,它通过遍历所有块向量并计算与查询向量之间的距离来进行搜索。
  • 高效的向量索引:为了在大规模数据集上实现有效的检索,需要使用如faiss、nmslib或annoy等高效的向量索引库,它们采用近似最近邻搜索技术,如聚类、树结构或HNSW算法。
  • 管理型解决方案:还存在一些管理型解决方案,如Elasticsearch或专门的向量数据库,它们不仅提供索引功能,还负责数据摄取和处理流程。
  • 元数据与向量存储:根据索引的选择,可以同时存储元数据和向量,使用元数据过滤器根据特定条件(如日期或数据源)进行搜索。
  • LlamaIndex的索引支持:LlamaIndex支持多种向量存储索引,并提供其他索引实现,如列表索引、树索引和关键字表索引。
  • 双索引策略:对于大型文档集合,可以创建两个索引:一个用于摘要,一个用于文档块,以分两步进行搜索,首先通过摘要过滤,然后对相关块进行详细搜索。
  • 大模型的训练与应用 | 七、进阶的RAG技术(上篇):分块和矢量化、搜索的索引、Rerank和过滤_agi_02

  • 问题生成与向量化:可以要求大型语言模型(LLM)为每个块生成问题,并将这些问题向量化,然后在运行时使用这些问题向量进行搜索,以提高搜索质量。
  • HyDE方法:HyDE是一种反向逻辑方法,它要求LLM为给定查询生成假设响应,然后使用这个响应的向量与查询向量来提高搜索质量。
  • 上下文添加:为了提高搜索质量,可以为LLM添加周围的上下文,这可以通过句子窗口检索或父文档检索实现。
  • 句子窗口检索:在句子窗口检索中,每个句子都被单独嵌入,以提供高准确性的上下文搜索。
  • 父文档检索:父文档检索涉及将文档拆分成块的层次结构,并在检索期间使用父块作为上下文。
  • 稀疏检索算法:可以结合使用稀疏检索算法(如tf-idf或BM25)和向量搜索,以获得最佳结果。
  • 集成检索器和RRF:在LangChain或LlamaIndex中,集成检索器可以实现多种检索器的组合,并使用RRF算法进行结果的重新排序。
  • 混合或融合搜索:混合搜索结合了语义相似性和关键字匹配,以提供更全面的检索结果。
  • 大模型的训练与应用 | 七、进阶的RAG技术(上篇):分块和矢量化、搜索的索引、Rerank和过滤_人工智能_03


三、Rerank和过滤

在得到了检索结果后,需要通过过滤来重新排序。LlamaIndex 提供了多种可用的后处理程序,根据相似度评分、关键词、元数据过滤掉结果,或者用其他模型对结果进行重新排序,比如基于句子transformer的交叉编码器、 根据元数据(比如日期最近性)内聚重新排序等等。

  • 检索结果的初步获取:在使用索引进行搜索后,我们通常会得到一个初步的检索结果列表,这个列表包含了与查询向量距离最近的文档块或句子。
  • 过滤(Filtering):过滤是后处理程序的一部分,它根据特定的标准(如相似度评分、关键词匹配、元数据条件等)来筛选和排除不相关的结果。
  • 重新排序(Reranking):在过滤之后,可能会使用其他模型对剩余的结果进行重新排序。这个过程称为重新排序,目的是进一步优化结果的相关性。
  • 使用LlamaIndex的后处理程序:LlamaIndex提供了多种后处理程序,这些程序可以基于不同的标准对检索结果进行过滤和重新排序。
  • 相似度评分:可以使用相似度评分作为过滤和重新排序的依据。例如,只保留评分高于某个阈值的结果。
  • 关键词过滤:根据查询中的关键词对结果进行过滤,只保留包含这些关键词的文档块。
  • 元数据过滤:利用元数据(如作者、日期、来源等)进行过滤,例如,只保留最近一周内发布的文档。
  • 使用模型进行重新排序:可以使用基于句子的transformer模型(如交叉编码器)来评估和重新排序结果。这些模型能够更深入地理解文本的语义内容。
  • 元数据内聚性:根据元数据的内聚性对结果进行重新排序,例如,优先显示来自同一作者或同一来源的结果。
  • 提供上下文给LLM:过滤和重新排序后的最终结果将作为上下文提供给大型语言模型(LLM),以便生成更准确和相关的回答。

Rerank和过滤是将检索到的上下文提供给LLM以获得结果答案之前的最后一步,确保了提供给模型的信息是最相关和最有用的。

通过这一过程,可以显著提高检索系统的性能,确保用户或系统能够得到最准确和最有价值的信息。