来源:互联网 更新时间:2026-08-26 14:13
最近在不少B端和G端的大模型项目里,RAG几乎成了应用落地的标配起点。大家热情很高,但真正动手时,数据预处理这一步往往是第一个“坑”。这篇文章就从RAG实施流程的数据预处理开始聊,重点聊聊文档分割这个环节的一些实操细节。

数据采集是整个RAG系统的地基。具体落地时,可以拆解成“数据源识别”、“数据治理”、“数据清洗”三个步骤。
这一步既要识别内部数据源,也要识别外部数据源,并且要跟RAG应用建立持续更新的机制。举个例子,假设某地产公司想搭建一个RAG系统,用于市场洞察、智能客服和辅助决策这三类场景,那么数据源的识别大概会涉及这些内容:
另一个绕不开的环节是数据治理。这里面包括数据质量管理、安全与隐私保护、合规性管理、数据周期管理、元数据管理等等。数据治理本身是一个很大的主题,这里就不展开了。
这里的“数据清洗”指的是开发一套自动化的数据清洗管道,能够按照数据治理过程中制定好的规则,实时、自动地处理重复数据和错误数据,并且与RAG系统及其他业务系统之间建立良好的数据更新机制。
在Langchain的实现里,像PDF这样的文档,每一页都会转化成一个Document对象。这个对象包含两个属性:page_content和metadata。
page_content就是从文档页面中提取到的文本内容;
metadata是页面的元数据,包括文档来源、页码、文件类型等信息。当LLM生成有洞察力的答案时,会依赖这些元数据追溯到具体的来源。
大语言模型在做Embedding时,有上下文窗口长度的限制——尽管现在一些长上下文模型的窗口越来越大。同时,为了提高检索的准确性和效率,对文档进行分块是必须的。分块时,有几个问题需要仔细掂量:
那固定大小的分块法怎么回事呢?简单说,就是在每个块里固定token数量,再设置一定数量的重叠部分,确保上下文的丰富语义在各块之间能完整保留。
这种方法的优势很明显:逻辑简单,容易实现,不需要复杂的算法或条件判断,直接按字数、词数或字符数来切就行。块的大小固定,处理速度和效率高,尤其是在并行处理或批量操作时,每个块的处理时间差不多,方便系统优化和资源分配。此外,固定分块有助于在后续处理(如检索或编码)时保持一致的输入格式,减少复杂性。
但问题也同样突出:语义完整性不足。如果切在不恰当的位置(比如句子中间、段落中间),就会导致语义不完整或断档,这直接影响检索准确性和生成结果的质量。对于内容密度高或语义复杂的文本,固定分块可能并不适用,容易造成信息丢失或分块数量过多。
相比固定分块,“上下文感知分块”是一种更智能的方式,在传统NLP任务和RAG中应用很广。跟固定分块不同的是,它在分块时会把文本的语义和上下文信息考虑进去,保证每个块都保持语义完整性和连贯性。常见的上下文感知分块方法有这几种:
比如Naive splitting,通过标点符号(句号、问号、感叹号等)来分割。这个方法快速且简单,但可能会在错误的位置分割——比如缩写或数字里的句号(像“Dr. Smith”或“3.14”)也会被当作句子终止符,造成误判。
NLTK这个Python自然语言处理库,提供了基于规则的句子分割器,比如PunktSentenceTokenizer。它使用训练好的模型(如Punkt模型)结合上下文来识别句子边界,比Naive splitting更智能,能处理常见的标点符号误分割问题,比如识别缩写中的句号不作为句子终止符。不过,在复杂语境下,它依然可能出错。
spaCy是另一个强大的自然语言处理库,它的句子分割器利用了依存句法分析和预训练的统计模型来准确识别句子边界。因为结合了依存句法分析,spaCy能更准确地处理复杂句子结构,尤其在处理嵌套从句或其他复杂句法结构时效果更好。它特别适合需要高准确度的句子分割任务,尤其是处理复杂或非标准文本时表现出色。当然,缺点也很明显:计算开销较大,某些语言或特定领域的文本可能需要额外微调。
总结一下:
递归分块算是一种更高级的方法。它通过递归的方式,把文本逐步分割成更小的块。跟普通固定分块不同,递归分块能更好地捕捉文本的层次结构和语义关联,而且能灵活处理各种类型的文本,尤其是那些语义层次复杂的长文档。由于它能捕捉到文本的多层次结构,这对于需要细粒度理解和处理的任务特别有用。
它的工作原理是这样的:
LangChain中的RecursiveCharacterTextSplitter类就能实现递归分块。
对于Markdown和LaTeX这类结构化文本,可以使用专门的分块方法,这样能在拆分过程中保留内容的原始结构。
B端或G端客户的数据通常以多种形态存在,比如PDF里包含图像、表格和文本内容,还有一些文件夹里混着各种常见格式。每种模态都有它独特的挑战和细微差别。构建多模态RAG流程时,必须捕捉并处理这些细微差别。举个例子:

先看这三张图。最左侧的丹霞地貌,很难用文字完全捕捉它的信息——虽然能用文字描述,但整体的“视觉效果”很难完整表达。在多模态RAG中,如果用户查询的是跟这相关的内容,系统可能需要更多地依赖视觉特征的向量来做检索和匹配,而不仅仅是靠文本描述。
中间这张智能驾舱的图示,一部分细节可以用文字描述,比如驾舱里每个设备的信息和位置。这种图像的检索,可能需要结合文本和图像信息,用文本描述来增强对关键点的理解,同时利用图像特征来捕捉整体的视觉信息。
最右侧是小米SU7的话题趋势图。这种图像的细节可以完全用文字来描述,检索和处理时可以较多地依赖文本向量,图像向量的作用可能相对小一些。
构建多模态RAG主要有三种方法:
下面以图像和文本输入为例展开聊聊。
这种方法的思路是:把不同类型的数据(文本、图像)转换成具有相同维度和相似语义表示的向量。
如果原来只有针对文本的RAG模型,那需要把嵌入模型换成支持多模态嵌入的模型(比如CLIP,Contrastive Language-Image Pre-training);生成阶段则要把只能生成文本的LLM换成多模态LLM(比如GPT-4V、LLaVA、FUYU-8b)。
根据应用的需求,选一种主要模态,然后把其他模态基于这种模态来构建。比如,如果最终目标是根据PDF做基于文本的问答,那就按常规方法处理文本数据;对于图像,在数据预处理阶段就创建文本描述和元数据存储起来,后续再用。
推理过程中,检索主要依据图像的文本描述和元数据来进行。答案生成时,可以结合LLMs和MLLMs,具体取决于检索到的图像类型。
这种方法的优点是:从图像中生成的元数据在回答客观问题时非常有用;而且绕开了“需要为图像嵌入更换嵌入模型”的问题;也不需要专门设计排序器来对跨模态结果重新排序。
缺点也很明显:数据预处理的成本不低,而且原始图像中包含的细节可能会丢失。
为不同的模态设置独立的数据存储,然后使用Rank-rerank方法来处理。具体流程是:在初次排序(Ranking)中,系统先把查询提交给多个模态的独立存储库,每个存储库根据自身模态特性返回与查询最相关的前N个结果(chunks)。文本存储库返回文本片段,图像存储库返回语义相关的图像。
当从各个模态的存储库拿到初步结果后,一个多模态重排序器(multimodal re-ranker)会介入,把这些来自不同模态的top-N结果整合起来,根据它们与查询的整体相关性重新排序,最终交给用户最相关的结果。
这篇文章初步梳理了RAG系统中的数据处理方法,重点讲了文档分割的方法和多模态数据的处理。
腾讯ima怎么把微信内容一键导入知识库?
腾讯ima怎么创建共享知识库?
Celestia价格预测2026-2032:TIA币能否引领山寨币上涨行情?历史价格回顾
比特币(BTC)核心周期指标复刻历史走势 价格或跌破5.8万美元关键支撑位
比特币 2025 年价格预测:BTC 的未来走势
新浪互联网热点小时报丨2026年07月26日16时_今日实时互联网热点速递
新浪机器学习热点小时报丨2026年07月25日18时_今日实时机器学习热点速递
WorkBuddy微信版怎么获得积分?
新浪人工智能热点小时报丨2026年07月30日18时_今日实时人工智能热点速递
5000元起的鼠标哪个最值得入手?
腾讯ima知识库怎么分类管理?
短剧《史上最强洪荒修为》剧情介绍
海尔消毒柜自动消毒如何中止
博世壁挂炉关闭暖气怎么操作
男生高性价比充电头?
车载冰箱重置到出厂设置几步?
Windy卫星云图怎么看?云层变化识别技巧
WorkBuddy积分怎么获得?
5000-6000元鼠标有什么推荐?
管线机怎么接云米净水器
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc