An's Blog
收藏、分享 …
Toggle navigation
Home
Cesium
SuperMap
ArcGIS
MapboxGL
CentOS
GeoServer
Favorites
Archives
Tags
大模型入门到精通(RAG知识库)——数据清洗
2025-02-12 17:08:36
2
0
0
admin
## **1. 数据清洗** 在构建知识库时,数据清洗是一个非常重要的步骤,其目的是为了确保知识库中的数据是有序的、优质的和精简的。以下是为什么在知识库搭建过程中需要清洗数据的一些原因: ### **1.1 特点** 1. **提高数据的可读性** 原始数据可能包含许多格式化问题,比如在读取 PDF 文件时常见的换行符(\n)问题。这些换行符在文档中可能是由于排版原因而存在,但在知识库中可能会破坏内容的连贯性,影响可读性。通过清洗数据,可以去除这些不必要的换行符,使文本更加流畅和易读。 2. **减少噪音数据** 噪音数据是指那些对信息的理解没有帮助,甚至可能产生误导的无用数据。例如,文档中多余的空行、格式化字符、无意义的符号等,都会影响文本的质量和理解。清洗数据的过程可以帮助去除这些噪音,保留有用的关键信息。 3. **保证数据的一致性** 知识库中的数据应该具有一致的格式和结构,以便于后续的查询和分析。如果数据格式不一致,例如同一类型的信息在不同文档中以不同的方式呈现,会导致查询复杂化,甚至产生错误的结果。清洗数据有助于确保格式的一致性。 4. **优化存储和处理效率** 冗余和无用的数据不仅占用存储空间,还会增加处理复杂度,导致资源浪费。通过数据清洗,可以删除多余的信息,精简数据结构,从而提高存储和处理的效率。 5. **提升模型的精度** 如果知识库数据是用于训练机器学习或自然语言处理模型的,那么数据的质量直接影响模型的性能。清洗数据可以确保模型的训练集更准确,从而提升模型的精度和有效性。 6. **保持数据的相关性** 在一些情况下,原始文档中可能包含过时或不相关的信息,这些信息可能对当前的知识库没有价值。清洗数据的过程可以帮助筛选出最新的、最相关的信息,确保知识库内容的高质量。 ### **1.2 代码示例:使用正则表达式清洗数据** 以下是一个简单的 Python 代码示例,展示如何使用正则表达式来删除文本中的多余换行符: import re # 原始文本数据(包含多余的换行符) raw_text = "这是一个示例文本。\n\n它被分成了\n多行,\n但实际上是\n一个连续的句子。" # 使用正则表达式删除多余的换行符 cleaned_text = re.sub(r'\n+', ' ', raw_text) # 替换多个连续的换行符为一个空格 cleaned_text = re.sub(r'(?<!\n)\n(?!\n)', ' ', cleaned_text) # 删除单个换行符,但保留段落之间的换行 print("清洗后的文本:") print(cleaned_text) 消除掉空格,•等字符 pdf_page.page_content = pdf_page.page_content.replace('•', '') pdf_page.page_content = pdf_page.page_content.replace(' ', '') print(pdf_page.page_content) ## **2. 向量化Embedding** 在构建向量知识库时,由于文档长度可能超过模型支持的上下文长度,因此需要将文档分割成较小的片段(chunk),以便模型能够有效处理和检索。这是通过 chunk_size 和 chunk_overlap 两个参数来控制分割过程的。通过设置合理的 chunk_size 和 chunk_overlap,可以有效地分割文档,使得模型能够在处理长文档时,依然保持对上下文的理解能力,并且在检索时返回高质量的结果。这种方法在构建高效的向量知识库中非常重要。在检索时,我们会以 chunk 作为检索的元单位,也就是每一次检索到 k 个 chunk 作为模型可以参考来回答用户问题的知识。 ### **2.1 chunk_size(块大小)** chunk_size 指每个块包含的字符或 Token (如单词、句子等)的数量 chunk_size 是指每个文档片段的最大长度(通常以字符或标记数来计量)。这个参数决定了每个 chunk 的大小。较大的 chunk_size 可以包含更多的上下文信息,但也有可能超出模型的处理能力;而较小的 chunk_size 则更容易被模型处理,但可能会丢失一些上下文。 ### **2.2 chunk_overlap(块重叠大小)** chunk_overlap 指两个块之间共享的字符数量,用于保持上下文的连贯性,避免分割丢失上下文信息 chunk_overlap 定义了相邻 chunk 之间的重叠部分的大小。这是为了确保每个 chunk 在分割后,依然保留部分上下文信息,从而在模型处理时,不会因为分割而导致语义的断裂。例如,如果一个句子被分割成两个 chunk,通过 chunk_overlap 保持部分重叠,可以确保两个 chunk 都包含完整的句子信息。 2.3 分割方式的选择 按长度分割:可以简单地按 chunk_size 指定的长度进行分割,然后按 chunk_overlap 进行重叠处理。这种方法适用于内容比较平铺直叙的文档。 按固定规则分割:有时,我们可以根据自然段落、句子或其他语义单位来分割,这种方法需要更复杂的分割逻辑,但能够更好地保持文本的语义完整性。 2.4 实际使用示例 在实际操作中,我们可以通过 LangChain 提供的文本分割器来实现这些功能。 RecursiveCharacterTextSplitter(): 按字符串分割文本,递归地尝试按不同的分隔符进行分割文本。 CharacterTextSplitter(): 按字符来分割文本。 MarkdownHeaderTextSplitter(): 基于指定的标题来分割markdown 文件。 TokenTextSplitter(): 按token来分割文本。 SentenceTransformersTokenTextSplitter(): 按token来分割文本 Language(): 用于 CPP、Python、Ruby、Markdown 等。 NLTKTextSplitter(): 使用 NLTK(自然语言工具包)按句子分割文本。 SpacyTextSplitter(): 使用 Spacy按句子的切割文本。 以下是一个基本的代码示例: from langchain.text_splitter import CharacterTextSplitter # 设置块大小和重叠大小 chunk_size = 500 chunk_overlap = 50 # 初始化文本分割器 text_splitter = CharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap) # 原始文档内容 text = "这是一个非常长的文档内容,需要进行分割处理。..." # 执行分割 chunks = text_splitter.split_text(text) # 打印分割后的 chunks 数量和部分内容 print(f"总共分割为 {len(chunks)} 个 chunk") print(chunks[:2]) # 打印前两个 chunk 作为示例 # 使用递归字符文本分割器 ''' text_splitter = RecursiveCharacterTextSplitter( chunk_size=CHUNK_SIZE, chunk_overlap=OVERLAP_SIZE ) text_splitter.split_text(pdf_page.page_content[0:1000]) ''' 2.5 检索时的应用 在检索时,模型会以 chunk 作为基本的检索单位,返回与查询最相关的 k 个 chunk。这些 chunk 作为模型回答问题的参考知识,k 的值可以根据具体需求和模型的容量进行调整,以平衡性能和答案的准确性。
Pre:
《中国电力行业年度发展报告2024》(发布稿全文)
Next:
Huggingface模型无法git clone解决方案
0
likes
2
Weibo
Wechat
Tencent Weibo
QQ Zone
RenRen
Table of content