图片

图片

最新内容请微.信搜索公.众.号阅读

内容总结

  • ChatGPT 中的广告会正常投放(存在于 result.ads[] 数组中),但界面最多只会显示一次 —— 在 300 多万次回复中,约 87% 的带广告回复会显示可见的广告卡片,约 13% 的广告虽然投放了但从未展示。

  • 在实际展示层面,该界面本质上是单广告位的:仅约 4.2% 的广告响应会同时服务于多个广告商(极少出现三个广告商,四个几乎不存在)。而在返回两个广告商的响应中,83% 显示一张卡片,13% 不显示任何卡片,约 4% 会同时显示两张卡片。

  • 当两个广告商发生竞争时,界面倾向于展示品牌名称出现在 ChatGPT 生成答案中的那个广告(答案中提到的品牌最终展示概率为 61%,而未提到的被丢弃概率为 4%);广告的返回顺序(adsResponseIndex)预测获胜者的准确率约为 90%,但这仅仅是一个代理指标,而非底层逻辑。

  • 5.1% 的响应会在不同的 ads_response_index 值中重复发送同一个广告。因此,如果解析器直接以索引作为唯一键名,就会错误地将“用户看了一次广告”报告为“看了三次”。

  • 被标记为 hidden(隐藏)的广告实际上并未出现在广告数据流中(60 天内的 8,590 个广告中无一例外)。因此,已投放但未显示的广告数量差额,完全取决于前端的渲染决策,而非可见性过滤标志。

OpenAI 的广告有效载荷(Payload)回答了一个问题 —— ChatGPT 投放了什么? 却悄悄隐藏了另一个关键问题 —— 用户实际看到了什么? 这两个数字并不等同。在 ChatGPT 中,广告以候选列表的形式存在于 result.ads[] 数组中,但聊天界面在每个回复下方最多只会渲染一张广告卡片。其余的广告均处于“已投放但未显示”的状态:这些付费广告位在被大模型评估后、呈现在屏幕上之前就被丢弃了。

本文通过分析关于 ChatGPT 广告的数据,反向推导并填补了这一认知差距。我们测量了广告实际被渲染的频率、“多个广告”实际上是同一广告重复播放的频率、OpenAI 隐藏广告的频率,以及 —— 当两个广告商真正竞争时 —— 前端界面最终会选择展示哪一个。对于最后一个问题,数据给出了一个基于内容的清晰答案。

注:这些数据来自对数百万条 ChatGPT 回复的测量采样,而非针对整个 ChatGPT 平台的普查。采样广告主要集中在美国、加拿大、澳大利亚和日本,且提示词组合偏向商业意图。

“已投放但未显示”究竟是什么样的

ChatGPT 的回复中包含的付费广告位,可能远多于用户在屏幕上实际看到的数量。API 返回的 result.ads[] 数组代表 OpenAI 的投放决策 —— 即竞价系统针对该提示词(Prompt)返回的广告候选列表。而答案下方可见的卡片则代表展示决策 —— 即前端客户端根据渲染逻辑,最多只保留一个广告,并将其余广告丢弃。

对于任何想要衡量 ChatGPT 广告效果的人来说,这一点至关重要。如果你直接统计 result.ads[] 中的广告投放数量,你统计的只是广告的“出货量”,而非实际的“曝光量”(Impressions)。广告主真正关心的曝光加权数据需要依据“展示决策”,而该决策并不存在于广告有效载荷的字段中。你必须从渲染后的 DOM(网页文档对象模型)中提取该字段。

“已投放”与“已显示”在数据上的区别

假设你向 ChatGPT 提问:“如何在不损坏耐克 Air Max 运动鞋的前提下清洗它们?”

API 返回的响应中包含一个非空的 result.ads[] 数组 —— OpenAI 向你推送了一个鞋类护理品牌的广告:

"ads": [
  {
    "brand": {
      "name": "Wolf & Shepherd",
      "url": "https://wolfandshepherd.com/?utm_source=chatgpt.com"
    },
    "cards": [
      {
        "title": "Sneaker Shoe Care Kit",
        "image": "https://bzrcdn.openai.com/…webp"
      }
    ],
    "visibility": "allowed",
    "adsResponseIndex": 0,
    "rendered": false
  }
]

广告确实存在于数据有效载荷中。但是当你阅读用户屏幕上实际看到的答案时,下方并没有任何“赞助”卡片 —— 无论是 Wolf & Shepherd 还是其他品牌的。数据中的 rendered: false 字段清晰表明:OpenAI 投放了该广告,但前端界面并未将其渲染出来。因此,此响应只能计为“广告投放”,而不能计为“广告曝光”。

即便广告内容与用户提问完全契合,这种情况依然会发生。例如,鞋类护理广告与“清洗鞋子”的提示词高度匹配,但它依然没有被展示。是否投放广告由竞价系统决定;而是否展示则是前端界面在构建最终答案时做出的另一个独立决策。

再来看相反的例子。当你提问“目前最好的外呼销售平台是什么?”,得到的答案推荐了 JustCall —— 这次答案下方成功渲染出了它的赞助卡片,因此该广告带有赞助标识,且状态为 rendered: true。同样的 result.ads[] 数据结构,用户端却呈现出了截然相反的结果。区分两者的唯一标准就是 rendered 字段……

我们如何解读 visibility 与 rendered 字段

每条广告数据中的这两个字段讲述着不同的故事,且它们来自于完全不同的数据源:

  • visibility(可见性):这是 OpenAI 官方返回的判断,直接传递。 在 SSE(服务器发送事件)数据流中,投放的每条广告都带有 visibility.status 字段,其值为 allowed(允许)或 hidden(隐藏,表示未能通过 OpenAI 的合规完整性检查)。Cloro 会原样复制该值,并不对其做加工。在实际数据中,该状态几乎无一例外都是 allowed

  • rendered(已渲染):这是 Cloro 自身的测量指标。 因为原始有效载荷本身不会透露页面最终加载了哪条广告。Cloro 会通过读取渲染后的 HTML 中是否存在 data-testid="image-card-v2-elevated-brand" 元素来做判断 —— 该元素仅存在于真正渲染成功的赞助卡片上,而不会出现在页面其他地方嵌入的已投放广告 JSON 中。该元素包含了可见标签(如“赞助”或广告商名称)。当广告商名称与卡片匹配时,标记为 rendered: true,否则标记为 false。该读取过程设有超时限制,避免因页面加载缓慢而导致抓取卡死(此时会直接标记为未渲染)。

因此,visibility(OpenAI 是否允许投放该广告?)与 rendered(用户是否真正看到了该广告?)回答的是两个不同的问题。这就是为什么一条广告可以同时处于 allowed: true 且 rendered: false 的状态。

发现 1 :广告被投放了,但不一定会被展示

在 325 万次包含广告的回复响应中:

  • 约 87% 的响应会渲染出可见的广告卡片

  • 约 13% 的响应虽然投放了广告,但用户从未看到过

大多数情况下,单个广告被投放后约有 87% 的概率会在屏幕上显示,剩下的 13% 则意味着用户根本没有看到它。这约 13% 的差距,是评估 ChatGPT 广告真实效果时最重要的修正项:大约每 8 个被成功投放的广告中,就有 1 个从未触达用户的眼睛。

发现 2:界面本质上是单广告位的,但并非绝对

ChatGPT 的广告版面被设计为单一广告位,数据也证实了这一点:只有约 4.2% 的广告响应会同时服务于多个不同的广告商。大约每 4000 个响应中才会出现一次包含 3 个广告商的情况,而包含 4 个广告商的情形则极为罕见(我们在整整一周的流量监控中仅捕获到 4 次)。

“最多展示一个”虽然符合直觉,但不够严谨。在返回了两个广告商的响应中:

广告卡片渲染情况 在双广告商响应中的占比
渲染 1 张卡片 82.9%
渲染 0 张卡片 12.7%
渲染 2 张卡片 4.4%

因此,前端界面通常显示一个广告,偶尔不显示,极少数情况下会同时渲染两个。如果直接将 result.ads[] 数组中的广告数量等同于曝光次数,不仅会因为“已投放未显示”而高估,还会在极少数“同时渲染两张卡片”的情况下造成低估。

发现 3:同一条广告,可能会被多次计数

这也是简单粗暴的广告计数逻辑极易出错的地方。ChatGPT 会在响应流中多次重复发送同一个广告,每次重播都会赋予一个新的事件标识 ads_response_index。因此,一个只展示了单张广告卡片的回复,其底层可能包含三个完全相同的 type: "ads" 事件,其索引分别为 0、1 和 2。

根据数据,有 5.1% 的广告响应会以这种方式重复发送同一个广告商的信息。如果你仅根据 ads_response_index 进行去重或计数,就会保留所有 3 个副本,从而将用户仅看到一次广告的事实,错误地报告为看了三次。

这是一个常见的解析陷阱。如果不做内容去重,解析器就会将同一个广告位里的重复重播误判为多次不同的广告投放。正确的做法是:基于广告商和素材内容(品牌及其卡片信息)进行去重,并将 ads_response_index 的递增视为重播计数器,而非新广告的标识符。同一个广告播放多次,它依然只是那同一个广告。

发现 4:数据流中几乎不存在 hidden 状态的隐藏广告

每一个被投放的广告都带有 visibility.status 字段。直觉上,人们可能会认为 hidden(被 OpenAI 完整性检查过滤掉的广告)可以解释“已投放但未显示”的数量差距。但事实并非如此。

在 Cloro 连续 60 天监控的 8,590 个包含广告的响应中,没有出现过任何一个被标记为 hidden 的广告事件。我们观测到的每一个被投放的广告,其状态均为 allowed

这是一个关键的否定性结论。“已投放”与“已显示”之间的差距,并非因为 OpenAI 在有效载荷中将广告标记为了不合格 —— 因为这类广告根本不会被推进数据流中。这一差距完全取决于广告被标记为 allowed 之后前端界面所做出的渲染决策。因此,不要试图通过 visibility.status 来推算真实的曝光量。

发现 5:被展示的广告,正是 ChatGPT 在回答中提到的那个

现在来看一个非常有趣的现象:当 ChatGPT 的有效载荷中同时包含两个不同的广告商,但前端最终只打算展示其中一个时,它是如何做出选择的?

我们测试了有效载荷中的各个字段 —— 广告格式(image_card_v2 与 product_card_v2)、卡片数量、图片是否存在、visibility 状态以及 adsResponseIndex 等;结果发现,预测性最强的信号根本不在广告有效载荷本身,而在于 ChatGPT 生成的文本回答之中

  • 如果某个广告商的品牌名称出现在了 ChatGPT 生成的回答文本中,该广告被最终渲染展示的概率高达 61%;而未在文本中被提到的品牌,其展示概率仅为 4%。 前端界面会优先渲染大模型在正文中实际提及的那个品牌。

已投放的广告 是否在生成答案中被提及
最终成功渲染的广告 61%
最终被丢弃未展示的广告 4%

这可以简化为一条包含两部分的判定规则:

1. 当回答文本恰好提到了两个广告商中的某一个时(占双广告商响应的 60%),被提到的那个广告有 96% 的概率会被渲染展示(45 次测试中成功了 43 次)。

2. 当两个广告商均未在回答文本中被提到时(占 39%),前端界面会退而求其次,按照投放顺序渲染:后被投放的广告(即具有较高 adsResponseIndex 的广告)有 86% 的概率会被渲染。

而那些打破了简单排序规则的例外情况,恰恰揭示了背后的真相:在约 10% 的响应中,先被投放的广告最终反败为胜,且这些广告无一例外都与回答上下文高度相关。例如:在搜索“西雅图的星巴克”时,Expedia 的广告压制了一个跑鞋品牌;在搜索“最佳销售拓展工具”时,Gong.io 的广告压制了一个潜在客户开发工具。

这表明,广告的选择过程是基于广告素材与生成的答案之间的上下文语义匹配,而非固定的位置排序。adsResponseIndex 之所以能达到 90% 左右的预测准确率,仅仅是因为 OpenAI 的后端倾向于把与答案更相关的广告放在后面投放 —— 它只是一个代理指标,而非根本机制。渲染后的 DOM 才是检验真相的唯一标准。

这对 ChatGPT 中的广告效果衡量意味着什么

广告效果测量的三条黄金法则;对于任何在 ChatGPT 生态中追踪广告效果的人来说,以下是三条切实的建议:

1. 不能简单用 ads[].length 来代表曝光量。 约 87% 的广告响应会展示广告卡片;直接统计已投放的广告列表,会高估用户实际看到的广告数量约 13%。请务必测量实际渲染的卡片,而非仅仅统计数据包里的广告列表。

2. 去重必须基于广告商数据,而非索引标识。 5.1% 的响应存在重复投放现象。如果把 ads_response_index 当成唯一标识,就会严重夸大计数。无论重播多少次,一个广告位只对应一个广告商和一套素材。

3. 最终展示的广告,是文本回答中提到的那个。 在占比约 4% 的双广告商回复中,只要回答中提到了某个品牌,该品牌对应的广告就有 96% 的概率会被渲染展示。广告格式、卡片数量等均无影响;广告投放顺序(adsResponseIndex)也仅仅是底层语义匹配结果的一种体现。

为什么这对广告商至关重要

对广告主而言,这直接关系到预算与投入产出比。result.ads[] 代表的是赢得了广告竞价的品牌,而只有成功渲染的卡片才代表真正被用户看到的品牌。当两个广告主共享一个广告位时,约 90% 的情况下,先被投放的那个广告会被前端直接丢弃。如果你的曝光量统计止步于竞价成功的数据包,就会严重高估那些从未在屏幕上展现过的广告曝光。

Cloro 在对 ChatGPT 广告效果进行监测时,全面融入了这三项校正机制:首先,基于广告商和广告素材对数据进行去重;其次,保留每条广告自身的 visibility 和 adsResponseIndex 原始标记;最后,通过读取 DOM 注入 rendered 标记,明确指示前端界面实际绘制了哪一条广告。只有这样,才能将“投放了多少”准确转化为“看了多少” —— 这才是广告曝光衡量的核心指标。

如何在 ChatGPT 中赢得广告位

如果最终展示的广告是 ChatGPT 在回答中提到的那个,那么广告主的营销策略就非常明确了:成为 ChatGPT 在回答特定搜索词时主动引用的品牌。

两个广告主可能会赢得同一个搜索词的竞价,但只有被大模型文本提到的那个广告才会被真正渲染出来。因此,在 ChatGPT 中,广告的最终转化不仅取决于竞价出价,更取决于品牌在模型心中的“权威度与曝光度”。

对于广告主来说,有三件事至关重要:

  • 成为值得被搜索查询引用的品牌。 那些最终能在回答中被提到并成功展示广告的品牌,都是模型已经认定为优质答案的选项 —— 这些品牌在其领域内拥有真正的权威性,并且在公网上提供了能被 AI 搜索引擎轻松抓取和引用的结构化、高质量内容。如果 ChatGPT 在正文中从不主动推荐你,那么单靠购买广告位,在竞争中就只能任由排序机制摆布。

  • 将产品与用户意图相匹配,而非仅仅匹配关键词。 例如,如果用户的搜索词是“最佳乡村运营商”,此时展示一个充电器品牌的广告,其效果远不如回答正文中实际提及的任何相关品牌广告。系统是根据生成答案的上下文来判断相关性的,而答案的语义范围往往比原始搜索词更具体、更狭窄。

  • 衡量真实曝光量,而非仅看投放数据。 追踪用户侧真实的 rendered(已渲染)次数,而非仅仅看 result.ads[] 中的停留数据;同时观察你的品牌名称是否频繁出现在广告卡片旁边的回复正文中。这种“正文提及 + 赞助卡片”的重叠,正是 ChatGPT 广告被用户高效接收的早期征兆。

这些关键信息都不会直接显示在普通的广告投放报告中。只有将广告有效载荷与生成回复的内容关联起来,才能还原真实图景;这正是评估 ChatGPT 广告效果时,必须从渲染后的回复内容(而不是广告投放列表)入手的根本原因。

深入了解飞马:世界上最臭名昭著的间谍软件系统的演变

Logo

AtomGit AI 社区提供模型库、数据集、Agent、Token等资源

更多推荐