3層のコンテンツ品質ラダーを構築した方法

プログラマティックなウェブサイトのスケールアップは容易ではありません。コンテンツ作成をAIだけに頼っていると、APIがダウンした際にサイトが機能しなくなります。

私は「Top AI Tools」、「Find Games Like」、「Open Alternative To」という3つのディレクトリサイトを立ち上げました。AIとの接続が切れている状態でも常に情報を表示できるよう、3層のコンテンツラダーを採用しています。

このシステムでは、データベース内の model_used という単一のカラムを使用しています。これにより、3つの品質レベルを管理しています。

  • seeded-from-json: ファイルからの基本データ。構造化されていますが、内容は薄いです。
  • fallback-template: AIが失敗した場合やAPIキーが不足している場合に使用される標準テンプレート。技術的には正確ですが、個性に欠けます。
  • claude-haiku-4-5: 目標とする状態。高品質な編集済みサマリーと、ニュアンスを含んだ詳細な情報を提供します。

アップグレードの管理には、特定のSQLクエリを使用しています。スクリプトは以下の2点を探します。

  1. まだコンテンツがない新しいエントリ。
  2. 低品質な seeded または fallback コンテンツしか持っていない既存のエントリ。

スクリプトはこれらを人気順に並べ替えます。最も訪問数が多いページから優先的にアップグレードを行います。これにより、トラフィックの多いページに即座に最高のコンテンツを提供できます。

このプロセスは完全に自動化されており、べき等性(idempotent)も備えています。私は upsert パターンを使用しています。アップグレードが成功すると、データベースは古い fallback コンテンツを新しいAIコンテンツで上書きします。model_used カラムも自動的に更新されます。

また、Anthropicのプロンプトキャッシュも活用しています。これにより、コストとトークンを大幅に節約できます。システムプロンプトはすべてのエントリで共通であるため、最初の呼び出しでキャッシュが準備されます。そのバッチ内の次の99回の呼び出しは、より低コストでそのキャッシュから読み込まれます。

主要なアーキテクチャの選択肢:

  • エラーハンドリング: Claudeが失敗しても、システムはクラッシュしません。単に fallback テンプレートを書き込み、次のアイテムへ進みます。
  • SEOの安全性: ページに有用なコンテンツが全くない場合は、noindex タグを使用します。これにより、Googleが空のページをインデックスするのを防ぎます。
  • 静的ビルド: データベースをAstro用のJSONファイルとしてエクスポートします。これにより、データベースやAI APIに障害が発生しても、サイトはオンラインを維持できます。

この構成により、サイトの安定性を損なうことなく、迅速な構築が可能になります。

出典: https://dev.to/morinaga/how-i-built-a-three-tier-content-quality-ladder-for-programmatic-directory-etl-483