このブログにカテゴリ機能を作った。たとえば「ポケモン25周年動画の元ネタを全部調べた」には「Game」、「VS Code 1.53はCentOS7で動かない」には「Technology」というように、記事ごとにカテゴリが付いた。そして、このカテゴリ情報は私が入力したものではなく GCP Natural Language APIを利用して自動で分類している

このブログの現在のインフラ構成はこうなっている。

普通に考えれば、ブログにカテゴリ機能を追加したいならCMSを担うRailsに記事メタデータとしてカテゴリ入力欄をひとつ追加すればおしまい。だけど今回は、 CMSであるRailsを一切触らずに自動でカテゴリが付けられるシステム を構築することにして、上記のような構成になった。

GCP Natulal Language API

https://cloud.google.com/natural-language/docs/basics?hl=ja

GCPの提供するモデル構築済のテキスト分類AIサービス。ブログデータを使ってそれらしいカテゴリ分類できる物がこれしかなかった。日本語に対応していないため、同じくGCPのTranslation API で記事データを一旦英語にしてから突っ込んだ。

もう少し技術的な事は下記Qiita記事に書いている。

このCloud Natural Languageが一応今回の主役だが、上記の構成を構築するのが結構手間だったので相対的にそこまで色々触ったりできていない。

Apollo ServerとFirebase Realtime Database

AIの実行結果をRailsの返す記事データと一緒にして、Next.jsで使う必要がある。ここでは Apollo Server を立ててデータとを一緒にした GraphQL Server を用意することにした。たぶんBackends for Frontends(BFF)というデザインパターン。

今回のNatulal Language APIは比較的気軽に使えるけど、もう少しコストの高いAI系サービスを非同期で実行することも想定して、先程のAIを実行するPythonプログラムはFastAPIに乗せて実行結果を一旦 Firebase Realtime Database に保存してき、Apollo Serverでは Realtime Databaseから結果を取得することにした。

GCP CloudRun

Apollo ServerとFastAPIの実行には GCP CloudRun を使った。Next.jsもStatic Site Generationで使っているので、これらのAPIは常時起動が必要ない。CloudRunはリクエストをさばいている時間に対する従量課金であり、放っておくと勝手にゼロスケールするので、こういったバッチ処理的なAPIや非同期処理等ではコストを大幅に削ることができる。

画像の出典