对rag到底需要什么样的数据的调研和思考
对rag知识库数据的处理步骤
NO.1 数据清洗
高性能RAG系统依赖于准确且清洁的原始知识数据。一方面为了保证数据的准确性,我们需要优化文档读取器和多模态模型。特别是处理如CSV表格等文件时,单纯的文本转换可能会丢失表格原有的结构。因此,我们需引入额外的机制以在文本中恢复表格结构,比如使用分号或其他符号来区分数据。另一方面我们也需要对知识文档做一些基本数据清洗其中可以包括:
a)基本文本清理:规范文本格式,去除特殊字符和不相关信息。除重复文档或冗余信息。
b)实体解析:消除实体和术语的歧义以实现一致的引用。例如,将“LLM”、“大语言模型”和“大模型”标准化为通用术语。
c)文档划分:合理地划分不同主题的文档,不同主题是集中在一处还是分散在多处?如果作为人类都不能轻松地判断出需要查阅哪个文档才能来回答常见的提问,那么检索系统也无法做到。
d)数据增强:使用同义词、释义甚至其他语言的翻译来增加语料库的多样性。
e)用户反馈循环:基于现实世界用户的反馈不断更新数据库,标记它们的真实性。
f)时间敏感数据:对于经常更新的主题,实施一种机制来使过时的文档失效或更新。
NO.2 分块处理
在RAG系统中,文档需要分割成多个文本块再进行向量嵌入。在不考虑大模型输入长度限制和成本问题情况下,其目的是在保持语义上的连贯性的同时,尽可能减少嵌入内容中的噪声,从而更有效地找到与用户查询最相关的文档部分。如果分块太大,可能包含太多不相关的信息,从而降低了检索的准确性。相反,分块太小可能会丢失必要的上下文信息,导致生成的回应缺乏连贯性或深度。在RAG系统中实施合适的文档分块策略,旨在找到这种平衡,确保信息的完整性和相关性。一般来说,理想的文本块应当在没有周围上下文的情况下对人类来说仍然有意义,这样对语言模型来说也是有意义的。
分块方法的选择:
固定大小的分块:这是最简单和直接的方法,我们直接设定块中的字数,并选择块之间是否重复内容。通常,我们会保持块之间的一些重叠,以确保语义上下文不会在块之间丢失。与其他形式的分块相比,固定大小分块简单易用且不需要很多计算资源。
内容分块:顾名思义,根据文档的具体内容进行分块,例如根据标点符号(如句号)分割。或者直接使用更高级的NLTK或者spaCy库提供的句子分割功能。
递归分块:在大多数情况下推荐的方法。其通过重复地应用分块规则来递归地分解文本。例如,在langchain中会先通过段落换行符(\\n\\n
)进行分割。然后,检查这些块的大小。如果大小不超过一定阈值,则该块被保留。对于大小超过标准的块,使用单换行符(\\n
)再次分割。以此类推,不断根据块大小更新更小的分块规则(如空格,句号)。这种方法可以灵活地调整块的大小。例如,对于文本中的密集信息部分,可能需要更细的分割来捕捉细节;而对于信息较少的部分,则可以使用更大的块。而它的挑战在于,需要制定精细的规则来决定何时和如何分割文本。
从小到大分块:既然小的分块和大的分块各有各的优势,一种更为直接的解决方案是把同一文档进行从大到小所有尺寸的分割,然后把不同大小的分块全部存进向量数据库,并保存每个分块的上下级关系,进行递归搜索。但可想而知,因为我们要存储大量重复的内容,这种方案的缺点就是需要更大的储存空间,
特殊结构分块:针对特定结构化内容的专门分割器。这些分割器特别设计来处理这些类型的文档,以确保正确地保留和理解其结构。langchain提供的特殊分割器包括:Markdown文件,Latex文件,以及各种主流代码语言分割器。
分块大小的选择:
上述方法中无一例外最终都需要设定一个参数——块的大小,那么我们如何选择呢?首先不同的嵌入模型有其最佳输入大小。比如Openai的text-embedding-ada-002的模型在256 或 512大小的块上效果更好。其次,文档的类型和用户查询的长度及复杂性也是决定分块大小的重要因素。处理长篇文章或书籍时,较大的分块有助于保留更多的上下文和主题连贯性;而对于社交媒体帖子,较小的分块可能更适合捕捉每个帖子的精确语义。如果用户的查询通常是简短和具体的,较小的分块可能更为合适;相反,如果查询较为复杂,可能需要更大的分块。实际场景中,我们可能还是需要不断实验调整,在一些测试中,128大小的分块往往是最佳选择,在无从下手时,可以从这个大小作为起点进行测试。
下面这个介绍了5中分割的方式
RAG的5种文本分块策略#Text Splitting-CSDN博客
No.3 RAG的影响因素
关于原始文本数据量,RAG的性能并不直接取决于原始文本数据的数量,而是取决于外部知识库的质量、覆盖范围以及与任务相关的信息。然而,以下是RAG所需原始文本数据的一些考虑因素:
- 外部知识库:RAG使用外部数据库作为知识来源。这些数据库可以包含各种文本数据,例如维基百科、专业领域的论文、新闻文章等。外部知识库的规模和内容对RAG的性能至关重要。
- 文本分块策略:将外部知识库划分为适当大小的文本块是RAG的关键步骤。这些文本块应该足够大,以包含有用的信息,但又不至于过大,以避免检索和生成的效率下降。不同的文本分块策略可能需要不同数量的原始文本数据
- 检索效率:RAG的性能还受到检索过程的影响。更大的外部知识库可能需要更复杂的检索算法,因此需要更多的原始文本数据来构建索引和优化检索效率。
总之,RAG的性能不仅取决于原始文本数据的数量,还受到外部知识库的质量、文本分块策略和检索效率的影响。因此,具体的数据量要根据任务需求和外部知识库的特点来确定。
二、对我们原本数据集的观察
本来对我们下载到的书籍数据有两种处理思路:
1.
2.
但是,再次观察我们下载好的书籍数据后,发现。。。
结果是放弃自己做数据集的思路,换成别人做好的数据集
❤️Emotional First Aid Dataset, 心理咨询问答语料库_数据集-阿里云天池 (aliyun.com)
Mike/Chinese-Psychological-QA-DataSet - 码云 - 开源中国 (gitee.com)
GitHub - chatopera/efaqa-corpus-zh: ❤️Emotional First Aid Dataset, 心理咨询问答、聊天机器人语料库