概要
作为 DSP 角色,当接受到由广告交易平台(ADX)发送来的竞价请求时,通常会根据一些业务需求、广告主要求、用户特征等,对请求进行过滤,从而决策竞价与否。如果决定参与竞价,则会对请求特征连同自己的广告数据库、用户数据库等进行一系列的计算匹配,同时根据广告(Ads)、竞选(Campaign)、广告位(Placement)等的时长、已展示量等特征计算出竞价。以此逐步筛选,最终选出最优的广告以及竞选价格返回给广告交易平台。整个流程根据业界标准,SLA 通常需要在 200ms 内完成,同时考虑到网络通信的损耗,真正数据在 DSP 内部的用时不能超过 100ms。因为极高的 SLA 要求,所以对系统布局和算法提出了挑战。
具体流程
1. 接收竞价请求(Bid Request)
我们以 OpenRTB v2.4 的竞价请求为例,如下图。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
{ "id": "DxU0032U8a", "at": 2, "allimps": 0, "imp": [ { "id": "1", "banner": { "w": 320, "h": 50, "format": [ { "w": 320, "h": 50 } ], "btype": [ 1, 3 ], "battr": [ 1, 3, 5, 6, 8, 9, 10, 11 ], "pos": 3, "mimes": [ "image/jpeg", "image/png", "image/gif" ], "api": [] }, "ext": { "strictbannersize": 0 }, "instl": 0, "displaymanager": "SOMA", "tagid": "101000415", "secure": 0 } ], "device": { "geo": { "lat": 53.550003, "lon": 10, "ipservice": 3, "country": "DEU", "region": "04", "zip": "20099", "metro": "0", "city": "Hamburg", "type": 2 }, "make": "Apple", "model": "iPhone", "os": "iOS", "osv": "4.3.2", "ua": "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5", "ip": "95.90.255.47", "js": 0, "connectiontype": 0, "ifa": "e4273e31-97a9-4b29-93a8-8a99f0cea068", "devicetype": 1 }, "app": { "id": "101000415", "name": "OpenRTB_2_4_UATest_openRtb_2_4_iOS_XXLARGE_320x50_IAB1", "domain": "example.com", "cat": [ "IAB1" ], "storeurl": "http://example.com", "keywords": "", "publisher": { "id": "1001028764", "name": "OpenRTB_2_4_UATest_openRtb_2_4_iOS_XXLARGE_320x50_IAB1" } }, "user": { "keywords": "" }, "bcat": [ "IAB17-18", "IAB7-42", "IAB23", "IAB7-28", "IAB26", "IAB25", "IAB9-9", "IAB24" ], "badv": [], "ext": { "udi": { }, "operaminibrowser": 0, "carriername": "unknown - probably WLAN" }, "regs": { "coppa": 0 } } |
这个竞价请求来自于一个 iOS App,当我们深入这个请求结构可以发现,这是一个横幅广告(Banner Ad),宽度 320px,高度 50px,来自一台 iOS 设备,操作系统是 4.3.2,地理坐标为经度 53.550003,纬度 10,邮政编码是20099,城市为Hamburg,用户的 IP 地址,以及这个 App 的信息例如名字、编号、域名、App Store 的地址、发行商等,同时竞价请求也包含了这个广告需要满足的类别,比如年龄的要求等。
2. 过滤(Filter)竞价请求
再接收到竞价请求后,DSP 是否参与这次竞价一般会基于几个方面的考虑:
1) 该请求是否在黑名单内?
当作弊检测(Fraud Detection)发现,该请求属于有害请求或者无效请求,则需要选择性的过滤掉该竞价请求。作弊检测通常基于 IP 地址、用户设备 ID、地理位置以及 App 本身属性等特征进行判断。
2) 是否参与该 ADX 的竞价?
此选项往往基于业务的考虑,例如某些 ADX 平台的流量质量不佳或者利润抽成过高,都可能导致不参与竞价。
3) 服务器集群是否过载?
当遇到例如双 11或者感恩节时候,广告的竞价请求往往会出现持续的洪峰,如果不进行限流可能引起集群服务雪崩,从而影响正常业务。
过滤竞价请求能够防止类似于机器人点击等作弊性质的刷量行为,有效保护了广告主的利益。同时遇到流量洪峰时,起到削峰整流的作用,保护正常业务的运转。
3. 预处理
首先声明,并不是所有 DSP 都必须做预处理。或者说,预处理的内容完全取决于每家 DSP 的自身需求。在预处理阶段,DSP 可以对请求 App 或者网页的内容进行预爬取,然后提取一些 NLP 特征处理,或者有预先缓存好的网页特征,则可以直接提取插入到请求特征中。或者某些 DSP 拥有较大的用户数据库,则会对请求用户提取出预先计算好的用户特征段(Segments)出来以便后续计算。预处理主要目的是为了更好地定位受众(Audience Targeting)。
4. 筛选广告
程序化购买的优势之一就在于精准投放。而体现了这一优势的地方就在于如何筛选广告。最基本的可以直接根据用户浏览的网页内容进行广告推荐,例如用户浏览汽车网站,则可以推荐汽车的品牌广告。如果做得精度更高,则可以对用户进行画像(Demographic),对用户一系列的历史行为进行分析,例如最近一段时间去过哪些地方、购买过什么商品、浏览了什么网页,对用户的行为、喜好有清晰的刻画。
以精准投放为目的,训练出一系列的算法模型,对于每个用户,可以在众多的广告库中筛选出用户最有可能感兴趣的一个,从而达到将广告推荐给有效用户的目的,进而提高点击率(CTR)和转化率(ROI)。无论是最基本的图片广告,还是最新的动态创意优化(DCP),都是以此为基础发展的。
5. 定价
实时竞价通常采用次价密封投标拍卖(Second-price sealed-bid auction),所以如何既能中标又能以最低价格中标,成为定价阶段的主要目标,这些主要以博弈论为理论基础,我们就在此不赘述。除此之外,如何在竞选时间内平稳均匀地将广告展示(Impression)出去,而不是在竞选初期消耗掉大量展示量造成后期展示量不足,也是定价的次要目标,而业界通常以 Pacing 算法为原型,拓展出其他预算模型控制出价。
6. 返回竞价回复
在筛选出最佳广告,需要把广告素材、追踪代码(Tracking Code)等渲染成网页代码,然后把网页代码、定价等等按照格式生成竞价回复,送返给 ADX。
我们以 OpenRTB v2.4 的竞价回复为例,如下图。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
{ "seatbid":[{ "bid":[{ "nurl":"http:\/\/reports.ubimo.com\/fb?b=JdZQFdbCARgKMURHWGhvUVl0bSMBJeAhAA&c=MTo6&wp=${AUCTION_PRICE}", "crid":"12459", "adomain":["academy.com"], "price":2.93, "id":"1DGXhoQYtm", "adm": "<ad xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"smaato_ad_v0.9.xsd\" modelVersion=\"0.9\"> <imageAd> <clickUrl>http:\/\/reports.ubimo.com\/fb?b=JdZQFdbCARgKMURHWGhvUVl0bSMBJeAhAA&amp;c=Mzo6&amp;t=https%3A%2F%2Fad.doubleclick.net%2Fddm%2Fclk%2F292804678%3B119963336%3Bw%3Fhttp%3A%2F%2Fwww.academy.com%2Fwebapp%2Fwcs%2Fstores%2Fservlet%2FContainer_10151_10051_-1_%3Fname%3DOfficial_Rules%26uv%3Dvanity%3Aofficialrules <\/clickUrl> <imgUrl>http:\/\/static.ubimo.com\/io\/603\/ecd01dce <\/imgUrl> <height>50<\/height> <width>320<\/width> <beacons> <beacon>http:\/\/reports.ubimo.com\/fb?b=JdZQFdbCARgKMURHWGhvUVl0bSMBJeAhAA&amp;c=Mjo6<\/beacon> <beacon>https:\/\/ad.doubleclick.net\/ddm\/ad\/N5865.276855.MOBILEFUSE\/B8852634.119963336;sz=1x1;ord=1436319256367<\/beacon> <\/beacons> <\/imageAd> <\/ad>", "impid":"1", "cid":5163 }] }], "id":"1DGXhoQYtm" } |
用请求数据流串联上上述所有的步骤,便如下图所示