Type RAG
Created Aug 02, 2026, 06:30:00 / Updated Aug 02, 2026, 06:30:00
Views — / Comments — / Words 11,533
数据清洗与切片
数据清洗与切片位于 RAG 的入口。它把 PDF、Word、Markdown、图片等原始文件,转换为可以建立索引的结构化文本单元。该阶段需要同时解决解析质量、噪声过滤、语义边界、块长度、重叠区和元数据传播问题。 | 边界 | 数据 | 关键字段或要求 | | --- | --- | --- | | 输入 | 原始...
数据清洗与切片位于 RAG 的入口。它把 PDF、Word、Markdown、图片等原始文件,转换为可以建立索引的结构化文本单元。该阶段需要同时解决解析质量、噪声过滤、语义边界、块长度、重叠区和元数据传播问题。
| 边界 | 数据 | 关键字段或要求 |
|---|---|---|
| 输入 | 原始文档 | 文件路径、文件类型、语言、是否扫描件、是否包含表格/公式/图片 |
| 解析输出 | Element[] | text、category、metadata;常见类型有 Title、NarrativeText、Table、Image |
| 框架输出 | Document[] | text 和文档级 metadata |
| 切片输出 | Node[] | id_、text、metadata、relationships,后续可写入 embedding |
| 下游输入 | 可索引节点 | 每个 Node 应能追溯到文件、页码或章节,并满足 Embedding 模型长度限制 |
UnstructuredReader.load_data(...) 返回 Document 列表;直接调用 unstructured.partition 返回 Element 列表;NodeParser.get_nodes_from_documents(...) 返回 Node 列表。三者不能混为同一种返回值。
flowchart LR
A[原始文件] --> B{识别文档类型与质量}
B -->|电子 PDF / 规则文本| C[fast / PyMuPDF]
B -->|复杂布局 / 表格| D[hi_res / MinerU / Marker]
B -->|扫描件| E[OCR / ocr_only]
B -->|极复杂图文| F[VLM]
C --> G[Element 或 Document]
D --> G
E --> G
F --> G
G --> H[过滤页眉页脚与重复噪声]
H --> I[保留标题、页码、坐标等元数据]
I --> J[按标题 / 句子 / Token / 语义切片]
J --> K[Node 列表]
K --> L{质量检查}
L -->|合格| M[进入向量化与入库]
L -->|超长或语义断裂| J
strategy,不要直接对所有 PDF 使用同一方案。chunk_size、chunk_overlap 或语义断点阈值。chunk_size 不超过 Embedding 模型限制,重叠区没有造成大量重复召回。以下内容保留源文档的全部正文、表格、代码、参数、链接和原有流程图,仅调整标题级别,使其纳入当前文档结构。 向量数据库:
切分依据(语义优先+上限兜底):以 512 个 Token 为硬上限,但落刀点优先选择自然语言的物理边界(如段落换行符 \n\n、句号等),以此来保证每一块内容的语句完整。
切分方式(递归动态切分):不采用死板的固定字数一刀切,而是用递归算法。先尝试按大段落拆,如果超长,再降级找单换行符或标点符号继续拆。切片最终的实际大小是动态浮动的。
切片关系(冗余衔接):相邻的前后切片之间会强制保留 51 个 Token 的重叠内容。这就像铺瓦片一样,通过几十个字的上下文冗余,防止核心概念被生硬切断,确保大模型检索时能读到连贯的上下文。
技术选型决策
| 工具 | 核心优势 | 适用场景 |
|---|---|---|
| unstructured.io | 支持50+格式,生态完善 | 多源数据ETL入口 |
| PyMuPDF | 解析速度>200页/分钟 | 纯文本/简单PDF批量处理 |
| Marker | 代码/公式支持优秀 | 技术白皮书/学术文献 |
| MinerU | 数学公式识别精准 | 科技/专利类文档 |
| DoclingAI | 表格提取精度98%+ | 金融财报/科研报告 |
| DeepDoc | 中文优化+端到端方案 | 中文RAG系统建设 |
Unstructured.io作为集成框架,通过strategy参数实现后端自适应切换:
这种混合架构使其在金融财报(表格提取精度98%+)和科研报告等场景中表现突出。
基于你提供的关键信息,这份文档系统性地梳理了用于检索增强生成(RAG)的文档解析模块(以 unstructured 库架构为核心)。在整理截图信息的基础上,补充了部分在 RAG 实际工程中的应用逻辑和最佳实践。
在处理非结构化文档时,底层的系统级依赖是确保各种复杂文件格式(尤其是扫描件、富文本格式)能够被正确读取的基础。
tesseract-lang 多语言扩展包。pdf2image 库将 PDF 转换为图像格式,为后续的 Tesseract OCR 处理提供标准化的图像输入。"Could not build wheels for pikepdf")。qpdf、libheif 和 pillow。在企业级 RAG 系统中,本地部署庞大的解析模型(如布局检测模型)会导致极高的冷启动延迟和资源占用。
pip install unstructured-clientstrategy) 与进阶参数在调用解析器时,参数的配置直接决定了速度与质量的平衡。
strategy)fast(默认):适用于纯数字版 PDF(包含标准文本层),解析速度极快,不加载视觉模型。hi_res(高精度):核心特性。会调用复杂的视觉布局检测模型(如 Detectron2, YOLOX, 或自研的 Chipper 等)来提取文档的物理结构信息(段落边界、表格、图片)。ocr_only:专为扫描件或纯图像版 PDF 设计,仅执行 OCR 提取。vlm:前沿方案,直接调用多模态视觉语言模型(如 OpenAI/Anthropic 的 Vision 模型)进行页面理解。hi_res 下生效):
extract_images_in_pdf (布尔值):是否提取嵌入的图像块。extract_image_block_types (列表):指定提取类型,例如精确提取 ["Image", "Table"]。extract_image_block_output_dir (字符串) / extract_image_block_to_payload (布尔):决定提取的图片是落盘保存到指定目录,还是直接转为 base64 payload 存入内存。infer_table_structure:设为 True 尝试还原复杂的表格行列结构。skip_infer_table_types:在不需要表格结构的场景中,跳过表格推断以大幅提升解析速度。max_partition:在使用 ocr_only 时,限制单个文本块的最大字符长度(默认 1500),这是防止单块输入超出 LLM Token 限制的初步手段。split_pdf_page (True):大文件分块处理机制,提升超大文档的解析效率。languages / ocr_languages:显式指定 OCR 使用的语言包列表,提高识别准确率。解析引擎完成工作后,会将文档结构化为一个个 Element 对象的集合。理解这些对象是构建高质量 RAG 索引的关键。
text: 元素的纯文本内容。(重点:对于表格类型,这里的文本会自动呈现为 Markdown 表格格式,这对 LLM 非常友好)category: 元素类型标识。metadata: 丰富的上下文元数据。精确的分类能让 RAG 切块不再盲目按字数截断。
Title (标题):文档的各级标题和副标题。NarrativeText (叙事文本):标准正文段落。Table (表格):包含结构化数据的表格。Text (段落):普通无明显特征的文本。Image (图像):文档中的所有插图。Formula (数学公式):提取出的公式文本,例如 y = Wx + b。Header/Footer (页眉/页脚):(重要:在 RAG 中通常直接过滤掉这些元素,防止注入无意义的噪声)丰富的元数据为检索后的召回排序和文档溯源提供了依据。
page_number:该文本块所在的页码(从 1 开始计)。coordinates (坐标信息):
points:文本块在页面上的四个角坐标(格式:[左上, 左下, 右下, 右上],单位为像素)。system:坐标系统类型(通常为 PixelSpace 像素坐标系)。layout_width / layout_height:该页面的总宽度和高度。languages:检测到的文档语言(如 ["zho"] 代表中文,遵循 ISO 639-3 标准)。filename / last_modified (ISO 8601格式) / filetype (如 application/pdf):文件基本溯源信息。在实际业务落地时,如何根据文档特点动态调整策略是拉开差距的关键。
category 字段直接过滤掉不需要的内容,如 Image、Header、Footer,保证输入给向量数据库的文本纯净度。Title 元素构建文档的层次树(Hierarchy)。与其按死板的 500 字切块,不如按照“标题 -> 下属子段落”的逻辑打包(如 Parent-Child 切块策略),这能极大提升检索召回的准确性和语义完整性。fast。必须优先使用 strategy="hi_res" 先做强大的版面分析(Layout Detection),将页面准确切割后,再对图片区域分别进行 OCR。fast + PyMuPDF/pdftotext 管线通常是最快且足够准确的方案。hi_res,它能显著提高表格/标题/图片的检测率。但由于视觉模型开销巨大(时间和依赖),如果对系统吞吐量有严格要求,应考虑将 hi_res 推理外包给独立的 GPU 处理服务,并对任务进行异步/队列的批量调度。1. 大模型开发框架(SDK)是什么?
SDK: Software Development Kit,它是一组软件工具和资源的集合,旨在帮助开发者创建、测试、部署和维护应用程序或软件。 所有开发框架(SDK)的核心价值,都是降低开发、维护成本。大语言模型开发框架的价值,是让开发者可以更方便地开发基于大语言模型的应用。
主要提供两类帮助:
好的开发框架,需要具备以下特点:
LlamaIndex 是一个为开发「上下文增强」的大语言模型应用的框架(也就是 SDK)。上下文增强,泛指任何在私有或特定领域数据基础上应用大语言模型的情况。例如:
graph TD
User((User))
subgraph Your_data [Your data]
DB[(Database)]
Doc[Document]
API[API]
end
Index[Index]
LLM[LLM]
User -- query --> Index
DB -- structured --> Index
Doc -- unstructured --> Index
API -- programmatic --> Index
Index -- prompt + query +<br>relevant data --> LLM
LLM -- response --> User
核心库安装
LlamaIndex版本0.14.x
pip install llama-index-core llama-index
解析库安装
pip install llama-parse unstructured nest-asyncio python-multipart llama-index-readers-file
pip install pytest
pip install "unstructured[md]"
常用组件:
SimpleDirectoryReaderLlamaParse(针对复杂 PDF)UnstructuredReader(多格式文档)PandasReader(表格类文件)LlamaIndex与Unstructured的关系
因此:
flowchart LR
subgraph Data ["Data (数据源: 各种文件格式与数据源)"]
direction TB
sub1["Document\n(pdf, docx, image, audio, csv, markdown...)"]
sub2["Arxiv, Github, Database, Gmail,\nGraphDB, Jira ... (180+种)"]
end
subgraph Loading ["Loading (将各种数据统一加载为 Doc, Node, Metadata)"]
direction TB
L1["Documents\nNodes\nMetadata"]
L2["DirectoryReader"]
L3["Data Connectors"]
end
subgraph Chunking ["Chunking (文本结构解析 / 文本切割)"]
direction TB
C1["Node Parsers"]
C2["Text Splitters"]
end
subgraph Indexing ["Indexing (建索引 (并灌库))"]
direction TB
I1["Keyword\nVector\nProperty Graph"]
I2[/"Storing"/]
end
subgraph Querying ["Querying (检索+预处理、后处理)"]
direction TB
Q1["Retrieval"]
Q2["Postprocessors"]
Q3["Query Pipelines"]
Q4["Routing"]
end
subgraph Responding ["Responding (生成回复)"]
direction TB
R1["QA"]
R2["Chat (multi-turn)"]
R3["Structured"]
R4["Agents"]
end
Data --> Loading
Loading --> Chunking
Chunking --> Indexing
Indexing --> Querying
Querying --> Responding
subgraph Models ["Models"]
direction LR
M1["Embedding Models"]
M2["LLMs"]
end
Models -.-> Indexing
Models -.-> Querying
Models -.-> Responding
结合两者优势:
这种做法在实际RAG框架开发中非常常见:
总结一句话
unstructured.partition = 底层引擎,适合复杂数据管线推荐场景:快速测试/教学/单格式文件读取
优点:
partition缺点:
from llama_index.readers.file.unstructured import UnstructuredReader
from pathlib import Path
reader = UnstructuredReader()
documents = reader.load_data(file=Path("甬兴证券-AI行业点评报告:海外科技巨头持续发力AI,龙头公司中报业绩亮眼.pdf"))
print("打印列表长度: " + str(len(documents)))
print("=====================================")
print("打印解析的文本内容: " + documents[0].text[:100])
print("=====================================")
print("打印元数据信息: " + str(documents[0].metadata))
推荐场景:生产级RAG应用/多格式数据管线/高可控性需求
优点:
| 场景 | 推荐方式 | 特点/说明 |
|---|---|---|
| 初学者/快速Demo | UnstructuredReader() | 封装好,一行代码 |
| RAG系统 | UnstructuredReader() | 输出直接是Document对象 |
| 生产系统/多文件管线 | partition() | 可完全控制OCR/分块策略 |
| 精细元数据追踪(页码/坐标/字体) | partition() | 元数据更丰富 |
在文档切分之前,针对文本内容需要进行适当的数据清洗和预处理,这一步骤可以显著提高切分质量和后续检索效果。数据清洗和预处理就是在源头把关,确保流入RAG系统的每一滴水都是干净的,这样最终输出的答案才能清澈见底。这个环节投入1小时的工作,可能在后续每个环节都为你节省10小时的调试和优化时间,并且将噪声内容清洗掉以后,会降低后期向量存储成本,提升检索的速度和回答的答案质量。对于企业级项目来说,这是性价比最高的投入之一。
数据清洗的核心目标是:
数据清洗是文档切分的基础工作,良好的清洗能够显著提高后续切分质量和检索效果。
RAG (Retrieval-Augmented Generation) 系统中的文档切分是构建高效检索系统的关键步骤。文档切分,也称为分块(Chunking),是将长文档分割成更小、更易于管理的片段的过程,防止长文档有大部分的噪音数据进入上下文中,这些片段随后被转换为向量并存储在向量数据库中,以便在查询时进行快速检索。
文档切分直接影响RAG系统的性能表现:
粒度是RAG性能的”第一性变量”。不同粒度级别对系统性能有显著影响:
| 粒度级别 | 检索准确性 | 生成质量 | 计算成本 | 典型策略 |
|---|---|---|---|---|
| 细粒度(句子级) | 高 | 低(上下文不足) | 高 | SentenceWindowNodeParser |
| 中等粒度(段落级) | 中高 | 中高 | 中 | SentenceSplitter |
| 粗粒度(文档级) | 低(噪声多) | 高(上下文完整) | 低 | 直接使用Document |
分块过大:可能导致检索到的单个块包含过多无关信息(噪音),增加了 LLM 理解上下文的难度,降低了答案的精确性,甚至可能超出 LLM 的上下文窗口限制。
分块过小或切分不当:可能破坏原文的语义连贯性,导致一个完整的知识点被拆散到多个块中。检索时可能只召回了部分信息,使得 LLM 无法获得完整的背景,难以生成全面、准确的答案。
未能适应文档结构:不同的文档类型(如论文、手册、报告、网页)具有不同的结构特点。死板的分块方式可能无法有效利用标题、列表、表格等结构信息,影响信息提取的完整性。
一般工程上,层次化切分与句子窗口相结合,通过”粗检索——细生成”的两阶段路径,有效平衡召回率与上下文完整性。
文档切分通常包括以下基本步骤:
评估文档切分效果的常用指标包括:
LlamaIndex提供了灵活的文档处理框架,理解其核心概念是有效使用文档切分功能的基础。它们是将大文档首先会读取为document对象,然后拆解为适宜检索的语义片段(节点Node)。选择合适的切分器对于提升 RAG 系统的检索精度和回答质量至关重要。
graph LR
subgraph Data_Sources [Data Sources]
direction TB
DB[Databases]
Doc[Documents]
API[APIs]
end
DC[Data Connectors]
subgraph Documents_Group [Documents]
Nodes[Nodes]
%% Representing multiple documents visually
Doc1[ ]
Doc2[ ]
Doc3[ ]
end
KB[(Knowledge Base)]
Data_Sources --> DC
DC --> Documents_Group
Documents_Group --> KB
(此处原图展示了 Data Sources (Databases, Documents, APIs) 通过 Data Connectors 转换为 Documents (包含多个 Nodes),最终存入 Knowledge Base 的流程)
| 维度 | Document (文档) | Node (节点) |
|---|---|---|
| 概念层级 | 顶层数据容器,代表一个完整的数据源(如一个PDF文件、一个API响应) | 基础数据单元,由Document解析/分块而成,代表其中一段文本 |
| 核心职责 | 数据的统一与标准化:将不同来源、格式的数据封装成统一对象,便于系统处理 | 数据的精细化组织与关联:通过分块、元数据和关系,构建细粒度的数据网络以支持高效检索 |
| 内容与关系 | 包含原始、完整的数据内容;Document之间通常独立 | 包含数据片段;Node之间可通过关系(如父子、先后)构建复杂的图结构 |
| 典型使用场景 | 数据加载与初始化,统一元数据管理(如为整个文档设置来源、作者) | 构建各类索引(向量、关键词等)的基础,实现精确的语义检索,构建复杂的关系知识图谱 |
关于Document
Document 对象。它充当了原始数据的统一接口,随后,通过称为 NodeParser(节点解析器)的组件,将Document解析为多个Node。Document 级别非常适合存储文档整体的元数据,例如 file_name(文件名)、author(作者)、category(分类)等。这些元数据可以被其下的所有 Node 继承,也可用于高级检索策略。关于Node
Node 是LlamaIndex构建索引的真正原材料。将 Document 解析成 Node 的过程(常称为”分块”或”切分”)对检索性能至关重要。Node 可以与其他 Node 建立关系,例如 Next(下一个)、Previous(上一个)、Parent(父级)、Child(子级)等。这使得LlamaIndex不仅能处理线性文本,还能构建树状或图状的复杂知识结构,这对于理解长文档的逻辑或回答需要多步推理的问题非常关键。Document和Node在LlamaIndex中分别扮演着数据容器和语义单元的角色。理解它们的分工与协作,是有效使用LlamaIndex构建高效检索系统的关键。 Document负责承载原始数据,而Node则作为构建索引、进行语义检索和生成回答的真正基石。
LlamaIndex中的元数据传播遵循继承原则:
| 属性名 | 类型 | 说明 |
|---|---|---|
| id_ (node_id) | str | 节点的唯一标识符,可自动生成或手动指定 |
| text | str | 节点包含的文本内容 (chunk) |
| metadata | Dict[str, Any] | 存储文档的元数据信息(如文件名、页码等) |
| embedding | List[float] | 节点的向量嵌入表示 |
| relationships | Dict[NodeRelationship, RelatedNodeInfo] | 节点间关系映射 |
| hash | str | 内容的哈希值,用于去重和变更检测 |
| excluded_embed_metadata_keys | List[str] | embedding 时排除的元数据键 |
| excluded_llm_metadata_keys | List[str] | LLM 处理时排除的元数据键 |
| start_char_idx | Optional[int] | 在原始文档中的起始字符位置 |
| end_char_idx | Optional[int] | 在原始文档中的结束字符位置 |
| text_template | str | 文本格式化模板 |
| metadata_template | str | 元数据格式化模板 |
切分后的Node之间可以建立多种关系:
有效的文档切分应遵循以下核心原则,以确保切分结果既保持语义完整性又满足检索需求。
核心思想:切分应尽量不破坏语义单元的完整性,避免在句子或段落中间进行不合理的分割。
句子边界优先:优先在自然语言句子结束处(如句号、问号、感叹号)进行分割
段落边界考虑:在段落分隔符处进行分割,保持段落的完整性
主题连贯性:切分点应选择在主题转换处,避免将不同主题的内容混合在一个块中
例如:
核心思想:控制每个文本块的长度,使其适应模型的上下文限制和检索需求。
[Artificial intelligence is] [transforming technology] [and shaping the future.]
|--------- Chunk 1 ------------------|
|--------- Chunk 2 -----------------------|
|<----- Overlap ------->|
核心思想:在相邻文本块之间设置适当的重叠区域,避免重要信息在边界处丢失。
核心思想:针对特殊格式的文档(如代码、表格、列表)采用专门的切分策略。
LlamaIndex提供了多种切分工具,适应不同的文档类型和应用场景。了解这些工具的特点和适用场景是选择合适切分策略的关键。
| 维度 | TextSplitter | NodeParser |
|---|---|---|
| 核心定位 | 基础的文本分割工具 | 高级的文档解析与节点生成框架 |
| 处理逻辑 | 通常基于固定规则,如长度、标点或字符递归分割 | 除基础分割外,可集成语义分割、代码解析等复杂策略 |
| 输出结果 | 文本块(字符串列表) | Node对象列表,包含文本、元数据及节点间关系信息 |
| 语义感知 | 通常不具备 | 部分解析器(如SemanticSplitterNodeParser)具备语义感知能力 |
| 性能特点 | 轻量快速,计算开销小 | 功能更强的解析器(如语义分割)可能速度较慢,计算成本高 |
| 适用场景 | 基于语义相似度进行文本切分,保持语义连贯性 处理主题转换自然、结构复杂的文档 对切分质量要求较高的生产环境 | 构建生产级RAG系统 处理复杂文档(如代码、学术论文) 需要利用节点间关系(如父节点…)进行复杂查询 |
Text-Splitters专注于将任意文本字符串拆分成多个片段,按字符/句子/token/自定义分隔规则切分,通常只关心文本长度与重叠上下文,不会理解文件格式。
TokenTextSplitter按照token长度进行切分,适用于需要精确控制token数量的场景,特别是在有严格token限制的嵌入模型或语言模型中使用。
核心特性:
SentenceSplitter是一种基于自然语言句子和段落边界进行分割的解析器,类似于LangChain的RecursiveCharacterTextSplitter。它优先在句子结束处或段落分隔符处进行分割,尽量避免在句子中间切断,以保持语义单元的完整性。
核心特性与工作原理:
关键参数:
| 参数名 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| chunk_size | int | 每个文本块的目标最大token数 | 1024 |
| chunk_overlap | int | 相邻文本块之间重叠的token数 | 200 |
| separator | str | 用于分割的主要分隔符 | ” ” (空格) |
| paragraph_separator | str | 用于识别段落的分隔符 | ”\n\n\n” |
适用场景:SentenceSplitter非常适用于自然语言文本,如新闻文章、博客文章、书籍章节等结构清晰的散文体内容。
CodeSplitter专为编程语言源代码设计,利用编程语言的抽象语法树(AST)来理解代码结构,确保将代码按功能单元进行分割。
核心特性:
JSONNodeParser用于处理JSON文件,能够根据JSON结构进行切分,保持数据的层次关系。
SemanticSplitterNodeParser通过嵌入模型计算文本块间的语义相似度,实现自适应断点识别,核心解决固定分块的语义割裂问题。其检索准确率较固定分块提升20%左右,适合对上下文连贯性要求高的场景(如学术论文、长文档理解)。
实现原理
简单来说,它的工作流程是:先将文本拆分成句子,然后通过滑动窗口计算句子群的综合语义,最后在语义发生显著变化的地方(即相似度低于阈值时)进行分割,它的分割点是动态的、由语义决定的,因此无法像固定大小的分割器那样,简单地在前一个块的末尾和后一个块的开头插入一段重叠的文本;这种基于语义的分割方式,其设计目标之一就是让每个分割出的文本块在语义上尽可能独立和完整。buffer_size参数在某种程度上扮演了维持上下文连贯性的角色,因为它确保了在判断是否分割时,已经考虑了当前句子周围一定范围内的语义上下文。
调优建议
SemanticSplitterNodeParser 之后接一个 SentenceSplitterNodeParser 或 TokenTextSplitter 作”后备分割”。SentenceWindowNodeParser的工作流程核心在于检索单元和上下文窗口的分离:
这种方法有效缓解了RAG系统中”检索精度”与”生成答案所需上下文完整性”之间的矛盾。
| 特性维度 | 具体说明 |
|---|---|
| 核心原理 | 将文档按句子拆分并建立索引,检索时返回匹配句子及其周围句子(滑动窗口)。 |
| 主要优势 | 检索与上下文解耦:检索用小粒度句子提升精度,提供给LLM的是包含更完整上下文的窗口文本。 |
| 关键参数 | windowsize:控制窗口大小;windowmetadata_key:存储窗口文本的元数据键名。 |
| 典型应用场景 | 处理文档结构清晰、句子间逻辑连贯的文档,如技术文档、学术论文、法律合同等。 |
使用注意事项
HierarchicalNodeParser结合文档结构(标题、章节、段落)和语义边界进行多层次切分,适合处理Markdown、PDF、Word等结构化文档,尤其适用于说明书、规约、设计文档等场景。其核心优势在于保留文档原生逻辑层级,支持父节点(章节标题+简介)与子节点(具体段落)的嵌套组织。
结合多种切分策略,发挥各自优势:
核心思想:利用Title元素作为分段标志,将Title与其后的内容组合成语义完整的chunk
核心思想:创建多层级的chunk结构,对长文本再进一步使用SemanticSplitterNodeParser或其他切分器进行
# ==================== 步骤4: 使用Metadata Extractor进一步增强 ====================
"""
可选: 使用LLM自动提取更多metadata
"""
# 导入metadata提取器
from llama_index.core.extractors import (
TitleExtractor,
SummaryExtractor,
KeywordExtractor,
QuestionsAnsweredExtractor,
)
# 导入IngestionPipeline管道
from llama_index.core.ingestion import IngestionPipeline
# 定义metadata提取器
extractors = [
TitleExtractor(nodes=5), # 从前5个节点提取标题
KeywordExtractor(keywords=10), # 提取10个关键词
SummaryExtractor(summaries=["self"]), # 生成摘要
QuestionsAnsweredExtractor(questions=3), # 生成3个问题
]
选择合适的切分策略并对其进行优化是构建高效RAG系统的关键步骤。本节将介绍如何根据不同的应用场景选择合适的切分策略,并提供优化建议。
| 场景 | 推荐工具 | 原因 |
|---|---|---|
| 普通文本/报告/网页 | SentenceSplitter | 简单快速,保持句子完整性 |
| 长文本/Embedding限制场景 | TokenTextSplitter | 精确控制token数量 |
| 精确语义块/摘要场景 | SemanticSplitterNodeParser | 基于语义的智能切分 |
| 技术文档、Notebook | CodeSplitter | 保持代码结构完整性 |
| 教程、技术博客 | MarkdownNodeParser | 识别Markdown层级结构 |
| 教材、论文类文档 | HierarchicalNodeParser | 分 |
| 文档类型 | 推荐策略 | 关键参数 |
|---|---|---|
| 结构化文档 (Markdown、PDF、Word) | HierarchicalNodeParser | chunk_sizes=[2048, 512, 128] |
| 纯文本 (小说、新闻、邮件) | SentenceSplitter | chunksize=500, chunkoverlap=50 |
| 代码文件 | CodeSplitter | language=“python”, max_chars=1000 |
| 混合文档 (文本+表格+图像) | Unstructured + SentenceSplitter | chunksize=500, chunkoverlap=50 |
| 长文档 (书籍、报告) | SemanticSplitter | buffersize=1, breakpointpercentile_threshold=90 |
Comments
Notes, questions, and follow-ups are welcome here.
Comments are temporarily unavailable because
WALINE_SERVER_URL or PUBLIC_WALINE_SERVER_URLis not configured.