用途
本文档提供一套实用决策框架,用于解析结构化文本,例如试卷题目、表单、发票、收据和文档。其核心观点是:正则表达式能以低成本、确定性的方式处理 95%-98% 的案例,应把昂贵的大语言模型(LLM)调用保留给剩余的边缘情况。
何时适用
- 解析具有重复模式的结构化文本(题目、表单、表格)
- 在正则表达式与 LLM 之间选择文本提取方案
- 构建结合两种方法的混合流水线
- 优化文本处理中的成本与准确率权衡
决策框架
判断文本格式是否一致且重复:
- 是(超过 90% 遵循模式)→ 从正则开始
- 正则覆盖 95% 以上 → 完成,无需 LLM
- 正则覆盖低于 95% → 仅对边缘情况添加 LLM
- 否(自由格式、高度多变)→ 直接使用 LLM
架构模式
源文本 → 正则解析器(提取结构,准确率 95%-98%)→ 文本清洗器(去除噪声,如标记、页码、伪影)→ 置信度评分器(标记低置信度提取结果)
- 高置信度(≥0.95)→ 直接输出
- 低置信度(<0.95)→ LLM 校验器 → 输出
实现
1. 正则解析器(处理大多数情况)
示例代码使用 Python 的 re 和 dataclasses,定义 ParsedItem 数据类,通过正则模式匹配编号、题干、选项和答案,并返回解析结果列表。代码中定义的字段包括 id、text、choices、answer 和 confidence,默认置信度为 1.0。
2. 置信度评分
对可能需 LLM 复核的条目进行标记。示例定义了 ConfidenceFlag 数据类,包含 item_id、score 和 reasons。评分函数在选项少于 3 个、缺少答案、题干文本过短等情况下扣分,并返回低置信度条目列表。
3. LLM 校验器(仅边缘情况)
对低置信度提取结果调用 LLM 修正。示例中使用 claude-haiku-4-5-20251001 作为最便宜的校验模型,将原文与当前提取结果一并发送,要求返回修正后的 JSON 或标注 CORRECT。
4. 混合流水线
process_document 函数整合完整流程:先用正则提取,再进行置信度评分,若存在低置信度条目且提供了 LLM 客户端,则仅对这些条目调用 LLM 校验,其余保持原样输出。
实际指标
来自一个生产环境的试卷解析流水线(共 410 个条目):
- 正则成功率:98.0%
- 低置信度条目:8 个(2.0%)
- 需要 LLM 调用:约 5 次
- 相比全部使用 LLM 的成本节省:约 95%
- 测试覆盖率:93%
最佳实践
- 从正则开始——即使正则不完美,也能提供可改进的基线
- 使用置信度评分以程序化方式识别需要 LLM 帮助的内容
- 使用最便宜的 LLM 做校验(Haiku 级别的模型足够)
- 不要修改已解析的对象——清洗和校验步骤应返回新实例
- TDD 适合解析器——先为已知模式编写测试,再覆盖边缘情况
- 记录指标(正则成功率、LLM 调用次数)以跟踪流水线健康度
应避免的反模式
- 在正则能处理 95% 以上案例时仍将所有文本发送给 LLM(昂贵且缓慢)
- 对自由格式、高度多变的文本使用正则(此时 LLM 更合适)
- 跳过置信度评分,指望正则“自然有效”
- 在清洗或校验步骤中修改已解析对象
- 不测试边缘情况(格式错误输入、缺失字段、编码问题)
适用场景
- 试卷/考题题目解析
- 表单数据提取
- 发票/收据处理
- 文档结构解析(标题、章节、表格)
- 任何具有重复模式且对成本敏感的结构化文本