本文最后更新于 2026-07-29,文章内容可能已经过时。

AI 接入 Excel 之前,先给每一列立规矩:一套可执行的数据治理方法

1000 行客户反馈已经全部调用完 AI,分类、摘要也顺利写回了表格。程序没报错,接口没中断,看起来一切正常。

直到运营开始抽查:

  • 金额列里同时出现了 10001,000元约一千
  • 日期列里混入了 2025/3/1下周三 和纯文本
  • 空白单元格有时代表“没有”,有时代表“尚未采集”
  • VIP 被写成 vipV.I.P,甚至“重要客户”
  • 部分反馈没有来源,已经无法追溯原始记录

真正棘手的不是重新调用 AI,而是你根本不知道:哪几行应该重跑,哪些结果还能相信,哪些错误已经悄悄进入下游。

AI 批处理最危险的状态,不是程序直接报错,而是程序正常运行,结果却合理地错了。

这类事故通常不是模型能力不足,而是输入表格没有明确的“数据契约”。AI 会努力猜测每个单元格的意思,但批量流程最怕的,恰恰就是这种看似合理的猜测

提示词负责告诉 AI 做什么,字段约束负责保证 AI 拿到什么。

在让 AI 自动分类、摘要、翻译或补全数据之前,先要约束五件事:类型、范围、缺失、来源和复核。

一、AI 不是从第一行开始出错,而是从表头定义不清开始出错

很多表格只有字段名,没有字段定义。

例如一列叫“客户等级”,填写的人可能理解为:

  • 普通、重要、VIP
  • 一级、二级、三级
  • A、B、C
  • 高价值、普通、流失风险

人类看到这些内容,大致可以猜出意思。但代码无法稳定判断,AI 即使能够理解,也可能在不同批次中给出不同映射。

下面是一份故意加入问题的“客户反馈自动分类”演示表。为了避免伪造真实客户信息,示例均为脱敏构造数据,但错误类型来自常见业务场景。

图 1:问题表格截图素材

| record_id | feedback_text | submitted_at | customer_level | source | source_batch | | R001 | 退款三天了还没到账 | 2025-03-01 | VIP | crm_export_01.csv | BATCH-01 | | R002 | 请问会员什么时候到期 | 2025/03/01 | 普通 | crm_export_01.csv | BATCH-01 | | R003 | | 2025-03-02 | 重要 | crm_export_01.csv | BATCH-01 | | R004 | 新版本能否增加批量导出 | 2025-03-02 | V.I.P | feedback.xlsx | BATCH-02 | | R005 | 客服一直没有回复 | 2025-03-03 | 普通 | | BATCH-02 | | R006 | 希望下周联系我 | 下周三 | 普通 | crm_export_02.csv | BATCH-03 | | R007 | 发票抬头在哪里修改 | 2025-03-04 | 重要 | helpdesk.csv | BATCH-03 | | R008 | 页面偶尔无法打开 | 2025-03-04 | 未知 | https://example.com/ticket/8 | BATCH-04 | | R009 | 1000 | 2025-03-05 | 普通 | call_record.csv | BATCH-04 | | R010 | 产品价格太贵 | 2025-03-05 | 普通 | 来源不明 | | | R011 | 合同承诺的服务没有提供 | 2025-03-06 | VIP | contract_feedback.csv | BATCH-05 | | R012 | 建议增加深色模式 | 2025-03-06 | 普通 | app_feedback.csv | BATCH-05 |

这里至少包含五类风险:

1. 日期格式不统一;

2. 必填文本为空;

3. 枚举值拼写不一致;

4. 来源缺失或不可追踪;

5. 高风险客户反馈没有复核标记。

如果不做预检,这 12 行都可能被发送给 AI。模型或许能“看懂”其中大部分,但看懂不等于数据合法,更不等于流程可靠。

二、先约束类型和范围,堵住最常见的格式错误

字段类型不能只写“文本、数字、日期”,还要明确机器能够检查的格式

例如:

  • 日期统一为 YYYY-MM-DD
  • 金额保存为数值,不要把“元”“美元”写进金额字段
  • 币种单独保存为 CNYUSD 等枚举值
  • 折扣使用 0~1 之间的数值
  • 客户等级只能是“普通、重要、VIP、未知”
  • 反馈文本长度限定为 1~2000 个字符

如果一列金额同时出现 10001,000元约一千,不要让 AI 直接理解。更稳妥的做法是拆成:

| amount | currency | amount_note | |---:|---|---| | 1000 | CNY | | | 1000 | CNY | 原始值为“1,000元” | | | | 原始值为“约一千”,待人工确认 |

范围不只是最大值和最小值

范围约束还包括:

  • 文本长度:摘要不能超过规定长度;
  • 合法枚举:分类只能从固定选项中选择;
  • 日期区间:提交日期不能晚于当前业务日期;
  • 字段关系:结束日期不得早于开始日期;
  • 业务逻辑:退款金额不能大于订单实付金额。

Excel 或 WPS 用户可以先使用:

1. 数据验证限制日期和数值;

2. 下拉列表限制枚举值;

3. 条件格式标记空值、重复值和异常值;

4. 公式检查跨字段逻辑。

图 2:Excel/WPS 数据验证截图素材

| 字段 | 数据验证设置 | 错误提示 | | submitted_at | 日期,按统一格式录入 | 请输入 YYYY-MM-DD 格式日期 | | customer_level | 下拉列表:普通、重要、VIP、未知 | 请选择列表中的值 | | feedback_text | 文本长度 1~2000 | 反馈内容不能为空或过长 | | review_status | 下拉列表:待复核、通过、驳回 | 不允许自行填写其他状态 |

进阶用户可以进一步使用 JSON Schema、Pydantic 或 Python 脚本,把规则放在 API 调用之前执行。

关键原则是:异常值进入隔离区,而不是直接交给 AI“自行理解”。

三、处理缺失、来源和复核,避免结果无法追责

一个空白,可能代表四种不同状态

业务表格中的空白单元格,至少可能表示:

  • 确实没有;
  • 暂未采集;
  • 对当前记录不适用;
  • 采集失败。

如果四种状态都用空白表示,AI 和代码都无法区分。

更合理的做法是给关键字段设置明确的缺失策略:

| 缺失情况 | 建议处理 | | record_id 缺失 | 终止本行处理 | | feedback_text 缺失 | 不调用 AI,退回补录 | | submitted_at 缺失 | 标记“待补录” | | customer_level 缺失 | 在业务允许时填入“未知” | | source 缺失 | 进入错误表,不允许继续 | | reviewer 缺失 | 待复核阶段允许,通过阶段不允许 |

来源字段是数据的“快递单号”

每条输入都应尽量保留:

  • 原始文件名或 URL;
  • 导入批次;
  • 采集时间;
  • 操作者或导入系统;
  • 原始行号。

每条 AI 输出则建议记录:

  • 请求编号;
  • 使用的模型;
  • 处理时间;
  • AI 返回内容;
  • 处理状态;
  • 错误信息;
  • 重试次数;
  • 是否需要人工复核。

没有来源,错误发生后只能猜;有了来源,才能回到原始记录重新核对。

高风险结果必须进入复核闭环

以下内容不应由 AI 结果直接覆盖原始数据:

  • 金额和财务数据;
  • 合同条款;
  • 医疗、法律等专业建议;
  • 对外公开发布的内容;
  • VIP 客户投诉;
  • 涉及服务承诺或赔偿的结论。

审核状态至少应包含:

待复核 → 通过 / 驳回

图 3:AI 结果复核队列截图素材

| record_id | 原文 | AI 分类 | AI 摘要 | review_status | reviewer | | R001 | 退款三天了还没到账 | 投诉 | 用户反馈退款到账时间过长 | 待复核 | | | R007 | 发票抬头在哪里修改 | 咨询 | 用户询问发票抬头修改入口 | 通过 | 李明 | | R011 | 合同承诺的服务没有提供 | 投诉 | 用户认为服务未按合同履行 | 待复核 | |

注意,人工复核不是“重新看一遍所有结果”,而是按照风险规则,只把需要判断的记录送进队列。

四、把五类约束做成可执行的字段字典

字段字典不是写完就存进文件夹的说明文档,而应该成为表格、代码、提示词和审核规则共同引用的单一事实来源

图 4:字段字典截图素材

| 字段 | 业务含义 | 类型 | 范围/格式 | 缺失策略 | 来源要求 | 复核要求 | 错误处理 | | record_id | 记录唯一编号 | 字符串 | 唯一,1~50字符 | 不允许缺失 | 导入系统生成 | 无 | 隔离 | | feedback_text | 客户反馈原文 | 字符串 | 1~2000字符 | 缺失则不调用AI | 原始反馈 | 无 | 退回补录 | | submitted_at | 提交日期 | 日期 | YYYY-MM-DD | 标记待补录 | 业务系统 | 无 | 隔离 | | customer_level | 客户等级 | 枚举 | 普通/重要/VIP/未知 | 可填“未知” | CRM | VIP需复核 | 标准化或隔离 | | source | 原始数据来源 | 字符串 | URL或文件批次号 | 不允许缺失 | 采集记录 | 无 | 隔离 | | source_batch | 导入批次 | 字符串 | 批次号 | 不允许缺失 | 导入流程 | 无 | 隔离 | | ai_category | AI分类结果 | 枚举 | 咨询/投诉/建议/其他 | 不允许缺失 | AI生成 | 按规则复核 | 重试或人工处理 | | ai_summary | AI摘要 | 字符串 | 建议限制长度 | 不允许缺失 | AI生成 | 高风险内容复核 | 重试 | | review_status | 审核状态 | 枚举 | 待复核/通过/驳回 | 默认待复核 | 审核流程 | 必填 | 禁止发布 | | reviewer | 审核人 | 字符串 | 内部账号或姓名 |通过时必填 | 审核流程 | 必填 | 退回审核 |

两层校验比一道防线更可靠

第一层放在 Excel/WPS 中,尽量阻止明显错误进入表格。

第二层放在 API 调用前。因为表格数据可能来自复制粘贴、文件合并或外部系统导入,前端的数据验证并不能覆盖所有情况。

下面是一段新手也能理解的 Python 校验代码:

from datetime import datetime

ALLOWED_LEVELS = {"普通", "重要", "VIP", "未知"}

def validate_row(row):

errors = []

# 1. 类型

if not isinstance(row.get("feedback_text"), str):

errors.append("feedback_text 必须是字符串")

# 2. 范围

text = row.get("feedback_text") or ""

if not 1 <= len(text) <= 2000:

errors.append("feedback_text 长度必须在 1~2000 之间")

level = row.get("customer_level", "未知")

if level not in ALLOWED_LEVELS:

errors.append("customer_level 不在允许范围内")

# 3. 缺失

if not row.get("record_id"):

errors.append("record_id 不允许缺失")

# 4. 来源

if not row.get("source"):

errors.append("source 不允许缺失")

# 日期格式检查

try:

datetime.strptime(row["submitted_at"], "%Y-%m-%d")

except (KeyError, TypeError, ValueError):

errors.append("submitted_at 必须为 YYYY-MM-DD")

# 5. 复核

needs_review = level == "VIP"

return {

"valid": len(errors) == 0,

"errors": errors,

"review_status": "待复核" if needs_review else "无需复核"

}

AI 输出也要结构化,例如只允许返回:

{

"category": "投诉",

"summary": "用户反馈退款到账时间过长",

"needs_review": true,

"review_reason": "涉及退款金额和服务承诺"

}

但必须强调:模型输出了 JSON,不代表数据一定合法。

代码端仍需检查:

  • category 是否属于固定枚举;
  • summary 是否为字符串且长度合规;
  • needs_review 是否为布尔值;
  • 必填字段是否全部存在;
  • 是否出现了合同中没有定义的新字段。

五、接入 AI,采用“校验—调用—回写—复核”四段式流程

一个可长期运行的 AI 表格流程,应该是:

原始表格

字段校验

├─ 不合格 → 错误表 → 人工修正

└─ 合格 → 调用 AI → 输出校验

├─ 不合格 → 重试/人工处理

└─ 合格 → 回写结果 → 必要时人工复核

1. 校验

逐行检查类型、范围、缺失和来源。不合格记录写入错误表,禁止发送给 AI。

图 5:异常记录隔离表截图素材

| row_number | record_id | field | error_reason | status | |---:|---|---|---|---| | 2 | R002 | submitted_at | 日期不是 YYYY-MM-DD | 待修正 | | 3 | R003 | feedback_text | 必填字段为空 | 待补录 | | 4 | R004 | customer_level | V.I.P 不在允许枚举中 | 待确认 | | 5 | R005 | source | 来源缺失 | 待补录 | | 6 | R006 | submitted_at | “下周三”不是确定日期 | 待确认 | | 9 | R009 | feedback_text | 内容疑似数字,不符合文本要求 | 待确认 | | 10 | R010 | source | 来源不可追踪 | 待补录 |

对上面的 12 条演示数据进行静态预检,可以确定拦截 7 条异常记录,仅让 5 条进入下一步。若完全不校验,则会发起 12 次调用。

这里能可靠统计的是本地规则拦截数量。至于结构化输出失败、接口错误和人工返工数量,必须使用确定的模型、提示词与接口实际运行后记录,不能预先编造一个百分比。

建议按下面的实验表如实填写:

| 指标 | 无约束组 | 五类约束组 | |---|---:|---:| | 样本规模 | 12 | 12 | | 本地拦截异常行 | 0 | 7 | | 进入 API 的记录 | 12 | 5 | | 结构化输出失败 | 实测填写 | 实测填写 | | 进入人工返工 | 实测填写 | 实测填写 | | 无法追溯来源 | 实测填写 | 实测填写 |

2. 调用

只有通过校验的记录才能调用模型。此时提示词只传递任务需要的字段,不要把无关的客户隐私和内部备注一并发送。

当字段校验通过后,可以通过 api.884819.xyz 配置并测试 API 调用。建议先使用 10~20 条脱敏样本,确认结构化输出、错误记录和复核流程正常,再扩大处理规模。

8848AI 使用用户名和密码即可注册,不需要邮箱验证;平台内置 AI 对话功能,注册后可以直接使用。国产模型如 Deepseek、千问等可免费使用,其他服务没有月租和订阅,按量付费。

新用户注册即送体验token。

3. 回写

AI 结果必须写入新列或独立结果表,例如:

  • ai_category
  • ai_summary
  • ai_request_id
  • ai_status
  • ai_error
  • retry_count

不要让模型直接覆盖 feedback_text 等原始字段。原始数据一旦丢失,后续几乎无法审计和重跑。

4. 复核

满足风险条件的记录进入复核队列。审核人只能修改 AI 结果列,不能悄悄改掉原文;审核通过后,再进入发布、统计或客户跟进流程。

上线前检查清单

正式批量运行之前,至少确认以下问题:

  • [ ] 每个字段是否定义了明确类型?
  • [ ] 日期、金额、枚举和文本长度是否有范围约束?
  • [ ] 空值是否区分缺失、不适用和采集失败?
  • [ ] 异常记录是否进入独立错误表?
  • [ ] 每条输入能否追溯到文件、URL或导入批次?
  • [ ] AI 输出是否经过类型和枚举校验?
  • [ ] 原始数据是否保持只读,没有被直接覆盖?
  • [ ] 高风险结果是否有明确审核人?
  • [ ] 是否保存请求编号、错误信息和重试次数?
  • [ ] 是否先用脱敏小样本完成测试?

能跑通一次,只能说明演示成功;能够定位错误、局部重跑并追溯责任,才说明流程具备长期运行的基础。

准备搭建时,先复制本文的字段字典和校验代码,再前往 api.884819.xyz 测试模型接口。不要直接上传整份业务表:先脱敏、先小批量、先验证返回格式,最后再进入正式流程。

可靠的 AI 自动化,不是让模型少犯错,而是让错误能被提前拦截、定位和复核。

字段约束解决的是“什么数据可以送进 AI”,但接口上线后,还会遇到超时、限流、重复重试、返回格式错误和部分行处理失败。

下一篇,我们将继续拆解表格 AI 批处理的容错机制:如何设计请求编号、幂等、重试、错误表和断点续跑,让 1000 行任务失败后不用从头再来。

本文由8848AI原创,转载请注明出处。关注8848AI,带你从零开始学AI。

#AI教程 #Excel自动化 #数据治理 #人工智能 #Python #AI工作流 #8848AI #表格处理