o3炸场之后,我拿“清洗电话号码”虐了它:前沿模型真正有用的,可能只有这4步
本文最后更新于 2026-08-08,文章内容可能已经过时。
o3炸场之后,我拿“清洗电话号码”虐了它:前沿模型真正有用的,可能只有这4步
o3刚在数学和编程基准上刷屏时,很多人的第一反应是:这是不是意味着日常办公也要被彻底改写了?
AIME、Codeforces、ARC-AGI、SWE-bench……这些名字听起来很硬核,也确实代表了模型在复杂推理、代码修复、抽象问题解决上的能力跃迁。
但我更关心另一个问题:
一个在数学竞赛里“炸场”的模型,能不能帮普通人把一段口头需求,变成一段以后能反复调用的脚本?
所以我没有先拿它解奥数,也没有让它写复杂系统架构。
我故意选了一个最土、最常见、最像真实工作的任务:
清洗销售表里的客户电话号码。去重、统一格式、标记异常、封装成 Python 函数——这类活不性感,但几乎每家公司、每个运营、销售、数据同学都遇到过。
结果有点反直觉:o3确实很强,但真正帮我提效的,不是它长篇大论的“链式思考”,而是里面少数几个关键中间步骤。
剩下的大半内容,更像是在空转 token。
这篇文章,我想把这次测试拆开讲透:前沿模型不是不能用,而是你要学会让它少表演、多干活。
---
第1章:o3刚刷新基准,我却先测了个“土”任务
先说背景。
根据 OpenAI 公开材料和第三方讨论,o3在多个复杂任务上表现非常亮眼:
- 在 AIME 2024 这类数学竞赛任务中,o3展示了很强的多步推理能力;
- 在 Codeforces 风格的编程竞赛任务中,o3被重点强调具备更强的代码推理和问题拆解能力;
- 在 SWE-bench Verified 这类真实 GitHub issue 修复任务中,o3也被拿来证明“模型不只是会写小段代码,而是能理解项目上下文”;
- 在 ARC-AGI 这类抽象推理基准上,o3同样引发了大量讨论。
配图建议:这里放 OpenAI 官方发布页或 ARC Prize 相关页面截图,标注 AIME、SWE-bench、ARC-AGI 等基准位置。
注意:不同测试设置、计算预算、评测版本会影响结果,建议引用官方原图,不要二次加工成夸张结论。
这些成绩当然重要。
但问题是,大多数普通用户每天并不在做 AIME,也不在修 Linux 内核 bug,更不会天天刷 ARC-AGI。
更多人的真实工作是这样的:
- Excel里电话格式乱七八糟;
- 客户名有重复;
- 手机号里混着空格、横杠、括号;
- 有些号码少一位、多一位、带国家区号;
- 老板只会口头说一句:“你帮我整理干净,下次也能复用。”
这才是 AI 是否能落地的关键场景。
于是我设计了一个非常朴素的测试:
把一段口语化业务需求丢给 o3,看它能不能生成一段可复用的数据清洗脚本。更重要的是,我不只看最终代码能不能跑,还要看它中间“想了些什么”。
因为很多人用高级模型时,会被长长的推理过程震住:看起来很聪明、很严谨、很高级。
但问题是:
哪些步骤真的提高了结果质量?哪些只是模型在给自己加戏?---
第2章:任务拆解——从“口头需求”到可复用脚本的完整链条
先看我给模型的原始需求。
我没有写成标准 PRD,也没有给字段字典,只用真实工作里常见的口语表达:
我有一个销售线索表,里面有一列叫 phone,客户电话格式很乱,有的有空格,有的有横杠,有的写了 +86,有的是 0086 开头,有的还带括号。
你帮我写一个 Python 函数,把这些电话清洗干净:
1. 中国大陆手机号统一成 11 位数字,比如 13800138000;
2. 如果是 +86 或 0086 开头,要去掉国家区号;
3. 去掉空格、横杠、括号等符号;
4. 如果号码不是合法大陆手机号,要标记为 abnormal;
5. 同一个手机号重复出现时,只保留第一次,后面的标记 duplicate;
6. 最后返回一个新的 DataFrame,保留原始 phone,新增 clean_phone 和 status 两列;
7. 希望以后别的表也能直接调用这个函数。
这段需求很典型:描述清楚了大方向,但没有完全形式化。
模型如果直接写代码,很容易漏掉边界条件,比如:
+86 138-0013-80000086-13800138000(+86) 138 0013 80001380013800少一位23800138000不是合法大陆手机号- 空值、
None、nan - 重复手机号如何标记
为了合规说明一下:现在很多模型和 API 并不会、也不建议直接暴露完整隐藏链式思考。更好的做法是让模型输出可审计的关键路径摘要,也就是“它做了哪些判断、为什么这么设计”,而不是要求它把所有内部推理逐字吐出来。
我让模型输出的是类似下面这种结构化推理摘要:
任务理解摘要:
1. 输入是一个 pandas DataFrame,至少包含 phone 列。
2. 输出应保留原始 phone,并新增 clean_phone、status 两列。
3. clean_phone 只在合法且非重复时保留标准化后的手机号。
4. status 至少包含 ok、abnormal、duplicate。
5. 手机号合法性按中国大陆手机号基本规则判断:11位、1开头、第二位为3-9。
6. 清洗流程应先统一字符串,再去除国家区号和非数字字符。
7. 去重应基于清洗后的合法手机号,并保留第一次出现。
8. 函数应可复用,字段名最好允许参数化。
这部分是有用的。
它把口头需求变成了工程步骤。
接下来是最终生成的 Python 脚本,我做了少量整理,让它更适合直接复制使用:
import re
import pandas as pd
from typing import Optional
def normalize_china_mobile(raw_phone: Optional[object]) -> Optional[str]:
"""
将原始手机号清洗为中国大陆 11 位手机号。
如果无法清洗为合法手机号,返回 None。
合法规则:
- 11 位数字
- 以 1 开头
- 第二位为 3-9
"""
if pd.isna(raw_phone):
return None
phone = str(raw_phone).strip()
if not phone:
return None
# 去掉常见分隔符前,先处理 +86 / 0086 等国家区号形式
# 例如:+86 138-0013-8000、0086-13800138000
phone = phone.replace("(", "(").replace(")", ")")
# 去掉所有非数字字符,+86 会变成 86
digits = re.sub(r"\D", "", phone)
# 处理 0086 开头
if digits.startswith("0086") and len(digits) > 11:
digits = digits[4:]
# 处理 86 开头
if digits.startswith("86") and len(digits) > 11:
digits = digits[2:]
# 校验中国大陆手机号
if re.fullmatch(r"1[3-9]\d{9}", digits):
return digits
return None
def clean_phone_dataframe(
df: pd.DataFrame,
phone_col: str = "phone",
clean_col: str = "clean_phone",
status_col: str = "status"
) -> pd.DataFrame:
"""
清洗 DataFrame 中的手机号字段。
返回:
- 保留原始 phone 列
- 新增 clean_phone 列
- 新增 status 列
status 说明:
- ok:合法且首次出现
- abnormal:无法识别为合法中国大陆手机号
- duplicate:合法手机号,但此前已经出现过
"""
if phone_col not in df.columns:
raise ValueError(f"DataFrame 中不存在字段:{phone_col}")
result = df.copy()
seen = set()
clean_values = []
status_values = []
for raw_phone in result[phone_col]:
clean_phone = normalize_china_mobile(raw_phone)
if clean_phone is None:
clean_values.append(None)
status_values.append("abnormal")
continue
if clean_phone in seen:
clean_values.append(clean_phone)
status_values.append("duplicate")
continue
seen.add(clean_phone)
clean_values.append(clean_phone)
status_values.append("ok")
result[clean_col] = clean_values
result[status_col] = status_values
return result
if __name__ == "__main__":
demo = pd.DataFrame({
"name": ["张三", "李四", "王五", "赵六", "钱七", "孙八"],
"phone": [
"+86 138-0013-8000",
"0086-13900139000",
"(137) 0013 7000",
"23800138000",
"13800138000",
None
]
})
cleaned = clean_phone_dataframe(demo)
print(cleaned)
这段代码不复杂,但它已经完成了一个从“口头需求”到“可复用函数”的闭环。
它做对了几件事:
- 把手机号标准化逻辑单独拆成
normalize_china_mobile; - 把 DataFrame 批处理逻辑封装为
clean_phone_dataframe; - 支持自定义字段名;
- 明确区分
ok、abnormal、duplicate; - 对空值、非法值、重复值都有处理。
如果你只是想完成工作,到这里其实已经够用了。
但真正有意思的,是拆开看它中间到底“想”了哪些东西。
---
第3章:中间步骤深度解剖——哪些真有用,哪些只是在空转 token
我把模型输出的推理摘要按功能拆开,大致可以分为两类。
第一类,是确实有用的关键步骤。
第二类,是看起来很认真,但对最终代码几乎没有贡献的空转内容。
真正有用的4类步骤
| 步骤类型 | 是否有用 | 为什么有用 | 对普通人的价值 | |---|---:|---|---| | 需求澄清 | 高 | 把“清洗电话”拆成输入、输出、字段、状态 | 防止模型直接乱写 | | 边界条件枚举 | 高 | 覆盖空值、区号、符号、非法号、重复号 | 决定脚本能不能真实使用 | | 错误处理设计 | 高 | 处理缺失字段、非法输入、异常状态 | 避免上线后崩掉 | | 可复用性抽象 | 高 | 拆函数、参数化字段名、保留原始列 | 从一次性脚本变成工具 |这4类步骤,是我认为普通人最应该学会保留的。
你甚至不需要懂模型内部怎么推理,只要会要求它输出这4项,就能显著提高结果质量。
比如这句提示词就很关键:
请先输出“需求澄清、边界条件、错误处理、可复用设计”四部分摘要,再给代码,不要展开无关推理。
这比“你一步一步思考”更有效。
因为“逐步思考”很容易诱导模型写出一大段看似严谨、实际重复的信息。
最容易空转的4类内容
我在类似任务里经常看到这些内容:
| 空转类型 | 典型表现 | 问题 | | 过度自我怀疑 | “我需要再次确认手机号规则……”重复多次 | 没有新增信息 | | 重复举例 | 同一个+86 示例反复解释 | 增加阅读成本 |
| 无关理论说明 | 解释正则表达式历史、数据清洗哲学 | 对任务无帮助 |
| 华丽过渡句 | “让我们深呼吸,系统性解决问题” | 纯消耗 token |
注意,我不是说模型不能解释。
解释当然有价值。
但解释必须服务于决策。
比如:
- 为什么先去符号再处理区号?
- 为什么
86开头时要判断长度? - 为什么重复号要基于清洗后的手机号判断,而不是原始字符串?
这类解释是有用的。
但如果它花很长篇幅告诉你“数据清洗是数据分析中非常重要的一环”,那基本就是空转。
token 浪费该怎么算?
这里我不伪造精确 token 数。
因为不同平台、不同 tokenizer、不同模型版本,对同一段中文和代码的计数会有差异。你在实际复现时,应该以 API 返回的 usage 字段或平台界面的 token 统计为准。
但可以给一个可执行的统计方法:
1. 记录原始回答总 token;
2. 把回答按段落分为“关键路径”和“空转解释”;
3. 删除空转段落后再次运行同一任务;
4. 对比:
- 代码是否可运行;
- 测试样例是否通过;
- token 是否下降;
- 人类阅读时间是否减少。
建议你用下面这张表记录自己的实测结果:
| 对比项 | 原始长推理版 | 裁剪关键路径版 | 观察结论 | |---|---:|---:|---| | 输出 token | 以平台 usage 为准 | 以平台 usage 为准 | 通常会明显下降 | | 是否生成完整函数 | 是/否 | 是/否 | 看功能是否缺失 | | 是否处理空值 | 是/否 | 是/否 | 检查边界条件 | | 是否处理 +86 / 0086 | 是/否 | 是/否 | 检查业务规则 | | 是否支持去重 | 是/否 | 是/否 | 检查状态逻辑 | | 是否可复用 | 是/否 | 是/否 | 看是否参数化 | | 人类阅读负担 | 高/中/低 | 高/中/低 | 看是否容易维护 |如果你跑完发现:裁剪版代码一样能运行,测试样例一样通过,而 token 和阅读成本都更低,那就说明原来的长推理里确实存在大量“表演性内容”。
配图建议:这里放两张实际对话界面截图。
一张是“长推理版”,标注输出很长、token 较高;
一张是“裁剪版”,标注结构更短、token 更低。
注意不要手动篡改 token 数,直接截平台统计即可。
这也是我这次最大的感受:
o3的强,不在于它能说很多,而在于它能把模糊需求压缩成正确的关键路径。我们要做的,不是鼓励它越想越长,而是让它只保留能改变结果的思考。
---
第4章:给普通人的落地指南 + 可直接复制的提示词模板
如果你只是普通用户,不想研究模型论文,也不想理解什么推理范式,我建议你记住一句话:
不要让模型“自由发挥式思考”,要让它“沿关键路径思考”。
具体怎么做?
我总结成三个动作。
动作一:先限定输出结构
不要说:
请一步一步思考,然后帮我写代码。
更推荐说:
请只按以下结构输出:
1. 需求澄清
2. 边界条件
3. 错误处理
4. 可复用设计
5. 最终代码
不要输出与任务无关的背景介绍。
这会明显减少废话。
动作二:要求模型自我剪枝
你可以让模型在输出前先做一次“删减”。
比如:
在给出最终答案前,请删除以下内容:
- 重复解释
- 与代码无关的背景知识
- 没有影响实现决策的推理
- 空泛的总结性句子
只保留会影响代码正确性的关键判断。
这句话很有用。
它相当于给模型加了一个“编辑器”。
动作三:用测试样例约束结果,而不是用长推理制造安全感
很多人喜欢看模型解释很久,因为这会带来一种“它很认真”的错觉。
但在代码任务里,最靠谱的约束不是长解释,而是测试样例。
比如:
请同时给出 5 条测试样例,覆盖:
1. +86 开头
2. 0086 开头
3. 带空格和横杠
4. 非法手机号
5. 重复手机号
有测试,才有可验证性。
没有测试,再长的推理都只是作文。
---
可直接复制:强制关键路径版提示词模板
下面这段可以直接复制使用,适合数据清洗、Excel处理、批量脚本、自动化办公类任务。
你是一个擅长把口头业务需求转成可复用脚本的 Python 工程助手。
请根据我的需求生成代码,但必须遵守以下规则:
【输出结构】
1. 需求澄清:用不超过 5 条 bullet 总结输入、输出、核心规则。
2. 边界条件:列出会影响代码正确性的边界情况,不要泛泛而谈。
3. 错误处理:说明缺失字段、空值、非法值如何处理。
4. 可复用设计:说明函数如何封装、哪些参数可配置。
5. 最终代码:给出完整可运行代码,代码中加入必要注释。
6. 测试样例:给出最少 5 条测试数据和预期结果。
【强制剪枝】
- 不要输出长篇链式思考。
- 不要解释与实现无关的背景知识。
- 不要重复举例。
- 不要写“我将仔细思考”这类无实际信息的句子。
- 只保留会影响最终代码正确性的关键判断。
【代码要求】
- 使用 Python。
- 如果处理表格,优先使用 pandas。
- 函数要可复用,不要只写一次性脚本。
- 对异常输入要有明确处理。
- 输出字段命名要清晰。
我的需求如下:
<<<
在这里粘贴你的口头需求
>>>
小白版用法
如果你刚开始用 AI 写脚本,建议这样做:
1. 先复制上面的模板;
2. 把自己的需求用大白话写进去;
3. 让模型先生成代码;
4. 把代码复制到本地或在线环境跑;
5. 把报错信息原样粘回去,让模型修。
重点不是一次写完,而是形成闭环。
进阶版用法
如果你已经会一点 Python,可以再加两句:
请把核心清洗逻辑和 DataFrame 处理逻辑拆开。
请补充 pytest 风格的单元测试。
这样模型会更倾向于写可维护代码,而不是一坨脚本。
如果你想亲自复现,或者直接调用最新 o3 系列模型测试自己的清洗任务,我把完整可运行环境放在了 api.884819.xyz。
8848AI 的注册流程很简单:用户名+密码即可注册,不需要邮箱验证。平台注册后内置 AI 对话功能,直接就能用;国产模型如 Deepseek、通义千问等完全免费;没有月租、没有订阅,按量付费。
新用户注册即送体验token。复制上面的模板,就可以立刻开测,不用自己折腾代理和复杂计费。
---
结尾:会用,比会追新更重要
o3这类前沿模型的出现,当然值得兴奋。
但对普通人来说,真正的分水岭不是“谁第一时间知道了新模型”,而是:
你能不能把模型的能力压缩进自己的工作流。复杂 benchmark 证明了模型的上限。
而“清洗电话号码”这种土任务,才检验它能不能进入日常。
这次测试给我的结论很明确:
- 前沿模型确实更擅长理解口头需求;
- 它能把模糊任务拆成工程步骤;
- 但长篇链式思考并不天然等于高质量;
- 真正有用的,往往只有需求澄清、边界条件、错误处理、可复用抽象这几步;
- 学会裁剪 token 空转,才是普通人使用高级模型的生产力护城河。
下一篇,我会把同样的口语任务同时丢给 o1、Claude 3.5、DeepSeek-R1 和 Gemini 2.0,做一次“链式思考空转率”横向对比,并给出不同模型最适合普通人的裁剪配方。
想知道谁最“诚实”不装吗?
关注不迷路。
本文由8848AI原创,转载请注明出处。关注8848AI,带你从零开始学AI。#AI教程 #o3 #Prompt技巧 #数据清洗 #Python #人工智能 #8848AI #AI学习