【RAG系列】知识加工的艺术 - 文档预处理实战手册

知识加工的艺术 - 文档预处理实战手册

原始文档
文档拆分
结构化数据
非结构化数据
表格处理器
文本分割器
格式化CSV
语义分块
知识图谱

一、文本拆分的积木法则

1.1 机械分割 vs 语义理解

固定窗口
上下文感知
段落拆分
...模型参数量达到175B时...
语义拆分
模型参数量...<分割点>...175B时表现
分割策略对比
方法 优点 缺点 代码示例
固定窗口 O(1)时间复杂度 割裂技术术语 text.split("\n\n")
滑动窗口 保留局部上下文 重复内容占用存储 [text[i:i+512] for i in range(0,len(text),256)]
语义分割 保持逻辑完整性 依赖NLP模型 semantic_splitter(text)
from langchain.text_splitter import SemanticChunker
from langchain_community.embeddings import HuggingFaceEmbeddings

# 语义分割器实现
class TechnicalSplitter:
    def __init__(self):
        self.embedder = HuggingFaceEmbeddings('BAAI/bge-base-zh')
        self.splitter = SemanticChunker(self.embedder, breakpoint_threshold=0.7)
  
    def chunk(self, text):
        return self.splitter.split_text(text)

# 测试法律条文分割
legal_text = "第一条 ...(此处省略具体法律条文)... 第十条 ..."
chunks = TechnicalSplitter().chunk(legal_text)

思考题:处理基因序列数据时,应该选择哪种分割策略?为什么?

二、元数据魔法:知识图谱的基石

2.1 标签注入五法

原始文本
元数据注入
正则匹配
NER识别
章节分析
外部知识库
人工规则
标签: 法律条文
实体: 张三/ORG
章节: 第三章
元数据应用案例
# 金融报告元数据标记
def tag_financial_report(text):
    metadata = {}
    # 正则匹配报告期间
    period = re.search(r"(\d{4}年\第[一二三四]季度)", text)
    if period:
        metadata["report_period"] = period.group(1)
  
    # 提取关键指标
    keywords = {"营收增长率": r"营收\s*增长\s*(\d+\.?\d*)%"}
    for k, v in keywords.items():
        match = re.search(v, text)
        if match:
            metadata[k] = float(match.group(1))
  
    # 章节结构分析
    sections = re.findall(r"第[一二三四]部分:(.+)", text)
    metadata["sections"] = sections
  
    return metadata

2.2 知识图谱构建

DOCUMENT string doc_id timestamp create_time CHUNK string content vector embedding ENTITY RELATION contains mentions has target

三、复杂文档处理:表格/公式/图示

3.1 PDF表格解析流水线

User Unstructured OCR TableTransformer 上传PDF文档 提取原始文本 返回混合内容 检测表格区域 表格坐标数据 转换表格为HTML 结构化表格数据 User Unstructured OCR TableTransformer
表格处理代码
from unstructured.partition.pdf import partition_pdf
from unstructured.staging.base import convert_to_html

# PDF表格提取
elements = partition_pdf("financial_report.pdf", strategy="hi_res")
tables = [e for e in elements if e.category == "Table"]

# 转换表格
html_tables = []
for table in tables:
    html = convert_to_html(table)
    html_tables.append(html)
    print(f"提取到{len(table.metadata.text_as_html)}行表格")

# 公式处理示例
math_formula = "\\[ E = mc^2 \\]"
latex_math = re.sub(r"\\\[(.*?)\\\]", r"$$\1$$", math_formula)

思考题:当表格跨页显示时,如何保证数据完整性?

四、开源工具链推荐

4.1 技术选型矩阵

PDF/扫描件
API集成
百万级
小规模
需求
文档类型
Unstructured
LlamaIndex
处理规模
LlamaIndex+分布式
Unstructured
工具对比表
工具名称 核心优势 适用场景 代码示例
Unstructured 复杂版式解析 扫描件/合同 partition_pdf()
LlamaIndex 智能索引构建 知识库构建 VectorStoreIndex()
Nougat 公式识别 学术论文 nougat.predict()
PDFPlumber 精准坐标定位 表格提取 extract_table()

4.2 生产级预处理流水线

from llama_index.core import SimpleDirectoryReader
from unstructured.cleaners.core import clean_extra_whitespace

class DocPipeline:
    def __init__(self):
        self.loader = SimpleDirectoryReader(input_dir="docs")
        self.cleaners = [clean_extra_whitespace, self._remove_headers]
  
    def _remove_headers(self, text):
        return re.sub(r"第\d+章\s+", "", text)
  
    def process(self):
        documents = self.loader.load_data()
        for doc in documents:
            # 清洗文本
            for cleaner in self.cleaners:
                doc.text = cleaner(doc.text)
            # 添加元数据
            doc.metadata.update(self._extract_metadata(doc.text))
        return documents

# 企业年报处理示例
pipeline = DocPipeline()
cleaned_docs = pipeline.process()

五、扩展思考:预处理的伦理边界

5.1 数据清洗的灰度地带

原始文档
敏感信息
个人隐私
商业机密
偏见内容
脱敏处理
访问控制
公平性审核
隐私保护实现
from presidio_analyzer import AnalyzerEngine
from presidio_anonymizer import AnonymizerEngine

analyzer = AnalyzerEngine()
anonymizer = AnonymizerEngine()

def anonymize_text(text):
    results = analyzer.analyze(text=text, language='zh')
    return anonymizer.anonymize(text, analyzer_results=results).text

# 测试示例
original = "患者张三,身份证号310101199901011234,确诊为糖尿病。"
print(anonymize_text(original)) 
# 输出:"患者<姓名>,身份证号<身份证号>,确诊为糖尿病。"

思考题:当处理历史档案时,是否应该保留带有时代偏见的表述?如何平衡保存原貌与伦理审查?


下篇预告:《工业级RAG系统设计 - 从玩具到生产系统》

  • 性能优化四板斧:缓存/异步/批处理/量化
  • 新鲜度保障:增量更新策略与版本控制
  • 安全防护:内容过滤与权限控制设计
  • 监控指标体系:检索命中率/响应延迟/成本监控

延伸阅读

  1. 《Document Engineering》Robert J. Glushko
  2. Unstructured官方文档:https://unstructured.io/
  3. LlamaIndex教程:https://docs.llamaindex.ai/

你可能感兴趣的:(原理概念,#,深度学习,深度学习,RAG,人工智能)