こんにちは、ヤプリの25新卒サーバーサイドエンジニアの籔本です!
先日、ヤプリの開発統括本部内でAIハッカソンが開催されました。 私を含む 24・25新卒入社のエンジニア4人でチームを組み、「アプリ分析AIエージェント」 を開発しました。
今回の記事ではその開発した内容と成果を紹介します!
概要
作ったのもの
今回の開発の目的は「アプリのエンドユーザーの行動データを分析し、具体的な施策まで提案してくれるエージェント」を作ることでした。
ヤプリでは、アプリでのエンドユーザの行動データをBigQueryに蓄積しています。 tech.yappli.io
そこで、PythonとLangGraphを使ってBigQueryへクエリを実行し、取得したデータを基にLLMが分析・提案を行うシステムを構築しました。

LangGraphとは
LangGraphはLLMを用いたアプリケーションにおいて、ステップバイステップの実行ワークフローをコードベースで構築できるライブラリです。 主に以下の4つの要素を用いて、ステートフルなマルチエージェントシステムを定義できます。
Node:ワークフローにおける1つの処理ステップ。LLMとの対話や関数実行など、具体的なアクションを定義できます。
Edge:NodeとNodeをつなぐ接続線。処理の遷移先や条件分岐を定義します。
State:各Node間で共有されるデータの集合。実行結果やコンテキストを次のステップへ引き継ぐために使用します。
Graph:これらを組み合わせた一連のワークフロー全体。複数のGraphを連結することで、複雑なマルチエージェントを構築可能です。
LangGraphの具体的な解説については、こちらの記事が分かりやく参考になりました zenn.dev
また、開発ではLangSmithも併用しました。
LangGraphと連携させることで、複雑になりがちなエージェントの挙動や各ノードの入出力を可視化でき、デバッグがかなり簡単にできるようになりました。

実装したエージェント
今回は3つの専門的なエージェントと、それらを指揮する司令塔の計4エージェント構成を採用しました。
- DL / MAU:アプリのダウンロード数・MAU(月間アクティブユーザ数)を分析
- Push:プッシュ通知の開封率や人気な通知の傾向を分析
- Screen:アプリ内のホットスクリーン(ユーザから注目されている画面)を分析
- Orchestrator:上記3つを統括し、アプリを総合的に分析

また、我々のチームは「実際のプロダクトとして使えること」にもこだわりました。
ハッカソン期間中に、ヤプリの管理画面上でユーザーが分析項目の選択や要望の入力を行えるUIを実装しました。

(※今回はハッカソン用の実装であり、実際の製品には反映していません)
Orchestrator
Orchestratorはユーザからのリクエストに応じて、3つのエージェントをオーケストレーションします。

- エージェントの選択:実行対象のエージェントを決定します。「統合的な分析」が指定された場合は全エージェントを、それ以外の場合は対応する特定のエージェントを選択します。
- エージェントの実行:1で選択したエージェントを実行させます。各エージェントは独立しているので、「統合的な分析」を選択した場合は全部のエージェントを並列で実行させて実行時間を最適化させています。
- レスポンスの生成:各エージェントの実行結果を集約し、最終的なレスポンスとしてユーザに返却します。
DL / MAU
DL / MAUは、アプリのダウンロード数やMAU(月間アクティブユーザ数)を基に、アプリの成長傾向を分析します。

- SQLの構築:アプリのメタデータを基に、データ取得用SQLを構築します。クエリの正確性を担保するためにLLMによるSQL生成は行わず、固定のSQLテンプレートにプレースホルダーで値を埋め込む方式を採用しました。
- BigQueryからデータ取得:構築したSQLをBigQueryに対して実行し、対象アプリのダウンロード数・MAUに関するデータを取得します。
- LLMによる分析:BigQueryから得られた実績データをLLMに渡し、傾向分析を実行させます。
実装のポイント:LLMでの分析には、LangChainが提供するChatPromptTemplateを使用しました。 事前に定義したプロンプトテンプレートに対し、BigQueryから取得したデータを動的に流し込むことで、分析に使用して欲しいデータをLLMへ渡す実装としています。
reference.langchain.com
テンプレートはこちら
あなたはDL・MAU分析の専門エージェントです。
データを分析して、簡潔な洞察を生成してください。
分析結果:
- 今月のMAU: {mau_current:,} ユーザー
- 新規DL数: {new_downloads:,} ダウンロード
- 前月比成長率: {growth_rate:.2f}%
以下の形式で3-5行程度の簡潔な洞察を提供してください:
- 現状の評価(1行)
- 主要な課題(1行)
- 推奨アクション(1-2行)
長い説明や表、セクション分けは不要です。端的に要点のみを述べてください。
Push
Pushは、プッシュ通知の開封数や遷移数などの行動データを基に、アプリのエンドユーザーへの訴求効果を分析します。

基本的な実装アーキテクチャはDL / MAUと同じなので、詳細の説明は割愛します。
プッシュ通知は、アプリの継続率やエンゲージメントを高める上で最も重要な施策のうちの一つです。 そのため、単に数値を羅列するのではなく、「成功した通知」に焦点を当てて分析を行います。具体的には、直近1ヶ月のデータから最も開封された通知と詳細画面に遷移したプッシュ通知を抽出し、LLMへ分析リクエストを投げます。
DL / MAUと同様に、ChatPromptTemplateを用いて定量データをプロンプトに埋め込み、LLMによる分析を行っています。
テンプレートはこちら
あなたはアプリのプッシュ通知分析の専門エージェントです。
データを分析して、簡潔な洞察を生成してください。
ユーザ質問: {query}
【プッシュ通知専門エージェント結果(直近1ヶ月)】
配信通知数: {total_notifications} 件
総開封数: {total_opened} 回
【最も開封された通知 TOP5】
1位:{top-1}
2位:{top-2}
3位:{top-3}
4位:{top-4}
5位:{top-5}
【最も詳細閲覧された通知 TOP5】
1位:{most-1}
2位:{most-2}
3位:{most-3}
4位:{most-4}
5位:{most-5}
以下の形式で3-5行程度の簡潔な洞察を提供してください:
- 現状の評価(1行)
- 主要な課題(1行)
- 推奨アクション(1-2行)
長い説明や表、セクション分けは不要です。端的に要点のみを述べてください。
Screen
Screenは、アプリ内で特に重要度の高い画面を特定し、その傾向を分析するエージェントです。

単純に「最も見られた画面」を抽出する場合、アクセス頻度が極端に高い「ホーム画面」などが常に上位を占めてしまい、有益な分析結果が得られないという問題があります。
そこで、画面の重要度判定にTF-IDFという指標を導入しました。 TF-IDFを用いることで、多くのユーザーが一律に閲覧する画面(低IDF)のスコアを下げ、特定のアクティビティにおいて集中的に閲覧される(TF-IDFが高い)画面を「重要な画面」として抽出しています。
TF-IDFに関する参考記事:TF-IDFとは?テキストマイニングの基本指標を分かりやすく解説 #機械学習 - Qiita
テンプレートはこちら
あなたはスクリーン分析の専門エージェントです。
スクリーンとは、アプリのそれぞれの機能を開かれた回数を表します。
以下に事前に集計データしたデータを示すので、ユーザに表示させるレポートを生成してください。
ユーザ質問: {query} よくみられているスクリーン TOP10: {recent_screens} ホットスクリーン(TF-IDF) TOP10: {hot_screens}
レポートフォーマット: 🖥️ スクリーン分析レポート <<分析結果をここに記載してください>>
2. ホットなスクリーン TOP5
<<hot_screens>>
注意点: - レポートは日本語で作成してください。 - レポートはmd形式で作成してください。 - 以上のフォーマットに厳密に従ってください。 - 分析レポートは500文字以内に収めてください。
実験
今回実装したアプリ分析AIエージェントを用いて、実際にアプリの分析実験を行います。
ヤプリが社内で従業員向けに展開しているアプリ『Yappli Hang Out』を分析させた結果を紹介します! また、アプリを分析するLLMにはGemini 2.5 Proを使用しました。
DL / MAUの分析結果
BigQueryから取得した実データを基に、直近のトレンドが正しく可視化されています。
単に「309人です」と数値を返すだけではなく、直近の推移を加味して「ユーザー基盤は維持できている」と言語化して評価してくれています。
一方で、要望欄に「Yappli Hang Outは従業員向けアプリ」と記載したものの、一般的な消費者向けアプリ向けの知識が先行し「ASOや広告による新規獲得」を提案してしまっています。 従業員向けアプリでは従業員増加でしか新規DLは増えないため、このあたりは単一エージェントの視野の狭さが出ており、改善の余地がありそうです。
プッシュ通知の分析結果
ここでは、「従業員向けアプリ」という内容を正確に考慮し、福利厚生や社員紹介などの社内コミュニケーションを促進するような通知が有効だと分析してくれました。
さらに、「詳細への誘導(クリックさせる工夫)」としてプッシュ通知ならではの具体的なネクストアクションを提示してくれています。 運用者が「次に何をすればいいか」まで踏み込んでくれるため、実際の施策改善に直結しそうです。
ホットスクリーンの分析結果
TF-IDFを用いたことで、単純にPV数が最も多い「ホーム画面」ではなく「デイリーくじ」や「俳句」、「社員紹介」といった、意味的に重要な画面を抽出できました。
実用的な「福利厚生」情報だけでなく、「デイリーくじ」のようなゲーミフィケーション要素が毎日の起動トリガーになっていることまで言語化しており、ユーザー行動の解像度が高いです。
総合的な分析結果

これまでの独立した分析結果とは異なり、「点」ではなく「線」での分析と提案をしてくれました。
特に「Push分析での発見(割引クーポンが人気)」と「Screen分析での発見(デイリーくじが人気)」の分析を組み合わせ、「デイリーくじの景品にクーポンを入れる」という具体的な施策を提案してくれました。 それぞれのエージェントでは見えなかった相乗効果を分析してくれたので、実用的なエージェントになったかなと思います。
まとめと展望
ヤプリ社内のAIハッカソン「ヤッ祭」にて、LangGraphを使ってアプリ分析AIエージェントを実装しました! 3つの専門的なエージェントと、それらを統括するエージェントのマルチエージェント構成にすることで、総合的なアプリ施策を提案するエージェントを作ることができました。 また、単にデータを可視化するだけでなく、「次に何をすべきか」という意思決定のサポートまでできるエージェントを実装できたのが良かったと考えています。
今回の実装はハッカソンで作ったいうこともあり、いくつか改善の余地があります。 一つは「自律的な分析」です。現在は固定の手順やテンプレートに従うのみですが、今後はユーザの抽象的な問いに対し、エージェント自身が取得データや分析の切り口を自律的に設計・実行できるようにしたいです。 もう一つは「対話型」です。現在は分析結果を出して終了ですが、対話形式での深掘りを可能にし、AIと人間が壁打ちしながら施策を練り上げられるようなエージェントを作りたいです。
余談
今回のハッカソンでは6つの賞が用意されていたのですが、我々のチームは「チームドリブン賞」 を受賞しました!! 技術的な挑戦も楽しかったですが、先輩方と力を合わせて1つのAI機能を作り上げる過程は本当に良い経験になりました!
最後まで読んでいただき、ありがとうございました!!
ヤプリではAIに興味があるエンジニアを大募集しています! 興味を持った方は、ぜひカジュアル面談にお越しください!
