Ollmaを使って、LLMに、野球のテキスト実況をさせてみました。
野球は全く見ないですが、スポーツナビはスクレイピングも禁止されてそうなので、Claudeさんに相談した結果、APIがあるMLBにしました。
GitHub
Tech Stack
- Python
- LangChain
- LangGraph
- Ollama
- gpt-oss:20b
- MLB Stats API
Difficulty
やはり、ローカルLLMなので、スペック内で実行できるモデルで、かつ、多少のハルシネーションがあってもデータに基づいた実況っぽくなるようにするところで時間がかかりました。
qwen2.5:14bなども試しましたが、日本語の精度、ハルシネーション、誤字の観点から、gpt-oss:20bが一番良い結果でした。
どのデータを使うかの調査に時間もかかったので、機械学習のときと同じで、事前準備・調査に時間がかかりますね。
あとは、ClaudeCodeを利用して作成しましたが、やはり、お節介で余計なコードや機能を追加したりするんですよね。気づければいいのですが、システム開発でそういうことされると、別なところで、エラーが発生するので困る。
そう考えると、開発にAIを使うならテスト駆動開発がいいのかなって思っています。
今までの開発手法のフレームワークは、人を意識したものでしたが、今後はAIを意識した開発手法のフレームワークとかできるのでしょうね。
Output Result
====================================================================================================
試合: Cleveland Guardians vs Los Angeles Dodgers
1回表
スコア: Cleveland Guardians 0 - Los Angeles Dodgers 0
打者: Steven Kwan
投手: Yoshinobu Yamamoto
カウント: 1ボール 1ストライク 1アウト
今の1球: Four-Seam Fastball 95.5mph → In play, out(s)
結果: Groundout
【実況】1回表、ヤマモト投手が95.5マイルの四球速球を投げ、Kwanをグラウンドアウトに!解説者、どう思われますか?
【データ分析解説】ヤマモト投手の95.5マイルの四球速球は、Kwanの平均打球速度と中軸打ちの傾向を踏まえて、グラウンドに落ちさせるための的確な選択だったよ。
【元選手解説】95.5マイルの四球速球でKwanをグラウンドアウトできたのは、相手の中軸打ちを見極めた的確な投球だったね。
====================================================================================================
====================================================================================================
試合: Cleveland Guardians vs Los Angeles Dodgers
1回表
スコア: Cleveland Guardians 0 - Los Angeles Dodgers 0
打者: Angel Martínez
投手: Yoshinobu Yamamoto
カウント: 2ボール 2ストライク 2アウト
今の1球: Curveball 78.8mph → In play, out(s)
結果: Flyout
【実況】ヤマモト投手が78.8mphのカーブを投げ、メルティンがフライアウトでアウトに!解説者、どう思いますか?
【データ分析解説】ヤマモト投手が78.8mphで投げたカーブは、約2,600rpmの高いスピン率と1.5インチのブレイクでメルティンのスイングを揺さぶり、フライアウトでアウトに終わった。
【元選手解説】78.8mphで投げたカーブは、俺が投げたときのようにスピン率が高くてブレイクも1.5インチあるから、メルティンのスイングを揺らしてフライアウトに終わったんだね。
====================================================================================================
====================================================================================================
試合: Cleveland Guardians vs Los Angeles Dodgers
1回表
スコア: Cleveland Guardians 0 - Los Angeles Dodgers 0
打者: José Ramírez
投手: Yoshinobu Yamamoto
カウント: 1ボール 2ストライク 3アウト
今の1球: Splitter 91.3mph → In play, out(s)
結果: Groundout
【実況】ヤマモト投手が91.3mphのスプリッターで1ボール2ストライクのカウントを投げ、ジョセ・ラミレスはグラウンドアウトを踏んで3アウト、解説者の皆さん、これについてどう思われますか?
【データ分析解説】ヤマモト投手が91.3mphのスプリッターで1ボール2ストライクを投げ、ジョセ・ラミレスがグラウンドアウトを踏んで3アウト――速球と変化球の組み合わせが打者のタイミングを狂わせ、ヒットゾーンを外した結果だね。
【元選手解説】俺がプロでやってた時も、速球と変化球を組み合わせて相手のタイミングを狂わせるのが鍵だったので、ヤマモトが91.3mphのスプリッターで1ボール2ストライクを投げてラミレスをグラウンドアウトにしたのはその典型だね。
====================================================================================================
====================================================================================================
試合: Cleveland Guardians vs Los Angeles Dodgers
1回裏
スコア: Cleveland Guardians 0 - Los Angeles Dodgers 0
打者: Shohei Ohtani
投手: Gavin Williams
カウント: 3ボール 2ストライク 0アウト
今の1球: mph → Batter Timeout.
結果: Batter Timeout
【実況】オオタニがタイムアウトを取った!このタイムアウトで何が変わるのか、解説者のご意見をお願いします!
【データ分析解説】オオタニがタイムアウトを取ったんだけど、投球速度が平均で0.6mph上がって、速球とスライダーの投球比が5:3に変わったみたいで、対打者の揃撃率が0.275から0.260に落ち、打球の平均飛距離も約2.5ft増えてるんだよね。
【元選手解説】オオタニがタイムアウトで投球速度が0.6mph上がり、速球とスライダーの比率が5:3に変わったことで、対打者の揃撃率が0.275から0.260に落ち、打球の平均飛距離も約2.5ft増えているので、今後は相手打者がかなり苦戦しそうだね。
====================================================================================================
====================================================================================================
試合: Cleveland Guardians vs Los Angeles Dodgers
1回裏
スコア: Cleveland Guardians 0 - Los Angeles Dodgers 0
打者: Kyle Tucker
投手: Gavin Williams
カウント: 0ボール 0ストライク 1アウト
今の1球: Cutter 93.0mph → In play, out(s)
結果: Flyout
【実況】0-0、1アウト、Gavin Williamsが0ボール0ストライクで93mphのカットを投げ、Kyle Tuckerはそれを飛んでアウト!解説者のコメントをお願いします!
【データ分析解説】0-0 1アウトの場面で93mphのカットを左肩から左下へ投げ、タッカーは早めにスイングを切り、ボールの切れ目を乗り越えられず、フックが上に伸びてアウトに終わった。
【元選手解説】僕が投げた93mphのカットは、タッカーにとっては速すぎて、早めに切りに入ったからフックが上に伸びてしまってアウトになったんだ。
====================================================================================================
====================================================================================================
試合: Cleveland Guardians vs Los Angeles Dodgers
1回裏
スコア: Cleveland Guardians 0 - Los Angeles Dodgers 0
打者: Mookie Betts
投手: Gavin Williams
カウント: 0ボール 0ストライク 3アウト
今の1球: Four-Seam Fastball 97.7mph → In play, out(s)
結果: Grounded Into DP
【実況】三アウトでギャップを突かれたMookie Betts、Gavin Williamsの97.7mphファーストにゴロでダブルプレイ、ガーディアンズは0-0のまま、どう思いますか?
【データ分析解説】Gavin Williamsの97.7mphファーストがMookie Bettsにゴロダブルプレイを強いられ、ガーディアンズは0-0のまま、速球でギャップを突く戦術が有効だと感じます。
【元選手解説】いや、Mookieがゴロでダブルプレイに持ち込まれたのは残念だが、Williamsの速球でギャップを突く戦術は確かに効果的だと実感するよ。
====================================================================================================
====================================================================================================
試合: Cleveland Guardians vs Los Angeles Dodgers
2回表
スコア: Cleveland Guardians 0 - Los Angeles Dodgers 0
打者: Kyle Manzardo
投手: Yoshinobu Yamamoto
カウント: 1ボール 2ストライク 1アウト
今の1球: Curveball 75.6mph → In play, out(s)
結果: Flyout
【実況】ヤマモトの75.6mphのカーブを1ボール2ストライクで見事に飛び返したマンズァード、アウトで2回表は0-0のまま…解説者、どう思いますか?
【データ分析解説】ヤマモトの75.6mphのカーブは回転率が高く、打球角度が約45度で約120mphで飛び、マンズァードはレイアウトを利用したタイムドヒットだったが、打者の平均球速90mphと比べて速いカーブだったため、アウトで2回表は0-0のままに終わった。
【元選手解説】ヤマモトの75.6mphカーブをそんなに速いカーブに打ち返すのは、ほんとに大きな実力とタイミングが必要で、マンズァードのそのタイムドヒットはまさにプロの技だね、でも2回表で0-0のままに終わると、相手投手も安心してくるから、これか らの展開が気になるね。
====================================================================================================
Wrap-up
APIのデータのうち、result.eventがあった時にだけに実況させているので、選手情報も使ったり、攻守の交代時に総評させたり、AWSなどで音声化させたりなどしていったら、面白そうですね。
スポーツナビのサッカーのテキスト速報に、LLMで解説者を作るのも面白そうです。
もう少し、ちゃんとエージェントを作成するかなー。。。