最近半年我一直在折腾一件事:把搜推方向的数据生产体系,从“跑批+报警”的结构重构成Agentic(智能体化)的结构。这个标题我起名叫“数据涅槃”,因为过程真的跟涅槃差不多——旧体系是一套撑了三年的庞然大物,链路像缠在一起的毛线,每次业务迭代都像在毛线团里找线头。动手重构的导火索,是一次上游表字段rename直接带崩了整条样本链路,全量修复用了整整两天。那两天我除了修数据,想得最多的一个问题就是:为什么这些脏活儿累活儿,不能由系统自己感知、自己处理,非得靠人半夜爬起来看日志、跑重算?这个念头最终长成了一整套Agentic数据生产体系。如果你也在维护一套搜推数据体系,下面这些从0到1的拆解、踩坑记录和个人复盘,大概率能用得上。
1. 先对齐:搜推数据生产体系到底在生产什么
1.1 一条完整的数据生产链路长什么样
搜索和推荐系统的效果,最终取决于两点:模型结构,以及喂给模型的数据。结构决定上限,数据的质量和生产稳定性决定下限。所谓搜推数据生产体系,解决的核心问题就是:把用户的每一次行为,变成模型能直接消费的训练样本和特征。
一条典型链路是这样的:用户在前端产生曝光、点击、收藏、购买等行为,埋点服务把行为打成日志,经过采集通道进到消息队列,然后分两条路走。一条是实时路,Flink消费日志流,算实时特征,写进特征存储供线上推理使用;另一条是离线路,Spark消费日志落地成明细表,再经过清洗、去重、口径对齐,生成训练样本表,同时计算离线特征。样本和特征最终都要打上版本,产出快照供训练和评测使用。通常还会有一条近线路,用增量计算兼顾时效和稳定性,应对实时和离线之间的灰度地带。
整条链路如果再详细拆,至少包括埋点Schema管理、日志采集的时效保障、曝光/点击/转化明细表的清洗、样本Join和负样本采样、离线特征计算、实时特征计算、特征存储与线上特征对齐、样本版本生成与回滚、质量监控与告警这些环节。我习惯用一张表把每个环节的典型实现和常见问题列出来,方便新人快速建立全局认知:
| 环节 | 典型实现 | 常见问题 |
|---|---|---|
| 行为采集 | 埋点SDK + 日志采集服务 | 漏采、重复、字段缺失 |
| 实时特征 | Flink任务消费Kafka实时计算 | 窗口延迟、状态丢失 |
| 离线样本 | Spark批任务Join明细表生成 | 数据倾斜、样本穿越 |
| 特征存储 | Redis / FeatureStore | 线上线下特征不一致 |
| 调度编排 | Airflow / DolphinScheduler | 任务失败连锁、依赖混乱 |
| 质量监控 | 规则引擎 + 告警 | 告警滞后、误报多 |
这个表看起来简单,但每一个格子展开都是一部血泪史。以“样本穿越”为例:如果你在生成训练样本时,不小心把用户点击之后产生的特征也拼了进去,模型在训练时“看到了未来”,离线评估会很漂亮,上线之后一塌糊涂。这种问题藏得深,常规质量监控根本发现不了,只能靠特征时效校验把这个窗口卡死。
1.2 传统体系的“三座大山”
搜推数据生产体系发展到一定规模后,会稳定地卡在三类问题上。我把它们称为三座大山。
第一座,告警驱动,靠人救火。质量监控的默认行为是定一堆阈值,超过阈值就发告警,然后值班的人去定位。问题在于,告警本身不告诉你根因,你只看到“训练样本数量骤降30%”这类结论,至于是因为上游Hive表分区没跑出来、埋点字段改名了、还是业务流量下跌,全靠人排查。排查链条往往要跨好几个团队,数据链路越长,根因定位越慢。大促期间一次误报,可能让几个开发白白排查一整个通宵。
第二座,Schema变更的“连环爆炸”。搜推数仓的上游经常变化,业务方字段改名、加字段、改枚举值是家常便饭。每次变更,下游所有依赖该字段的加工任务都要跟着改,改漏一个,线上表现要么是样本丢失,要么是特征全错。更麻烦的是,很多下游脚本是不同时期不同人写的,文档普遍缺失,你根本不知道谁依赖了什么字段。一次rename,从源头到样本层层层炸开,修复成本呈指数级增长。
第三座,数据质量反馈严重滞后。离线样本和特征是每天跑批生成的,但有效性的验证往往要等模型训练完成、上线之后看线上指标,中间隔了一整个天级甚至更长的周期。等发现问题时,坏数据已经污染了训练集,模型带着毒数据学了几轮,再纠正的代价远比预防高。说白了,这个体系里“数据生产”和“数据验证”是脱节的,前者闷头跑,后者发生后置审判。
这三座大山放在一起,最后的体感就是:平台团队每天忙于救火,业务团队的迭代节奏被数据链路绑架。很多搜推团队的现状都是,算法和模型迭代只花30%的时间,剩下70%都在处理数据问题。这个比例一旦形成,整个组织就会被拖拽在一个低水平循环里。
2. Agentic不是玄学,它是数据生产的第三种组织形式
2.1 先搞清楚Agentic到底指什么
“Agentic”这个词这两年非常热,但很多讨论把它和“智能体聊天”混为一谈。聊个天、调用一个API,不叫Agentic。Agentic的核心特征是:自主感知环境、基于目标做决策、调用工具执行动作、根据执行结果反思修正,形成闭环。放到数据生产体系里,就是一套能够自动发现问题、判断影响范围、执行修复动作并沉淀经验的系统。
我习惯用一个类比:传统数据体系像一条工厂流水线,每个环节都是固定工位,工人只在报警铃响的时候冲过去处理。Agentic体系更像是每个关键工位都站了一个“能自己看、自己想、自己动手的老师傅”,小问题直接解决,大问题才举手叫人。这里的重点不是“用了AI”,而是把原来由人承担的判断职责,转移成了系统里可运行、可观测、可回滚的逻辑。
2.2 从“管道模型”到“多智能体协作”
传统的数据生产体系本质上是管道模型:数据从一端流入,经过一个个预定义好的节点,最终流向模型训练。管道的好处是确定性高,坏处是太脆——任何一个节点出问题,整条管道都不转。
Agentic体系的组织形态是“多智能体协作”:数据链路被拆成若干自治域,每个自治域由对应的Agent负责。Agent之间有明确的信息交换协议,而不是硬编码的流程依赖。质量治理Agent发现问题后,不是傻傻地报警等人工处理,而是发布一个“数据事件”,特征加工Agent、样本生命周期Agent根据各自的职责订阅并响应。
举个例子。上游Schema变更,传统做法是DBA通知开发,开发排查所有依赖、改脚本、上线。Agentic做法是:特征加工Agent感知到Schema变更事件,比对变更前后的字段映射,自动从知识库中检索受影响的特征定义,生成新的加工逻辑,提交审核后自己执行。整个过程可能只需要几分钟,而且全程有审计记录。从这个角度看,Agentic并没有把数据生产变成“黑盒魔法”,它只是把原来依赖人的判断、协调和执行,变成了程序化的、可观测的、可回滚的自主流程。这和组织管理上“把命令下发变成目标管理”是一个道理。
2.3 为什么搜推数据生产特别适合Agent化
不是所有数据场景都适合Agent化。比如财务对账,要求强一致、强审计,你很难让Agent自主改账。搜推数据生产适合Agent化,我总结有三个理由。
第一,链路长且标准化。搜推链路有大量固定拓扑的加工任务,环节之间边界清晰,非常适合按自治域拆分Agent。第二,容错空间相对弹性。搜推数据的价值在于统计规律,单条数据的微小错误不会带来灾难性后果,系统允许Agent试错并快速回滚;数据分布的变化能通过模型效果快速反馈,形成一个天然的验证闭环。第三,故障代价高、返工成本高。正因为链路长、依赖多,故障定位和修复成本极高,Agent的自主感知和自动处置能直接缩短MTTR,收益非常直观。
所以我的判断是:搜推数据生产体系,几乎是Agentic方法论的最佳试验田之一。它既有足够的复杂度来体现Agent的价值,又有足够的容错空间来承接Agent的不完美。
3. 我在重构中设计的四个核心Agent
3.1 质量治理Agent:从报警到自主止血
质量治理Agent是整条链路的“哨兵”。它的核心变化,是从被动告警变成主动感知和自主止血。
它的工作流是典型的感知-决策-执行-反思闭环。感知阶段,周期性采集样本量、正负样本比、特征覆盖率、空值率、延迟水位等指标,用动态基线替代固定阈值来识别异常。决策阶段,判断异常类型:是突发性事件(比如上游任务断跑)、趋势性变化(比如大促流量爆发导致样本量激增),还是结构性漂移(比如业务改版后行为分布变了)。执行阶段,对突发性问题直接触发下游隔离,防止坏数据污染训练集;对趋势性变化则调整基线,不误报。反思阶段,每次处置都记录为一条结构化经验,沉淀成事件处置案例库,后续遇到类似问题时可以检索复用。
这里有一个非常关键的实操细节:质量Agent的判断不能只看单指标,要结合多指标组合。样本量下降30%,如果同时伴随曝光量下降30%,很可能是因为流量下跌,而不是链路故障;只有当样本量的下降显著高于曝光量的下降时,才判定为链路异常。这个规则是我在踩过多次误报坑之后总结出来的,后面第5章会展开讲。
3.2 特征加工Agent:吃掉一场Schema变更事故
特征加工Agent是我这次重构里收益最直接的一个模块。它的触发源是元数据变更通知:上游表结构变化后,Agent自动拉取新Schema,比对旧Schema,识别出字段改名、类型变更、新增字段、删除字段四类操作。然后做三件事:从特征注册中心检索所有受影响的特征;生成适配后的加工SQL或代码;跑校验任务对比新旧特征的分布差异。如果差异在阈值内,自动提交上线;如果差异超阈值,挂起并申请人工复核。
这个流程我用伪代码表达过很多次,核心逻辑大致是这样的:
# 特征加工Agent的Schema变更响应 def on_schema_change(event): new_schema = fetch_schema(event.table) diff = diff_schema(previous_schema, new_schema) affected_features = feature_registry.query(table=event.table) for feat in affected_features: new_sql = rewrite_sql(feat.sql_template, diff) if validate_distribution(new_sql, feat.baseline): apply_feature(feat, new_sql) publish_feature_update(feat) else: request_review(feat, reason="distribution_shift_over_threshold")这个Agent上线后,第一次真实场景就接住了上游一次字段改名,从感知到自动适配只花了十几分钟。放在以前,这个改动至少要半天,还要拉上三方团队对口径。不过它也踩出过一个“自动适配但口径跑偏”的坑,这个我在第5章详细说。
3.3 样本生命周期Agent:兜住样本漂移
样本生命周期Agent负责训练样本的生成、采样、版本管理和淘汰。它解决的核心问题是:样本不能一直“闷头生成”,要有人盯着它是不是还符合当前业务分布。
它的职责具体拆开有四块。第一,监控样本分布漂移,包括正负样本比、时间衰减、特征值分布变化。第二,触发负样本挖掘,当正负样本比失衡且负样本噪声上升时,自动启动难例挖掘流程。第三,样本版本化自动管理,每次生成的样本集都有独立版本,训练任务可以精确回溯到任意历史版本。第四,样本过期淘汰,基于模型反馈动态调整样本有效窗口,把过期样本自动挪进冷存储。
这里我想重点解释“样本有效性窗口”。很多人以为历史样本越多,模型越稳,其实不然。业务在快速变化,三个月前的用户行为分布很可能已经和现在完全不同,留着大量陈旧样本只会拖慢模型收敛。样本生命周期Agent会基于模型效果的反馈,动态调整有效窗口长度:离线评估掉点了,就缩短窗口;数据量不足了,就适度放宽。这本质上是一个带反馈控制的库存管理问题。
实操中一个典型场景是:某场景正负样本比1:20,Agent发现近一周负样本噪声比例明显上升,于是触发负样本细化难例挖掘流程,把比例调整到1:10,然后自动对这份新样本做离线回放,确认离线评估没有下降后,再正式让训练任务切到新版本。整个过程基本不需要人工介入。
3.4 口径对齐Agent:Agentic RAG把知识库接到生产链路上
搜推数据生产有一个特别折磨人的问题:指标口径。比如“点击率”,在不同团队的定义可能完全不同,有的是点击次数除以曝光次数,有的是点击用户数除以曝光用户数,还有的是带后验过滤的。口径不一致,跨团队协作时就会反复扯皮。
口径对齐Agent做的事情,本质上就是业界常说的Agentic RAG:它维护一个特征口径知识库,把每个指标的定义、计算公式、负责人、变更历史全部沉淀下来,用向量化方式存储。当某个Agent在处理任务时遇到一个口径模糊的字段,它通过检索知识库找到最匹配的口径定义,并生成一段解释,跟着解释附上溯源信息,交给下游使用方确认。
这样做最大的收益是:口径不再只存在于人的脑子里或零散的文档中,而是变成了数据生产链路里可以被机器自动检索、自动应用的知识资产。后来特征加工Agent每次生成新的加工逻辑,也强制加了一步语义校验:调用口径对齐Agent做RAG检索,比对生成逻辑的语义与历史定义是否一致,一致才允许上线。这一步直接堵住了“自动适配但口径跑偏”的隐患。
4. 如何把Agentic体系从图纸落到线上
4.1 现状盘点和Agent边界划定
落地的第一步不是写代码,而是盘点现状。我建议用一个表格把现有链路节点、负责人、依赖关系、已知痛点全部列出来,然后逐项确认:这个环节如果出问题,通常是谁发现的、怎么发现的、恢复要多久。这个动作看起来很基础,但它直接决定Agent边界怎么划。
划定边界时,我用了三条筛选原则。判断逻辑相对闭环:能不能用清晰的规则或模型判断“是否异常”;动作相对标准化:修复动作能不能模板化;容错窗口允许试错:即使误操作也能快速回滚。同时满足这三条的环节,优先Agent化;不满足的,继续保留人工流程,不要硬上。
我的实操心得是:一开始只选三个场景做试点,而不是全面铺开。Agent体系本身也是新系统,如果带着所有历史包袱一次性改造,风险太大。先跑通三个最小闭环,让团队看到效果、攒出经验,再去覆盖更多环节。
4.2 技术选型:编排框架、通信协议、资源底座
技术选型我分三层来做。
第一层,Agent编排框架。现在开源的多Agent编排框架已经不少,比如LangGraph、AutoGen这类。我的选择是先用开源框架跑通流程,重点考察它的事件订阅/发布、状态持久化、断点恢复能力。这个能力在数据生产场景里特别重要,因为任务长、依赖多,Agent跑着跑着挂了不能从头再来,要支持从断点恢复。实测下来,框架的状态持久化做得好不好,直接决定Agent在凌晨睡了一觉醒来还能不能接上昨天的任务。
第二层,Agent之间的通信协议。我定义了一套统一事件协议,所有Agent通过事件总线通信,事件类型包括DataQualityEvent、SchemaChangeEvent、SampleVersionEvent、FeatureUpdateEvent等。事件里必须带上数据源标识、影响范围、置信度、处理动作建议和上下文信息。这样下游Agent才能做判断,而不是拿到一个无脑指令。简化的事件内容长这样:
{ "eventType": "DataQualityEvent", "severity": "critical", "domain": "recall_training_sample", "metric": "sample_count", "observedValue": 120000, "baselineValue": 180000, "dropRate": 0.33, "relatedTables": ["dwd_recall_expo", "dws_recall_sample"], "suggestedAction": "isolate_downstream_training", "confidence": 0.92 }第三层,资源底座。Agent本身是无状态的,真正执行数据加工还需要计算资源。在多集群、多云场景下,把Agent调度和底层资源解耦是关键。社区里像Karmada这类云原生多集群管理项目,正好可以做资源底座:让Agent按需申请资源,底层任务被调度到哪个集群对Agent完全透明。这样做的好处是,Agent化体系不绑定单一集群,某个集群出问题或资源紧张时,其他集群可以平滑接管。
4.3 灰度上线与效果评估
Agent化的效果不能靠“感觉”来评估,必须量化。我用的核心指标有四个:自动处置率,指Agent能自主完成处置、无需人工介入的异常事件占比;平均故障恢复时间MTTR,从异常发生到链路恢复的时间;误处置率,Agent错误判断并执行了错误动作的比例;人工复核通过率,随机抽样Agent的决策让资深开发复核,通过的比率。
灰度策略我分了三个阶段。第一是影子模式,跑两周左右。影子模式下Agent只感知、只做决策、不执行,把决策结果写到日志,由人来复核。等影子模式的决策准确率稳定在95%以上,再切到半自动模式:低风险动作自动执行,高风险动作等人工确认。最后才进入全自动模式。我们真正全自动上线是在第六周,前五周都在反复修Agent的认知。这类系统重构真的急不得,前期的“慢”就是为了后期的“稳”。
4.4 责任边界:Agent的权限设计和人工兜底
任何一个自称“自主”的系统,都必须回答一个问题:出事了谁负责?我的答案是:人负责,但人通过设计目标和事后审计来负责,而不是通过事中盯盘来负责。
权限设计上做三件事。分级授权:低风险动作如调整基线、重跑任务,Agent自动执行;高风险动作如删表、改线上特征、回滚版本,必须经过审批流。全链路审计:Agent的每次感知、决策、执行、反思都写审计日志,事后可以完整回溯,知道每一步是谁触发的、为什么触发、执行了什么。Kill Switch:任何一个Agent都提供一键暂停能力,人工可以随时接管。这个设计不是不信任Agent,而是数据生产链路毕竟给模型训练提供燃料,出了大错会影响整个线上系统。给Agent留好“刹车”,反而能让它跑得更快更远。
5. 实操三个月,踩过的坑和排查实录
5.1 质量Agent的误报:把大促流量波动当成了异常
上线第二周,质量Agent在凌晨发出高优告警:样本量较基线骤降25%,判定为critical,自动触发了下游隔离。等我们早上看到消息的时候,训练样本已经断供了半个多小时。结果业务方反馈,那是大促奖励活动的流量阶段性收缩,根本不是链路故障。这次误判直接浪费了半天的数据产量,还让团队对Agent产生了不信任感。
复盘后做的改进,就是把“单一指标判断”改成“多维指标共振判断”。样本量下降25%的同时,如果曝光量也下降25%,转化率没变,那大概率是业务流量波动;只有样本量下降显著高于曝光量下降时,才判定为链路异常。这个规则听起来很简单,但它挡掉了后续大量误报。后来我还让Agent在发布告警時附上“参考指标对比”,方便人工快速确认,而不是光秃秃一个结论。
5.2 特征血缘断裂:Agent自愈了,但口径乱了
有一次上游字段改名,特征加工Agent成功自动适配并上线了新特征。但过了几天,算法同学发现新模型的离线AUC明显低于预期,查了很久才发现:Agent在适配时自动生成的特征加工逻辑,沿用一个过期的口径定义,把“近30天点击次数”算成了“近30天曝光次数”。链路是修好了,但口径错了,而且错得悄无声息。
这个坑的根本问题,是Agent的自动适配缺少“语义校验”。从那以后,我在特征加工Agent里加了一步:每次生成新的加工逻辑,必须调用口径对齐Agent做一次RAG检索,比对语义是否与历史定义一致。只有语义校验通过,才能进入上线流程。也正是在这个阶段,Agentic RAG对我来说不再是一个热搜词汇,而是一个真正在兜底的组件。
5.3 样本漂移误触发重算风暴
样本生命周期Agent有一次判定样本分布严重漂移,触发了全量重算。重算任务同时占用了大量计算资源,把其他正在跑的实时训练任务堵了整整一个多小时。那次之后我意识到,重算决策不能只看数据分布,还要考虑资源约束。
解决方案是给样本Agent加了一个资源预算模块:任何重算任务先向资源管理器申请配额,配额不足时自动降级为增量计算,或者排队等待低峰期执行。这个模块上线后,重算任务再也没有挤垮过其他作业。顺带一提,现在很多Agent执行重算前都会看一眼集群水位,这个习惯就是从这次事故里长出来的。
5.4 常见问题速查表
把这几类高频问题整理成一个速查表,方便团队在新Agent接入或异常排查时快速对照:
| 症状 | 可能原因 | 排查思路 | 对应解法 |
|---|---|---|---|
| 样本量骤降 | 上游表分区失败、字段改名、业务流量下降 | 先看曝光量是否同步下降,再看样本层任务日志 | 质量Agent多维判断 |
| 特征大面积缺失 | 上游字段被删除、加工任务失败 | 查元数据变更记录和特征注册中心 | 特征加工Agent自动适配 |
| 离线AUC与线上不一致 | 特征口径不一致、样本穿越 | 对比线上线下特征分布、检查特征时间戳 | 口径对齐Agent语义校验 |
| Agent误触发重算 | 基线漂移误判、资源竞争 | 查看Agent决策日志和集群资源水位 | 资源预算模块约束 |
这几个案例不是孤立的,它们都指向同一个教训:Agent的每一步自主决策,都必须有明确的上下文、校验条件和资源约束。少了任何一道,自主就会变成失控。
6. 一点个人体会和扩展思路
做这个重构,我最大的体会是:Agentic数据生产体系的价值,不在于它“用了AI”,而在于它把数据生产的管理模式从“人对系统负责”变成了“系统对系统负责”。但这句话有另一半——系统对系统负责的前提,是人已经把边界、权限、审计都设计好了。所以Agent化的过程,真正考验的不是写Agent的技术,而是对数据链路本身的理解深度。
给想尝试的同学一个建议:不要一上来就搞一个庞大的全知全能Agent。从最小闭环开始,选一个你最痛、判断逻辑最清晰的环节,比如质量告警自动诊断,先做成“感知-决策-执行-复盘”的闭环,跑顺了再扩展。一步到位的基本上都会在灰度阶段被真实业务打回去重做。
另外,有一件事我还在继续做:把Agent的经验沉淀从“记录日志”升级成“结构化知识”。现在每个Agent都有一个独立的经验库,存放历史事件、处置动作和结果评估。下一步的想法是让这些经验库之间能互相参考,做到质量Agent遇到一个没见过的问题时,可以去翻特征Agent的经验库。这个方向如果跑通,Agent体系就会从“自动化系统”真正变成“会生长的体系”。到那时候,再说什么“数据涅槃”,我才觉得名副其实。