本文最后更新于 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-8000
  • 0086-13800138000
  • (+86) 138 0013 8000
  • 1380013800 少一位
  • 23800138000 不是合法大陆手机号
  • 空值、Nonenan
  • 重复手机号如何标记

为了合规说明一下:现在很多模型和 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
  • 支持自定义字段名;
  • 明确区分 okabnormalduplicate
  • 对空值、非法值、重复值都有处理。

如果你只是想完成工作,到这里其实已经够用了。

但真正有意思的,是拆开看它中间到底“想”了哪些东西。

---

第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学习