Sanityに移行せずにコンテンツをAI対応にする方法
CMS の世界で今流行っているナラティブがあります。それはこんな感じです。「AI 対応のコンテンツが欲しいなら、Sanity の構造化されたコンテンツアプローチが必要だ」というものです。確かに、Sanity のコンテンツレイクと GROQ パワーの AI インテグレーションは本当に素晴らしいです。しかし、ここが重要なポイントです。ほとんどのチームは既存の CMS を突然放棄することはできません。WordPress に数年分のコンテンツがあります。アプリのデータレイヤーは Supabase に存在しています。6 ヶ月前に Payload CMS への移行を終えたばかりです。別の移行など考えるだけで気が重くなります。
良いニュースがあります。切り替える必要はありません。コンテンツがどのように構造化され、保存され、公開されているかについて、異なる方法で考える必要があるのです。私は過去 1 年間、既存のスタックを AI 消費用に改造するチームを支援してきました。そして、どの CMS やデータベースを実行しているかに関わらず、パターンは驚くほど一貫しています。詳しく説明しましょう。
目次
- 「AI 対応コンテンツ」が実際に意味すること
- Sanity がすべての注目を集める理由
- WordPress でのコンテンツの構造化
- Payload CMS: 思っているより近い
- AI 対応コンテンツレイヤーとしての Supabase
- AI 対応コンテンツの普遍的原則
- AI 抽象化レイヤーの構築
- 完全な移行なしでベクターエンベディング
- 実装例のアーキテクチャパターン
- FAQ
「AI 対応コンテンツ」が実際に意味すること
細かい話に入る前に、実際に何について話しているのかを明確にしましょう。「AI 対応コンテンツ」はマーケティング用語ではありません(まあ、そうですが、その下に実質があります)。これは、コンテンツが 3 つの基準を満たすことを意味します。
- 機械が解析可能な構造 -- AI モデルはコンテキストを推測することなく、コンテンツから確実に意味を抽出できます。
- 豊富なメタデータ -- コンテンツの各部分は、AI が関係、意図、およびコンテキストを理解できるようになるための十分なセマンティック情報を含んでいます。
- API アクセシビリティ -- コンテンツは、AI エージェント、RAG パイプライン、および LLM ツール呼び出しが消費できるプログラム的インターフェイスを通じて利用可能です。
これだけです。リストに含まれていないことに注意してください。特定のベンダーではなく、これらはアーキテクチャパターンであり、製品機能ではありません。
コンテンツインテリジェンススペクトラム
コンテンツの AI 対応性をスペクトラムで考えます。
| レベル | 説明 | 例 |
|---|---|---|
| 0 | HTML の塊 | インラインスタイルと混合メディアの WordPress 投稿 |
| 1 | 関心の分離 | 構造化データマークアップを備えたクリーンな HTML |
| 2 | フィールドレベルの構造 | 型指定されたフィールド(タイトル、概要、本文、著者)に分割されたコンテンツ |
| 3 | セマンティック関係 | 明示的な参照、分類法、エンティティリンク付きのコンテンツ |
| 4 | AI ネイティブ | エンベディング、セマンティック注釈、機械可読意図付きのコンテンツ |
Sanity の構造化コンテンツモデルはデフォルトではレベル 3-4 へ促します。しかし、すべての CMS はレベル 3 に到達でき、追加のインフラストラクチャがあればレベル 4 に到達できます。
Sanity がすべての注目を集める理由
信用を与えるべきところに与えましょう。AI ユースケースのための Sanity の構造化コンテンツへのアプローチは本当によく設計されています。
- Portable Text は、リッチテキストを HTML ではなく JSON AST として格納し、プログラム的に解析するのが簡単です。
- GROQ クエリは、必要なデータの形状を正確に返します。これは LLM コンテキストウィンドウに完璧にマップします。
- Content Lake は、型指定されたドキュメントと明示的な参照のグラフとしてコンテンツを扱います。
- 2025 年の AI SDK インテグレーション により、LLM からコンテンツクエリへの直接ツール呼び出しが可能になります。
しかし、ここが Sanity の伝道者が述べていないことです。これらの利点はアーキテクチャパターンであり、独占的なマジックではありません。これらのすべてを既存のスタックに実装できます。意図的な設計が必要なだけです。
本当の質問は「Sanity に切り替えるべきか?」ではありません。「既に存在する場所で構造化コンテンツの原則をどのように適用するか?」です。
WordPress でのコンテンツの構造化
WordPress は 2025 年のウェブの約 43% を動かしています。WordPress を実行している場合、良い会社にいます。また、思っているより多くのオプションがあります。
ステップ 1: クラシックエディタをすべてに使用するのをやめる
Gutenberg ブロックエディタはコンテンツを構造化ブロックとして既に保存しています。各ブロックには型、属性、コンテンツがあります。これは Sanity の Portable Text よりもほとんどの人が気づくより Sanity に近いです。
{
"blockName": "core/paragraph",
"attrs": {},
"innerBlocks": [],
"innerHTML": "<p>This is structured content, not just HTML.</p>",
"innerContent": ["<p>This is structured content, not just HTML.</p>"]
}
ブロックデータは post_content 内でシリアル化されたコメントとして保存されますが、プログラム的に解析できます。
$blocks = parse_blocks($post->post_content);
$structured = array_map(function($block) {
return [
'type' => $block['blockName'],
'attributes' => $block['attrs'],
'content' => strip_tags($block['innerHTML']),
];
}, array_filter($blocks, fn($b) => $b['blockName'] !== null));
ステップ 2: カスタムフィールドと分類法に投資する
Advanced Custom Fields (ACF) または Meta Box はレベル 2-3 のコンテンツ構造を提供します。しかし、それについて意図的である必要があります。単にフィールドを追加するだけでは -- コンテンツモデルを設計してください。
// AI 消費用の構造化コンテンツタイプを登録
register_post_type('knowledge_article', [
'supports' => ['title', 'custom-fields'],
'show_in_rest' => true, // API アクセスに不可欠
]);
// セマンティックフィールドを定義
acf_add_local_field_group([
'title' => 'AI-Ready Content Fields',
'fields' => [
['key' => 'summary', 'label' => 'Summary', 'type' => 'textarea'],
['key' => 'key_concepts', 'label' => 'Key Concepts', 'type' => 'taxonomy', 'taxonomy' => 'concept'],
['key' => 'content_intent', 'label' => 'Content Intent', 'type' => 'select', 'choices' => [
'informational' => 'Informational',
'transactional' => 'Transactional',
'navigational' => 'Navigational',
]],
['key' => 'related_entities', 'label' => 'Related Entities', 'type' => 'relationship'],
],
]);
ステップ 3: REST API 経由ですべてを公開する
WordPress REST API は AI への橋渡しです。カスタムフィールドが公開されていることを確認してください。
add_action('rest_api_init', function() {
register_rest_field('knowledge_article', 'ai_metadata', [
'get_callback' => function($post) {
return [
'summary' => get_field('summary', $post['id']),
'concepts' => wp_get_post_terms($post['id'], 'concept', ['fields' => 'names']),
'intent' => get_field('content_intent', $post['id']),
'related' => get_field('related_entities', $post['id']),
'structured_blocks' => parse_blocks(get_post_field('post_content', $post['id'])),
];
},
]);
});
WordPress をヘッドレス CMS として実行している場合(Social Animal で私たちが多くの作業をしている)で、Next.js または Astro フロントエンドを使用している場合、この REST API は AI の主要なインターフェイスになります。
ステップ 4: JSON-LD 構造化データを追加する
これは AI 対応性のために見落とされることが多いですが、重要です。Google の AI Overviews とその他の AI クローラーは JSON-LD を消費します。Yoast SEO または RankMath のようなツールは基本的なスキーマを生成しますが、本当の AI 対応性のために、詳細な構造化データを出力したいです。
{
"@context": "https://schema.org",
"@type": "TechArticle",
"headline": "Make Your Content AI-Ready",
"abstract": "How to structure existing CMS content for AI consumption",
"about": [
{"@type": "Thing", "name": "Content Management"},
{"@type": "Thing", "name": "Artificial Intelligence"}
],
"mentions": [
{"@type": "SoftwareApplication", "name": "WordPress"},
{"@type": "SoftwareApplication", "name": "Payload CMS"}
]
}
Payload CMS: 思っているより近い
既に Payload CMS にいる場合は、おめでとうございます -- 追加作業なしでおそらくレベル 2-3 にいます。Payload のコレクションベースのアーキテクチャは、型指定されたフィールドとして本質的に構造化されています。
Payload が既に AI フレンドリーである理由
Payload は MongoDB または Postgres に型指定された JSON ドキュメントとしてコンテンツを保存します。すべてのフィールドには定義された型があります。関係は明示的です。これはまさに AI が必要とするものです。
// 既に AI 対応の Payload コレクション
const Articles: CollectionConfig = {
slug: 'articles',
fields: [
{ name: 'title', type: 'text', required: true },
{ name: 'summary', type: 'textarea' },
{ name: 'body', type: 'richText' }, // Slate/Lexical JSON として保存
{ name: 'topics', type: 'relationship', relationTo: 'topics', hasMany: true },
{ name: 'contentType', type: 'select', options: ['guide', 'tutorial', 'reference'] },
],
};
Payload のリッチテキストエディタ(v3.x の Lexical)は、Sanity の Portable Text のように JSON AST としてコンテンツを保存します。既に構造化されたコンテンツがあります。
Payload に AI 固有のフィールドを追加する
Payload と完全な AI 対応性の間のギャップは主にメタデータについてです。これらのフィールドをコレクションに追加します。
const aiFields: Field[] = [
{
name: 'aiMetadata',
type: 'group',
fields: [
{ name: 'embedding', type: 'json', admin: { hidden: true } },
{ name: 'extractedEntities', type: 'json', admin: { readOnly: true } },
{ name: 'semanticSummary', type: 'textarea', admin: { readOnly: true } },
{ name: 'contentHash', type: 'text', admin: { hidden: true } },
],
},
];
その後、Payload のフックを使用してエンベディングを自動生成します。
const generateEmbeddingHook: CollectionAfterChangeHook = async ({ doc, operation }) => {
if (operation === 'create' || operation === 'update') {
const textContent = extractTextFromLexical(doc.body);
const embedding = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: `${doc.title}\n${doc.summary}\n${textContent}`,
});
await payload.update({
collection: 'articles',
id: doc.id,
data: {
aiMetadata: {
...doc.aiMetadata,
embedding: embedding.data[0].embedding,
contentHash: hashContent(textContent),
},
},
});
}
};
これは基本的に Sanity の AI 機能が内部で実行するものです。自分でそれをしているだけです。Next.js で Payload に構築しているチームの場合、このパターンは既存のデプロイメントパイプラインに自然に統合されます。
AI 対応コンテンツレイヤーとしての Supabase
Supabase は興味深いです。なぜなら、それは CMS ではなく、データベースプラットフォームだからです。しかし、ますます、チームはそれをコンテンツバックエンドとして使用します。特に Supabase の pgvector 拡張機能を使用して。
pgvector の利点
Supabase は 2023 年以来 pgvector をサポートしており、大幅に成熟しています。これはコンテンツとベクターエンベディングを同じデータベースに保存できることを意味します。
-- 拡張機能を有効にする
create extension if not exists vector;
-- エンベディングサポート付きのコンテンツテーブルを作成
create table content (
id uuid default gen_random_uuid() primary key,
title text not null,
body text not null,
metadata jsonb default '{}',
content_type text not null,
embedding vector(1536), -- OpenAI text-embedding-3-small ディメンション
created_at timestamptz default now(),
updated_at timestamptz default now()
);
-- 類似性検索用のインデックスを作成
create index on content using ivfflat (embedding vector_cosine_ops)
with (lists = 100);
AI エージェント用のコンテンツ API の構築
Supabase の自動生成 REST API と Edge Functions は必要なすべてを提供します。
// AI コンテンツ取得用の Supabase Edge Function
import { createClient } from '@supabase/supabase-js';
Deno.serve(async (req) => {
const { query, limit = 5 } = await req.json();
const supabase = createClient(Deno.env.get('SUPABASE_URL')!, Deno.env.get('SUPABASE_KEY')!);
// クエリのエンベディングを生成
const embeddingResponse = await fetch('https://api.openai.com/v1/embeddings', {
method: 'POST',
headers: {
'Authorization': `Bearer ${Deno.env.get('OPENAI_API_KEY')}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'text-embedding-3-small',
input: query,
}),
});
const { data } = await embeddingResponse.json();
const queryEmbedding = data[0].embedding;
// pgvector を使用したセマンティック検索
const { data: results } = await supabase.rpc('match_content', {
query_embedding: queryEmbedding,
match_threshold: 0.7,
match_count: limit,
});
return new Response(JSON.stringify(results), {
headers: { 'Content-Type': 'application/json' },
});
});
類似性マッチング用の Postgres 関数。
create or replace function match_content(
query_embedding vector(1536),
match_threshold float,
match_count int
) returns table (
id uuid,
title text,
body text,
metadata jsonb,
similarity float
) language sql stable as $$
select
content.id,
content.title,
content.body,
content.metadata,
1 - (content.embedding <=> query_embedding) as similarity
from content
where 1 - (content.embedding <=> query_embedding) > match_threshold
order by content.embedding <=> query_embedding
limit match_count;
$$;
これにより、CMS の移行なしで完全に機能的な RAG(Retrieval-Augmented Generation)バックエンドが得られます。コンテンツは Supabase に存在し、AI はセマンティックに照会でき、Astro または Next.js フロントエンドは同じ API を通じてそれを消費できます。
AI 対応コンテンツの普遍的原則
CMS に関わらず、これらの原則が適用されます。
1. コンテンツをプレゼンテーションから分離する
これは最も大きなことです。コンテンツが HTML、CSS クラス、レイアウト上の懸念と絡み合っている場合、AI はそれを確実に解析することはできません。コンテンツをデータとして保存し、プレゼンテーションレイヤーで HTML としてレンダリングします。
2. すべてを型指定する
すべてのフィールドに明示的な型が必要です。構造化されたデータに汎用の「テキスト」フィールドを使用しないでください。日付は日付として保存する必要があります。参照は参照である必要があり、テキストフィールドに貼り付けられたスラッグ文字列ではありません。
3. 関係を明示的にする
記事 A が製品 B を参照する場合、それは型指定された関係である必要があります。本文内の言及ではなく、AI ツールはコンテンツグラフを横断する必要があり、暗黙的なリンクではできません。
4. セマンティックメタデータを追加する
基本的な SEO メタデータを超えてください。次を含めます。
- コンテンツ意図(情報、トランザクション、ナビゲーション)
- 対象者セグメント
- 信頼度/鮮度インジケータ
- エンティティ注釈
- 基本的なカテゴリを超えたトピック分類
5. すべてをバージョン化し、タイムスタンプを付ける
AI システムは、コンテンツがどの程度新しいかを知る必要があります。created_at、updated_at、そして理想的には valid_until または review_date フィールドを含めます。RAG パイプライン内の古いコンテンツは幻覚につながります。
AI 抽象化レイヤーの構築
ここで何度も繰り返されるパターンがあります。CMS を移行する代わりに、その上に AI 抽象化レイヤーを追加します。
[WordPress/Payload/Supabase] → [Content Sync] → [AI Layer (pgvector/Pinecone)] → [AI Consumers]
AI レイヤーは以下を実行します。
- ソースからのコンテンツを同期 Webhook またはポーリング経由でお使いの CMS から
- それを正規化 ソースに関わらず一貫した構造への
- エンベディングを生成 正規化されたコンテンツと共に保存
- AI 最適化 API を公開 RAG、ツール呼び出し、セマンティック検索用
// 簡略版のコンテンツ同期パイプライン
interface NormalizedContent {
id: string;
source: 'wordpress' | 'payload' | 'supabase';
sourceId: string;
title: string;
body: string; // マークアップなしのプレーンテキスト
structuredBody: object; // 利用可能な場合は JSON AST
metadata: {
type: string;
intent: string;
topics: string[];
entities: string[];
createdAt: string;
updatedAt: string;
};
embedding?: number[];
}
async function syncContent(source: ContentSource): Promise<void> {
const rawContent = await source.fetchAll();
for (const item of rawContent) {
const normalized = source.normalize(item);
const embedding = await generateEmbedding(
`${normalized.title}\n${normalized.body}`
);
await aiLayer.upsert({
...normalized,
embedding,
});
}
}
このアプローチには大きな利点があります。編集者は知っている CMS を使い続けることができます。再トレーニングなし、移行なし、ダウンタイムなし。AI レイヤーは既存のスタックと並行して存在します。
完全な移行なしでベクターエンベディング
2025 年のコスト とツーリングについて話しましょう。実際の決定に重要です。
| エンベディング プロバイダ | モデル | 1M トークンあたりのコスト | ディメンション | メモ |
|---|---|---|---|---|
| OpenAI | text-embedding-3-small | $0.02 | 1536 | 最高のコスト/品質比 |
| OpenAI | text-embedding-3-large | $0.13 | 3072 | より高い精度 |
| Cohere | embed-v4 | $0.10 | 1024 | 多言語サポートが良い |
| Voyage AI | voyage-3 | $0.06 | 1024 | コンテンツに対して強い |
| ローカル (Ollama) | nomic-embed-text | 無料 | 768 | プライバシーファースト オプション |
平均 1,500 語の 5,000 記事のある典型的なコンテンツサイトの場合、およそ 7.5M トークンを見ています。OpenAI の小モデルを使用すると、それはエンティアコンテンツライブラリを埋め込む約 $0.15 です。毎週再度埋め込むことさえ無視できます。
ベクターストレージオプション
| ソリューション | 無料ティア | 料金 (2025) | 最適な用途 |
|---|---|---|---|
| Supabase pgvector | 500MB データベース | $25/月 8GB の場合 | 既に Supabase にいるチーム |
| Pinecone | 5M ベクトル | $70/月 スターター | 大規模で本番稼働中の RAG |
| Qdrant Cloud | 1GB クラスター | $25/月 | 高度なフィルタリングが必要 |
| Weaviate Cloud | 50k オブジェクト | $25/月 | マルチモーダルコンテンツ |
| Turbopuffer | 1M ベクトル | クエリあたり従量課金 | コスト意識的なプロジェクト |
既に Supabase を実行している場合、pgvector が明らかな選択肢です。追加のサービスなし、追加の課金なし、追加の障害点なし。
実装例のアーキテクチャパターン
実装した 2 つのアーキテクチャを共有しましょう。
パターン 1: WordPress + Supabase AI レイヤー
50k 以上の WordPress 投稿のメディア企業の場合。
- WordPress Webhook は投稿の保存/更新時に起動
- Supabase Edge 関数は Webhook を受け取ります
- コンテンツは WP REST API 経由で取得され、正規化され、埋め込まれます
- Supabase に pgvector で保存
- Next.js フロントエンドの AI チャットボットは Supabase にセマンティック検索をクエリ
- 結果は回答生成のコンテキストとして GPT-4o に渡されます
総追加インフラコスト: Supabase pro ティア用月額約 $25。
パターン 2: Payload CMS と組み込み AI
Payload v3 上の SaaS ドキュメントサイトの場合。
- Payload フックはドキュメント保存時にエンベディングを生成
- エンベディングは Payload が使用するのと同じ Postgres データベースの
vector列に保存 - セマンティック検索用のカスタム Payload エンドポイント
- 同じデータベースを搭載した AI ドキュメントアシスタント
- 外部ベクターストアは不要
総追加インフラコスト: OpenAI API 呼び出しを超える Payload v3 のティア $0(月額数セント)。
両方のパターンは実装に約 2-3 週間かかりました。完全な CMS 移行が取る 3-6 ヶ月と比較します。このようなアーキテクチャを検討している場合、これらのタイプのプロジェクトをカバーする 料金ティア があります。
AI 対応コンテンツの普遍的原則
CMS に関わらず、これらの原則が適用されます。
1. コンテンツをプレゼンテーションから分離する
これは最も大きなことです。コンテンツが HTML、CSS クラス、レイアウト上の懸念と絡み合っている場合、AI はそれを確実に解析することはできません。コンテンツをデータとして保存し、プレゼンテーションレイヤーで HTML としてレンダリングします。
2. すべてを型指定する
すべてのフィールドに明示的な型が必要です。構造化されたデータに汎用の「テキスト」フィールドを使用しないでください。日付は日付として保存する必要があります。参照は参照である必要があり、テキストフィールドに貼り付けられたスラッグ文字列ではありません。
3. 関係を明示的にする
記事 A が製品 B を参照する場合、それは型指定された関係である必要があります。本文内の言及ではなく、AI ツールはコンテンツグラフを横断する必要があり、暗黙的なリンクではできません。
4. セマンティックメタデータを追加する
基本的な SEO メタデータを超えてください。次を含めます。
- コンテンツ意図(情報、トランザクション、ナビゲーション)
- 対象者セグメント
- 信頼度/鮮度インジケータ
- エンティティ注釈
- 基本的なカテゴリを超えたトピック分類
5. すべてをバージョン化し、タイムスタンプを付ける
AI システムは、コンテンツがどの程度新しいかを知る必要があります。created_at、updated_at、そして理想的には valid_until または review_date フィールドを含めます。RAG パイプライン内の古いコンテンツは幻覚につながります。
AI 抽象化レイヤーの構築
ここで何度も繰り返されるパターンがあります。CMS を移行する代わりに、その上に AI 抽象化レイヤーを追加します。
[WordPress/Payload/Supabase] → [Content Sync] → [AI Layer (pgvector/Pinecone)] → [AI Consumers]
AI レイヤーは以下を実行します。
- ソースからのコンテンツを同期 Webhook またはポーリング経由でお使いの CMS から
- それを正規化 ソースに関わらず一貫した構造への
- エンベディングを生成 正規化されたコンテンツと共に保存
- AI 最適化 API を公開 RAG、ツール呼び出し、セマンティック検索用
// 簡略版のコンテンツ同期パイプライン
interface NormalizedContent {
id: string;
source: 'wordpress' | 'payload' | 'supabase';
sourceId: string;
title: string;
body: string; // マークアップなしのプレーンテキスト
structuredBody: object; // 利用可能な場合は JSON AST
metadata: {
type: string;
intent: string;
topics: string[];
entities: string[];
createdAt: string;
updatedAt: string;
};
embedding?: number[];
}
async function syncContent(source: ContentSource): Promise<void> {
const rawContent = await source.fetchAll();
for (const item of rawContent) {
const normalized = source.normalize(item);
const embedding = await generateEmbedding(
`${normalized.title}\n${normalized.body}`
);
await aiLayer.upsert({
...normalized,
embedding,
});
}
}
このアプローチには大きな利点があります。編集者は知っている CMS を使い続けることができます。再トレーニングなし、移行なし、ダウンタイムなし。AI レイヤーは既存のスタックと並行して存在します。
完全な移行なしでベクターエンベディング
2025 年のコストとツーリングについて話しましょう。実際の決定に重要です。
| エンベディング プロバイダ | モデル | 1M トークンあたりのコスト | ディメンション | メモ |
|---|---|---|---|---|
| OpenAI | text-embedding-3-small | $0.02 | 1536 | 最高のコスト/品質比 |
| OpenAI | text-embedding-3-large | $0.13 | 3072 | より高い精度 |
| Cohere | embed-v4 | $0.10 | 1024 | 多言語サポートが良い |
| Voyage AI | voyage-3 | $0.06 | 1024 | コンテンツに対して強い |
| ローカル (Ollama) | nomic-embed-text | 無料 | 768 | プライバシーファースト オプション |
平均 1,500 語の 5,000 記事のある典型的なコンテンツサイトの場合、およそ 7.5M トークンを見ています。OpenAI の小モデルを使用すると、それはエンティアコンテンツライブラリを埋め込む約 $0.15 です。毎週再度埋め込むことさえ無視できます。
ベクターストレージオプション
| ソリューション | 無料ティア | 料金 (2025) | 最適な用途 |
|---|---|---|---|
| Supabase pgvector | 500MB データベース | $25/月 8GB の場合 | 既に Supabase にいるチーム |
| Pinecone | 5M ベクトル | $70/月 スターター | 大規模で本番稼働中の RAG |
| Qdrant Cloud | 1GB クラスター | $25/月 | 高度なフィルタリングが必要 |
| Weaviate Cloud | 50k オブジェクト | $25/月 | マルチモーダルコンテンツ |
| Turbopuffer | 1M ベクトル | クエリあたり従量課金 | コスト意識的なプロジェクト |
既に Supabase を実行している場合、pgvector が明らかな選択肢です。追加のサービスなし、追加の課金なし、追加の障害点なし。
実装例のアーキテクチャパターン
実装した 2 つのアーキテクチャを共有しましょう。
パターン 1: WordPress + Supabase AI レイヤー
50k 以上の WordPress 投稿のメディア企業の場合。
- WordPress Webhook は投稿の保存/更新時に起動
- Supabase Edge 関数は Webhook を受け取ります
- コンテンツは WP REST API 経由で取得され、正規化され、埋め込まれます
- Supabase に pgvector で保存
- Next.js フロントエンドの AI チャットボットは Supabase にセマンティック検索をクエリ
- 結果は回答生成のコンテキストとして GPT-4o に渡されます
総追加インフラコスト: Supabase pro ティア用月額約 $25。
パターン 2: Payload CMS と組み込み AI
Payload v3 上の SaaS ドキュメントサイトの場合。
- Payload フックはドキュメント保存時にエンベディングを生成
- エンベディングは Payload が使用するのと同じ Postgres データベースの
vector列に保存 - セマンティック検索用のカスタム Payload エンドポイント
- 同じデータベースを搭載した AI ドキュメントアシスタント
- 外部ベクターストアは不要
総追加インフラコスト: OpenAI API 呼び出しを超える $0(月額数セント)。
両方のパターンは実装に約 2-3 週間かかりました。完全な CMS 移行が取る 3-6 ヶ月と比較します。このようなアーキテクチャを検討している場合、これらのタイプのプロジェクトをカバーする 料金ティア があります。
FAQ
AI 対応にするためにコンテンツを本当に再構成する必要がありますか?それはハイプですか?
それはハイプではありませんが、緊急性はあなたのユースケースに依存します。AI 機能(チャットボット、セマンティック検索、パーソナライズ)を構築している場合、構造化されたコンテンツは必須です。Google の AI Overviews または ChatGPT の閲覧などの AI 駆動の検索に対して最適化している場合、構造化データとクリーンなコンテンツ階層はあなたの可視性を測定可能に向上させます。Authoritas による 2025 年の研究では、スキーママークアップを使用するページは AI 生成の回答に表示される可能性が 40% 高いことを発見しました。
WordPress コンテンツを AI 対応にするために最小限でするべきことは何ですか?
3 つのことがあります。(1) HTML を貼り付ける代わりに Gutenberg ブロックを一貫して使用、(2) すべてのページに JSON-LD 構造化データを追加、(3) カスタムフィールドを REST API 経由で公開。これにより、数週間の焦点を当てた作業でレベル 0-1 からレベル 2-3 に到達します。一晩で全サイトを再構成する必要はありません。
Payload CMS は AI パワーコンテンツの場合 Sanity を置き換えることができますか?
ほとんどのユースケースでは、はい。Payload v3 と Lexical リッチテキストは構造化 JSON としてコンテンツを保存し、型指定されたフィールドと関係を持ち、pgvector 付き Postgres をサポートします。Payload がネイティブに持っていない主な事項は、Sanity が提供する管理 Content Lake を備えた組み込み AI 機能です。しかし、独自のエンベディングパイプラインをワイアアップする場合(約 1 日かかります)、Payload はそれと同等の機能を提供します。
既存の CMS にベクターエンベディングを追加するのにいくらかかりますか?
驚くほど少ない。10,000 記事のサイトの場合、OpenAI の text-embedding-3-small による初期エンベディング生成は約 $0.30 かかります。更新されたコンテンツを再度埋め込むための継続的なコストは通常月額 $5 未満です。ベクターストレージはより大きなコストです。プロバイダとスケールに応じて月額 $0-70 を予想します。Supabase の無料ティアは多くの小〜中規模サイトを処理できます。
個別のベクターデータベースまたは既存のデータベースにエンベディングを保存する必要がありますか?
Postgres を使用している場合(Payload v3 と Supabase の両方が使用)、pgvector で同じデータベースにエンベディングを保存します。管理するサービスが 1 つ少なく、同期する 1 つが少ない。Pinecone のような専用ベクターデータベースは、数百万のドキュメントがある場合、または 1 ミリ秒以下のクエリ時間が必要な場合に意味があります。ほとんどのコンテンツサイトでは、pgvector は十分に高速です -- 1M ベクトル未満のコレクションの場合、一般的なクエリ時間は 5-20ms です。
AI エンベディングがコンテンツの変更と同期を保つにはどうすればよいですか?
Webhook があなたの友達です。モダンな CMS はすべてそれらをサポートします。コンテンツが作成または更新されたとき、再度埋め込みをトリガーする Webhook を起動します。エンベディングと共にコンテンツハッシュを保存して、変更されていないコンテンツをスキップできます。WordPress の場合は、save_post アクションを使用します。Payload の場合、afterChange フックを使用します。Supabase の場合、データベーストリガーまたはリアルタイム購読を使用します。
複数の言語でのコンテンツについてはどうですか -- このアプローチはまだ機能しますか?
はい。ただし、エンベディング モデルを慎重に選択します。OpenAI の text-embedding-3 モデルは多言語コンテンツをよく処理します。Cohere の embed-v4 は言語間検索専用に最適化されています。正規化レイヤーは言語コードをメタデータとして保存して、AI コンシューマーが適切にフィルタリングできるようにします。重要な注記: 翻訳を連結するのではなく、各言語バージョンを個別に埋め込みます。
AI 対応コンテンツの前提条件としてヘッドレス CMS に移行する必要がありますか?
前提条件ではありませんが、かなり役に立ちます。ヘッドレス CMS アーキテクチャは自然にコンテンツをプレゼンテーションから分離し、これは AI 対応性の基礎です。まだモノリシックな WordPress テーマを実行していて、コンテンツがテンプレートファイルに焼き込まれている場合は、ヘッドレス(Next.js または Astro フロントエンド付きのバックエンドとしての WordPress)への移行は同時にあなたの AI 対応性とフロントエンドパフォーマンスを向上させます。AI ユースケースを検討する前でも、投資の価値があります。これを探索したい場合は、お問い合わせください -- これはリテラルに毎日行っていることです。