数据工程特别适合 GPT‑6 Astra 与 Codex,因为它同时包含代码、SQL、Schema、数据质量、日志、调度和大量业务规则。但它也是最容易被 AI"看懂一半"的领域:一条 SQL 可以语法完全正确,却把收入、退款、时区或去重口径算错;一个 ETL 可以成功运行,却在迟到数据、重试或回填时悄悄产生重复。
所以这篇文章不讲"让 AI 自动写 SQL",而是讲如何把 ChatGPT Pro + GPT‑6 Astra + Codex 放进一条可验证的数据工程流水线。对于偶尔查 SQL、写小脚本的人,Plus 已经很实用;如果每天都要在大仓库、长任务、数据模型、测试和 Codex 之间反复切换,Pro 更容易成为主力工作环境。
一、先定义数据契约,再写 ETL
假设订单事件长这样:
json
{
"event_id": "evt_001",
"order_id": 1001,
"user_id": 88,
"amount_cents": 12900,
"currency": "USD",
"created_at": "2026-09-10T10:00:00Z"
}
不要直接开始写 ETL。先确认:event_id 是否全局唯一?order_id 是否可能重复出现?金额是否允许负数?created_at 是业务时间还是接收时间?迟到事件如何处理?取消订单如何表达?退款是更新订单还是产生新事件?
这些问题决定数据模型,也决定后续所有 SQL 是否可靠。
二、用 Schema 把输入边界写出来
python
from datetime import datetime
from pydantic import BaseModel, Field
from typing import Literal
class OrderEvent(BaseModel):
event_id: str = Field(min_length=1)
order_id: int = Field(gt=0)
user_id: int = Field(gt=0)
amount_cents: int
currency: Literal["USD", "EUR", "CNY"]
created_at: datetime
但 Schema 校验不等于业务校验。如果退款应该使用单独事件类型,就不要允许负数金额同时表达"订单"和"退款"。
python
def validate_event(event: OrderEvent) -> None:
if event.amount_cents < 0:
raise ValueError("negative amount not allowed")
GPT‑6 Astra 很适合在这一阶段帮你找"字段合法但业务含义仍然冲突"的情况,再把确认后的规则落到代码,而不是只保留在提示词里。
三、ETL 最重要的能力之一是幂等
任务失败后重跑,不能把数据插两遍。直接:
sql
INSERT INTO fact_orders (...) VALUES (...);
通常不够。更稳妥的方式之一:
sql
INSERT INTO fact_orders (
event_id,
order_id,
user_id,
amount_cents,
created_at
)
VALUES (?, ?, ?, ?, ?)
ON CONFLICT (event_id) DO NOTHING;
或者:
sql
ON CONFLICT (event_id)
DO UPDATE SET
amount_cents = EXCLUDED.amount_cents;
到底用 DO NOTHING 还是 DO UPDATE,取决于事件模型。如果事件一旦产生就不可变,更新可能隐藏上游问题;如果上游允许修正事件,完全忽略冲突又会造成数据陈旧。
四、让 GPT‑6 Astra 先找指标口径冲突
"日收入"看起来很简单:
sql
SELECT
DATE(created_at) AS day,
SUM(amount_cents) / 100.0 AS revenue
FROM orders
GROUP BY 1;
但真正的问题是:取消订单算不算?退款按退款日还是下单日扣?税是否包含?货币是否统一?测试订单是否排除?时区是什么?部分退款如何计算?优惠券由谁承担?
高质量数据分析的关键不是 SQL 写得快,而是口径明确。可以先给 Astra:
text
不要先写 SQL。
指标:Daily Revenue。
请先列出所有必须明确的业务定义,
并说明每个缺失定义会造成什么统计偏差。
这种用法比直接让模型生成查询更有价值。
五、数据质量检查必须自动化
事件唯一:
sql
SELECT event_id, COUNT(*)
FROM fact_orders
GROUP BY event_id
HAVING COUNT(*) > 1;
关键字段空值:
sql
SELECT COUNT(*)
FROM fact_orders
WHERE user_id IS NULL;
时间异常:
sql
SELECT COUNT(*)
FROM fact_orders
WHERE created_at > CURRENT_TIMESTAMP + INTERVAL '5 minutes';
币种异常:
sql
SELECT currency, COUNT(*)
FROM fact_orders
GROUP BY currency;
这些检查应该进入 pipeline,而不是只在第一次上线时人工看一遍。更进一步,还可以对行数、分区、迟到率、重复率和空值率建立阈值。
六、Codex 更适合做仓库级数据修改
项目结构:
text
analytics/
├── models/
├── pipelines/
├── tests/
├── schemas/
├── docs/
└── AGENTS.md
给 Codex 的任务可以写:
text
增加 daily_revenue 模型。
要求:
- 先阅读 schemas/order_event.json;
- 不改变现有订单口径;
- 所有金额内部使用 cents;
- 输出层再转换;
- 增加数据质量测试;
- 更新 README 指标定义;
- 运行项目测试。
如果退款口径未定义,停止并报告,不要猜。
这比"帮我写一个收入 SQL"更适合生产项目,因为 Codex 可以同时看到模型、测试、文档和调用关系。
七、时间是数据工程里最容易忽略的 bug
例如:
sql
DATE(created_at)
到底使用 UTC 还是业务时区?如果业务按中国自然日统计,必须明确转换,或者在仓库规范中统一"仓库存 UTC,报表层显式转换业务时区"。不要让不同 SQL 各自决定。
跨时区业务还要考虑夏令时。一个"每天 24 小时"的假设,在某些地区并不总成立。数据模型应该存绝对时间,业务报表再按明确时区转换。
八、Schema 演进要考虑四种兼容组合
第一版事件只有:
json
{"amount_cents": 1000}
第二版增加:
json
{"amount_cents": 1000, "discount_cents": 100}
此时要检查:旧生产者→旧消费者、旧生产者→新消费者、新生产者→旧消费者、新生产者→新消费者。
GPT‑6 Astra 很适合帮助推演这四种组合,而 Codex 可以在仓库里找真实生产者和消费者。真正的兼容性结论仍然要通过测试和实际 Schema 证明。
九、Backfill 是高风险操作
新增字段后需要回填大量数据时,不要让 Codex 直接生成一个全表 UPDATE 就执行。更稳妥的是分批、限速、可暂停、可重入、有进度、有验证。
python
while True:
rows = load_batch(limit=1000)
if not rows:
break
process(rows)
save_checkpoint(rows[-1].id)
并记录:
text
processed
failed
skipped
remaining
模型可以生成脚本,但生产执行策略必须由工程系统和负责人控制。
十、数据异常诊断适合用 Astra 建"分析树"
假设今天 GMV 下降 18%,不要只问"为什么下降"。可以先让模型建立:
text
流量下降?
转化下降?
客单价下降?
某地区缺数?
某币种转换错误?
ETL 延迟?
退款异常?
数据源延迟?
再让程序查询每个维度。这样模型负责提出假设,SQL 负责计算证据,人负责确认解释。
十一、用测试保护 SQL 业务口径
python
def test_revenue_excludes_cancelled_orders(db):
seed_orders(db, [
{"status": "paid", "amount_cents": 1000},
{"status": "cancelled", "amount_cents": 5000},
])
assert daily_revenue(db) == 1000
这样以后 Codex 改 SQL 时,业务口径不会悄悄变化。Coverage 不是重点,关键是这些断言来自已经确认的业务定义。
十二、让模型区分"事实"和"推断"
text
分析数据异常时,输出两栏:
已验证事实:
必须来自提供的数据。
待验证假设:
可以推断,但必须给下一步验证 SQL。
禁止把时间相关性直接写成因果关系。
这个约束特别适合数据场景,因为数据异常最容易被流畅的自然语言"解释过头"。
十三、不要把整张生产表直接交给模型
更合理的流程:
text
原始数据
→ 字段白名单
→ 脱敏
→ 聚合/采样
→ GPT‑6 Astra
→ 结果校验
如果任务只需要时间、指标、地区和错误类型,就不要把邮箱、手机号、Token、完整订单备注等字段一起发送。模型上下文越大,不代表越专业;与任务无关的数据只会增加成本和风险。
十四、Pro 更适合高频数据工程工作流
真实数据任务常常包括:
text
读 schema
→ 读 SQL
→ 看 pipeline
→ 分析日志
→ 改代码
→ 跑测试
→ 重跑数据
→ 检查质量
→ 写文档
上下文大、步骤多、重复次数高。如果只是偶尔生成 SQL,Plus 已经足够有价值;如果每天都在多个数据任务之间使用 Codex、Work 和 Astra,Pro 更适合作为持续工作环境。
十五、建立数据工程 AGENTS.md
markdown
# Data Engineering Rules
- all monetary values use integer minor units
- timestamps stored in UTC
- reporting timezone must be explicit
- all pipelines must be idempotent
- backfills require checkpointing
- metric definitions live in docs/metrics
- never execute destructive production SQL automatically
Validation:
- unit tests
- schema checks
- row-count checks
- uniqueness checks
让这些规则进入仓库后,Codex 每轮都在同一个数据规范下工作,而不是每次重新猜团队习惯。
十六、数据流水线真正的完成标准
不是"脚本跑完了",而是:输入多少、输出多少、丢了多少、重复多少、异常多少、延迟多少、指标和旧版本差多少。
json
{
"input_rows": 100000,
"output_rows": 99880,
"rejected_rows": 120,
"duplicates": 0
}
只有这些信息可追踪,任务才真正可验收。
十七、上线前清单
确认输入 Schema 有版本;关键字段有约束;金额与时区口径统一;任务可重跑且不会重复写入;迟到数据有处理策略;Backfill 可以暂停和继续;输入输出行数可对账;唯一性、空值、范围和时间异常有自动检查;指标文档说明退款、取消、测试数据与币种;异常记录不会直接丢弃;生产 SQL 不由模型自动执行。
结语
GPT‑6 Astra 的复杂推理能力、Codex 的仓库操作能力与 ChatGPT Pro 的长任务环境,非常适合数据工程,但前提是不要把"模型会写 SQL"误认为"模型懂你的业务口径"。
真正专业的组合是:模型帮助理解与提出假设,Codex 修改真实项目,SQL 与测试提供确定性证据,数据契约保证长期一致。
官方参考资料
- OpenAI Help:ChatGPT Work and Codex
https://help.openai.com/en/articles/20001275 - OpenAI Help:GPT‑5.6 and GPT‑6 Pro in ChatGPT
https://help.openai.com/en/articles/20001354-gpt-56-and-gpt-6-pro-in-chatgpt - OpenAI Release Notes:Introducing GPT‑6 Astra
https://openai.com/products/release-notes/ - OpenAI Developers:GPT‑6 Astra
https://developers.openai.com/api/docs/models/gpt-6-astra
十八、进阶实践:为数据模型建立"口径版本"
很多团队最大的问题不是 SQL 没有版本,而是指标定义没有版本。比如"活跃用户"从"当天登录一次"改成"当天产生核心行为",如果只修改 SQL,不记录口径版本,那么历史报表和新报表会出现无法解释的断层。
可以在文档里写:
markdown
# metric: daily_active_user
version: 2
active_from: 2026-09-10
rule: 用户在自然日内产生至少一次 core_action
previous_rule: 用户在自然日内至少登录一次
然后让 Codex 修改查询时同时检查指标文档。GPT‑6 Astra 可以帮助比较两个版本影响哪些下游报表,但最终版本切换日期必须由业务确认。
十九、数据 Pipeline 要区分"业务失败"和"基础设施失败"
例如一条事件字段非法属于业务数据错误;数据库连接超时则属于基础设施错误。两者处理策略不应该一样。
python
try:
event = OrderEvent.model_validate(raw)
except ValidationError as exc:
quarantine(raw, reason="invalid_event")
return
基础设施失败则可能需要任务整体重试:
python
try:
sink.write(batch)
except TemporaryDatabaseError:
raise RetryablePipelineError()
如果全部写成 except Exception: continue,流水线可能"看起来成功",实际持续丢数据。Codex 做 Review 时,异常分类是很值得单独检查的一项。
二十、让 Astra 帮你设计数据对账,而不是只分析结果
数据迁移前后可以设计守恒关系:订单总数、支付总额、不同状态分布、唯一用户数、关键主键集合。对账不是追求每个表完全一样,而是根据业务关系定义"哪些值必须守恒"。
例如:
sql
SELECT status, COUNT(*), SUM(amount_cents)
FROM orders
GROUP BY status;
新旧系统分别执行,再用程序比较。这样模型不需要直接看到所有原始订单,就能根据聚合结果帮助定位差异来源,既降低上下文量,也降低敏感数据暴露。
二十一、流式数据要特别处理乱序和迟到
批处理里按日期重跑比较直观,但实时事件常常不会按发生顺序抵达。移动网络、第三方 Webhook、消息重试都可能让 10:05 的事件先到、10:03 的事件后到。如果窗口聚合只按"接收时间"关闭,就可能让最终统计持续漂移。
设计时要区分 event time 与 processing time,并明确 watermark 或允许迟到范围。例如:业务允许 30 分钟迟到,那么窗口关闭后仍可以接受一定时间的修正;超过范围的事件进入补偿队列,而不是悄悄丢掉。
GPT‑6 Astra 可以根据你的业务要求帮助推演:迟到 5 分钟、1 小时、1 天分别会影响哪些指标;Codex 则可以把规则落到流处理代码和测试中。测试至少要构造乱序事件,而不是只喂按时间排序的理想数据。
二十二、数据血缘是 AI 数据工程的高价值上下文
当一个指标异常时,如果不知道它来自哪些上游表、哪些模型和哪些字段,模型只能在大量 SQL 中搜索。团队可以维护最小血缘:
text
raw_orders
→ stg_orders
→ fact_orders
→ daily_revenue
→ finance_dashboard
一旦 daily_revenue 异常,Codex 可以沿血缘逐层检查,而不是扫描整个仓库。GPT‑6 Astra 还可以把 Schema 变化映射到下游影响范围,例如 currency 从可空变成必填,会影响哪些模型、测试和报表。
血缘不一定一开始就上复杂平台,哪怕先用 YAML 记录关键依赖,也比完全依赖人脑好。对高频 Pro 用户,这种结构化上下文会让长任务更稳定,因为 Astra 不需要每次重新推断"这个指标到底从哪里来"。
二十三、数据工程里最有价值的 AI 输出往往是"下一条验证 SQL"
当模型提出"某地区数据缺失"时,不要停在自然语言解释,让它同时给最小验证查询,并由人或受控工具执行。比如:
sql
SELECT region, COUNT(*)
FROM fact_orders
WHERE order_date = CURRENT_DATE
GROUP BY region
ORDER BY region;
如果结果不支持假设,就立即淘汰。这样每一轮对话都推动证据增加,而不是让模型围绕同一个猜测写越来越长的解释。GPT‑6 Astra 的推理能力越强,这种"假设→查询→证据→更新假设"的闭环越值得建立。