本業は生成AIプロダクトのSRE, 趣味(と昔の仕事*1)は野球データサイエンス&エンジニアリングの人です.
本日, LayerX ランチタイムLT「AI for fun」にて「生成AIを活用した野球データ分析〜メジャーリーグ編」という, (昔からのshinyorkeを知ってる方からすると)久しぶりに自分の芸風⚾️らしいLTをさせてもらいました*2.
本記事ではこの発表の主に技術解説的な部分を紹介できればと思います(つまり至って真面目?な技術ブログです).
- Claude for Desktopを使うまでの背景
- MCP Toolbox for Databasesでいい感じに作れた.
ぐらいの話を事細かにできればと思います.
TL;DR
3年前(2022年)に野球データ分析基盤の開発と運用に全振りした意思決定, 生成AIのお陰でとんでもないブレークスルーが生まれて最高.
3年前に作って今もアップデートしながら運用しているこれが大きな役割を果たしました.
なぜこのネタを作ったか
このLTネタ, 実質半日でデモ作成, (+スライド作成と収録で半日)というとてつもない爆速スピードで完成しました.
7 Days LTの登壇が決まってから収録まで非常に短い期間*3で正直ヤバいと思いましたが.
- 生成AIをバディに野球の時間を楽しみたい
- MCPでいい感じに作れそうと知る
これらのモチベーションと生成AI周りの技術スタックのお陰で上手く乗り切りました.
生成AIをバディに野球の時間を楽しみたい
ガチで仕事にしていた程度に野球データとセイバーメトリクスが大好きな私, 3年前(2022年)にクラウドなデータ基盤の実験台的な意味も兼ねて野球データ分析基盤「Zobrist*4(ゾブリスト)」を構築しました.
MLBの公式データサイト「Baseball Savant」から定期的にデータ収集し, データレイク(Storage), DWH(BigQuery)に貯めていくETL的な基盤と, これらのデータを可視化・分析するSoI的なダッシュボードから構成されています.
これはこれでめちゃくちゃ活用している(先日カブスのPCAのネタを書いた時もこのダッシュボードから素材を利用)のですが,
- 分析ダッシュボード(こちらはDashで実装しているお手製です, 昨年のPyConJP 2024にて発表)のコードベースが案外大きくて開発・メンテが大変.
- ちょっと凝ったことをするのにクエリを書くのは楽しいけど時間が溶ける.
という課題があり.
ワイ「もう生成AIエージェントに割り切ったほうが良いのでは?」
と思いつき, 実行することにしました.
クエリを叩けばデータが出てくる, 仕様もわかってる(何だったら言語化もしている)事もあり, 割とやりやすい楽しいタスクになりそうと思ったことも理由の一つです.
ちなみに思いついたのはLTの企画が出る前の話で, LTの企画が社内公募になったタイミングで第一弾をやろう!と決めていました.
MCPでいい感じに作れそうと知る
技術スタック的には最初からMCP(Model Context Protocol)を全力活用すると決定していました.
が, 7 Days LTの登壇が決まってから収録まで非常に短い期間
という制約, 当時デブサミの登壇準備と並行(こっちは全くの別ネタ)という事情で開発とテストに書けられる時間が良くて1日という大ピンチに陥りました.
当初は自分でMCP ClientとMCP Serverを実装(今後実際やるつもりです)してLTするつもりでしたが1日でできるような気がしなかったので.
- MCP Clientはあり物のツールを使う.使い慣れているCursorもしくは使ったこと無い(当時)がClaudeでやれそう.
- MCP ServerはMCP Toolbox for Databasesをそのまま使う.
この意思決定を元にLTネタを作る(事実上のPoCを行う)ことにしました.
技術実装
意思決定はしたのであとはお試しするだけや!って事で試しました.
- Cursorでの初期実験
- Claude for Desktopへの移行
- ルール設計の重要性
Cursorでの初期実験
最初のMCP Clientとして使い慣れているCursorを選択しました. CursorはIDEとして優れた機能を持っており, チャット機能を使って生成AIと対話しながらデータを取得できる環境を構築しました.
実際に試してみると, 驚くべきことに, チャットで会話するだけで思った通りのデータを取得してくれました. 「大谷翔平の一番最近の試合の打撃成績」といった自然な質問に対して, 適切なSQLクエリを生成し, 結果を返してくれるのです. 正直めっちゃ感動しました*5.
ただ, ちゃんと文脈を渡さないと微妙な結果になることに気がついたため.
- BigQueryのスキーマ情報からルールを作成(これもCursorに会話しながら).
- 追加ルール・間違っている箇所を自分で修正.
- 最終的にCursor Ruleとmarkdownのドキュメントにまとめる.
といった事を愚直にやりました.
Claude for Desktopへの移行
これでもLT出来そう...と思ったのですが一個気が付きました.
ワイ「ライブコーディングを期待しているわけじゃないのでIDEじゃなくて別のツールのほうが良いのでは?」
CursorはIDEであり, 「いい感じに野球データ分析してリコメンドする」といった利用用途とマッチしない部分がありました.
より自然な対話型のインターフェースが必要だと考え, 新たなMCP Clientを探すことにしました.
そこで思いついたのがClaude for Desktopでした.
Claude for Desktopは対話に特化したインターフェースを提供しており, 野球データ分析のような用途に最適だと考えました.
実際にClaude for Desktopに切り替えてみると, 結果は大成功でした.
デモ動画で確認できる通り, 自然な会話を通じて野球データの分析が可能になりました.
そして本日のLTでお見せした通りの構成で完成しました.
新たにアプリを作ったりすること無く, ここまで行けたのは最高の体験でした.
シン・野球データサイエンス - 今後はどうする
今日はLTという形でいい感じに披露しましたが今後は個人開発ネタとして(今回できなかった)以下をやるつもりです.
- MCP ServerをMCP Toolbox for Databasesから自前実装に変える&Cloud環境にホストする
- MCP Client役の生成AIエージェントを開発, これもCloudにホストする
MCP ServerをMCP Toolbox for Databasesから自前実装
はBigQueryを直接実行でもいいのですが, データ基盤のコンポーネントとしてデータ取得用のRESTful APIを用意しているため, こっちの機能を活用するようなMCP Serverを作り, エージェントから使わせる方向性を考えています.
MCP Client役の生成AIエージェント
についても今回はClaude for Desktopでしたが, いい感じにグラフ描画したり野球データ分析のダッシュボードとして運用するために何かしらの生成AIエージェントとしてのMCP Clientを実装(Streamlitでシュッとできそうな気がする)していいかなと考えています.
この2つをやるモチベーションは「この仕組みをスマホやタブレットからも使いたい」これに限ります(つまりCloudとかどこかにホスト*6する必要がある).
CursorにせよClaude for Desktopにせよ, 現状自分のMacbookでしかできない縛りがあり, もっと気楽なUXを実現するためにCloud移行したいと思っています.
とはいえ現状のMCPは外部にホストする場合, 通信をInternalに閉じる*7(&生成AIエージェントの認証認可*8も考えないといけない)というチャレンジが待っているので引き続き頑張りたいと思います.
結び
「生成AIを活用した野球データ分析〜メジャーリーグ編」の技術解説を紹介しました.
生成AIと野球データ分析の組み合わせは, まだ始まったばかりです. この技術により, 野球ファンがより深く, より楽しくデータを活用できるようになることを期待しています.
この営みは引き続きやっていくのでshinyorke先生の新作にご期待ください.
最後までお読みいただきありがとうございました.
*1:2018年〜2019年半ばまで本気で野球の仕事をしていました(若い人は知らないと思うので補足). というかあれから7年経過しているのは流石に驚いた.
*2:一応補足ですが別にこのキャラを卒業したわけではないけど積極的にやる時がたまにあるぐらいの感覚です(つまり気分次第).
*3:詳細は言えませんが私含めてLT登壇の49人+司会者のみなさんがてんやわんやだったのは確かですw それでもやり切るLayerXのメンバーはマジで強いなとも思いましたが.
*4:名前の由来はメジャーリーグを代表するユーティリティ・プレーヤーである「ベン・ゾブリスト」から. もう引退しています&今の現役に近い感じだとドジャースのムーキー・ベッツ, (絶好調時の)西武ライオンズ外崎みたいな選手.
*5:何度もいいますが3年前にデータ基盤を作った意思決定がここに来てめっちゃ生きました.
*6:ちなみにCloud Runが最有力です, 今のシステムがCloud Runなので.
*7:外向けの認可の仕組みが無いため. L7レベルの認可は正式仕様が無いため, L4で通信経路を絞る必要があります.
*8:これに関してはCloud RunでもIAPが使えるようになったので案外いけるかも.