こんにちは、石原です。
私の所属しているエクスチュア株式会社では、パートナー様への日頃よりの感謝を込めてイヤーエンドパーティーの方開催させていただきました。
そのイベント内で実施する企画の一つとして今回ご紹介する「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システムを作成したことで、モデルのバージョンがずれていることに気付かずにチェックを通してしまったというわけでした。
皆さんもモデルの設定とレート制限、テストにはお気を付けください。。。
完
エクスチュアはマーケティングテクノロジーを実践的に利用することで企業のマーケティング活動を支援しています。
ツールの活用にお困りの方はお気軽にお問い合わせください。