メルカリAdsにおけるAIを活用した広告審査の取り組み

目次

  • はじめに
  • 背景
  • 広告審査における課題
  • AI審査の概要とシステム構成概要
  • プロンプトの検証
  • まとめ

はじめに

こんにちは。メルカリAdsのバックエンドエンジニア、chapaと申します。

今回は、メルカリAdsがOpenAIを活用して実現した広告審査プロセスについて解説します。
本記事を通じて、AI活用による課題解決について具体的にお伝えできればと思います。

背景

メルカリAdsでは多くの広告主様にご利用いただいており、さまざまな広告素材が日々入稿されています。その中には、残念ながら不適切な表現を含むものもあり、それらがメルカリのお客さまの目に触れることは、お客さま体験を損ねるリスクとなります。

これまではサンプリングした広告素材を人の目で確認していましたが、広告主様の増加に伴い、手動での対応に限界が見えてきました。そこで、審査の自動化に取り組む必要性が生じました。

広告審査における課題

広告事業をおこなうにあたって、入稿されている広告素材全てに対して審査を行う必要があります。
ただ入稿される広告素材は非常に多く、手動審査での対応では難しい状況です。
そのため、自動判定を取り入れることで基準を満たすかを効率的にチェックして、手動審査するべき数を減らし、運用の効率化を進めています。その手法の一つがAI審査です。

AI審査の概要とシステム構成概要

AI審査では、以下の機能を実現しています。

  • 広告画像やタイトルテキストなどに、不適切な表現が含まれていないかをチェック
  • 禁止表現が検出された場合は、広告配信を即座に停止

システム構成については以下のようになっています。

広告主様が更新するすべての広告をリアルタイムでOpenAIへ送信するとコストが非常に大きいため、以下の工夫を採用しました。

  • リアルタイムチェックは行わず定期的にBatchAPIを用いてOpenAIへ送信
  • ライトなモデル(gpt-4o-mini)を利用することでOpenAIへのコストを削減
  • OpenAIのオプション設定も以下を採用
    • 結果のブレをなくすため、Temperature0.01に設定
    • 結果はJSON形式にするため ResponseFormatjson_object に設定

プロンプトの検証

審査を実施するためのプロンプトを作成し、さまざまなパターンを用意して検証しました。
Playgroundでプロンプトと質問を送信した際には、期待通りに結果が返ってきましたが、BatchAPIを使用した際にいくつかの課題がありました。
システム的な課題と要件的な課題をいくつかサンプルとともにご紹介します。

① 期待しているJSON形式で返却されない

返却値はOpenAIのオプション設定にてJSON形式と定義し、プロンプトに例を記載しました。しかし、以下のようなケースが見られました。

  • JSON形式として正しいものの、期待している統一フォーマットではない場合がある
  • JSON形式そのものが正しくない場合がある

期待される返却値の一例:

// 期待される返却値の一例:
{
  "id": "test-id-00001",
  "result": <審査結果値>,
  "reasons": [{"type": 1, "value": "審査理由詳細・・・"}] // 審査理由があれば配列で設定される
}

// 実際の返却値の例:
{
  "id": "test-id-00001",
  "result": <審査結果値>,
  "reasons": [""] // 不正な形式(配列が空欄の際にダブルクォートのみが入っている)
}

このケースの場合はプロンプトに出力形式を厳守するようプロンプトに記載し解決しました。
これによりほぼ不正な形式で返却されることは解消されました。

// 省略

## 出力形式
**必ず以下の出力フォーマットを厳守**
{
  "id": <id>, 
  "result": <int>,
  "reasons": [{type: <int>, value: <string>}]
}

② 期待しているID値が返却されない

質問で送信したIDをキーとして返却されることを期待していましたが、以下のようなケースが見られました。

// 送信値の例:
{
  "id": "test-id-00001",
  "text": "test-text"
}

// 期待される返却値の一例:
{
  "id": "test-id-00001"
  "result": "<審査結果値>",
  "reason": []
}

// 実際の返却値の例:
{
  "id": "test-id-00",
  "result": "<審査結果値>",
  "reason": []
}

このケースはBatchAPIへリクエストを送信する際にユニークなID(custom_id)を設定することができるので、返却後もそのIDを正として利用することで解決しています。

参照: https://platform.openai.com/docs/api-reference/batch/request-input


③ 性的な表現と下着広告の判別

広告素材の中には性的表現を含む画像と下着広告が混在しています。これにより、下着広告が誤って性的表現と判定される問題がありました。

入稿されたデータから無作為にデータを取得して、期待値を設定し正答率を取りながらプロンプトの改善を行いました。

  1. 初期プロンプト
    • 正答率: 70.76%
    • 「性的表現」と「下着広告」を区別する定義が曖昧
  2. 改善プロンプト
    • 改善後の正答率は77.33%に向上しました。これは下着広告に関するプロンプトの条件追加が要因と考えられます。
    • しかし、「性的表現」と「下着広告」の詳細定義が曖昧なままでした。
  3. 最終プロンプト
    • 「性的表現」と「下着広告」の詳細に定義することで不明瞭な基準に基づく誤判定が大幅に減少し、正答率が13.37ポイント向上し90.67%となりました。
      • 例としては、以下のような記載を追加しました。
        性的表現: 過度に性的な印象を与える画像の構図・演出等を明確定義
        下着広告: 通常の下着製品画像は適切なファッション広告として区別

こうしたプロンプトの改善にもAIを活用しており、OpenAIにプロンプト、質問内容、返却された結果を伝えて、改善提案してもらい結果の正答率を上げることができました。
プロンプトの書き方の改善が最も大事だと改めて認識しました。
とうとう有識者とではなくとも、AIと壁打ちできるようになってしまったと感じました。

まとめ

この記事では、メルカリAdsにおけるOpenAIを活用した取り組みを紹介しました。
特別な工夫を施さなくても、基本的なAI活用によって大量のデータを効率的に処理できる可能性をお伝えすることができたと思います。

今後も引き続き改善を行い、より安心で安全なお客さま体験を提供できるよう努めていきたいと考えています。

  • X
  • Facebook
  • linkedin
  • このエントリーをはてなブックマークに追加