乐于分享
好东西不私藏

文档摄入管道Ingestion Pipeline实际应用落地

文档摄入管道Ingestion Pipeline实际应用落地

这期我们将聚焦在文档预处理管道(Ingestion Pipeline) 这一核心模块,逐项拆解其四个关键子任务:

1.数据收集与清洗

2.文本分割

3.元数据提取

4.格式转换

不仅说明怎么做,还结合企业实际场景,指出谁来做用什么工具做遇到什么问题如何解决。 Ingestion PipelineRAG系统的地基。地基不牢,上层再强也会幻觉频出。初期可投入30%-40% 的精力打磨这一环节——它决定了你整个系统的准确率上限。

一、数据收集与清洗

数据从哪里来?(企业常见来源)

在企业环境中,知识型文档通常分散在多个系统中:

来源类型示例特点

文件系统共享盘、NAS、本地服务器的Word/PDF/Excel–非结构化,需解析

内部Wiki / Confluence–产品文档、运维手册、FAQ–半结构化,有标题层级

CRM / ERP系统客户沟通记录、工单、合同结构化或半结构化

数据库–MySQLPostgreSQL 中的业务表(如知识库表)结构化,易提取

邮件系统–Outlook、企业邮箱中的历史邮件需去重、过滤签名

SaaS平台钉钉文档、飞书知识库、Notion API–可接入

建议做法:建立一个统一的数据接入层,通过脚本或ETL 工具(如Apache NiFiAirbyte、自研调度器)定期拉取各源数据。

谁来参与?

业务部门(产品、客服、法务等):提供原始文档,确认哪些内容可纳入知识库;

数据工程师:负责搭建采集管道,编写解析脚本;

合规/法务团队:审核敏感信息(如客户身份证号、合同金额)是否脱敏;

AI/算法团队:定义清洗规则(如去掉页眉页脚保留表格)。

清洗做什么?

清洗的目标是提升文本质量降低噪声,典型操作包括:

去除无关内容:页眉页脚、水印、页码、广告语、重复段落;

脱敏处理:用正则或NER 模型识别并替换手机号、身份证、银行卡号(如138****1234);

编码统一:转为UTF-8,避免乱码;

语言过滤:若只支持中文,可过滤英文或混合语种文档;

空文档/低质量文档剔除:如PDF 扫描件无OCR 文字、Word 仅含图片。

4常用工具:

PDF解析:PyPDF2(简单)、pdfplumber(保留表格)、Unstructured.io(企业级)Office解析:python-docxopenpyxl

通用清洗:BeautifulSoupHTML)、正则表达式、spaCy/NLTK(语言处理)

二、文本分割(Text Chunking

为什么需要分割?

当前主流开源LLM 的上下文窗口(context window)有限:

模型最大Token 实际可用(留空间给prompt + output

Llama-3-8B8,192     ≈6,000

Qwen-Max 32,768   ≈25,000

Claude 3 Sonnet 200,000 ≈150,000(但私有部署难)

开源模型(如ChatGLM3-6B  8,192     ≈6,000

⚠️注意:1 token ≈ 0.75 个汉字。所以6,000 tokens ≈ 4,500 汉字。如果一篇年报有万字,必须切分成多个块。

如何切分?——不是简单按字数!

错误做法:每500 字一刀切→ 可能切断句子、表格、段落逻辑。

正确策略:语义感知分块(Semantic-aware Chunking

方法说明适用场景

RecursiveCharacterTextSplitterLangChain 默认)\n\n → \n →   → ” 优先级递归切分通用,平衡效率与语义

MarkdownHeaderTextSplitter 标题 层级切分      Wiki、技术文档

基于句子边界(Sentence SplitterspaCy Stanza 切句,再组合成块高精度问答

滑动窗口(Overlap相邻块重叠50~100 防止关键信息被切碎

推荐配置示例(中文场景):

python编辑from langchain.text_splitter import RecursiveCharacterTextSplittersplitter = RecursiveCharacterTextSplitter(chunk_size=500,        # 目标块大小(字符数,非token)chunk_overlap=50,      # 重叠部分separators=["\n\n""\n""。"";"" """])

进阶技巧:

对表格、代码块单独处理,不与其他文本混切;使用LLM 自动摘要长段落后再切分(成本高但效果好)。

三、元数据提取(Metadata Extraction

为什么要元数据?

RAG不只是找相似文本,还要支持:

权限控制:用户不能看到财务机密;

时效过滤:只检索2024 年后的政策;

来源追溯:回答时附带来自《员工手册v3.2》第15 

提取哪些元数据?

元数据类型示例用途

Source–https://wiki.example.com/hr/policy–引用来源

title–2024年差旅报销标准提升检索相关性

author–HR部门权限/可信度判断

created_at / updated_at–2024-05-01–时效过滤

department–finance, legal–权限隔离

doc_type–contract, manual, email–路由不同处理流程

如何提取?

结构化来源(如数据库):直接映射字段;

非结构化文档(如PDF):

从文件名/路径推断(如/finance/2024/Q2_report.pdf → department=finance);

用正则匹配文档开头(如发文单位:XXX”);

用小型NER 模型抽取日期、机构名;

人工标注模板(适用于高频文档类型)。

4使用工具:

LangChainDocument 对象天然支持metadata 字典;

自研pipeline 可用JSON/YAML 存储元数据。

四、格式转换(Format Normalization

转换成什么格式?

最终目标格式:纯文本(Plain Text结构化元数据(JSON

原因:所有Embedding 模型都吃纯文本;

纯文本易于分块、清洗、索引;元数据单独存储,不影响向量化。

转换流程示例

输入:一份PDF 合同

[PDF解析] → 提取文字表格(用pdfplumber

[清洗] → 去页眉机密三年、脱敏身份证号

[元数据提取] → source=file:///contracts/2024/abc.pdf, type=contract, party=A公司

[分块] → 切成500 /块,每块带相同元数据

输出:List[Document(text=”…”, metadata={…})]

最佳实践:

保留原始文件哈希值(如SHA256),用于去重;记录处理时间戳,支持增量更新;对无法解析的文件(如加密PDF)打标并告警。

五、总结:谁来做?用什么做?产出什么?

任务主要参与者推荐工具交付物

数据收集数据工程师+业务方–Airbyte, 自研爬虫, API SDK–原始文档集合

清洗与脱敏数据工程师+合规团队–Unstructured, spaCy, 正则干净文本

分块–AI工程师–LangChain, LlamaIndex–分块列表(带overlap

元数据提取–AI工程师+业务专家规则引擎+小模型metadata–字典

格式标准化全流程自动化–JSON + Plain Text–统一输入格式供向量化

查看该公众号全部文章,点击屏幕左下方+关注按钮,可获得从01的全部教程和上手资料。

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 文档摄入管道Ingestion Pipeline实际应用落地

评论 抢沙发

2 + 9 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮