Generative AI

AIを使ったマーケティングゲームを作ってみた

こんにちは、石原です。

私の所属しているエクスチュア株式会社では、パートナー様への日頃よりの感謝を込めてイヤーエンドパーティーの方開催させていただきました。

そのイベント内で実施する企画の一つとして今回ご紹介する「AIマーケティングゲーム」を実施予定でしたが、事前のテスト不足と皆様の積極的なアクセスによりOpenAIのAPIのレート上限になってしまいエラー祭りとなってしまいました。。。

ご参加していただいた皆様には不甲斐ない所をお見せしてしまいました。また、作成したアプリを楽しんでいただけなかったこと非常に残念でした。。。

今回のブログではアプリの供養とテスト不足の反省のため、アプリの内容のご紹介と原因調査の方行いたいと思います。

企画デザイン

今回の企画のテーマとして「AI」を何かに使えないかということで、弊社での取り組んでいる「マーケティング×データ分析」と絡めたアプリを作成することとなりました。アプリ作成にはStreamlitとLangChain、OpenAIを使用しています。

前述の通り弊社イヤーエンドパーティーにはパートナーの皆様にご参加いただいており、ネットワーキングの要素も取り入れればということでランダムなチームに分かれていただくことにしました。

アプリの概要

今回のアプリでは「マーケティング」と「データ分析」の大きく2つのポイントでAIを活用しています。

マーケティング

AIを使った顧客ペルソナの作成を実施しています。

もともとChatGPTなどはプロンプト作成の手法として役割を与えるという手法が存在していました。

例えば旅行の内容について相談する場合に「あなたは優秀な旅行ガイドです。観光名所を詳しく教えてください。文化的なスポットと自然の景観、どちらも含めておすすめを教えてください。」などと与えることで結果の品質が良くなることが知られています。これは生成AIの内部で旅行ガイドが関連するような内容を確率的に出力しやすくなることを利用しています。

今回は以下の様なプロンプトを与えることで設定の与えられたお客様として動くように動作しています。

あなたは顧客です。広告やメールなどから商品を買うかどうかを決めることができます。
あなたの属性は以下の通りです。
年齢: {age}
性別: {sex}
職業: {job}
あなたの希望: {local_accident}
よく使うデバイス:{device}
登録日:{register_date}
サイトアクセス回数:{access_times}
最終購入日:{last_purchase_date}
これまでの購入金額:{total_purchase_amount}
これまでの購入回数:{total_purchase_times}
平均購入金額:{average_purchase_amount}
好きなカテゴリ:{favorite_category}
最終購入商品:{last_purchase_product}
返品率:{return_rate}
最終購入からの経過日数:{days_since_last_purchase}
リピート購入フラグ:{repeat_purchase_flag}
平均セッション時間:{average_session_time}
カート放棄回数:{cart_abandonment_times}
クーポン使用率:{coupon_usage_rate}
プロモーション反応率:{promotion_reaction_rate}
現在の季節:冬
日付:2024/12/17


あなたには自由な意思決定ができます。
気分屋な振る舞いをすることもできますし、お得な商品を見つけてつい買ってしまうことも、理由をつけて購入を拒否することもできます。
どのような意思決定をするか決めてください。
口調は年齢や性別、職業に合わせて自由に変えてください。

上記で作成したAIカスタマーに対してイベントを入力して、イベントを採点してもらうという仕組みになっていました。カスタマーのモデルにはgpt-4o-miniを使用しています。

裏話

AIカスタマーは一人一人それぞれ別でチャットを投げるのでレート制限に引っかかりやすいなというのは事前に考えていました。(今回の例では10人)

そこで、チームごとに1名のみ入力可能という制限を設けてレート制限を超えないようにしていました。

データ分析

データ分析に関しては以前より調査を実施していたAIエージェントを使用しています。

AIエージェントはチャットのための生成AIとは異なり、チャットの入力と出力までの間にツールの処理を挟むものになってます。イメージとしては検索ツールを渡しておけば、AIが実際に内容を調べてから応答してくれるようなものになってます。

例えば生成AIに天気について質問してみます。

「今日の大阪の天気は?」

すると、生成AI自体には今日の天気を知るすべがないので回答できなくなったり嘘をついたりという結果になります。(最近のGeminiやChatGPTではデフォルトで検索ツールを使用する機能がついているので実は問題なく回答できたりもします。)

そこで「大阪 今日 天気」などのGoogle検索の結果などを裏側で合わせてから回答を生成することで正しい結果を出力することができます。

今回のアプリではLangChainで事前に定義されている関数を使用しています。

この関数ではpandasのDataframeに対するpythonコードを作成しています。

from langchain_experimental.agents import create_pandas_dataframe_agent
from langchain_openai import OpenAI
import pandas as pd
from customer import customers

df = pd.DataFrame(customers)

agent = create_pandas_dataframe_agent(OpenAI(), df, allow_dangerous_code=True)

text = "平均年齢は?"

print(agent.invoke(text)['output'])

今回はAI秘書と名付けてデータベースへのアクセスを代替するような仕組みとして使っていました。

アプリの構成図

アプリの構成図としてはAI秘書を介してデータベースのデータを分析し、分析内容を元にAIカスタマーへ施策を実施し、評価を受けるという流れになっています。

実際に動かしてみる

AI秘書で年齢層を質問してみます。

ちなみに実際の年齢の分布は以下の通りでした。

20,24,26,33,35,37,44,64,66,66

結果としてはちぐはぐな回答が返ってくることも多いです。

属性について質問してみると正しく応答してくれています。

それでは施策の画面でクーポンを共有してみましょう!

厳しい評価でした。

今回レート制限はありつつも何とか入力していただいた結果の内、最高点だったものをご紹介します。

**「冬の機能性特化! パーソナルスタイリングキャンペーン」**

1. **パーソナライズ機能の強化**
- 顧客の好みや用途に応じて3つのコース選択が可能
  - 機能性重視コース
  - デザイン重視コース
  - バランス重視コース
- 各コースで最適な商品の組み合わせを提案

2. **インセンティブ設計**
- 基本のセット割引:25%オフ
- 追加特典:
  - 先着100名は追加で5%オフ
  - 2週間以内の購入で送料無料
  - メンバー登録で次回使える3,000円クーポン進呈

3. **商品体験の強化**
- 商品の機能性を実感できる14日間の返品保証
- 着用イメージ動画の提供
- サイズ交換無料サービス
- コーディネートのバーチャル試着機能

4. **限定特典**
- セット購入者限定の先行予約権付与
- 次シーズンの新商品情報の優先案内
- スタイリストによるパーソナルアドバイス(LINE相談可)

5. **商品構成の最適化**
- 機能性重視の冬物アウター
- 用途別シューズ(ビジネス/カジュアル)
- トレンド性の高いバッグ
- コーディネートの幅を広げるボトムス

このような施策により:
- 顧客の具体的なニーズに応える
- 購入の不安要素を解消
- 商品の価値をより明確に伝える
- 購入のハードルを下げる

が実現でき、より高い評価が期待できます。

いかがでしょうか?​​​​​​​​​​​​​​​​

結果の方はこちらです。

合計ポイントは83ポイントです!

ご参加いただきありがとうございます!

レートエラーの原因

実際にイベントで発生したエラーが下記の通りです。

ご覧になるとわかる通り、1分当たりのトークン上限(TPM)に引っかかってしまっております。

openai.RateLimitError: Error code: 429 - {'error': {'message': 'Rate limit reached for gpt-3.5-turbo-instruct in organization org-xxxxxxxxxxx on tokens per min (TPM): Limit 90000, Used 89043, Requested 1498. Please try again in 360ms. Visit https://platform.openai.com/account/rate-limits to learn more.', 'type': 'tokens', 'param': None, 'code': 'rate_limit_exceeded'}}

実は今回のイベントに向けてレート制限を全く気にしていなかったわけではなく、事前チェックとしてTPMの値を確認しておりました。

今回AIカスタマーで使用したgpt-4o-miniはというと10,000,000TPMが上限になっていますね。

最大の入力トークンは128,000なので参加者100人とすると1,280,000TPMです。(入力がかなり長文になるのであり得ない数字ではありますが)

あれ、上限超えてないですね。

エラー文を再度見てみるとモデル名が記載されており、gpt-3.5-turbo-instructに設定されていました。そのレート制限は確かにエラー文に記載の値と一致していますね。

ただ、このモデルを指定した覚えがなく、LangChainのドキュメントを確認していると下記の内容が見つかりました。

model_name: str = Field(default="gpt-3.5-turbo-instruct", alias="model")

勘の鋭い読者の皆様ならお気づきかもしれませんが、今回のレート上限に達してしまった原因はAI秘書のコードでOpenAI()のモデル呼び出し時にモデル名を指定していなかったことで、デフォルト値が使用されていたことです。。。

二つのAIシステムを作成したことで、モデルのバージョンがずれていることに気付かずにチェックを通してしまったというわけでした。

皆さんもモデルの設定とレート制限、テストにはお気を付けください。。。

エクスチュアはマーケティングテクノロジーを実践的に利用することで企業のマーケティング活動を支援しています。
ツールの活用にお困りの方はお気軽にお問い合わせください。

ピックアップ記事

  1. 最速で理解したい人のためのIT用語集

関連記事

  1. Python

    わかりやすいPyTorch入門④(CNN:畳み込みニューラルネットワーク)

    MNISTの手書き数字画像をCNNで分類前回の記事でも利用したMNI…

  2. ChatGPT

    LangChainって何?: 次世代AIアプリケーション構築 その2

    こんにちは、エクスチュアの石原です。こちらは第2回の記事にな…

  3. ChatGPT

    生成AIって何?今までのAIと何が違う?

    はじめにAIの世界は年々目覚しい発展を遂げています。最近では…

  4. Python

    その分析、やり方あってる?記述統計と推測統計の違い

    こんにちは、小郷です。閲覧数のために挑発的なタイトルでイキりました(…

  5. Python

    Streamlit in SnowflakeによるStreamlitアプリケーション作成

    こんにちは、エクスチュアの石原です。前回に引き続き、Pyth…

  6. Python

    わかりやすいPyTorch入門②(ニューラルネットワークによる分類)

    ニューラルネットワークを使ってワインの種類を分類する今回はsciki…

最近の記事

  1. AIを使ったマーケティングゲームを作ってみた
  2. Snowflakeや最新データ基盤が広義のマーケティングにも…
  3. 回帰分析はかく語りき Part3 ロジスティック回帰
  4. GCSへのSnowflake Open Catalogによる…
  5. VPC Service Controlsで「NO_MATCH…
  1. Google Apps Script(GAS)

    GoogleスプレッドシートのデータをGASで整理する【getRange編】
  2. Python

    わかりやすいPyTorch入門①(学習と評価)
  3. IT用語集

    仮想マシン(VM)って何?
  4. Databricks

    Databricks: Spark DataFrameでユーザー定義関数を使う
  5. Adobe Analytics

    Adobe Analytics 3つの主要指標
PAGE TOP