游乐游手机版
首页/AI热点日报/热点详情

吴恩达DeepLearning.AI课程:大模型检索增强生成之文档划分技术

类型:热点整理2026-06-28
引言 上一节我们介绍了 LangChain 的基础知识以及文件导入的相关操作。文档成功导入后,下一步自然是对文档内容进行处理。检索增强生成(RAG)系统的核心目标是什么?就是从海量文档中精准定位最相关的内容并输出。然而,一大挑战在于——大模型的上下文窗口容量有限,通常无法将整个文档的所有信息一次性塞

引言

上一节我们介绍了 LangChain 的基础知识以及文件导入的相关操作。文档成功导入后,下一步自然是对文档内容进行处理。检索增强生成(RAG)系统的核心目标是什么?就是从海量文档中精准定位最相关的内容并输出。然而,一大挑战在于——大模型的上下文窗口容量有限,通常无法将整个文档的所有信息一次性塞入。即便某些技术声称可以处理无限长度的上下文,从成本效益的角度来看,更长的上下文意味着更高的计算开销与费用,并不划算。

吴恩达DeepLearning.AI课程系列 —— 大模型检索增强生成(二):文档划分技术简介

解决这一问题的最佳途径之一,就是将文档切分为多个小段。这样做有两大优势:

  1. 通过 RAG 系统检索到的内容在语义上关联更紧密,检索效果自然更佳。
  2. 每个分段比整篇文档短得多,能显著降低计算资源和费用消耗。这也是大型语言模型兴起后,RAG 技术迅速流行的重要原因。

切分方法概述

那么,文档切分具体有哪些方法?最直接的方式是基于字符数量进行分割。例如,chunk_size 表示每个块的长度为 4000 个 token,chunk_overlap 表示上下文重叠部分为 200 个字符。为什么要设置重叠?因为文本段落之间天然存在关联,并非孤立存在。保留一定的重叠内容,相当于保留了上下文线索,有助于大模型更准确地理解当前段落。

然而,这种按字数机械分割的方式并非最优方案。首先,分割方式过于随机,完全不基于语义;其次,上下文的衔接显得生硬。因此在很多场景下,我们需要人工制作 chunk——借助个人经验与领域知识来找到合适的分块策略。当然,人工成本很高。好在 LangChain 除了提供基础的文本分割器外,还根据语言类型的不同,提供了更智能的分割方式。

实例实践

接下来我们通过具体案例,实践 LangChain 中两种常用的文档切分方法。所需版本如下:

langchain                0.3.0
langchain-community      0.3.0
pypdf                    5.0.0
openai                   1.47.0
beautifulsoup4           4.12.3

先通过一个简单示例来观察文本切分的效果。首先,从 LangChain 的 text_splitter 模块导入两种常见切分器:RecursiveCharacterTextSplitterCharacterTextSplitterCharacterTextSplitter 直接按照字符串长度进行划分,就像前面图片展示的那样。

RecursiveCharacterTextSplitter 则对文档进行更精细的分割,它不仅关注分割后的文本长度,还会考虑重叠字符。默认情况下,它使用 ["nn", "n", " ", ""] 这四种符号作为分割标记,并按优先级顺序依次尝试:先使用双换行符(nn),再使用单换行符(n),然后是空格,最后才强制分割。因此,尽管使用 RecursiveCharacterTextSplitter 分割后的文本长度可能与设定的 chunk_size 不完全一致,但它更倾向于按句子或段落进行分割,可读性与语义连贯性都明显更好。

下面用一个具体例子对比两种分割方式。先准备一段文本 some_text,然后配置 c_splitterr_splitter,均设置 chunk_size 为 450,且不设 chunk_overlap

from langchain.text_splitter import RecursiveCharacterTextSplitter, CharacterTextSplitter
some_text = """When writing documents, writers will use document structure to group content. 
This can convey to the reader, which idea's are related. For example, closely related ideas 
are in sentances. Similar ideas are in paragraphs. Paragraphs form a document. nn  
Paragraphs are often delimited with a carriage return or two carriage returns. 
Carriage returns are the "backslash n" you see embedded in this string. 
Sentences ha ve a period at the end, but also, ha ve a space.
and words are separated by space."""

c_splitter = CharacterTextSplitter(
    chunk_size=450,
    chunk_overlap=0,
    separator = ' '
)
r_splitter = RecursiveCharacterTextSplitter(
    chunk_size=450,
    chunk_overlap=0, 
    separators=["nn", "n", " ", ""]
)

调用 c_splitter 查看结果:

print(c_splitter.split_text(some_text))

终端运行后可以看到,这段文本被切成了两块。但两块的大小差异非常大——原文本共计 496 个字符,而 chunk_size 设为 450,对于 c_splitter 来说,它只按字符串长度切割,因此第一块 450 字符,剩余 46 字符成为第二块。

['When writing documents, writers will use document structure to group content. This can convey to the reader, which idea's are related. For example, closely related ideas are in sentances. Similar ideas are in paragraphs. Paragraphs form a document. nn Paragraphs are often delimited with a carriage return or two carriage returns. Carriage returns are the "backslash n" you see embedded in this string. Sentences ha ve a period at the end, but also,',
 'ha ve a space.and words are separated by space.']

再来看 r_splitter 的结果:

print(r_splitter.split_text(some_text))

虽然字符数上不完全符合 chunk_size,但确实是按句子形式划分的,切分点正好落在第一优先级 nn 的位置。

["When writing documents, writers will use document structure to group content. This can convey to the reader, which idea's are related. For example, closely related ideas are in sentances. Similar ideas are in paragraphs. Paragraphs form a document.",
 'Paragraphs are often delimited with a carriage return or two carriage returns. Carriage returns are the "backslash n" you see embedded in this string. Sentences ha ve a period at the end, but also, ha ve a space.and words are separated by space.']
来源:https://www.53ai.com/news/RAG/2025010457283.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。