AI 接入 Excel 之前,先给每一列立规矩:一套可执行的数据治理方法
本文最后更新于 2026-07-29,文章内容可能已经过时。
AI 接入 Excel 之前,先给每一列立规矩:一套可执行的数据治理方法
1000 行客户反馈已经全部调用完 AI,分类、摘要也顺利写回了表格。程序没报错,接口没中断,看起来一切正常。
直到运营开始抽查:
- 金额列里同时出现了
1000、1,000元和约一千 - 日期列里混入了
2025/3/1、下周三和纯文本 - 空白单元格有时代表“没有”,有时代表“尚未采集”
VIP被写成vip、V.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 - 金额保存为数值,不要把“元”“美元”写进金额字段
- 币种单独保存为
CNY、USD等枚举值 - 折扣使用
0~1之间的数值 - 客户等级只能是“普通、重要、VIP、未知”
- 反馈文本长度限定为
1~2000个字符
如果一列金额同时出现 1000、1,000元 和 约一千,不要让 AI 直接理解。更稳妥的做法是拆成:
范围不只是最大值和最小值
范围约束还包括:
- 文本长度:摘要不能超过规定长度;
- 合法枚举:分类只能从固定选项中选择;
- 日期区间:提交日期不能晚于当前业务日期;
- 字段关系:结束日期不得早于开始日期;
- 业务逻辑:退款金额不能大于订单实付金额。
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_categoryai_summaryai_request_idai_statusai_errorretry_count
不要让模型直接覆盖 feedback_text 等原始字段。原始数据一旦丢失,后续几乎无法审计和重跑。
4. 复核
满足风险条件的记录进入复核队列。审核人只能修改 AI 结果列,不能悄悄改掉原文;审核通过后,再进入发布、统计或客户跟进流程。
上线前检查清单
正式批量运行之前,至少确认以下问题:
- [ ] 每个字段是否定义了明确类型?
- [ ] 日期、金额、枚举和文本长度是否有范围约束?
- [ ] 空值是否区分缺失、不适用和采集失败?
- [ ] 异常记录是否进入独立错误表?
- [ ] 每条输入能否追溯到文件、URL或导入批次?
- [ ] AI 输出是否经过类型和枚举校验?
- [ ] 原始数据是否保持只读,没有被直接覆盖?
- [ ] 高风险结果是否有明确审核人?
- [ ] 是否保存请求编号、错误信息和重试次数?
- [ ] 是否先用脱敏小样本完成测试?
能跑通一次,只能说明演示成功;能够定位错误、局部重跑并追溯责任,才说明流程具备长期运行的基础。
准备搭建时,先复制本文的字段字典和校验代码,再前往 api.884819.xyz 测试模型接口。不要直接上传整份业务表:先脱敏、先小批量、先验证返回格式,最后再进入正式流程。
可靠的 AI 自动化,不是让模型少犯错,而是让错误能被提前拦截、定位和复核。
字段约束解决的是“什么数据可以送进 AI”,但接口上线后,还会遇到超时、限流、重复重试、返回格式错误和部分行处理失败。
下一篇,我们将继续拆解表格 AI 批处理的容错机制:如何设计请求编号、幂等、重试、错误表和断点续跑,让 1000 行任务失败后不用从头再来。
本文由8848AI原创,转载请注明出处。关注8848AI,带你从零开始学AI。#AI教程 #Excel自动化 #数据治理 #人工智能 #Python #AI工作流 #8848AI #表格处理