はじめに
前回の記事では、コーディング未経験からMirai Signalという海外テックメディアを1ヶ月で作った話を書きました。
今回はその中核となる「AIパイプライン」の仕組みを概説します。
どうやってAPIリクエスト数を最小限に抑えながら、質の高いスコアリング・翻訳を実現したかというのがこの記事のテーマです。
👉 実際のサイト:https://mirai-signal-web-kzfb.vercel.app
パイプラインの全体像
毎日100件以上入ってくる海外ニュースを、以下の流れで処理しています。
海外ニュース収集(RSS・HackerNews・arXivなど)
↓
Gemini APIでスコアリング・分類・翻訳
↓
閾値以上の記事のみ承認待ちに
↓
手動承認
↓
サイト公開・ニュースレター配信
AIがやっていることは大きく5つです。
- 重要度スコアリング
- 分野分類(AI・Robotics・Biotechなど7分野)
- 日本語タイトル生成
- 英語要約
- 日本語要約
これを1回のAPI呼び出しでまとめてやらせています。
工夫した点①:バッチ処理でAPI使用量を削減
最初は1記事1APIコールで実装していましたが、Gemini APIの無料枠は1日20リクエストまで。100件を処理するには5日かかる計算です。
そこで複数記事をまとめて1回のAPIコールで処理する方式に変更しました。
1記事 × 100コール → NG(無料枠オーバー)
↓
複数記事まとめて × 20コール → OK(無料枠内で処理完了)
Geminiに複数記事のタイトルをまとめて渡して、JSON配列で返してもらいます。レスポンスのパースには少し工夫が必要でしたが、安定して動くようになりました。
工夫した点②:スコアリングの設計
単純な「重要度」だけでなく、複数の観点から記事を評価しています。
ポイントは「今バズっているかどうか」ではなく、「長期的に重要な変化かどうか」を検知することです。
具体的なスコアリングの項目や閾値は公開していませんが、設計の方向性としては以下を重視しています。
- 技術的な深度があるか
- 将来への影響が大きいか
- 新規性・独自性があるか
- 単なるトレンドではなく本質的な変化か
この基準で選ばれた記事だけがサイトに掲載されます。
工夫した点③:エラー処理の設計
AIを使ったシステムで一番大変なのはエラー処理です。
実際に経験した問題と対処法を紹介します。
API制限エラー
無料枠を使い切ると429エラーが返ってきます。最初はリトライを繰り返すコードにしていたため、制限に達しても何十分も動き続けるという問題がありました。制限エラーを検知したら即座に終了して翌日に持ち越す方式にして解決しました。
バッチ処理の失敗
複数記事をまとめて処理する際、AIが期待通りのフォーマットで返してくれないことがあります。その場合は自動的に1件ずつの処理に切り替えるフォールバックを実装しました。
GitHub Actionsで毎日自動実行
このパイプラインはGitHub Actionsで毎朝7時(JST)に自動実行されます。
on:
schedule:
- cron: '0 22 * * *' # UTC 22:00 = JST 7:00
朝起きたら新しい記事が承認待ちになっている、という状態を毎日維持できています。
まとめ
工夫したポイントをまとめると以下のとおりです。
- 複数記事をまとめてAPIに送ることで使用量を大幅削減
- 「今バズっているか」ではなく「長期的に重要か」を基準に設計
- バッチ失敗時のフォールバック処理を必ず実装する
- API制限エラーは即終了して翌日に持ち越す
詳細な実装は公開していませんが、考え方の参考になれば嬉しいです。
Mirai Signalはまだ成長中です。興味があればぜひ見てみてください。
👉 https://mirai-signal-web-kzfb.vercel.app
X(Twitter)でも毎日情報発信しています。→ @MqS_quest
前回の記事:コーディング未経験の大学1年生がNext.js+Supabase+Gemini APIで海外テックメディアを1ヶ月で作った話