DALL·E 3(画像生成モデル)と GPT をつかった個人開発ためのヒント
はじめに
11月、OpenAIのイベントにて新しい画像生成モデル(DALL·E 3)がAPI経由で利用可能になったことが発表されました。DALL·E 3では、以前のモデルに比べてはるかに高いクオリティの画像生成ができます。
「砂漠のオアシスみたいな寿司」の出力結果を左から:DALL·E 2、DALL·E 3
そこで、さっそくDALL·E 3を使った個人開発を行い、AIお寿司生成アプリ Sushify(iOS)を先月リリースしました。(遊んでいただけたらうれしいです🍣)
🔗 AIお寿司生成アプリ Sushify(iOS)
DALL·E 3 とGPT を使った個人開発[1]中に、気づいたことや考慮したことがいくつかあります。そこで、これからOpenAI APIを個人開発でつかってみたい方に向けに、企画・開発・運用のためのヒントとしてまとめてみました。
企画(アイディアの検証)のヒント
DALL·E 3の生成結果とプロンプトの検証
少しでも良さそうなアイディアが浮かんだら、ChatGPT Plus(月額20ドルのChatGPTの有料サービス)で検証を行うのがおすすめです。「〜の画像」「〜を描いて」などのプロンプトで描画が始まります。ChatGPT Plus以外で、無料で DALL·E 3 を試したい方は、Microsoft Bing の Image Creator で画像生成が可能です。
DALL·E 3のプロンプトの調整
サービスのコンセプトや機能にもよりますが、生成される画像に統一感を出したい場合、プロンプトには具体的な数・色・モチーフの情報を端的に入れることがポイントでした。
例えば、「犬が寿司ネタのお寿司」画像を生成したい場合に、
# プロンプトA
寿司ネタが「犬」のお寿司の画像
とするよりも
# プロンプトB
寿司ネタが「犬」のお寿司二貫がお皿の上に載っている画像
※ 背景は白色
のように、より具体的に指定することが重要でした。
左から:プロンプトAの、プロンプトBの生成例(Aの方が雑多に見える)
AIお寿司生成アプリ Sushify では、他ユーザーによって生成される画像のギャラリー機能があります。一覧化された寿司画像には統一感を出したかったので、プロンプトは後者のようにしています。
開発のヒント
Sushifyアプリのシステム構成は下記のようになっています。
よりくわしいシステム構成
技術選定の基準は、自分が慣れていることを重視しました。クソアプリアドベントカレンダー2023のために、早くつくるのが目的立ったためです。
❶ Appからのリクエスト
- Cloud Endpoints
- Cloud Run
アプリからのリクエスト時にAPI Key を設定したかったので、Cloud Endpoints を利用しています。
❷ OpenAIで画像とテキストの生成
- OpenAI API
Cloud RunからOpenAI APIにリクエストを行います。
今回はこちらについての具体的な実装について触れていきます。
❸ 生成した画像とテキストの保存
- Firestore
- Cloud Storage
生成結果をFirebase に保存しています。
❹ 保存したデータの取得
- Firebase SDK
アプリから保存されている寿司データを取得します。
画像データの保存の検討
後述するパラメータの仕様については、公式の API reference を参照ください。
生成した画像データはresponse_format
パラメータにurl
かb64_json
を指定し、
- 画像URL
- base64エンコードされた画像データ
のいずれかとして受け取れます。
画像URLを受け取る場合、その有効期限は1時間ですので、個人開発のサービス内で生成画像を長期間保存したりアクセス可能にする場合は、データをストレージなどへ保存する必要があります。
画像データのサイズと品質(と料金)の選択
画像データのサイズは品質をそれぞれsize
、quality
パラメータに指定できます。
sizeには、
-
dall-e-2
:256x256
、512x512
、1024x1024
のいずれか -
dall-e-3
:1024x1024
、1792x1024
、1024x1792
のいずれか
qualityには、
-
dall-e-3
のみ:standard
、hd
のいずれか
を指定できます。
DALL·E 3を最も安く利用する組み合わせが、size="1024x1024",quality="standard"
です。より大きいサイズでより高品質の画像を生成するほど、APIの利用料金が高くなります。
実際の利用料金については、公式の Pricing リストを参照ください。
画像データの圧縮の検討
前述の通り、DALL·E 3を用いる場合には最小サイズでも1024x1024
となり、およそ3MBほどのデータサイズになるようです。
AIお寿司生成アプリ Sushify では、ユーザーが生成した画像をストレージに保存しています。高画質は重要な要件ではなく、むしろストレージの使用量の削減と、アップロードとダウンロードの時間を短縮したかったため、画像を圧縮することにしました。
リクエストの並列化とUIの検討
GPTはgpt-3.5-turbo
モデルを使って3秒ほど、DALL·E 3は10秒前後の時間がAPIレスポンスにかかります。Sushify では、テキストと画像生成のためにGPTとDALL·E 3を併用しているので、リクエストを並列に行っています。
しかしそれでもレスポンスには時間がかかるので、ユーザーに待機時間を明記したり、ローディング状態を明示するなど、UI側での工夫が必要になります。
Sushify ではローディングの点滅アニメーションとテキストを入れています
工数の関係で初回リリースでは実装を見送りましたが、画像生成中に他ユーザーの生成した寿司画像を見せるアイディアなども検討しました。
コンテンツフィルタリングの対応
Sushify では、ユーザーが寿司ネタを自由に入力して寿司画像を生成することができます。
OpenAIのAPIにはコンテンツポリシーに基づくフィルター機能があります。しかし 「うんこ」などのキーワードはフィルターで除外されず、「うんこ寿司」の画像が出力されることがありました。そのため、画像として出力が適さないキーワードをブラックリスト化して、サーバー側でエラーを返すように独自に実装をしました。
あとで知りましたが、Azure OpenAI Service では、コンテンツフィルターをカスタマイズできるのでこちらを利用しても良さそうです。
絵文字も注意
OpenAI のモデルは絵文字もキーワードとして解釈できるようなので、絵文字もフィルタリング対象にしたほうが良いです。
NGワードをすり抜けてきた「💩」(寿司画像が生成されてしまった)
モデルの切り替え可能化
Sushifyの開発中、ある時からGPT が文字化けしたレスポンスを返すようになりました。
こちらについては、利用モデルの変更で対応しました。
2023年12月3日時点ですが、モデル別の文字化けは下記のような状態でした。
-
gpt-4-1106-preview
: 文字化けする -
gpt-4-0613
: OK -
gpt-4
: OK -
gpt-3.5-turbo-1106
: 文字化けする -
gpt-3.5-turbo
: OK
同じようなことが本番運用中も起こるかもしれませんので、モデルの切り替えは、アプリならRemoteConfig 利用やサーバー側の変数差し替えなどで、簡単にできるようにするのがおすすめです。
運用のヒント
OpenAI APIのコストの把握
本記事を執筆時点で、Sushify アプリのリリースからおよそ1ヶ月が経ちました。アプリ内には、ささやかなバナー広告を入れていますが大赤字です。(わたしの場合、もともとクソアプリアドベントカレンダー2023に間に合わせるのが目的でしたので、コストは度外視していました。)
下記は、Sushify の12月のOpenAI API 利用料金です。
Sushify による12月のOpenAI API利用料金
アプリをリリースしたのが12月12日ですが、この日に利用料金が跳ね上がっていることが確認できます。DALL·E 3の利用料金は、1回の画像生成ごとに0.040ドル
です。GPTでも同じ回数分リクエストを行なっていますが、料金の差は大きいです。
最終的に、リリースから約1ヶ月間のOpenAI APIの利用料金は48.45ドルになりました。
なお、OpenAI 各モデルの詳しい料金は下記から確認できます。
使われ方の分析と黒字化のための検討
Sushify では、画像生成された回数のうちおよそ46% が、同一ユーザーによる同じ寿司ネタでの画像生成でした。Sushify には生成結果画面にリトライボタンを実装しています。仮説ですが、おそらく 画像を生成したが、出力結果が想像していたイメージと違ったなどの理由で、リトライしているのでは? と考えています。わたし自身が Microsoft Bing の Image Creator などを使った経験からも「いい感じの画像が出るまでつい試したくなる」ことから、画像生成系のサービスでは同一の傾向が出るような気がしています。
また、Sushify アプリの平均エンゲージメント時間は16分と長めです。生成の待機時間と前述のリトライの多用などが理由として挙げられます。
これまで記載した通り、DALL·E 3の利用料金は決して安いとは言えません。今、絶賛赤字中のSushify では今後のアプリ継続のために下記の導入を検討しています。(ただしあくまでUXを損なわない程度にしたい)
- リトライ回数の制限(課金)
- バナーではなく、より単価の高い広告の導入
以上、わたしの個人開発経験で得た、OpenAI APIを使ったサービスの企画・開発・運用のヒントでした。このほかに「こんなことも気にしたほうがいいよ」と言ったことがあれば、教えていただければうれしいです🍣
さいごに
今後の目標
飽き性なのでSushify を長くメンテナンスしていきたいです。また、黒字化についてはノウハウがまだないので、今後強くなりたいです💪😺🍣
(おまけ)開発者厳選!みんながつくったお寿司 🍣
AIお寿司生成アプリ Sushify(iOS) を遊んでいただいたみなさま、ありがとうございます!せっかくなので、つくっていただいたオモシロお寿司をいくつかピックアップさせていただきます!
かっけええええ!!!!ドラゴン寿司
厨二心が疼いてやまない!これこれ!わたしは!こういうお寿司が見たくてアプリをつくったんだ!!と思える逸品です。
名前: ドラゴン寿司
寿司ネタ: ドラゴン
寿司の説明: とろけるような食感と濃厚な味わいが特徴のドラゴン寿司。口の中に広がるエキゾチックな旨みをお楽しみください。
受かってくれ!医師国家試験合格祈願寿司
若干カンペが挟まっているようにも見えるお寿司ですが、ドラえもんの暗記パンに似た「暗記寿司」的なイメージでしょうか。今年の国家試験は2月実施みたいですね!応援しています!
名前: 医師合格祈願寿司
寿司ネタ: 医師国家試験合格祈願寿司
寿司の説明: 医師国家試験に合格するための幸運と成功を祈願した寿司。鮪と車海老を使った贅沢な一品です。
まぐろおじさん
寿司の説明から「おじさん」要素が抹消されているのが怖いです。隠し味なのでしょうか!?
名前: まぐろおじさん
寿司ネタ: まぐろ おじさん
寿司の説明: ジューシーで濃厚なまぐろの風味が広がる寿司です。
寿司ネタ「このアプリの仕組みを教えて」
この記事はあなたに捧げます!
お寿司をつくってくださったユーザーさんに届きますように!
名前: 謎の寿司
寿司ネタ: このアプリの仕組みを教えて
寿司の説明: つかみどころのない味わい。一度食べたら忘れられない。
記事は以上です🎉
ありがとうございました。
Discussion