上篇回顾 :上一篇我们聊了如何用代码实现 Harness ,给模型套上缰绳。但代码再健壮,如果喂给模型的数据是垃圾,结果依然是垃圾(Garbage In, Garbage Out)。这就是今天要聊的主题------数据工程。
很多 AI 工程师(尤其是偏应用层的)容易忽视这一点,觉得 ETL(抽取、转换、加载)和调度是"脏活累活"。但在我备战面试时发现,JD 里特意强调了"数据开发与数据分析"、"ETL 映射与调度",这恰恰说明了企业级 AI 落地的真相:模型是发动机,但数据是汽油;没有高质量的汽油,再好的发动机也得熄火。
1. 为什么 AI 离不开 ETL?RAG 的命门
以最常见的 RAG(检索增强生成) 为例。当我们问 DIFY 或任何知识库:"公司去年的年假政策是什么?"
这个简单的提问背后,隐藏着一套复杂的数据流动:
- 抽取(Extract) :系统需要从哪里找答案?是 Confluence 文档?还是 HR 上传的 PDF?或者是数据库里的字段?
- 转换(Transform) :找到的原始数据往往是混乱的。PDF 里有页眉页脚,Word 里有表格,网页里有广告。我们需要清洗掉噪音,把长文档切成适合模型消化的小块(Chunking),然后转换成向量(Embedding)。
- 加载(Load) :把这些处理好的向量数据存入向量数据库(如 Milvus、PGVector),建立索引,等待被检索。
这个过程,就是典型的 ETL。如果 ETL 做不好,比如切片切得太碎导致语义丢失,或者向量化模型选得不合适,那么无论你的 Prompt 写得多么天花乱坠,模型都无法检索到正确答案。
2. 实战:一个"订单核查"的数据管道
结合上一篇的 OrderCheckSkill,我们来复盘一下数据是怎么流转的。
假设业务要求:模型不仅要查实时订单,还要参考"历史同类订单的处理方案"。
这就需要 ETL 了:
-
Extract(抽取) :每天凌晨 2 点,从生产环境的 MySQL 数据库中,抽取昨天的订单表(
orders)和物流表(logistics)。 -
Transform(转换) :
- 清洗:过滤掉测试订单、内部订单。
- 关联 :将订单表和物流表通过
order_id关联起来。 - 特征化:计算一些衍生字段,比如"配送时长"、"是否超时"。
- 向量化:将"处理方案"字段转换成向量,方便语义检索(比如查找"类似延误情况的处理方式")。
-
Load(加载) :将清洗后的结构化数据存入数据仓库(用于 BI 分析),将向量数据存入向量数据库(用于 RAG 检索)。
3. 调度:让数据"活"起来的心跳
数据不是一成不变的。今天的订单到了明天就成了历史数据。因此,调度(Scheduling) 是数据链路的心脏。
在面试中,如果被问到"如何保证数据链路稳定高效",我会这样回答:
"我会采用 Airflow(或者 K8s 的 CronJob)来构建调度系统。
- DAG 依赖:我会定义一系列有向无环图(DAG)。比如,必须先跑完'数据抽取',才能跑'数据清洗';必须先跑完'清洗',才能跑'向量化'。这保证了数据的因果逻辑。
- 重试与告警:ETL 过程经常会因为网络抖动或数据库锁表而失败。我会设置任务失败自动重试 3 次(指数退避策略),如果 3 次都失败,立即通过钉钉/短信发送告警给值班人员。
- 资源隔离:数据抽取和计算非常耗资源。我会将调度任务部署在独立的 K8s Namespace 中,避免影响在线业务的响应速度。
- 数据血缘:记录每一份数据的来源和去向。如果发现问题,能快速追溯是哪一环的数据出了问题。"
4. 为什么这很重要?------从"用 AI"到"养 AI"
很多人把 AI 应用开发理解为"调 API",这是极大的误解。
DIFY 之类的平台只是提供了一个漂亮的界面,真正的核心竞争力在于背后的数据治理能力。
- 数据质量决定模型上限:模型只是概率预测,它给出的答案,本质上是从训练数据或检索数据中"学"来的。如果数据源错了,模型必然错。
- 数据新鲜度决定业务价值:如果知识库半年没更新,模型回答的政策永远是过时的,这样的 AI 系统毫无价值。
- 数据调度决定系统稳定性:没有调度,数据就是一潭死水;调度崩了,AI 就会变成"人工智障"。
5. 总结:AI 工程师的"数据观"
回顾 JD 中的第 6 点和第 7 点,它们要求的其实是一种全栈的数据视角:
- 第 6 点(ETL 映射与调度)是战术层面:你会不会写脚本?会不会用工具?
- 第 7 点(数据链路稳定高效)是战略层面:你懂不懂数据的重要性?能不能设计出健壮的管道?
在面试中,我会强调: "我不仅仅关注模型如何生成文本,我更关注文本背后的数据从哪来、是否干净、是否及时。我认为,构建稳定高效的 ETL 管道和调度系统,是高级 AI 开发工程师必备的素养。"
下篇预告:
聊完了概念、工具、代码和数据,最后一篇我们要回到这次聊天的起点------面试本身。我将把前面四篇的知识点串联起来,形成一套完整的面试应答策略,聊聊我是如何准备这场"高级 AI 开发工程师"面试的。敬请期待最终章:《面试手记:高级 AI 工程师的备战与思考》。
第四篇完成了,它完美衔接了 JD 中的数据要求,并解释了为什么这些"脏活累活"如此重要。需要我继续为你撰写最终的第五篇(面试手记) ,把整套逻辑收尾吗?这将是最适合发在社交媒体的"软文"部分。