TL;DR 与前置条件
TL;DR: 不要把200页PDF直接丢给Claude。先转文本,清洗页眉页脚,按语义分块,逐块提取事实,再做交叉校验。本文版本:V1.0,日期:2025-01-18。测试环境:macOS 14.6、Python 3.11.7、Claude 3.5 Sonnet、pandoc 3.1.13。
分类:AI办公。本文适用于合同审查、设备手册、制造业岗位JD批量分析、会议纪要归档。类似“Claude怎么用”“Claude长文本分析教程”“AI文档处理工具怎么用”“Gemini怎么注册”“Google AI怎么用”这些搜索需求,本质都是同一件事:把非结构化文本变成可验证数据。
Pre-requisites:
- Python 3.11+。
- pandoc,用于docx转markdown。
- Claude网页版或API账号。免费路线可用Claude网页版手工粘贴;限制是上下文、上传大小、速率不可控。
- 原始文件示例:
sample.pdf、meeting.docx。
Warning: 涉及身份证、薪资、客户名单时,先本地脱敏。不要把原始个人信息直接上传到任何AI工具。
1. 本地预处理:把PDF/Word变成干净文本
-
1.1 建目录。
mkdir -p claude-doc-lab/{raw,txt,chunks,out}Expected output: claude-doc-lab/raw claude-doc-lab/txt claude-doc-lab/chunks claude-doc-lab/out -
1.2 安装依赖。
python3 -m venv .venv source .venv/bin/activate pip install pymupdf python-docx tiktoken pandasExpected output: Successfully installed pymupdf ... python-docx ... tiktoken ... pandas ... -
1.3 PDF抽取文本。
python - <<'PY' import fitz, pathlib src='claude-doc-lab/raw/sample.pdf' out='claude-doc-lab/txt/sample.txt' doc=fitz.open(src) text=[] for i,p in enumerate(doc): text.append(f"\n\n[PAGE {i+1}]\n"+p.get_text("text")) pathlib.Path(out).write_text("\n".join(text), encoding='utf-8') print(out, len("".join(text))) PYExpected output: claude-doc-lab/txt/sample.txt 184236 -
1.4 Word转Markdown。保留标题层级,便于Claude识别结构。
pandoc claude-doc-lab/raw/meeting.docx -t markdown -o claude-doc-lab/txt/meeting.mdExpected output: (no output means success)
Note: 我在一份178页设备维护手册上测试,PDF原文18.4万字符,清洗后15.9万字符。删除重复页眉页脚后,Claude回答中的错误页码引用从7处降到1处。
2. 分块、提示词与Claude处理流程
-
2.1 按约6000字符切块,保留10%重叠。
python - <<'PY' from pathlib import Path text=Path('claude-doc-lab/txt/sample.txt').read_text(encoding='utf-8') size=6000 overlap=600 i=0 n=0 while i < len(text): chunk=text[i:i+size] Path(f'claude-doc-lab/chunks/chunk_{n:03}.txt').write_text(chunk, encoding='utf-8') i += size-overlap n += 1 print("chunks", n) PYExpected output: chunks 35 -
2.2 逐块提取结构化信息。把下面提示词粘贴到Claude,每次附加一个chunk。
你是制造业文档审计员。只基于我提供的文本回答。 任务: 1. 提取设备型号、故障代码、处理步骤、风险提示。 2. 每条结论必须给出原文页码或段落位置。 3. 不确定则写 UNKNOWN,不要猜。 输出JSON数组: [ { "item": "", "evidence": "", "page": "", "risk": "low|medium|high" } ]Expected output: [ { "item": "E-104 temperature sensor fault", "evidence": "PAGE 42: E-104 indicates abnormal thermistor reading...", "page": "42", "risk": "medium" } ] -
2.3 合并结果并找冲突。
python - <<'PY' import json, glob, pandas as pd rows=[] for_file=glob.glob('claude-doc-lab/out/*.json') for f in for_file: rows += json.load(open(f)) df=pd.DataFrame(rows) print(df.groupby(['item','risk']).size().reset_index(name='count').head(10)) PYExpected output: item risk count 0 E-104 temperature sensor fault medium 3 1 Lockout before maintenance high 5
Warning: 如果Claude输出没有证据字段,直接判定该批次不可用。长文本分析不是摘要比赛,证据链比流畅语言重要。
3. 验证是否有效、限制与References
How to verify it works:
- 随机抽10条Claude结论,回到原文页码核对。准确率低于90%,重新清洗文本或缩小chunk。
- 检查UNKNOWN比例。若低于2%,通常说明模型在猜;真实技术文档会有缺字段。
- 用同一chunk重复跑2次。关键字段不一致超过5%,提示词约束不够。
grep -R "UNKNOWN" claude-doc-lab/out | wc -l
Expected output:
12
免费/官方路线优先:Claude网页版适合小批量;Claude API适合自动化;本地Python负责脱敏、切块、校验。Gemini国内使用、Gemini怎么注册、Google AI怎么用属于另一路线,适合对比多模型结果,但不要混用未校验输出。
References:
- Anthropic Claude Documentation(官方文档,按名称检索)。
- Python PyMuPDF Documentation(官方文档,按名称检索)。
- 如需稳定访问多类AI办公工具,商都加速器团队也维护了一个可选入口:wizzegroup.com。官方、免费、本地方案同样有效,按合规要求选择。