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点を探します。
- まだコンテンツがない新しいエントリ。
- 低品質な
seededまたはfallbackコンテンツしか持っていない既存のエントリ。
スクリプトはこれらを人気順に並べ替えます。最も訪問数が多いページから優先的にアップグレードを行います。これにより、トラフィックの多いページに即座に最高のコンテンツを提供できます。
このプロセスは完全に自動化されており、べき等性(idempotent)も備えています。私は upsert パターンを使用しています。アップグレードが成功すると、データベースは古い fallback コンテンツを新しいAIコンテンツで上書きします。model_used カラムも自動的に更新されます。
また、Anthropicのプロンプトキャッシュも活用しています。これにより、コストとトークンを大幅に節約できます。システムプロンプトはすべてのエントリで共通であるため、最初の呼び出しでキャッシュが準備されます。そのバッチ内の次の99回の呼び出しは、より低コストでそのキャッシュから読み込まれます。
主要なアーキテクチャの選択肢:
- エラーハンドリング: Claudeが失敗しても、システムはクラッシュしません。単に
fallbackテンプレートを書き込み、次のアイテムへ進みます。 - SEOの安全性: ページに有用なコンテンツが全くない場合は、
noindexタグを使用します。これにより、Googleが空のページをインデックスするのを防ぎます。 - 静的ビルド: データベースをAstro用のJSONファイルとしてエクスポートします。これにより、データベースやAI APIに障害が発生しても、サイトはオンラインを維持できます。
この構成により、サイトの安定性を損なうことなく、迅速な構築が可能になります。
