Gorisan(ゴリさん)
関西弁AIパーソナルトレーナー LINE Bot
Gorisan(ゴリさん)— 関西弁AIパーソナルトレーナー
「筋肉は裏切らへん!」熱血・関西弁のAIトレーナーが、食事写真の解析から運動記録、応援メッセージまでを担当するLINE Botです。友人と2人で使っていて、お互いの記録が相手への応援通知になります。
- 稼働状況: 2026年7月〜/継続運用中
- 主インターフェース: LINE
概要
「AIに叱られる」のではなく「アニキに褒められる」体験を目指したダイエット支援Botです。
スモールステップ、全肯定、完璧主義をやめる。こうした行動科学の考え方をキャラクター設計に落とし込み、とにかく記録のハードルを下げることを最優先にしました。
設計の軸は3つあります。
- 入力のハードルをなくす — 食事は写真1枚、体重や歩数は「62.5kg」「5000歩歩いた」といった普通の文章でOK。専用のフォームやコマンドを覚える必要がありません
- キャラクターと行動科学 — 「スクワット1回でOK」「休むのも勇気やで」など、0を1にすることを称賛する姿勢をプロンプトで一貫させています
- 2人で続ける仕組み — 片方が記録するともう一方へ応援メッセージが飛び、3日記録がないと心配メッセージが届きます
主な機能
対話機能
| 機能 | 内容 |
|---|---|
| 食事画像の解析 | 写真を送るとGeminiがメニューを推定し、カロリーとPFCバランスを算出。時間帯も考慮する |
| テキストでの食事記録 | 「カツ丼食べた」だけで記録。「親子丼やった」と訂正すれば即座に再計算 |
| 自然文からの記録 | 文章の意図をAIが読み取って数値を取り出し保存。体重・歩数・筋トレに対応 |
| グラフ生成 | 直近30日の体重と歩数の推移を画像で返信 |
| 相談への回答 | 筋トレ方法などの相談に、Google検索で裏付けを取りながら回答 |
| ゴールの自動切替 | 目標体重の達成を検知するとダイエットモードから筋トレモードへ移行し、メニューも差し替え |

Apple Healthのデータが届くと自動で記録し、ゴリさんが関西弁で反応する
自動で動く機能
| 機能 | トリガー | 内容 |
|---|---|---|
| タスク通知 | 毎朝7時 | 今日やることをリマインド |
| サボり検知 | 毎日11時 | 3日間記録がないユーザーへ心配メッセージ |
| マイルストーン | 体重記録時 | 「-2kg達成」などの節目を検知して祝福 |
| 週次レビュー | 日曜21時 | 1週間の体重・歩数・食事を総括 |
| 月次チャレンジ | 月初 / 月末 | 月ごとの目標設定と達成判定 |
| 日記への反映 | ヘルスデータ着信時 | Apple Watch経由のデータが届いたらObsidianの日記へ転記 |

日曜21時に届く週次レビュー。体重・歩数・筋トレを集計し、最後にひとこと添える
ソーシャル機能
- 相互奮起通知: どちらかが記録すると、相手に応援メッセージが届きます。本人への返信を待たせないよう、裏側で並行して送信しています
- オンボーディング: 友だち追加のときに、目標や現在の状態をヒアリングする案内フロー
技術スタック
- 言語: Go 1.21+。Webフレームワークを使わず標準ライブラリだけで構成
- AI: Gemini 3.1 Flash Lite。文章の理解、画像解析、検索連携の回答
- インフラ: Cloud Run + Cloud Scheduler + Pub/Sub
- データ保存: Firestore(ユーザー情報・記録)/ Cloud Storage(画像・健康データ)
- 秘密情報: Secret Manager。取得結果をキャッシュしてアクセス回数を削減
- 外部連携: LINE Messaging API
アーキテクチャ
gorisan_go/ 1つのCloud Runサービスとして稼働
├── main.go ルーティング・定時実行の受け口
├── line_handler.go / client LINEの受信・返信・プッシュ送信
├── intent_classifier.go 文章が何の記録かをAIで判定
├── feature_food_analyzer.go 食事画像の解析
├── feature_food_text.go テキストでの食事記録・訂正
├── feature_workout.go 筋トレの記録
├── feature_mutual_motivation.go 相互奮起通知
├── feature_rag.go 相談への回答
├── feature_chart.go / report グラフ生成・各種レポート
├── cron_*.go サボり検知 / 週次 / 月次 / 日記反映
├── user_service.go 複数ユーザーの管理
└── onboarding_handler.go 初回セットアップ
相互奮起通知のデータフロー
友人がLINEで「今日3000歩」と送信
→ AIが歩数の記録と判定して数値を取り出す
→ データベースに保存し、本人へ即返信
→ 裏側で並行して、相手へ応援メッセージを送信
技術的な見どころ
- イベント駆動の設計: Apple Watchの健康データがストレージに書き込まれた瞬間に、日記への転記が走ります。ファイルパスから日付を読み取る作りにしたので、データの到着が遅れても、同じイベントが2回届いても、正しい日付に1回だけ処理されます
- コストを抑える工夫: Secret Manager の取得結果をメモリに保持し、起動中のアクセスを1回に制限。呼び出し課金のあるサービスへの無駄なアクセスを減らしました
- ユーザー追加に強い設計: 送信者の判定をデータベース照会にしたので、友人が増えても設定変更なしで対応できます。照会結果は5分間キャッシュして負荷も抑えています