LaravelでAI占いサイトを作るとき苦労したこと
公開日:2026年6月25日 10時10分
Laravelなら作れると思っていた
私は長年バックエンドエンジニアとして開発に携わってきました。
PHPやLaravelにも慣れていたため、AI占いサイトを作ると決めたときも、
「バックエンド側はなんとかなるだろう」
と思っていました。
しかし実際に作り始めてみると、通常のWebサービスとは違う難しさがいくつもありました。
AI占いサイトは、単にフォームを作って結果を返すだけのサービスではありません。
相談内容を受け取り、AIに渡し、占い結果を生成し、履歴として保存し、必要に応じて次回以降の相談にも活用する必要があります。
今回は、LaravelでAI占いサイトを作る中で苦労したことを振り返ってみます。
OpenAI APIとの連携
最初に苦労したのは、OpenAI APIとの連携です。
APIを呼び出すだけなら、それほど難しくありません。
しかし実際のサービスとして使うには、
- 相談内容をどう渡すか
- タロットカード情報をどう含めるか
- どのような形式で回答させるか
- エラー時にどう処理するか
を細かく考える必要がありました。
特に占い結果は文章が長くなりやすいため、レスポンス時間やトークン数にも注意が必要でした。
プロンプト設計の難しさ
AI占いサイトで一番重要なのは、プロンプト設計です。
Laravelのコードが正しく動いても、AIの回答が期待した内容にならなければサービスとしては成立しません。
例えば、
- 未来を断定しすぎない
- 不安をあおらない
- 相談者の気持ちを整理する
- タロットカードの意味を反映する
- 読みやすいMarkdownで出力する
といった調整が必要でした。
これは通常のシステム開発とは少し違う難しさでした。
コードのバグなら原因を特定できます。
しかしAIの回答品質は、プロンプトを少し変えるだけで大きく変わります。
そのため、何度も試行錯誤しながら調整しました。
JSONとMarkdownの扱い
AI占いでは、カード情報や結果本文を扱う必要があります。
最初はすべて文章として返していました。
しかしサービスとして画面表示するには、
- 選ばれたカード
- 正位置・逆位置
- カード画像
- 占い本文
を分けて管理した方が便利です。
そこで、カード情報はJSONで扱い、占い本文はMarkdownで表示する形にしました。
ただし、AIにJSONを返させる場合は注意が必要です。
少しでも形式が崩れると、Laravel側でパースできません。
このため、
- JSON部分
- Markdown本文
- エラー時のリカバリ
をどう設計するかに苦労しました。
ストリーミング対応
占い結果は文章量が多いため、生成完了まで待つと利用者が不安になります。
当初は、AIの回答がすべて完成してから画面に表示していました。
しかしそれでは、長いときに40秒近く待つことがありました。
そこでOpenAI APIのストリーミングに対応しました。
ストリーミング化すると、数秒で文章が表示され始めます。
ただしLaravel側では、
- レスポンスを逐次返す
- フロントエンドへリアルタイムに表示する
- 最終結果を保存する
という処理が必要になります。
通常のJSONレスポンスとは違うため、実装にはかなり工夫が必要でした。
相談履歴の保存
AI占いサイトの特徴として、相談履歴を保存する仕組みを作りました。
これは「続き占い」や「毎朝のAI占いメルマガ」にも関わる重要な機能です。
ただ、履歴を保存するときには、
- どの情報を保存するか
- 個人情報をどう扱うか
- 過去履歴をどこまでAIに渡すか
- ユーザーが見返しやすい形にできるか
を考える必要がありました。
特に過去の相談内容をAIに渡す場合、すべてを渡すとコストも増えますし、回答が散らかる可能性もあります。
そのため、直近の相談を中心に参照する形にしました。
認証とプラン制御
AI占いサイトでは、無料プランと有料プランで使える機能を分けています。
例えば、
- 1日の利用回数
- AIヒアリングの有無
- 続き占いの有無
- 毎朝のメルマガ
- 回答文字数
などです。
Laravel側では、ユーザーのプランに応じて処理を分岐する必要があります。
単純な会員制サイトならログイン判定だけで済みますが、AI占いサイトでは機能ごとの制御が多くなります。
この部分は思ったより複雑でした。
決済連携
有料プランを提供するためには、決済機能も必要です。
月額課金を導入する場合、
- 契約開始
- 無料トライアル
- プラン変更
- 解約
- 決済失敗時の対応
などを考える必要があります。
Laravelで決済処理を実装すること自体も大変ですが、それ以上に「ユーザーのプラン状態を正しく管理すること」が重要でした。
決済とAI機能が連動しているため、ここは慎重に設計しました。
AWS環境での運用
ローカル環境で動くことと、本番環境で安定して動くことは別の話です。
AI占いサイトではAWS上で運用しているため、
- ECS
- RDS
- ElastiCache
- SQS
- SES
- Lambda
- EventBridge
など、さまざまなサービスを組み合わせています。
特に毎朝のAI占いメルマガでは、夜中にAIで文章を生成し、朝に一斉配信する仕組みを作りました。
Laravelアプリだけで完結するのではなく、AWSの各サービスと連携する点も苦労したところです。
コスト管理
AIサービスでは、API利用料とインフラ費用の両方を考える必要があります。
占い結果を生成するたびにOpenAI APIの利用料が発生します。
さらに本番環境では、AWSの各種リソースにも費用がかかります。
個人開発では、このコスト管理がとても重要です。
機能を増やせば便利になりますが、その分コストも増えます。
そのため、
- どの機能を無料にするか
- 有料プランに何を含めるか
- どこまでAIに処理させるか
を常に考える必要がありました。
SEOとの両立
AI占いサイトは、アプリ機能だけ作っても利用者には届きません。
検索から見つけてもらうためには、SEOも必要です。
Laravelで動的ページを作る場合、
- title
- description
- canonical
- sitemap
- OGP
- インデックス対象ページ
なども考える必要があります。
特にAIチャットのような動的ページは、検索エンジンにどう見せるかが難しい部分でした。
アプリとしての使いやすさと、SEOとしての分かりやすさを両立させる必要がありました。
作ってみて分かったこと
LaravelでAI占いサイトを作ってみて感じたのは、
AIサービスは通常のWebサービスよりも考えることが多いということです。
ユーザー管理や決済だけでなく、
AIの回答品質、
レスポンス速度、
履歴活用、
コスト、
安全な表現、
SEOまで考える必要があります。
それでも、一つずつ課題を解決していくことで、サービスとして少しずつ形になっていきました。
おわりに
Laravelは非常に使いやすいフレームワークです。
しかしAI占いサイトを作るとなると、単なるCRUDアプリとは違う難しさがあります。
OpenAI APIとの連携、ストリーミング、相談履歴、決済、AWS運用、SEO。
どれも簡単ではありませんでした。
それでも、自分の得意なLaravelを土台にすることで、AIタロットサイトを形にすることができました。
これからも改善を続けながら、利用者にとって使いやすく、安心して相談できるAI占いサービスを目指していきたいと思います。