传统广告系统是为响应用户意图的离散单元而构建的。用户在网上搜索或浏览某些内容,广告系统将这些查询和页面浏览作为事件接收,并基于这些事件寻找匹配的广告。为 ChatGPT 构建广告技术栈则不同:用户意图在对话中逐步形成,并在对话的多个轮次中发生变化,有时并不存在合适的广告时机。为支持这一新范式,我们构建了一套定制的广告投放系统。这种新型广告技术栈基于一个经过后训练(post-trained)的前沿 LLM,由它发起工具调用,用于检索(识别最佳选项)、排序(预测用户参与度)、相关性(评估广告的有用性),以及运行竞价以完成最终广告选择与定价。
我们的广告系统通过三项关键设计决策,支持用户目标不断演变的细微之处:1)实现有状态的广告会话,即信息在对话的多个轮次之间以及多次对话之间被记住;2)依赖一个经过后训练的定制 LLM,它使用工具调用架构来解读对话的上下文与底层意图,然后有效地选择、排序和投放广告;3)将广告选择过程与 ChatGPT 的答案生成分开,在独立服务中运行,以避免广告影响答案并保持 ChatGPT 的中立语气。我们使用经过后训练的 LLM 来编排整个广告流程,基于用户当前轮次和对话历史,确定在合适的时间展示合适的广告。虽然像这样自举一个自我改进的广告系统过去需要数年时间,但 ChatGPT Ads 在上线后不到 200 天就达到了 10 亿美元的年化收入运行率;如今,自上线以来已有超过 100,000 家广告主在 ChatGPT 上投放了广告。
常规的广告请求通常始于一个定义明确的事件。用户提交搜索查询或打开网页,广告系统便收到一个请求。这类系统相当简单:它检索潜在的广告候选,对其进行排序,运行竞价以合理地为该机会定价,并将最终广告展示给用户。ChatGPT 并不会自然产生这样一个具体的时刻。
在 ChatGPT 对话中,人们带着目标而来,而非一个只有单一答案的搜索查询。他们可能在规划旅行、为企业选择软件、布置家居,或学习一项新爱好。这些并不都在对话的一个轮次中发生。ChatGPT 常常在过程中帮助用户厘清真正重要的内容。
举例来说,我们的工程团队曾问 ChatGPT 如何为一场比赛进行训练:对话从关于跑步的一般性问题开始。几轮之后,他们询问有助于训练的鞋子。随着每项约束条件的出现,这段对话的商业含义也在变化——而这种个性化上下文会跨多个会话演变。一个仅根据第一条消息就采取行动的系统可能会完全检索到错误的意图,从而可能降低用户体验并妨碍用户。
构建我们的广告系统要求我们超越请求-响应式的广告架构,从零构建一套广告技术栈,在优先考虑用户信任与价值的同时发现潜在的经济机会。
对话记忆,且不影响 ChatGPT 的答案
像传统广告系统那样把每条消息都变成独立请求,在我们的聊天用例中会带来若干风险:1)因过度简化而误读用户目标;2)在用户真实需求尚未明确之前就过早启动广告流程;3)展示妨碍而非支持用户旅程的广告;4)每次请求变化时低效地重新运行广告流程,造成噪音并浪费成本。广告系统(由检索、排序和投放组成)并非围绕单个事件构建,而是维护一个有状态的会话,即广告会话在一个符合条件的轮次持续期间运行,随着信息演变而记住并更新信息。ChatGPT 将初始请求上下文发送给广告服务器。广告系统跟随并适应不断发展的交流,而不是依赖单个扁平化的查询。
广告选择过程与 ChatGPT 的正常响应生成并行运行,以确保广告流程不影响 ChatGPT 的响应。广告通过一个独立系统进行过滤和选择,该系统在其自身的资格、质量和投放约束下消费对话。这一重要的架构边界——使用独立模型和独立代码的不同服务——让核心 ChatGPT 服务器负责生成自然响应;与此同时,广告系统独立评估是否存在合适的广告机会,若存在,则通过独立的投放流程准备一个赞助展示位。
除了保护用户体验之外,这种分离还有一些实际影响。ChatGPT 对广告系统没有任何依赖——这些服务彼此完全不交织,也不共享内容生成模型。因此,如果广告投放系统不可用或响应缓慢,ChatGPT 的自然响应仍会继续不受影响。这意味着广告系统无法使 ChatGPT 产品宕机或延迟。这种分离的另一个好处是,它为有价值的广告保持了很高的门槛。不返回广告是一种普通且成功的结果。只有当广告对用户和广告主都明显有益时,系统才会投放广告。
LLM 解读对话并调用工具
我们广告技术栈中的另一个关键架构组件是经过后训练的 LLM,它解读对话并在智能体循环中运行整个广告流程——对广告系统的核心功能进行工具调用,从检索阶段到排序、竞价,最终到投放。我们将这个 LLM 称为编排器(orchestrator)。
广告流程的第一部分是理解用户意图,以启动检索过程,即快速且刻意广泛地获取潜在广告,供后续筛选。增量接收对话会带来更丰富但也更模糊的检索问题,因为广告系统需要区分当前意图与过时上下文。编排器必须解读对先前消息的指代,识别用户何时是在假设性地发言,并避免将每一次对产品或服务的提及都视为购买请求。
广告编排器利用可用的对话和用户上下文,反复迭代以寻找合适的广告,并反复选择何时调用哪个工具,其根本目标是为此对话和上下文找到最合适的广告(即在用户价值与广告主价值之间取得平衡的广告)。如果用户选择个性化广告,编排器还会考虑关于用户过往对话的可用非敏感信息,以找到最佳广告匹配。
随着对话推进、广告编排器获得更多更新信息,编排器可以基于更新后的上下文运行一组新的工具调用,以找到更好的广告并将其返回给客户端,客户端随后可以在这些新广告及时到达时使用它们。
编排器的设计目标是平衡用户价值与广告主价值,始终将用户放在首位。
广告系统由各个独立工具组成,编排器反复调用它们,为对话寻找最佳广告。在高层次上,编排器将对话转化为简短的文本摘要,再转化为语义嵌入(存储的含义,便于广告系统筛选),使用这些语义嵌入检索广告候选,对候选进行资格筛选(基于预算、用户设置和其他初步检查),评估其质量和相关性,并进行最终排序,以识别在聊天回复末尾投放的高价值机会。因此,每个广告都必须在资格和相关性上达到高标准,才有资格被投放。
准备能捕捉意图的检索查询
编排器 LLM 首先准备一个或多个代表相关商业意图的查询。这可以包括重写对话上下文,将商业可能性扩展到 1:1 搜索查询之外,然后创建语义表示,即编排器将多轮对话提炼为供检索系统使用的摘要版本——以聚焦的方式从我们的数据库中检索广告。
只有当广告投放建立在对用户意图的深入理解之上时,它们才会对用户和广告主都更有利。多个查询可以保留意图的不同方面。例如,一段关于规划旅行的对话可能包含与交通、住宿或活动相关的不同需求。检索系统可以保留这些区分,而不是将整个对话压缩成一个字面字符串。
举例来说,让我们看一段关于徒步鞋的潜在对话序列:
- 去优胜美地两日游应该准备什么?
- 下周会冷吗?
- 新的[插入品牌]产品线?
尽管用户没有将鞋品牌问题与优胜美地之行联系起来,这段对话在我们的广告系统中可能由两个查询表示,例如[shoes appropriate for hiking trip]和[new [brand] product lines good for travel]。这可能只是第一次尝试;编排器的设计目标是对这些表示进行迭代,直到在我们的广告库存中找到对用户具有高价值的广告。
检索是创建一个刻意广泛的广告选项池的过程。候选可能来自不同的检索策略,之后可以在相同的投放约束下竞争。我们构建多个索引,针对不同的系统和产品约束进行优化(例如,商品信息流广告的索引在设计上会在获取最佳可能广告时感知正面或负面商品评价。这与可能没有关联评价的其他广告无关)。每个索引都针对某种版本的近似最近邻(ANN)搜索进行优化,使用代表用户意图的嵌入。这种 ANN 搜索是一种用于在大型语义索引上检索的近似算法,意味着广告会被非常快速地获取,接近一个好的解决方案,而不是寻找“正确”的解决方案,同时保留大多数相关候选。
筛选不合格的候选
过滤的目标是消除所有不符合投放标准的广告候选,这些标准涉及相关性、出价和预算。根据候选和配置的不同,过滤检查可以包括创意和广告活动可用性(广告活动或广告创意是否活跃)、广告活动定向(例如,允许广告活动在哪些地区运营)、政策限制(关于可广告内容的合规要求)、预算可用性(广告活动是否仍有可用预算)、投放节奏(广告活动应在当前还是当天其他时间支出预算)、投放位置兼容性(此广告有资格参与哪些类型的对话),以及广告主和广告活动级别的去重(为每个广告主选择适当数量的广告,以确保企业间的公平参与)。
评估相关性和质量
通过资格检查的候选进入评分阶段,编排器在此阶段调用各种评分系统——用于服务考量,如语义相关性(广告是否与用户目标相关?)、预测互动(广告是否可能被观看、点击并转化为广告主期望的结果?)、历史表现(广告迄今为止向用户展示时表现如何?)。编排器还在拍卖前过滤广告以确保相关性和安全性。这些系统将范围缩小为准备拍卖的较小候选池,但它们仍不决定最终投放的广告。
编排器在对话上下文中评估准备好的候选,并选择哪些广告候选足够合理以进入最终拍卖。编排器不直接决定将投放哪个广告,也不设定价格。它提名上下文合适的候选供拍卖工具评估。
拍卖应用最终的服务机制,包括拍卖准入(通过相关性和价值的最低阈值)、投放节奏(更均匀地支出广告预算)、出价和拍卖特征计算、质量调整排名、定价和最终选择。
最终资格检查
拍卖之后,广告可能因两种方式投放失败,这两种方式都特定于 ChatGPT 对话媒介。
- 广告在聊天中可能显得不合适:即使对话本身已被完整性模型(决定何时适合投放广告的模型)认定为适合投放广告,且广告本身也被认定为符合政策,有时广告在某些对话上下文中可能显得不合适。编排器会阻止这些广告展示。
- 广告请求可能未及时到达:如果 ChatGPT 模型已准备好响应,但广告尚未准备好投放,广告请求会超时,广告不会投放。因此,广告系统的一个目标是尽可能快地运行。ChatGPT 模型的响应时间是动态的,我们不会延迟聊天响应来等待广告加载。
如果满足上述所有检查,我们将广告发送到前端进行渲染。我们认为这是服务器端的广告投放,但我们仍可能不向用户展示广告——这是有意设计的。
在像 ChatGPT 这样的对话产品中,广告创意的服务器端投放并不保证广告会展示;广告还必须及时到达以包含在当前轮次中。广告创意包括标题、描述、目标链接和任何行动号召。此外,广告系统还返回模型生成的前言,这是一个简短、中性的介绍,解释广告与对话的关系。将前言与创意分开,既保留了广告主的信息,又保持了 ChatGPT 声音的中立性。
ChatGPT 前端将前言和广告创意作为捆绑包接收。如果它在 ChatGPT 的响应完全生成之前到达,前端会在 ChatGPT 的响应下方展示广告,并明确标记为赞助。如果到达太晚,该轮次不会展示广告。这就是服务器端广告投放与面向用户的广告印象之间的区别。
我们的广告技术栈使用传统的日志和数据管道,这有三个主要好处:广告主可以更容易地将其现有系统与我们的技术栈集成,广告主可以利用报告数据改进策略,我们的团队可以找到系统中需要改进的领域。除了这些报告和优化工具,我们还部署了一个高质量模型来评估我们的投放并训练其他广告模型,创建了一个强大的自我改进循环。
详细分解所发生的事情有助于我们孤立地理解和改进广告系统的每个部分。日志处理系统还记录细粒度的结果,例如:
- 该轮次不符合广告投放条件。
- 广告会话已开始但未请求检索。
- 检索未返回候选。
- 候选已检索但未通过水合或资格检查。
- 广告已投放并随后收到互动。
这些详细分解有助于我们孤立地改进广告服务系统的每个部分。改进机会检测需要与改进检索、候选质量、拍卖参与或投放可靠性不同的证据。
高能力模型评估并改进整个技术栈
基于模型的评估背后的理念是,我们最强、推理能力最高的模型会观察并评判我们系统的结果,然后通过训练后训练 LLM 使其表现更好来改进它。例如,如果我们最强大的模型收集反馈并训练这些小模型尽可能做好工作,我们就可以使用更小、更高效的模型或推理能力较低的模型来进行编排或检索。
人类反馈引导有品位的方向
我们收集并依据人类反馈(用户的点击和隐藏)采取行动,同时还有面向用户的调查以及广告主通过我们的 Ads Manager 提供的直接反馈。我们还在构建过程中让团队随时接受反馈,并直接倾听 ChatGPT 用户和广告主的需求。这一反馈来源比模型的观察性反馈更能指导我们的方向,也是让我们能够快速迭代到正确产品决策的部分原因。模型或许能够理解用户意图并进行批判性思考以提供有价值的内容,但品味由人来塑造。
下一步
一年前,我们还没有广告系统,只有少数人在思考这个领域的问题。现在我们拥有一个稳健的广告系统,年化运行率超过 10 亿美元,并由基于 LLM 的编排器运行广告流程。Codex 是一个根本性的力量倍增器,使我们能够以无与伦比的速度引导系统实现这一重大使用里程碑。从一开始,我们就建立了团队和开发工作流,以使用 Codex 快速构建和扩展系统。我们为 Codex 构建了护栏,以可靠、安全地交付代码。与此同时,我们为 Codex 设置了数据基础设施插件,以大幅收紧洞察收集和系统改进落地的循环,包括新产品功能、质量改进和更好的系统性能。
我们系统的边界(植根于我们的广告原则)与基于 LLM 的编排器相结合,使我们能够在不把每次对话都当作广告请求的情况下让广告变得有用。展望未来,我们将继续试验更多动态广告格式,以提升用户价值(例如让用户能够通过广告直接与企业对话)和广告主价值。该技术栈的自我改进架构建立在 OpenAI 模型之上,并具有持续反馈循环,将加速我们随时间推移不断改进相关性和个性化的能力。
