让逻辑「漂」起来:阿里妈妈广告引擎Serverless(GaaS)架构揭秘

发布时间:2026-01-15 05:06  浏览量:1

2021年之前,阿里妈妈广告业务是搜索广告、展示广告、直播广告等多驾马车各自发展的局面。2021年阿里妈妈推出了「万相台」,一定程度实现了客户一笔钱可投放到阿里妈妈的所有土地上。2024年8月进一步推出了「万相台无界」,允许客户一笔钱在关键词/人群/货品全站/直播短视频各场景间自由腾挪,在不同土地上最优分配。这样

「预算通」、「土地通」

的产品,给了客户更多自由度,同时也给了技术侧更多的优化抓手,对于广告主和广告平台来说是双赢的。

不同引擎承接不同土地的流量,是业界共识的架构范式。如何让一笔钱花在不同的土地上,要解决同一个花钱逻辑如何同时在不同引擎生效的问题。换言之,业务上的「预算通」其实需要「引擎通」。

在这样以「通」为主题的业务和技术发展趋势之下,我们提出了 Serverless 的广告引擎架构范式,使得业务能力可以「一处开发按需集成」。更进一步,我们实现了 开发、测试、实验、生产交付 全链路迭代颗粒度对齐到「能力」,而阿里妈妈广告引擎对能力的承载形式是Graph(有向无环图),因此我们提出

Graph as a Service(GaaS)

的新玩法。GaaS已经很好地帮助业务解决了跨引擎/跨模块出价的迭代效率问题(开发自测提效:

1倍

以上;变更发布提效: 70% ),对不同场景、在离线系统能力复用也提供了巨大的助力。

在广告引擎这样一套复杂的系统中真正落地Serverless范式,是有挑战的,业界也鲜有耳闻。本文简要介绍了GaaS背后的思想,主要的方案,以及实际业务落地情况。

本文完整作者:应灵,飞驳,天形,子瑞,画沙

二、GaaS的核心是从开发到交付全链路颗粒度对齐到Graph

GaaS是阿里妈妈广告引擎以业务能力(通过图实现)为基本单元的交付范式。相较传统Serverless方案(如 FaaS),GaaS聚焦于在满足对系统低延迟、重数据、高频迭代 等系统约束的前提下实现敏捷交付。

我们将广告在线引擎逻辑进行「细粒度重构」,形成诸多合适粒度的Graph。GaaS核心提供对Graph的规范化封装,同时在Graph粒度上,提供 开发、自测、实验、发布 能力。具体包含了如下5个核心组成部分:

图1: GaaS核心能力体系架构全景图

基于能力重塑

:基于运行时、数据表达、范式统一的全图化引擎,以业务能力为粒度对引擎业务做整体做细粒度重塑,是GaaS运转的底层逻辑支撑。

面向能力开发

:构建以算子(底层计算逻辑)、编排、数据为整体的编译部署单元,实现业务视角的“能力”与工程交付视角的“图”概念对齐,是GaaS的工程基础。

面向能力自测

:解决在线引擎运行时环境的轻量级拉起难题,将能力的测试从集成测试轻量化为本地单测,是GaaS的效率核心。

面向能力实验

:解决能力升级后对所关联业务的实验感知、拉起及统一验证问题,避免图复用后验证成本的线性增长,是GaaS可持续推广的成本保障。

面向能力发布

:解决能力触发多业务发布的数据部署与发布效率问题,实现引擎变更以能力版本做统一对齐,是GaaS的最后一公里拼图。

GaaS的基础是,要有粒度适当的逻辑片段可构建在线引擎全链路流程,然后这些逻辑片段的部署不受模块/服务限制。在往期文章 《新时期的阿里妈妈广告引擎》 的工作中,我们通过以下三个「统一」实现了上述基础要求:

统一运行时

: 将引擎从控制流全面切换为数据流模式,实现了业务编排与底层执行的解耦。引入图编译优化以保障高吞吐、低延迟的同时,让开发者从复杂的数据分发与并行编排中解脱,专注于逻辑迭代。基于此实现各引擎各模块的

运行时互认

统一数据抽象

: 将各类异构数据统一建模为 Table(二维表)并交由框架自动化管理,使业务开发能够通过配置化方式

透明地消费数据

视图,显著解决了广告引擎重数据依赖的痛点,提升了交付效率。

统一业务抽象

:规范业务算子通过标准的Schema交互,并剔除了“大Session(Context)”数据总线,推动了逻辑片段的原子化与

无状态化

,为算子在各模块间的“自由漂移”及全链路逻辑重组扫清了障碍。

在上述三个「统一」的工作之上,阿里妈妈广告引擎具有了业务能力在不同模块、引擎之间互认的技术前提。我们进一步对业务逻辑进行体系化建模:基于 BP 能力与土地机制对引擎能力实施 MECE 式拆解并以图粒度承载,实现了以图为标准交付物的引擎研发范式。

以无界BP的“设置预算及出价”能力为例,通过统一的出价范式定义,我们实现了不同土地(搜索、展示)、不同营销场景、不同出价方式在底层共享同一套“出价内核”。

图2: 出价子图的动态漂移示意(在线高性能场景 vs 实验低成本场景)

进一步地,针对出价实验在重数据模块(如检索节点)拉起资源成本高的挑战,我们利用

图漂移能力

,支持出价子图根据场景灵活切换部署位置:在线接流阶段部署于“本地”以追求极致性能;实验阶段则“漂移”至远端节点,以极低的部署成本实现快速迭代。

四、面向能力开发:将引擎逻辑片段抽象为Graph,是GaaS的前提

阿里妈妈广告引擎基于

EADS图引擎框架

搭建,图可以表达一段任意粒度的引擎/业务逻辑,小到一张图中可以只有一个UDF(算子),大到召回引擎的完整图描述,甚至整个广告引擎都是一张可在一个进程中被EADS框架加载执行的图。基于之前描述的数据总线Table、运行时框架等统一的基建,引擎逻辑抽象为Graph已具备充分的技术可行性。

Graph定义

:Graph包含基于python脚本(TableAPI)描述的DAG流程、业务自定义UDF(C++)插件、算子所依赖的数据schema定义 等。

Graph调用

:可以在TableAPI描述中,通过「图接口」直接完成对子图的调用。

Graph编译:

根据图编译脚本(bazel BUILD)描述的主图(A)调用依赖子图(B)的方式(inline/local/remote),完成主图A到子图B的实际编译部署物。这一过程可类比C++程序对第三方库的处理方式——根据需求选择静态依赖、动态依赖或RPC调用。

图3:面向能力开发

五、面向能力自测:让Graph可以Local化跑起来,是GaaS的灵魂

集成测试是引擎迭代的重要质量保障。 GaaS打通了开发侧算子集成与图集成相关能力, 也对集成测试提出了「更高」/「更全」/「更广」的需求, 只通过传统的应用粒度的回归, 已经不能满足GaaS模式下

所测即所变的要求

。因此,Local化的集成自测呼之欲出。

图测试需要准备输入Table,索引数据,校验输出Table, 我们将这些流程的业务接口统一暴露为Python接口, 将图测试用例设计为Python测试用例, 通过Python的易用性与「AI-Friendly」特性, 降低图测试的构造门槛, 使图测试作为开发环节的必选项。我们将整个流程抽象为「测试图构造」, 「本地运行时」, 「数据构造与结果断言」:

测试图构造

: 提供接口Mock能力,实现对测试图进行上下游数据Mock构造。提供Mock过程中对图执行流程的必要改写能力, 从而将原图重构为测试图,进而实现图的本地运行。

本地运行时

: 提供小索引构建能力,利用图编译能力完成对被测试子图的编译、校验逻辑插入及具体调用。最终实现了本地运行Graph所需要依赖的简化,且优化单图测试时间到分钟级。

数据构造与结果断言

: 在图测试中提供了基于Python的Table数据结构, 支持业务使用Python完成图测试输入数据构造与输出结果断言, 极大地提升了图测试的易用性。

通过「测试图构造」, 「本地运行时」, 「数据构造与结果断言」等模式, 我们成功将一个EADS图的集成测试建模为在Python中的一段UT测试逻辑, 这大大优化了传统的基于生产实验环境的集成回归逻辑, 提供了真正的面向「能力」的集成回归, 使业务能根据能力丰富图回归, 有效地保证了GaaS的安全落地。

实验是引擎迭代的关键步骤,在这个环节,不仅要验证迭代的效果,更要验证迭代的稳定性。阿里妈妈在过去几年已规模化应用了引擎模块级的生产实验能力,对生产流量和资源进行科学敏捷管理,实现了引擎模块迭代的低成本高效验证。

在面向能力迭代的背景下,也需要面向能力(即Graph)建设配套的生产实验能力,这是GaaS走向生产的关键基础设施。这套实验能力包括以下几点:

Graph血缘分析

:构建维护Graph到模块的拓扑关系,是面向Graph的精准实验以及后续精准生产发布的关键能力。在没有拓扑关系的情况下,只能人工识别实验对象,难以避免出现遗漏或者实验资源浪费。我们的系统在引擎代码变更后,可自动提取并更新这一拓扑关系。

Graph精准实验

:用户以Graph为视角触发实验,系统基于血缘分析结果,精准定位需要实验的模块和业务场景,自动的进行相关实验构建、部署和流量接入。这一过程中用户只需要提供Graph及其变更信息,即可保证受影响的模块和业务场景都可以被验证到。

全局实验分析

:多业务场景实时效果监测和结果聚合,多引擎模块下钻到Graph的实时监控,这些基础能力有效的保障了Graph实验的最终目标,一次实验得到包括效果和稳定结论的各业务场景的正确验证结果。

基于面向Graph的实验能力,阿里妈妈广告引擎实现了GaaS高效的

「一处开发,多处验证」

图5:面向能力实验

七、面向能力发布:通过Graph发起生产变更,是GaaS的使命

面向能力即Graph的发布,能力成功交付到生产系统才是GaaS使命的达成,GaaS的Serverless理念在这一环节得到最终体现。面向Graph的Serverless发布主要体现在以下两点

Graph精准发布

:用户以Graph为视角触发生产变更,同样基于血缘分析结果,精准定位需要变更的模块和业务场景,并行进行多模块的生产变更。针对不同业务场景对Graph的差异化使用,我们对Graph发布流程进行了概念抽象,来满足这一诉求。

Graph灵活部署

:GaaS的一个核心Serverless能力是Graph作为可独立运行的实体,具备可灵活漂移部署的特性。Graph可以被模块本地inline调用从而获取最优的调用延迟,或者被远程调用获取最佳的迭代隔离性,也可以被动态子图调用来平衡调用延迟和迭代效率,不同的业务场景可灵活调整部署方式。

基于面向Graph的发布能力,阿里妈妈广告引擎实现了GaaS高效的「

一处开发,多处发布

图6:面向能力发布

八、完整秀出来:广告引擎GaaS对智能出价迭代的体验提升

以智能出价为例,GaaS显著提升了引擎能力的交付效率。作为广告引擎的核心商业能力,智能出价被广泛集成于多种流量土地(搜索、展示、内容等)的多个阶段。其核心逻辑包含了:个性化出价算子(C++ 实现)、横向复用的通用出价内核子图,以及支撑在线计算的算法数据。

在GaaS落地前,尽管逻辑可复用,但交付碎片化严重:集成侧需手动维护复杂的编译配置,逻辑验证深度绑定物理服务部署,效果验证需逐个渠道手动同步。这种按服务粒度发布的模式,节奏慢且极易导致全链路版本不一致(漏发)。

图7:完整案例——智能出价在 GaaS 落地前后的全链路交付流转对比

GaaS从根本上解决了上述问题。如图所示,在不降低验证质量的约束下,出价交付被收敛为统一的“图资产”交付,实现了研发效率与质量的双重飞跃:

开发阶段

:智能出价子图提供者保障所需能力的闭环交付及验证,从而

规避了在不同部署集成时的差异化兼容问题

load("eads_graph")

eads_graph(

name = "bidding_graph",

graph_main = "bidding_graph.py",

# 仅需申明图内新增的

# 编排、算子逻辑、数据

py_deps = ,

eads_udfs = [

":bidding_udf",

],

eads_datas = [

":my_promotion_bidding_data"

],

# 通过图之间的依赖关系解决

# 间接依赖编排、算子的依赖关系

graph_deps = [

"//graph:fetch_param_graph"

],

)

自测阶段

:以往依赖完整服务的集成测试,现在被轻量化为基于标准 I/O 的图自测。通过 Mock 输入表与算法数据,

在本地即可完成高仿真的逻辑闭环验证

。GaaS首次实现了Graph逻辑的本地测试,大大降低生产变更的返工频率。

from

turing_script.ad_table

import AdTable

from bidding.graph import bidding_graph

class BiddingTestCase

(EADSGraphTestCase)

:

# 用于执行图测试

def test_demo(self):

# 支持子图输入输出表构造

ad_table = AdTable.from_csv_file(

"ad_input.csv")

in_tables = {"ad": ad_table}

expect_table = AdTable.from_csv_file( "ad_output.csv")

# 执行待测试子图

out_tbls = self.run_graph(inputs=in_tables, fetches=[ "ad"])

# 验证结果

asserttable_equal(ad_table, expect_table)

实验阶段

实现了全局实验的一键启动

。依托图血缘能力,系统可自动识别出价子图升级所涉及的引擎模块,并同步完成相关业务场景的流量配置。在效果回收阶段,支持全域维度的指标聚合以及面向特定业务维度的深度下钻分析。以该场景为例,GaaS方式实验效率提升70%。

发布阶段

生产发布全由出价子图变更驱动

。利用血缘识别联动多个服务发起发布;同时,针对不同业务场景对调用延迟与开发效率的平衡需求,支持子图以“内联融合(Inline)”或“跨图调用”的差异化范式进行灵活部署,实现性能与灵活性兼得。以该场景为例,GaaS方式发布效率提升75%。

九、展望:GaaS不是终点,大模型时代,AI研发扑面而来!

我们通过图粒度的在线引擎能力建模,围绕图交付的基建升级,构建了基于GaaS的引擎能力交付范式,本质是面向在线广告引擎场景构建了一种AI-Friendly的软件工程架构。这套软件工程思想在大模型时代依然行之有效,甚至可以说正当其时:

更清晰的逻辑拆分本质上是更精准的领域建模,让大模型“理解代码”更有迹可循

更明确的引擎能力拆解是更精细的工程规范,让大模型“新增代码”更有理可依

更多颗粒度(Graph)的可测性是更强的质量抓手,让大模型“验证逻辑”更有底气

基于这套 AI-Friendly 的架构,我们已经在

引擎研发范式的AI化重塑

上迈出了坚实的一步:

Source Code As Document

:我们构建了以代码为主要依据的知识库,实现了日常编码建议、功能答疑、运维知识查询由向人咨询到向Agent咨询的转变。很大程度解决了文档缺、文档老、文档不准 的研发顽疾。

AI·Coding

:以编码规范 及 依赖知识(代码知识、业务知识) 为基础,我们实现了从原始需求出发,到技术方案生成、算子/子图编码、本地验证、实验拉起 等,端到端可由AI Agent辅助完成。部分领域的产品需求已默认通过AI辅助开发。

未来,我们将继续探索AI Agent与引擎架构更加激进、更加深入的融合,敬请期待!