技術書リーディングパートナー「SHIORI」
SHIORI - 技術書リーディングパートナー:Vertex AI Gemini で実現する自律的学習支援エージェント
本記事は 第4回 Agentic AI Hackathon with Google Cloud への提出物です。
デモ映像
はじめに
技術書を読み始めたものの、途中で挫折してしまった経験はありませんか?「計画を立てても続かない」「わからないところをすぐ聞けない」といった悩みを抱える学習者は少なくありません。
SHIORI(しおり)は、技術書を読む人のためのAI学習パートナーです。Vertex AI の Gemini を中心に、複数のエージェントが連携して「書籍登録」「学習計画の作成」「学習中の質問対応」「学習記録のレビュー」までを一貫してサポートします。
本記事では、SHIORI の設計思想と、Google Cloud を活用した実装について紹介します。
プロジェクト概要
何ができるか
- 書籍の登録:ISBN または目次画像から、AI が書籍の構造(目次)を自動抽出
- パーソナライズされた学習計画:AI 司書とのインタビューを通じて、あなたの目標・前提知識に合わせた計画を自動生成
- AI チューターチャット:各学習ユニットごとに、質問に答えてくれる AI チューター
- 学習記録のレビュー:ノートや自己コメントを提出すると、AI が理解度を評価し、フィードバックと推奨教材を提示
- 自然言語でのスケジュール調整:「火曜は忙しいので休みに」「土日は2時間に増やして」といった日本語の依頼で学習計画を更新
リポジトリ
- GitHub リポジトリ: https://github.com/Ryuuga-89/SHIORI
アーキテクチャ概要
SHIORI は以下の構成で動いています。
| レイヤー | 技術スタック |
|---|---|
| フロントエンド | Next.js, Firebase Auth |
| バックエンド | FastAPI, Python |
| AI | Vertex AI (Gemini 2.5 Flash, Gemini 3 Flash など) |
| データストア | Firestore |
| デプロイ | Cloud Run (backend / frontend) |
| 認証 | Firebase Authentication |
システムアーキテクチャ図は以下の通りです。

バックエンドとフロントエンドはそれぞれ Cloud Run にコンテナとしてデプロイし、スケーラブルかつサーバーレスに動作します。
マルチエージェント設計
SHIORI では、役割の異なる複数の AI エージェントが動作します。
1. Librarian Agent(司書エージェント)
役割: 書籍情報の取得・構造化、学習ユニットのメタデータ生成、AI 司書としての対話
主な処理:
- 目次の構造化:Google Books API で取得した書籍情報と、出版社サイト等をクロールした Web コンテンツ、またはユーザーがアップロードした目次画像から、Gemini を用いて階層的な目次構造(BookSkeleton)を抽出
- 学習セクションの詳細生成:各学習単位について、概要・重要キーワード・難易度・学習目標・前提知識・推奨検索クエリ・推定学習時間を生成
- インタビューチャット:書籍登録時に、学習目標・ゴール・前提知識・興味関心についてユーザーへヒアリング
- AI チューターチャット:学習ユニット閲覧中、ユーザーの質問にそのセクションの文脈に沿って回答
-
インタビュー要約:ヒアリング結果から、パーソナライズに使う
learning_goals/prerequisites/interests/difficulty_adjustmentを抽出
使用モデル: gemini-2.5-flash(目次・セクション生成・チューター)、gemini-2.0-flash(軽量チャット)
2. Reviewer Agent(レビュアーエージェント)
役割: 学習記録(ノート・自己コメント・添付ファイル)の評価とフィードバック
主な処理:
- 学習時間・自己コメント・ノート本文・添付ファイルを入力として、理解度スコア(0–100)を算出
- 良かった点(
good_point_summary/good_point_detail)と、改善すべきギャップ(gap_summary/gap_detail)を日本語で出力 - 次の学習行動(
suggested_actions)と推奨教材(recommended_resources)を提示
使用モデル: gemini-3-flash-preview(ThinkingConfig による推論強化で、複雑な評価・要約を実現)
3. Schedule Adjuster Agent(スケジュール調整エージェント)
役割: ユーザーの自然言語による日程調整依頼の解釈
主な処理:
- 「火曜日は学習不可に」「土日は2時間に増やして」「2月14日は120分」といった日本語を解釈
-
weekly_schedule_modifications(曜日ごとの学習可能時間)とdate_specific_overrides(特定日の時間)に構造化して出力 - Study Plan Generator がその指示に従って学習計画を再スケジュール
使用モデル: gemini-2.5-flash
利用している Google Cloud サービス
Vertex AI(Gemini)
- Vertex AI API を経由して Gemini を利用
- 目次抽出・学習セクション生成・レビュー・スケジュール解釈など、多様なタスクで Gemini を活用
- 構造化出力(
response_schema/response_mime_type="application/json")により、安定した JSON レスポンスを取得 - レート制限・タイムアウトに対しては指数バックオフによるリトライを実装
Cloud Run
- バックエンド(FastAPI)とフロントエンド(Next.js)をそれぞれ Cloud Run にデプロイ
- スケールゼロ対応で、利用状況に応じて自動スケール
-
docs/GOOGLE_CLOUD_DEPLOY.mdにデプロイ手順を記載
Firebase
- Firebase Authentication で Google ログイン
- Firestore でユーザー、書籍、学習計画、学習記録などを保存
その他
- Artifact Registry:Docker イメージの管理
-
Cloud Build:フロントエンドのビルド(
NEXT_PUBLIC_*の埋め込みを含む) - Google Books API:書籍メタデータの取得
技術的なポイント
目次の構造化
目次情報は以下の2通りで取得できます。
- Web クロール:ISBN から出版社サイトなどの目次ページ URL を生成し、HTML を取得。Gemini に渡して階層構造を抽出
- 画像入力:目次ページの画像をアップロードし、Gemini のマルチモーダル機能で OCR 風に読み取り、同様の JSON 構造を生成
いずれも response_schema で再帰的な目次スキーマを指定し、BookSkeleton 形式で一貫した出力を得ています。
学習計画の生成と再スケジュール
学習計画は Study Plan Generator が担当し、決定論的ロジックで構築します。
- ユーザーの曜日ごとの学習可能時間・学習速度・ページ数をもとに、各学習ユニットの所要時間を算出
- 難易度に応じた倍率を適用し、前詰めでスケジュールに割り当て
- Schedule Adjuster Agent が解釈した日本語依頼に基づき、曜日や特定日の時間を更新して再割り当て
レビューエージェントと Gemini 3
Reviewer Agent では gemini-3-flash-preview と ThinkingConfig(thinking_level=HIGH)を組み合わせ、複雑なノート内容の評価と要約を安定して実行しています。評価・要約・推奨リソースの生成といった多段階の推論が必要なタスクに適しています。
今後の展望
- ADK(Agent Development Kit)への移行:マルチエージェントの会話フローやツール呼び出しを ADK で再設計
- Vertex AI Search との連携:技術書の内容を検索可能にして、より文脈に即した回答を提供
- 音声インターフェース:リアルタイム音声で AI チューターと対話する体験の検討
まとめ
SHIORI は、Vertex AI Gemini を中心に、Librarian・Reviewer・Schedule Adjuster の3つのエージェントが連携する学習支援システムです。技術書の登録から計画作成、学習中の質問対応、学習記録のレビューまでを一貫してサポートし、ユーザーの「技術書を最後まで読み切る」という目標を支援します。
第4回 Agentic AI Hackathon を通じて、Google Cloud と Gemini の最新機能を活用した実践的なアプリケーション開発に挑戦しました。Google Cloud Agentic AI Bootcamp 2026 Winterにも参加させていただき、多くの学びを得ることができました。このような機会を下さった大会関係者の方々に深く感謝いたします。ご質問やご意見がありましたら、お気軽にコメントいただけると幸いです。
Discussion