前回のおさらい

前回の記事では、ChatGPTと相談しながら決めた、競馬AIの最初の方針について書きました。

複勝圏内に入る確率を予測する。
的中率だけではなく、回収率を重視する。
予測確率とオッズを組み合わせ、
期待値があると判断した馬を抽出する。
最初からすべてのレースを対象にするのではなく、
条件を絞って小さく始める。

こうして、競馬AIで何を目指すのかが少しずつ明確になりました。
しかし、方針を決めただけでは何も動きません。

実際に競馬AIを形にするためには、
データを集め、加工し、モデルに学習させ、
予測結果を確認できる仕組みが必要です。

ここから、競馬AI開発は実作業へと入っていきました。

最初に作ったロードマップは、あまり使いませんでした

競馬AIを作り始める前に、
ChatGPTには開発全体の流れも整理してもらいました。

方針を決めるところから始まり、
データ基盤の設計、
データ取得と前処理、
モデル設計、
期待値の計算、
可視化、
自動化、
将来の収益化までを
段階的に並べたロードマップです。

最初に見た時は、競馬AIを作るために必要なものを広く把握でき、
参考になりました。
ただ、正直に振り返ると、
そのロードマップを頻繁に確認しながら開発を進めたわけではありません。

実際の開発では、目の前で必要になったことをChatGPTに相談し、
その場でコードを作ってもらい、動かしながら次を考えていました。

データを取得しようとすると、保存方法を決める必要が出てくる。
コードを動かすと、想定していなかったエラーが起きる。
エラーを直すと、次に必要な処理が見えてくる。

開発は、最初に決めた順番どおりには進みませんでした。
最初にロードマップを作ったことに意味がなかったわけではありません。
プロジェクト全体がどれくらいの広さを持っているのかを知る役には立ちました。

しかし、実際に前へ進めてくれたのは、立派な計画よりも、
その時々に起きた問題についてChatGPTと交わした対話だったと思います。

コードを書く前に、まず開発環境を整えました

方針が決まり、いよいよ競馬AIを作り始めます。
しかし、すぐに予測モデルを作れたわけではありません。
最初に必要だったのは、開発環境を整えることでした。

Pythonを実行できるようにする。
VS Codeから作業できるようにする。
競馬AIプロジェクト用の仮想環境を作る。
必要なライブラリをインストールする。
プログラムやデータを保存するフォルダを決める。
取得したデータと、加工後のデータをどこに置くか考える。

一つひとつは、それほど派手な作業ではありません。
しかし、環境が整っていなければ、
どれほど良さそうなコードがあっても動きません。
必要なライブラリが入っていなければエラーになります。
コードが想定している場所にファイルがなければ、データを読み込めません。

環境やファイル構成が違えば、
ChatGPTが作ったコードをそのまま実行できないこともあります。
競馬AIを作り始めて最初に向き合ったのは、
機械学習の難しい理論ではなく、こうした地道な準備でした。

Pythonコードを一から自分で書くつもりはありませんでした

私は、競馬AI開発を通じてPythonを実践的に使いたいと考えていました。

ただし、Pythonの文法を最初から順番に勉強し、
すべてのコードを自分一人で書くつもりだったわけではありません。
コードは、ChatGPTに作ってもらうつもりでした。

どのような処理が必要なのか。
どのようなデータを扱うのか。
どのような結果が欲しいのか。

私が目的や条件を伝え、ChatGPTにコードを作ってもらう。
私はそのコードを実行し、結果を確認する。
意図と違えば、どこが違うのかを伝えて修正してもらう。
必要に応じてコードを読み、処理の意味を確認する。

そのような形で進めようと考えていました。
コードを書いてもらうからといって、
Pythonを学べないわけではありません。
実際に自分の環境で動かせば、さまざまな疑問が出てきます。

この処理は何をしているのか。
なぜこのライブラリが必要なのか。
このエラーは何を意味しているのか。
どこを変えれば、求めている結果になるのか。

一般的な教材を最初から順番に読むのではなく、
自分が作りたいものに必要な知識としてPythonに触れる。
私にとっては、その方がプロジェクトの進捗と学習を
バランスよく進められるように思えました。

思っていたよりもコードは動きました

実際にChatGPTへ、競馬データを取得するために必要な処理を伝え、
Pythonコードを作ってもらいました。
最初に取り組んだのは、予測モデルそのものではありません。

指定した開催日のレース情報を調べる。
対象となるレースIDを取得する。
各レースのページへアクセスし、HTMLをローカルに保存する。
保存したHTMLから、出走馬やレース結果などの必要な情報を取り出す。

そして、後から分析や学習に使える形へ整えて保存する。
そうした、競馬AIの材料となるデータを集めるための処理でした。

もっと大まかなサンプルコードが出てきて、
そこから自分で大幅に修正する必要があると思っていました。
しかし、取得したい情報や対象となるページ、
保存したい形式などをある程度具体的に伝えると、
想像していたよりも形になったコードが返ってきました。

もちろん、最初から完全に動いたわけではありません。

対象ページの構造を正しく読み取れない。
想定したレースIDを取得できない。
文字コードや保存先の違いでエラーになる。
取得できたHTMLから、必要な情報をうまく抽出できない。

そうした問題は何度も起きました。
それでも、想像していたよりは良い結果でした。
少なくとも、AIが作ったコードは使い物にならない、
という印象ではありませんでした。

エラーの内容や実際に取得できたデータを見せながら修正を繰り返せば、
少しずつ目的の処理へ近づけていける。
その手応えは、開発を続ける大きな理由になりました。

何度もリテイクを繰り返しました

コードが一度で動かなければ、
エラーメッセージをChatGPTへ渡します。

どのコマンドを実行したのか。
どのようなエラーが出たのか。
実際のデータはどのような形なのか。
期待していた結果は何なのか。

状況を説明すると、修正版のコードが返ってきます。
それをもう一度実行します。
また別のエラーが出れば、再び内容を伝えます。
一つの問題を修正すると、今度はその先にある問題が見つかることもありました。
何度もリテイクを繰り返しながら、少しずつ動くものへ近づけていきました。
一度の指示だけで完成品が出てきたわけではありません。

しかし、自分一人で調査しながらすべてを組み立てるより、
かなり速く進められたと感じました。
何より、分からないところで止まり続ける時間が減りました。

エラーへの向き合い方も変わりました

これまでの開発では、エラーが出ると、
まず検索エンジンでエラーメッセージを調べていました。
複数の記事や質問サイトを読み、似た事例を探し、
自分の環境に当てはめて考えます。

もちろん、今でもその方法は必要です。
しかし、ChatGPTと進める開発では、
エラーへの向き合い方が少し変わりました。

エラーメッセージをそのまま渡す。
実行したコードを見せる。
使用しているデータの形式を説明する。

すると、自分の状況を踏まえた修正案が返ってきます。

検索結果の中から自分に近い事例を探すのではなく、
自分の状況そのものについて相談できる。
これは、開発を進めるうえでかなり大きな違いでした。

一方で、ChatGPTの修正案が必ず正しいとは限りません。
一つの問題を直した結果、別の問題が起きることもあります。
こちらの意図やデータ構造を誤解したまま、
もっともらしいコードを返すこともあります。

そのため、出てきたコードをそのまま信じるのではなく、
実行結果を確認し、目的に合っているか判断する必要がありました。
AIがコードを書いてくれても、最終的に正しいかどうかを確認するのは人間です。
この当たり前のことを、実際の開発を通じて少しずつ実感していきました。

本当の壁は、コードよりも会話の継続でした

ChatGPTは、想像していた以上に頼れる存在でした。

方針を相談できる。
コードを作ってもらえる。
エラーの原因を一緒に考えられる。
次に何をすればよいかも整理してもらえる。

しかし、開発が進み、会話が長くなるにつれて、
別の問題が見えてきました。
一つのチャットで長く相談を続けると、
次第にレスポンスが悪くなります。

回答が返ってくるまで時間がかかる。
それまでの話とのつながりが弱くなる。
すでに決めた方針と異なる提案が出てくる。
こちらの意図が伝わりにくくなる。
では、新しいチャットへ移ればよいのか。

そうすると、今度はそれまでの話が引き継がれません。

どのような方針で作っているのか。
どのようなファイルがあるのか。
どこまで完成しているのか。
どのような問題が起きているのか。

それらを、もう一度説明する必要があります。
コードそのものよりも、AIとの間で開発の文脈をどう維持するか。
これが、競馬AI開発を進める中で見えてきた大きな課題でした。

AIは賢い。

しかし、長期間にわたって一緒に開発を続けるためには、
会話の内容やプロジェクトの状態を、人間側でも整理しておく必要があります。
この頃はまだ、そのための良い方法を持っていませんでした。

それでも、開発の形は確実に変わりました

問題はありましたが、ChatGPTと一緒に開発を始めたことで、
開発の形が大きく変わったことは間違いありません。

以前であれば、分からないことを検索する。
記事や公式ドキュメントを読む。
サンプルコードを探す。
自分の環境に合わせて書き換える。
実行し、エラーを調べ、また修正する。

そのように進めていました。
今回は、まずChatGPTに相談します。

必要な処理を説明する。
コードを出してもらう。
実行する。
エラーや結果を返す。
修正してもらい、再び実行する。

人間がコードを一行ずつ書く時間は減りました。
しかし、人間が何もしなくてよくなったわけではありません。

何を作るのかを決める。
AIに必要な情報を伝える。
出力されたコードを確認する。
結果が目的に合っているか判断する。
問題があれば、何が違うのかを説明する。

むしろ、人間の役割が「書くこと」から「考え、伝え、判断すること」へ
移り始めたように感じました。
競馬AIを作るという挑戦は、Pythonや機械学習だけではなく、
AIと一緒に開発する方法を学ぶ挑戦にもなっていました。

次回へ

こうして、競馬AIの開発環境が整い、最初のコードが動き始めました。
まだこの段階では、競馬を予測するモデルが完成したわけではありません。
ようやく、決めた方針を実際の処理へ変えていくための土台ができ始めたところです。

次に必要になったのは、集めた競馬データを、
AIが学習できる形へ整えることでした。

保存したHTMLから何を取り出すのか。
レースや出走馬の情報を、どのような形式で保存するのか。
予測に使うデータとして、何を残し、何を除外するのか。

次回は、取得した競馬データを学習に使える形へ変えていった、
最初の前処理について振り返ってみたいと思います。。