传统广告系统是为响应用户意图的离散单元而构建的。用户在网上搜索或浏览某些内容,广告系统将这些查询和页面浏览作为事件接收,系统再基于这些事件寻找匹配的广告。为 ChatGPT 构建广告技术栈则不同:用户意图在对话中逐步形成,并在多轮对话中不断变化,有时甚至没有合适的广告时机。为支持这一新范式,我们构建了一套定制的广告投放系统。这种新型广告技术栈基于一个经过后训练的前沿 LLM,它通过工具调用完成检索(识别最佳选项)、排序(预测用户参与度)、相关性评估(评估广告的有用性),以及运行拍卖以完成最终的广告选择和定价。

我们的广告系统通过三项关键设计决策来支持用户目标不断演变的细微之处:1)实现有状态的广告会话,即在对话的多轮之间以及多次对话之间记住信息;2)依赖一个经过后训练的定制 LLM,它使用工具调用架构来解读对话的上下文和底层意图,然后有效地选择、排序和投放广告;3)将广告选择过程与 ChatGPT 的答案生成分开,放在独立服务中运行,以避免广告影响答案,并保持 ChatGPT 的中立表达。我们用经过后训练的 LLM 来编排整个广告流程,根据用户当前轮次和对话历史,在合适的时间展示合适的广告。过去,搭建这样一个能自我改进的广告系统往往需要数年时间,而 ChatGPT Ads 在推出后不到 200 天内就达到了 10 亿美元的年化收入运行率推出后不到 200 天;如今,自推出以来已有超过 100,000 家广告主在 ChatGPT 上投放了广告。

在智能体式聊天中,广告应该如何运作?

传统的广告请求通常始于一个定义明确的事件。用户提交搜索查询或打开网页,广告系统便收到一个请求。这类系统相当简单:它检索潜在的广告候选,对其进行排序,运行竞价以合理地为该机会定价,并将最终广告展示给用户。ChatGPT 并不会自然产生这样一个具体的时刻。

在 ChatGPT 对话中,人们带着目标而来,而非一个只求单一答案的搜索查询。他们可能在规划一次旅行、为企业挑选软件、布置家居,或学习一项新爱好。这些并不都在对话的某一轮中完成。ChatGPT 常常在过程中帮助用户厘清什么才是重要的。

举个例子,我们的工程团队曾问 ChatGPT 如何为一场比赛进行训练:对话从关于跑步的一般性问题开始。几轮之后,他们询问有助于训练的鞋子。随着每一项约束条件的出现,这段对话的商业含义也在变化——而这种个性化上下文会跨多个会话逐步演变。一个仅根据第一条消息就采取行动的系统可能会完全抓错意图,从而可能损害用户体验并妨碍他们。

构建我们的广告系统,要求我们超越请求-响应式的广告架构,从零开始搭建一套广告技术栈,在优先考虑用户信任或价值的同时,发现潜在的经济机会。

对话记忆,且不影响 ChatGPT 的回答

把每条消息都当作独立请求来处理,就像传统广告系统那样,在我们的聊天场景中会带来几个风险:1) 过度简化用户目标而导致误读,2) 在用户的真实需求尚未明确之前就过早启动广告流程,3) 展示的广告妨碍而非支持用户旅程,4) 每次请求变化都低效地重跑广告流程,造成噪音并浪费成本。广告系统(由检索、排序和投放组成)并非围绕单个事件构建,而是维护一个有状态的会话,也就是说广告会话在符合条件的轮次期间持续运行,随着信息演变不断记忆和更新。ChatGPT 将初始请求上下文发送给广告服务器。广告系统跟随并适应不断发展的交流,而不是依赖单个扁平化的查询。

广告选择过程与 ChatGPT 的正常回复生成并行运行,以确保广告流程不会影响 ChatGPT 的回复。广告通过一个独立系统进行过滤和选择,该系统在自身的资格、质量和投放约束下消费对话内容。这一重要的架构边界——使用独立模型和独立代码的不同服务——让 ChatGPT 核心服务器负责生成自然回复;与此同时,广告系统独立评估是否存在合适的广告机会,如果存在,则通过独立的投放流程准备一个赞助展示位。

广告与 ChatGPT 的回答路径并行运行。

除了保护用户体验之外,这种分离还有一些实际影响。ChatGPT 对广告系统没有任何依赖——这些服务彼此毫无交织,也不共享内容生成模型。因此,如果广告投放系统不可用或响应缓慢,ChatGPT 的自然回复仍不受影响。这意味着广告系统无法让 ChatGPT 产品宕机或延迟。这种分离的另一个好处是,它为有价值的广告保持了很高的门槛。不返回广告是一种普通且成功的结果。只有当广告对用户和广告主都明显有益时,系统才会投放广告。

LLM 解读对话并调用工具

我们广告技术栈中的另一个关键架构组件是经过后训练的 LLM,它负责解读对话,并在智能体循环中运行整个广告流程——对广告系统的核心功能发起工具调用,从检索阶段到排序、竞价,最终到投放。我们把这个 LLM 称为编排器。

广告流程的第一步是理解用户意图,以启动检索过程,这是一次快速且刻意宽泛的潜在广告筛选,以便后续过滤。增量式地接收对话会带来一个更丰富但也更模糊的检索问题,因为广告系统需要区分当前意图与过时上下文。编排器必须解读对早前消息的引用,识别用户何时是在假设性发言,并避免把每一次对产品或服务的提及都当作购买请求。

广告编排器利用可用的对话和用户上下文,反复迭代以找到合适的广告,并不断选择何时调用哪个工具,其根本目标是为该对话和上下文找到最合适的广告(即在用户价值与广告主价值之间取得平衡的广告)。如果用户选择个性化广告,编排器还会考虑用户过往对话中可用的非敏感信息,以找到最佳的广告匹配。

广告编排器反复调用广告投放工具,以找到有价值的广告。

随着对话推进、广告编排器获得更多更新信息,编排器可以基于更新后的上下文运行新一轮工具调用,以找到更好的广告并返回给客户端,客户端随后可以在这些新广告及时到达时使用它们。

编排器的设计目标是平衡用户价值与广告主价值,始终把用户放在首位。

广告系统由各个独立工具组成,编排器会迭代调用这些工具,为一次对话找到最佳广告。从高层来看,编排器将对话转化为简短的文本摘要,再转化为语义嵌入(存储的含义,便于广告系统筛选),使用这些语义嵌入检索广告候选,根据资格条件(预算、用户设置和其他初步检查)过滤这些候选,评估其质量和相关性,并进行最终排名,以识别在聊天回复末尾放置的高价值机会。因此,每条广告都必须在资格和相关性上达到高标准,才能获得放置资格。

准备能捕捉意图的检索查询

编排器 LLM 首先准备一个或多个代表相关商业意图的查询。这可能包括重写对话上下文,将商业可能性扩展到 1:1 搜索查询之外,然后创建语义表示,即编排器将多轮对话提炼为供检索系统使用的摘要版本——以聚焦的方式从我们的数据库中检索广告。

只有当深入理解用户意图时,广告才会出现,这对用户和广告主都更有利。多个查询可以保留意图的不同方面。例如,一段关于规划旅行的对话可能包含与交通、住宿或活动相关的不同需求。检索系统可以保留这些区别,而不是将整个对话压缩成一个字面字符串。

举个例子,让我们看一段关于徒步鞋的潜在对话序列:

  1. 去优胜美地两天旅行应该准备什么?

  2. 下周会冷吗?

  3. 新的 [插入品牌] 产品线?

尽管用户没有将鞋品牌问题与优胜美地之旅联系起来,但这段对话在我们的广告系统中可能由两个查询来表示,例如[适合徒步旅行的鞋子]以及[适合旅行的新 [品牌] 产品线]这可能只是第一次尝试;编排器的设计目标是对这些表示进行迭代,直到在我们的广告库存中找到对用户具有高价值的广告。

检索可能的广告

检索是创建一个刻意宽泛的广告选项池的过程。候选广告可能来自不同的检索策略,之后可以在相同的投放约束下竞争。我们构建多个索引,针对不同的系统和产品约束进行优化(例如,商品信息流广告的索引在设计上会感知正面或负面的商品评价,以便获取尽可能好的广告。这与其他可能没有关联评价的广告无关)。每个索引都针对某种版本的近似最近邻(ANN)搜索进行优化,使用表示用户意图的嵌入向量。这种 ANN 搜索是一种用于在大型语义索引上进行检索的近似算法,意味着广告会被非常快速地获取,接近一个好的解决方案,而不是寻找“正确”的解决方案,同时保留大多数相关候选广告。

广告系统在广告检索过程中使用重写后的查询来创建语义嵌入,并生成一个宽泛的广告候选池。

过滤不合格的候选广告

过滤的目标是排除所有在相关性、出价和预算方面不满足投放标准的广告候选。根据候选广告和配置的不同,过滤检查可以包括广告素材和广告系列可用性(广告系列或广告素材是否处于活跃状态)、广告系列定向(例如,广告系列允许在哪些地区投放)、政策限制(关于可投放内容的合规要求)、预算可用性(广告系列是否仍有可支出的预算)、投放节奏(广告系列应该现在支出预算还是一天中的其他时间)、版位兼容性(此广告有资格参与哪些类型的对话),以及广告主和广告系列级别的去重(为每个广告主挑选适当数量的广告,以确保各商家公平参与)。

评估相关性和质量

通过资格检查的候选广告进入评分阶段,编排器会调用各种评分系统——用于投放考量,例如语义相关性(该广告是否与用户的目标相关?)、预测互动度(该广告是否可能被浏览、点击,并转化为广告主期望的结果?)、历史表现(该广告迄今为止展示给用户时表现如何?)。编排器还会在拍卖前对广告进行筛选,以确保相关性和安全性。这些系统将范围缩小为一个更小的候选池,准备进入拍卖,但它们仍不决定最终投放的广告。

运行广告拍卖

编排器在对话语境中评估已准备好的候选广告,并选择哪些候选广告足够合理,可以进入最终拍卖。编排器不直接决定将投放哪条广告,也不设定价格。它提名在语境上合适的候选广告,交由拍卖工具评估。

拍卖应用最终的投放机制,包括拍卖准入(通过相关性和价值的最低门槛)、节奏控制(更均匀地支出广告预算)、出价和拍卖特征计算、质量调整排名、定价以及最终选择。

最终资格检查

拍卖之后,广告可能无法投放有两种情况,二者都特定于 ChatGPT 对话媒介。

  1. 广告在聊天中可能显得不合适:尽管对话本身已被完整性模型(决定何时适合投放广告的模型)判定为适合放置广告,且广告本身也被判定为符合政策,但有时广告在某些对话语境中仍可能显得不合适。编排器会阻止这些广告展示。

  2. 广告请求可能未能及时到达:如果 ChatGPT 模型已准备好响应,但广告尚未准备好放置,广告请求就会超时,广告便不会被投放。因此,广告系统的一个目标是尽可能快地运行。ChatGPT 模型的响应时间是动态的,我们不会为了等待广告加载而延迟聊天响应。

如果上述所有检查都通过,我们会把广告发送到前端进行渲染。我们认为这是服务端广告投放,但我们仍可能不会向用户展示该广告——这是有意为之。

最后一步:向用户展示广告

在 ChatGPT 这样的对话式产品中,服务端投放广告素材并不保证广告会被展示;广告还必须及时到达,才能被纳入当前轮次。广告素材包括标题、描述、目标链接以及任何行动号召。此外,广告系统还会返回一段由模型生成的前言,这是一段简短、中性的介绍,说明该广告与对话的关联。将前言与素材分开,既能保留广告主的信息,又能保持 ChatGPT 的中立语气。

ChatGPT 前端会以打包形式接收前言和广告素材。如果它在 ChatGPT 的回复完全生成之前到达,前端会在 ChatGPT 的回复下方展示该广告,并明确标注为赞助内容。如果到达得太晚,该轮次就不会展示广告。这就是服务端广告投放与面向用户的广告曝光之间的区别。

胜出选择和投放是两个独立的事件。被选中的广告只有在 ChatGPT 批准并展示该广告位、且投放得到确认之后,才成为一次投放。

我们的广告技术栈使用传统的日志和数据管道,这有三个主要好处:广告主可以更轻松地将其现有系统与我们的技术栈集成,广告主可以利用报告数据改进其策略,我们的团队可以找到系统中需要改进的地方。除了这些报告和优化工具之外,我们还部署了一个高质量模型来评估我们的投放并训练其他广告模型,从而形成一个强大的自我改进循环。

对发生情况的详细分解有助于我们单独理解和改进广告系统的每个部分。日志处理系统还会记录细粒度的结果,例如:

  • 该轮次不符合广告投放条件。

  • 广告会话已启动,但未请求检索。

  • 检索未返回任何候选。

  • 检索到了候选,但未通过数据填充或资格校验。

  • 一条广告被投放,随后获得了一次互动。

这些细分拆解帮助我们分别改进广告投放系统的各个环节。改进机会识别所需的证据,与改进检索、候选质量、竞价参与或投放可靠性所需的证据各不相同。

投放、服务和质量系统观察到的是生命周期中不同的部分。受隐私控制的数据处理决定了哪些数据可用于衡量和模型改进。

高能力模型评估并改进整个技术栈

基于模型的评估背后的理念是:让我们最强、推理能力最高的模型观察并评判我们系统的结果,然后通过训练后训练 LLM 使其表现更好,从而改进它。例如,如果我们最强大的模型收集反馈并训练这些小模型尽可能做好工作,我们就可以使用更小、更高效的模型或推理能力较低的模型来进行编排或检索。

人类反馈引导品味方向

我们收集并依据人类反馈(用户的点击和隐藏)、用户调查以及广告主通过我们的 Ads Manager 提供的直接反馈采取行动。我们还在构建过程中让团队随时接收反馈,并直接倾听 ChatGPT 用户和广告主的需求。这一反馈来源比模型的观察性反馈更能指引我们的方向,也是让我们能够快速迭代到正确产品决策的部分原因。模型或许能够理解用户意图并进行批判性思考以交付有价值的东西,但品味由人来塑造。

下一步

一年前,我们还没有广告系统,只有少数几个人在思考这个领域的问题。现在我们有了一个稳健的广告系统,支撑着超过 10 亿美元的年化流水,并且有一个基于 LLM 的编排器在运行广告流程。Codex 是一个根本性的力量倍增器,让我们能够以无与伦比的速度启动系统,达成这一重要的使用里程碑。从一开始,我们就围绕使用 Codex 来搭建团队和开发工作流,以快速构建和扩展系统。我们为 Codex 建立了护栏,使其能够可靠、安全地交付代码。与此同时,我们为 Codex 搭建了数据基础设施插件,大幅缩短了洞察收集与系统改进落地的循环,包括新产品功能、质量改进以及更好的系统性能。

我们系统的边界(植根于我们的广告原则⁠)与基于 LLM 的编排器相结合,让我们能够在不把每一次对话都当作广告请求的前提下,让广告变得有用。展望未来,我们将继续尝试更多动态广告形式,以提升用户价值(例如让用户能够通过广告直接与企业对话)和广告主价值。这套技术栈的自我改进架构建立在 OpenAI 模型之上,并配有持续反馈循环,将加速我们随时间不断提升相关性和个性化的能力。