在RAG(Retrieval Augmented Generation)准确率优化问题中,有通过炼丹的、有通过设计复杂流水线的、有通过预处理的、有通过后处理的。但,有一项工作的重要性容易被忽视,那就是 切!文!档!
我通过文档结构的方式,设计了一组切文档的规则,应用这些规则,使得参数相同的情况下,RAG的准确率从75%提升到了95%!正文中将详细介绍这些启发式规则。
1、背景:RAG优化方法
炼丹和设计复杂流水线,这个是水论文的重灾区,需要毕设的同学可多留意。工业界的可以关注,获取灵感,但绝大部分不怎么实用。
- 炼丹:成本过高,收集、清洗、生成数据,选择、训练、评测模型,这些都是不容忽视的工作量。
- 流水线:设计多个由LLM参与的节点,代价是调用时间和成本开销,受制于LLM自身的能力,虽然能提高准确率,但不符合第一性原理,难以复制。
预处理: 现存的文档很多是为人服务的,少有为RAG准备的。比如代码、小红书图文笔记、Word文档等。预处理能够将其转换为对LLM友好的格式,且仅需一次转换,低成本,可复制。切分文档便是预处理中的一环。
后处理: 后处理是对检索到的文档进行重排或增强,填充到LLM的上下文中。后处理中最出名的莫过于Reranker模型,基于预处理时附带的元信息进行文档增强也是值得关注的优化手段。
2、文档切分方法
现如今的在线文档中包含复杂的多模态信息,比如图片、视频、音频、表格、代码等。文档切分时,需要谨慎的考虑这些复杂信息,这不止用于RAG,也应用于多模态预训练。
文档的切分有许多方法,最为常用的有:
- 按令牌切分:嵌入模型的上下文长度有限,在容许的长度下,按一定令牌量进行切分,较为简单且鲁棒。在我的实验中,选择 1000~3000 的令牌长度比较合适。按令牌切分时,容易将一句话拦腰切断,若召回时无法召回相邻块,则会影响RAG的性能。此时,最好的办法是设定一定长度的 overlap 。
- 按句子切分:在按令牌的基础上做的改进,按句子切分,从而避免一句话拦腰切断的问题。
- 按文档结构切分:典型的是 Markdown 切分工具,其按照文档的结构,仅提取标题至元信息,并不关心其它语意结构。
综上,如果想构建一个商业级的RAG应用,开源实现是不足以应对复杂场景的。
那如何切分文档才能够真正释放RAG的最大潜力呢?有几点核心要素:
- 结构即语意!比如标题、代码块、引用、公式等,做到定类处理。
- chunk要大,信息要密集!比如选择上下文长的嵌入模型,切分时,保证chunk接近满的。
- 避免文档被拦腰切断!
3、 以Markdown为例的结构化文档切分方法
1. lazy chunking
文档切的多 -> 向量多 -> 查询效率变差,语意内聚性也降低。因此,没必要切的时候最好别切,切时顶着最大长度切,能有效降低文档切块的数量。

文档切分的策略对比,eager与lazy
eager策略,当前段落(section)具有结构上的完整语意时,则独立为一个chunk,这保证了不同chunk有着不同的语意,但带来chunk的碎片化。(llama-index中的markdown parser便是如此)。
lazy策略,若chunk未满,则继续往里面加,直至超出chunk的承受能力。这会导致chunk中可能包含无关信息,需要LLM在生成时对其进行甄别。
我的建议是选择lazy策略。 现如今的LLM仍在进化,大海捞针的能力也逐渐在加强,丰富的语意也能够带来更鲁棒的稠密向量,参数也好调(top_k)。
2. Outline Guidance
在《金字塔原理》中,作者阐述了,与人沟通过程中如何组织语言,对LLM,该原理同样适用。
文档切分时,在每个chunk的开始,加入该chunk在文档中的位置,能够让LLM这段在整体中的位置,从而提升回答的质量。该技巧在langchain的MarkdownHeaderTextSplitter中有所体现。

Outline Guidance
大纲指引,方式简单,文本简短,却能够为该chunk提供更多的上下文,性价比很高。
3. Table Splitter
文档中通常会存在大量的表格,这些表格从内容形式分为两大类:
- 数据类
- 文本类
从表格的结构也可以分为两大类:
- 宽表,表的增张方向是向右的。
- 窄表,表的增长方向是向下的。
可借由一些表格提取工具,将表格提取,并经由LLM判断其分类后,再进行chunking。
若表格较大,且是数据表,则可应用宽表垂直切,窄表水平切的方式:

宽表垂直切
垂直切时,记得继续附带表的标题和表头,这对LLM帮助很大。
4. Table Converter
真实数据中,有一部分表是形式上是表,但内容却是键值对形式的。这类表都可以将其转换为文本,比如户口本上的表,可转换为:姓名:X,性别:X等。
转换后,构成一个段落,然后应用段落的拆分方法即可。
5. Code Splitter
代码与文本不同,代码的最小单位是一个函数(该函数属于某个类、模块、包)。切分是同样需要仔细处理,最好使用语法分析后进行切分。
比如,langchain中使用RecursiveCharacterTextSplitter,该切分器不分析语法,仅使用关键词进行递归的切分,经常会破坏函数的完整性,而 llama-index 中的 code splitter 则要好很多,但它是根据行数计算的,有时会超出嵌入模型的上下文长度。
6. Fallback
没有完美的切分方法,但可以先尝试最佳的切分策略,在无法切分时逐渐退化到次优的切分策略,这便是在生产环境中的最佳实践。
结语
按照惯例,知行合一,理论完了上代码,代码基于Markdown的AST进行实现。后续补充完测试后,考虑提交到 llama-index 中。
那么,如何系统的去学习大模型LLM?
作为一名从业五年的资深大模型算法工程师,我经常会收到一些评论和私信,我是小白,学习大模型该从哪里入手呢?我自学没有方向怎么办?这个地方我不会啊。如果你也有类似的经历,一定要继续看下去!这些问题啊,也不是三言两语啊就能讲明白的。
所以我综合了大模型的所有知识点,给大家带来一套全网最全最细的大模型零基础教程。在做这套教程之前呢,我就曾放空大脑,以一个大模型小白的角度去重新解析它,采用基础知识和实战项目相结合的教学方式,历时3个月,终于完成了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识点。
由于篇幅有限,⚡️ 朋友们如果有需要全套 《2025全新制作的大模型全套资料》,扫码获取~

👉大模型学习指南+路线汇总👈
我们这套大模型资料呢,会从基础篇、进阶篇和项目实战篇等三大方面来讲解。


👉①.基础篇👈
基础篇里面包括了Python快速入门、AI开发环境搭建及提示词工程,带你学习大模型核心原理、prompt使用技巧、Transformer架构和预训练、SFT、RLHF等一些基础概念,用最易懂的方式带你入门大模型。

👉②.进阶篇👈
接下来是进阶篇,你将掌握RAG、Agent、Langchain、大模型微调和私有化部署,学习如何构建外挂知识库并和自己的企业相结合,学习如何使用langchain框架提高开发效率和代码质量、学习如何选择合适的基座模型并进行数据集的收集预处理以及具体的模型微调等等。

👉③.实战篇👈
实战篇会手把手带着大家练习企业级的落地项目(已脱敏),比如RAG医疗问答系统、Agent智能电商客服系统、数字人项目实战、教育行业智能助教等等,从而帮助大家更好的应对大模型时代的挑战。

👉④.福利篇👈
最后呢,会给大家一个小福利,课程视频中的所有素材,有搭建AI开发环境资料包,还有学习计划表,几十上百G素材、电子书和课件等等,只要你能想到的素材,我这里几乎都有。我已经全部上传到CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!

894

被折叠的 条评论
为什么被折叠?



