在企业知识管理和科研辅助场景中,大量信息被锁在PDF文件里。PDF既不是纯文本也不是标准HTML,它内部可能包含流式排版、字体子集、矢量图与扫描图像,直接读取经常得到乱码或缺失换行的字符串。Agent作为一种以大模型为决策核心、可调用外部工具的自动化程序,能够把PDF解析、文本清洗、语义分块与总结生成串联起来,形成一条可复用的处理管道。下面我们从一个具体实现出发,拆解其中的关键技术点。

PDF解析库选型与文本抽取原理
要实现PDF内容提取,第一步是选择合适的解析工具。常见的Python库包括PyPDF2、pdfplumber、PyMuPDF(fitz)以及专门处理扫描件的OCR引擎如Tesseract配合pdf2image。PyPDF2适合快速抽取数字型PDF的文本,但遇到多栏排版或嵌入字体时容易把顺序弄乱;pdfplumber基于PDF原始内容流做分析,能拿到每个字符的坐标,适合做表格提取;PyMuPDF速度极快且支持提取图片与注解。理解这些差异,才能针对业务文档挑工具。
从原理上看,数字PDF本质是一组对象,页面内容通过内容流中的文本显示操作符(如Tj)绘制到画布。解析库读取这些操作符,结合字体映射表把字形编号转为Unicode。若文档使用了自定义字体子集且未嵌入ToUnicode表,就会抽出不对应文字的方块。此时需要借助OCR或基于视觉的模型。下面示例展示用pdfplumber提取单页文本与表格:
import pdfplumber
with pdfplumber.open("sample.pdf") as pdf:
page = pdf.pages[0]
# 提取纯文本
text = page.extract_text()
print(text)
# 提取表格
tables = page.extract_tables()
for table in tables:
for row in table:
print(row)
在Agent架构里,解析不应写死某库,而应交由工具模块暴露统一接口,例如extract_pdf(path)返回标准化字典。这样当遇到扫描件时,Agent可自动切换OCR分支。需要留意的是,很多开发者忽略PDF元数据中的标题与书签,其实<outline>结构能直接给出文档逻辑层级,比从正文猜标题可靠得多。
文本清洗、分块与语义保持策略
原始抽取文本常带多余空格、页眉页脚与断行。若直接丢给大模型总结,噪声会拉低质量。清洗阶段要用规则去掉连续空白、匹配页脚正则(如页码加公司名),并用换行合并算法恢复段落。例如某行结尾无标点且下一行缩进很小,大概率属同一段,可合并。清洗后还需做语言检测,混排中英文时方便后续调用不同模型。
分块(chunking)是决定总结效果的核心。盲目按字数切分会切断句子,导致大模型失去上下文。推荐递归分隔符法:优先按标题(如“1.2 实验方法”)切,再按空行,最后按句号。每块控制在模型上下文的百分之三十以内,预留空间给提示词与输出。对于论文,可借助之前提取的<outline>让分块对齐章节。以下代码展示一个简单的递归分块函数:
def recursive_split(text, max_len=800):
if len(text) <= max_len:
return [text]
# 先按双换行分
parts = text.split("nn")
if len(parts) == 1:
# 退化为按句号分
parts = text.split("。")
res = []
buf = ""
for p in parts:
if len(buf) + len(p) <= max_len:
buf += p
else:
res.append(buf)
buf = p
if buf:
res.append(buf)
return res
Agent在分块后可为每块打上序号与层级标签,总结时先块内摘要,再全局归纳,避免重复。相较于一次性总结整文档,这种分层策略在长文档上明显提升连贯性,也方便用户定位原文。实践中还要注意代码块与公式,LaTeX片段如果被切断,摘要会出现乱码,因此分块前可用正则保护$$...$$区域。
大模型提示词设计与Agent编排
总结质量高度依赖提示词。基础提示“总结一下”太弱,应明确角色、输入格式、输出结构与长度约束。例如告诉模型:“你是技术文档编辑,下面给出某章文本,请用三条要点概括,每条不超四十字,保留专业术语。”Agent可把清洗后分块循环送入该提示,收集局部摘要,再发起第二轮请求做整体归纳,形成map-reduce风格。
在Agent编排上,可用LangChain或自写状态机。状态包括:接收PDF路径、调用解析工具、清洗、分块、逐块总结、合并总结、输出Markdown。若某块总结返回空或报错,Agent应能重试或降级为关键词提取。下面给出一个极简的Agent循环伪代码,展示如何串起上述步骤:
def run_agent(pdf_path):
raw = extract_pdf(pdf_path)
clean = clean_text(raw["text"])
chunks = recursive_split(clean)
local_summaries = []
for c in chunks:
prompt = build_prompt(c)
out = llm_call(prompt)
local_summaries.append(out)
final = llm_call(build_merge_prompt(local_summaries))
return final
除了文本模型,也可引入视觉多模态模型直接看PDF渲染图,对复杂排版的表格与图示总结更稳,但成本高。工程上建议数字文本走语言模型,仅当解析失败率超阈值时切视觉分支。Agent还可把生成的摘要回写进原PDF元数据或另存为HTML报告,用<article>标签包裹,方便检索。经过以上环节,一个能稳定运行的PDF提取与总结Agent就成型了。
PDF_extractionLLM_Agenttext_summarization修改时间:2026-08-18 03:42:30