structured-data-batch-pipeline · ZH · 2026-10-20

把一列脏 CSV 变成干净记录:在一把 key 上分块、调用、校验、回填

本文介绍如何在一把 API key 下,用分块、模型分级调用、校验和回填的流水线,把脏 CSV 批量清洗成干净记录。重点解决记录错位、成本与准确率平衡的问题,适合处理中小规模数据抽取任务。

处理脏 CSV 时,最怕的不是脏数据本身,而是清洗后记录错位。本文给出一条可落地的流水线:切块、首轮抽取、二轮修补、校验、按原序回填。全程只需一把 API key,就能在多个模型间切换。

为什么不能一次性把整个 CSV 塞给模型

模型上下文有限,整表输入会导致截断、遗漏或串行。更麻烦的是,模型输出是自由文本,直接解析容易丢行、错位。把任务拆成小块,每块独立处理,才能保证可校验、可回填。

第一步:切块,并保留原始行号

切块不是简单按行数切。每块需要携带:

  • 原始行号范围(如第 101–200 行)
  • 表头(每块重复一次)
  • 块内行数上限(根据模型上下文和字段复杂度调整)

建议在切块时给每行加一个内部 ID(如 row_id),这个 ID 不参与模型推理,只用于回填。

第二步:用便宜模型跑首轮抽取

首轮目标不是完美,而是低成本覆盖大部分干净或半干净的行。选择价格较低的模型(如 DeepSeek、Qwen、GLM 等),给一个明确的输出格式要求:

  • 每行输出一个 JSON 对象
  • 必须包含 row_id 和抽取字段
  • 不要输出解释性文字

首轮后,你会得到一批解析成功的记录和一批失败或低置信度的记录。

第三步:用强模型修补问题行

把首轮失败、格式错误、字段缺失或明显异常的行挑出来,连同原始行内容一起,交给更强的模型(如 Claude、GPT)做二次抽取。

修补时注意:

  • 只传问题行,不要重跑整块
  • 保留原始 row_id,方便合并
  • 要求模型只输出修正后的 JSON,不要复述原文

第四步:校验,别跳过

校验分两层:

  1. 格式校验:每条记录必须是合法 JSON,必须包含 row_id 和所有必填字段。
  2. 业务校验:字段类型、枚举值、日期格式、数值范围等。不符合的记录标记为待人工处理。

校验不通过的记录不要强行回填,单独输出一个 review.csv。

第五步:按原序回填,避免错位

回填的唯一依据是 rowid,不是数组顺序。把首轮和修补轮的结果按 rowid 合并,再按原始 CSV 的行序输出。如果某行没有对应记录,保留原始行并标记为 failed,而不是丢弃。

回填后做一次行数对账:输出行数必须等于输入行数。不等就说明有记录丢失或重复。

一把 key 怎么管住成本

聚合站的好处是同一把 key 能调不同模型。流水线里可以这样分工:

  • 首轮用便宜模型,覆盖大多数行
  • 修补轮用强模型,只处理少量问题行
  • 校验和回填在本地完成,不消耗 token

按官方价 ×1.3 扣费,意味着每省一次强模型调用都是实打实的成本下降。但不要为了省钱把强模型完全去掉——修补轮的质量直接决定最终清洗效果。

常见坑

  • 表头重复:每块都带表头,但回填时要去掉重复表头行。
  • 模型擅自合并行:在提示词里明确“一行输入对应一行输出”。
  • JSON 外包裹 markdown:要求模型只输出 JSON,解析前先剥离代码块标记。
  • 空行和注释行:切块前先清理,避免浪费 token。

小结

这条流水线的核心是:切块保留行号、首轮求覆盖、二轮求准确、校验保底线、回填靠 ID。用一把 key 在多个模型间切换,把成本和准确率拆开管理,比一次性丢给大模型更可控。