blog-start-header

ブログサイト(+競馬予想AI)作りました

2024/09/01
2025/01/30
関連ワード:AIdjangonextjspython

AIの勉強もかねて競馬予想AIを作っていたのですが、どうせならwebで公開しようかと思ったので作りました。どうせ作るなら腰が重くてやれなかったブログも始めてみたいなと思い、ブログの機能も実装しました。

これから記事を投稿し続けられたらなと思います。

仕様・構成

フロントエンド

言語:typescript

フレームワーク:next.js

スタイル:tailwind、daisyUI

バックエンド

言語:python

フレームワーク:Django、wagtail

データベース: PostgreSQL

サーバーアプリケーション: uWSGI

その他

ホスティング:vercel

サーバーアプリケーション:nginx

アーキテクチャは以下のようになっています。

アーキテクチャ図

nginxを経由してnext.jsとdjango間でAPIを通信を行い、得たデータを元にページを生成しています。

ブログについて

仕様からもわかると思いますが、基本的にpythonのDjangoサーバーで持っているデータをnext.jsがAPIを叩いて取得することでページを生成しています。

バックエンド

もともとAIをpythonで作っていたので、

  • Django
  • Flask
  • FastAPI

あたりが候補でしたが一番多機能なDjangoを選びました。

CMSの機能を1から作るのはさすがにできないのでwagtailを使いました。

DjangoベースのCMSライブラリはwagtail以外にもいくつかありますが、

  • 使いやすいUI
  • 画像やPDFといった静的ファイルの管理が楽
  • カスタマイズ性に優れている

といった特徴があり、一番勢いがあるので選びました。

CMSの大枠部分はwagtailが用意してくれているので、

  • モデル定義
  • REST APIの機能追加
  • 使用するデータベースの変更

などを実装しました。

バックエンドのサーバー起動にはuwsgiを使用しています。


フロントエンド

nextjsで作成していて、ページごとにISRとSSRを使い分けています。

ブログページは、コンテンツの更新が頻繁にあるわけではないのでISR、競馬予想ページはオッズなど最新の情報が必要なのでSSRで実装しています。

スタイル周りはなるべく楽に進めたかったので、 クラス名でスタイリングができるtailwindcssと、コンポーネントライブラリのdaisyUIも使用しています。

競馬予想AIについて

3着以内に入る馬を予想し、確率が高い馬を5匹選んで印を打っています。

の順で確率が高いです(△については2頭選ばれます)。

レースの1,2日前に体重と印以外の項目が反映されます。体重と印については大体レースの30分前くらいに反映されます。

ちょっと動作が不安定なところがあり、時々予想がされていないときもあるので、ここは何か対策をする予定です。

学習用データの収集からモデルの作成まで試行錯誤しながら1年ぐらいかけて作りました。

現状精度がよくないので、データ項目を増やすなりモデル自体を変えてみるなりで少しずつ精度を上げていけたらなと思っています。

作ったAIの詳細は後日記事にしようと思います。

終わりに

ブログ部分も競馬予想AIも改良点がいろいろありますが、色々触って完成させる前に飽きてやめることが多かった自分としては

  • 途中でやめずに完成させた
  • 今まで作った(作ろうとした)ものの中では一番規模が大きい
  • 0からアプリケーションを作成できた

ということもあり、今回の開発は結構満足してます。

ブログに関しては方針もろくに定まっていないですが、とりあえず記事を書いていくのを続けるように頑張ろうと思います。