提升RAG性能:分块后,Chunk Enrichment的2个关键优化步骤不可错过
背景
在 Retrieval Augmented Generation (RAG,检索增强生成) 系统中,分块(chunking)是一个基础而关键的步骤,它将较大的文档分割成更小的文本块,以便后续处理和检索。虽然分块能够提高文档处理效率,但这些分块可能仍然包含冗余信息、噪声或缺乏上下文支持,从而影响检索和生成的效果。为了提升检索质量,微软提出了**“Chunk Enrichment Phase”**(分块优化阶段)这一概念,通过对文本块进行清理和增强,显著提高 RAG 系统的性能。
本文将详细探讨 chunk enrichment(分块优化)如何优化 RAG 系统,重点介绍其两个关键步骤——分块清理(chunk cleaning)和分块增强(chunk augmentation),并讨论大模型在其中的作用及其成本考量。
1. 什么是 Chunk Enrichment,它为何重要?
Chunk enrichment(分块优化)是对分块后的文档块进行修改和增强的过程,主要包括两个方面:
- 分块清理:通过去除噪声和冗余信息,提升文本向量的语义质量。
- 分块增强:通过附加元数据(如标题、摘要、关键词等),扩展文本块的上下文信息,提升检索的灵活性和准确性。
在 RAG 系统中,分块的目的是为了使得信息检索更加精准,而chunk enrichment则通过增强文本块的语义匹配度和扩展查询能力,进一步提升检索和生成的效果。例如,清理后的文本能够提高向量数据库在进行相似性检索时的精度,而丰富的元数据则可以支持更复杂的查询,例如关键词检索、条件过滤等。
增强以后的数据
2. Chunk Enrichment 的两个关键步骤
2.1 核心概念
为了更好地理解 chunk enrichment,首先需要明确一些关键概念:
- 分块(chunking):将较大的文档分割成更小的文本块,每个文本块包含一个主题或一个完整的单元。
- 向量检索(vector search):将文本转换为向量表示,通过比较查询与文本块向量之间的相似度,来检索最相关的内容。
- 语义匹配(semantic matching):通过向量的语义表示,而非字面匹配,来提高匹配精度。
- 元数据(metadata):附加到分块上的附加信息,用于过滤、排序或增强搜索能力。
2.2 分块清理(Chunk Cleaning):提升向量检索性能
分块清理的目的是提升向量的语义一致性,减少噪声。主要步骤包括:
- 统一字符形式(Standardizing character forms):例如,将繁体字转换为简体字,确保文本的一致性。
- 去除停用词(Removing stop words):去除无实际意义的词(如“的”、“是”等),以减少向量中的噪声。
- 清理标点符号(Removing punctuation):去掉中文中的标点符号(如“。”、“,”,)以消除不必要的干扰。
- 分词与词形标准化(Tokenization and text normalization):例如,对中文文本进行正确分词,并纠正拼写错误或非标准字符。
- 数字和特殊字符处理(Handling numerals and special characters):将数字和特殊符号转换为对应的文字形式,提高语义一致性。
示例:假设我们有一段原始文本:原文:我今天吃了两个苹果。
- 分词(Tokenization):我 | 今天 | 吃 | 了 | 两 | 个 | 苹果
- 去除停用词(Removing stop words):我 | 吃 | 两 | 个 | 苹果
- 简体字转换(Simplifying characters):如果文本是繁体字,则转换为简体字。
- 去除标点(Removing punctuation):我吃两个苹果。
这些清理步骤帮助去除文本中的噪声,提升向量在检索时的匹配精度。
为什么要同时存储原始版本和清理后的版本?存储原始的未清理文本非常重要,因为用户很可能希望查看完整的原始文档,而不希望在清理过程中做任何修改。清理后的文本块主要用于向量嵌入和向量检索,但当检索结果返回给用户时,原始文本块能够确保与源文档的一致性。
2.3 分块增强(Chunk Augmentation):扩展检索能力
分块增强通过添加元数据来扩展检索能力,常见的元数据包括:
- ID:为每个分块分配唯一标识符,用于去重和管理。
- 标题与摘要(Title and Summary):生成简短的标题和详细的摘要,帮助提高检索效率和准确性。
- 关键词与实体(Keywords and Entities):提取分块中的关键信息或命名实体,如人名、地名、组织名等。
- 可回答的问题(Questions the chunk can answer):为每个分块生成可能的提问,帮助系统在查询时更好地匹配相关内容。
示例:假设我们对“我今天吃了两个苹果”这段文本进行增强:
- 标题:今日苹果食用记录
- 摘要:描述了今天吃了两个苹果的事件。
- 关键词:苹果、吃、今天
- 问题:今天吃了什么?吃了几个苹果?
例如,通过为每个文本块生成标题和摘要,用户可以在查询时首先查看文本块的简要信息,提高查询效率。此外,生成关键词和实体可以增强关键词检索的准确性,尤其是在面对大规模数据时,能够帮助更好地定位到相关的文档片段。
上图展示了完全丰富内容的 JSON,并描述了搜索平台如何使用元数据。
3. 大模型在 Chunk Enrichment 中的作用
3.1 语言模型如何用于 Chunk Enrichment?
在 chunk enrichment 中,大语言模型(如 GPT 系列、Claude、BERT 等)主要用于生成和扩展元数据。具体应用包括:
- 生成元数据:语言模型能够自动生成标题、摘要、关键词等元数据,减少人工干预。
- 语义扩展:通过生成语义上等效的文本变体(如同义词替换或改写),帮助扩展检索范围。
- 文本清理:语言模型能够对文本进行自动清理,提升文本的语义一致性,避免噪声干扰。
例如,使用大模型可以根据文本块内容生成一段简洁的标题或一份详细的摘要,使得文本块在检索时更加易于识别。
3.2 Chunk Enrichment 的成本考量
尽管大模型在分块优化中发挥着重要作用,但其计算成本和经济成本不容忽视。具体而言:
- 计算成本(Computational cost):大模型进行文本清理和元数据生成时需要消耗大量的计算资源,特别是处理大规模数据时。
- 经济成本(Monetary cost):大规模的 chunk enrichment 可能涉及高昂的云计算费用,尤其是在使用大模型进行文本处理时。
因此,在实际应用中,需要权衡成本和效益。对于一些小规模或中等规模的项目,可能不需要对所有数据块都进行增强,而是根据查询需求选择性地对分块进行优化。
4. 总结
通过chunk enrichment(分块优化),我们可以显著提高 RAG 系统的检索和生成效果。通过清理文本和增强元数据,chunk enrichment 不仅提升了向量检索的精度,还增强了检索过程中的灵活性。大模型在此过程中起到了重要作用,尤其是在生成元数据、语义扩展以及文本清理方面,能够减少人工干预并提升处理效率。然而,优化的成本问题也需考虑,在实际应用中需平衡性能和经济性。
未来,随着大模型和向量检索技术的进一步发展,chunk enrichment 可能会得到更加高效和创新的应用,进一步提升 RAG 系统的整体性能。希望本文能为读者提供一个清晰的框架,帮助理解如何通过分块优化提升 RAG 系统的检索能力和生成效果。
参考链接
- https://learn.microsoft.com/en-us/azure/architecture/ai-ml/guide/rag/rag-enrichment-phase
- https://jsaer.com/download/vol-7-iss-8-2020/JSAER2020-7-8-205-210.pdf
- https://licor.me/post/chinese-text-cluster-hands-on
- https://huggingface.co/heack/HeackMT5-ZhCleanText1ML
本文转载自 非架构,作者: 非架构