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占いサービスを目指していきたいと思います。

関連記事