![見出し画像](https://assets.st-note.com/production/uploads/images/160838501/rectangle_large_type_2_773ec73e0281096d0fd4aa3c5fc0e994.png?width=1200)
ローカルLLMで自前の野球データを分析してみよう!
最近では、人よりAIと話す時間のほうが長いかもという日があるくらい、仕事のあらゆる部分でAIが活躍してくれています。
基本的にはChatGPTを使うのですが、自前のデータをかませたりすることを想定すると、無料でプログラムから使えるといいなーと思ったりするわけですね。
そんな動機でいろいろ探していたところ、ローカルで使える無料のモデルを見つけたので、自前データを使ってチャットできるような仕組みを作ってみたよ、という記事になります。
環境構築
まずは環境構築ですが、こちらの記事を参考にしました。
その際に記事にもありますがCMake関連のエラーが出たので、こちらの記事を参考に突破しました。
環境構築が終わってサンプルプログラムを動かしてみると、やや時間はかかりますがチャットしてくれます!すごい!
長い文章を送るとエラーが出たのですが、n_ctxの値を変更すると解決できました。
自前のデータを分析してもらう
次は自前のデータ分析をやってもらおうと思います。
使用したプロンプトは下記の通りです。
llm = Llama(
model_path="models/Llama-3-ELYZA-JP-8B-q4_k_m.gguf",
chat_format="llama-3",
n_ctx=2048,
)
response = llm.create_chat_completion(
messages=[
{
"role": "system",
"content": "あなたは誠実で優秀な日本人で、野球のデータ分析を専門としています。特に指示が無い場合は、常に日本語で回答してください。"
},
{
"role": "user",
"content": "以下のデータからこの選手の投手の投球スタイルについて分析してください。\
コメントを作る際には選手がわかりやすいよう、具体的な数値よりも大まかな傾向が知りたいです。\
全体と左右別での球種割合と、各球種の軌道や結果の傾向について教えてください。\
# 球種データ
ここは省略
",
}
]
)
print(response["choices"][0]["message"]["content"])
すると、下記のような返答を返してくれました。
全体の球種割合は、ストレートが49.4%、スライダーが28.4%、フォークが12.1%、チェンジアップが6.8%、カーブが3.3%です。ストレートとスライダーが合計で77.8%を占め、ストレート中心の投手と言えます。
各球種の傾向は次の通りです。
・ストレート: 高速の直球で、右打者には593球を投げ、左打者には449球を投げています。右打者には高めに浮いてくる傾向があり、打率は221、xBAは315、SLGは312と好成績を残しています。一方、左打者には低めに沈む傾向があり、打率は245、xBAは305、SLGは327とやや好成績を残しています。
・スライダー: 横に大きく曲がるスライダーで、右打者には316球を投げ、左打者には284球を投げています。右打者には低めに落ちる傾向があり、打率は245、xBAは309、SLGは327と好成績を残しています。一方、左打者には高めに浮いてくる傾向があり、打率は172、xBAは227、SLGは232とやや好成績を残しています。
・フォーク: 縦に大きく落ちるフォークで、右打者には213球を投げ、左打者には43球を投げています。右打者には低めに落ちる傾向があり、打率は162、xBAは173、SLGは232と苦手としています。一方、左打者には高めに浮いてくる傾向があり、打率は245、xBAは322、SLGは270と好成績を残しています。
・チェンジアップ: 高速のチェンジアップで、右打者には137球を投げ、左打者には6球を投げています。右打者には低めに落ちる傾向があり、打率は182、xBAは245、SLGは227とやや好成績を残しています。一方、左打者には高めに浮いてくる傾向があり、打率は182、xBAは201、SLGは201と苦手としています。
・カーブ: 横に大きく曲がるカーブで、右打者には41球を投げ、左打者には28球を投げています。右打者には高めに浮いてくる傾向があり、打率は286、xBAは304、SLGは500と好成績を残しています。一方、左打者には低めに落ちる傾向があり、打率は286、xBAは247、SLGは356とやや好成績を残しています。
「高めに浮いてくる」「低めに落ちる」などが適切に使われていないなど改善の余地はありますが、とはいえ選手の概要をまとめたコメントをすぐに作ってくれています。
ファインチューニングまでしなくとも、コンテクストとなる知識を加えるなどプロンプト面の改善だけで一定の能力は発揮できそうに感じます。
今回は野球のデータを使ってみましたが、あらゆる分野において広く浅い分析をしたいときには、生成AIによる自動コメントが今後普及していくのではないか、と感じました。
加えて今回はローカルで言語モデルを使っているので、自前データを利用したとしてもデータ流出などに気を使う必要がありません。企業などで活用していく際には、こうした点も大きなメリットになりそうです。
(補足)データの与え方
記事内では省略しましたが、実際にコードを書く人にとってはデータの与え方も重要なポイントとなるでしょう。
今回はcsvのテーブルデータを基にしていたので、まずpandasで読み込んでから、マークダウン形式の文字列に変換するコードをかけました。
その上で変換後のテキストをプロンプトに組み込み、LLMに処理させるというフローになります。
テーブルデータの食わせ方はまだあまり詳しくないので、よりよい方法を見つけたいなーと思っています!