毎日、ますます多くの人々がChatGPT、Perplexity、その他のAIツールを使用してコンテンツを検索し、要約しています。SEO to SAOに関する以前の投稿で議論したように、ウェブサイトやブログへのアクセス数の大部分がAIエージェントからのものになるのは時間の問題です。
言語モデルがコンテンツにアクセスできるようにするにあたり、複雑なクローリングソリューションよりも簡単な方法があります。特にAstroで構築された静的なサイトの場合です。この記事では、ブログのコンテンツをクリーンで構造化された形式でLLMに公開するllms.txtファイルの作成方法を説明します。
llms.txtとは?
llms.txtファイルは、概念的にはrobots.txtに似ていますが、言語モデル専用に設計されています。これは、LLMが解析および理解しやすい、コンテンツの構造化されたテキストベースの表現を提供します。
LLMは、リンクを介して複数のページをナビゲートすることは得意ではありません。代わりに、LLMは単一のページからコンテンツをスクレイピングし、それをメモリに保存することが非常に得意です。ここでllms.txtが非常に貴重になります。
Crawl4AIのようなクローリングツールが大げさになる可能性がある理由
Crawl4AIのようなツールは、LLM向けの強力なウェブサイトクローリング機能を提供します。これらは動的なサイトのLLMs.txtの生成に最適ですが、静的なサイトには大げさになる可能性があります。
特にAstroサイトでは、コンテンツは通常、フロントマター付きのmarkdownファイルとして保存され、すでに直接公開できる完全に構造化されたコンテンツが用意されています。
Astroでllms.txtエンドポイントを実装する
AstroサイトのLLMs.txtファイルを生成する方法を次に示します。
src/pages/llms.txt.ts(またはAstro構成に応じてsrc/pages/api/llms.txt.ts)にファイルを作成し、次のコードを追加します。
import { getCollection } from "astro:content";
import type { APIRoute } from "astro";
export const GET: APIRoute = async () => {
try {
// Fetch all content collections
const [blogs, features, transcriptions, alternatives, help] = await Promise.all([
getCollection("blog"),
getCollection("features"),
getCollection("transcription"),
getCollection("alternatives"),
getCollection("help")
]);
// Sort blogs by date (newest first)
const sortedBlogs = blogs
.filter(post => !post.data.draft)
.sort((a, b) => new Date(b.data.date).getTime() - new Date(a.data.date).getTime());
// Filter non-draft content
const activeFeatures = features.filter(item => !item.data.draft);
const activeTranscriptions = transcriptions.filter(item => !item.data.draft);
const activeAlternatives = alternatives.filter(item => !item.data.draft);
const content = `# あなたのウェブサイト名 - 完全なコンテンツガイド
このドキュメントには、ウェブサイトの完全なコンテンツが含まれています。
ウェブサイト: https://yourwebsite.com
最終更新日: ${new Date().toISOString().split('T')[0]}
## ブログコンテンツ
${sortedBlogs
.map((post) => `#
## ${post.data.title}
URL: https://yourwebsite.com/blog/${post.data.slug || post.id}
公開日: ${post.data.date}
カテゴリ: ${post.data.category}
著者: ${post.data.author}
説明: ${post.data.description}
${post.body}
---`).join('\n\n')}
## その他のコンテンツセクション
${activeFeatures
.map((feature) => `#
## ${feature.data.title}
URL: https://yourwebsite.com/${feature.data.slug}
カテゴリ: ${feature.data.category}
${feature.data.description}
${feature.body}
---`).join('\n\n')}
---
このコンテンツは、AIアシスタントがウェブサイトの提供内容を理解し、正確な情報を提供できるようにするために提供されています。`;
return new Response(content, {
headers: {
"Content-Type": "text/plain; charset=utf-8",
"Cache-Control": "public, max-age=3600" // 1時間キャッシュ
},
});
} catch (error) {
console.error('llms.txtの生成エラー:', error);
return new Response('llms.txtの生成エラー', { status: 500 });
}
};
このコードの仕組み
このコードは、次のことを行うAPIエンドポイントを作成します。
getCollection()を使用して、コンテンツコレクションからすべての投稿をフェッチします- 下書きコンテンツを除外して、公開された記事のみを含めます
- コンテンツを日付でソートして、最新のコンテンツを最初に表示します
- サイトタイトルで始まる構造化されたテキストファイルを作成します
- 各投稿に以下を含めます:
- 見出しとしての投稿タイトル
- 投稿への直接リンク
- メタデータ(日付、カテゴリ、著者、説明)
- 投稿コンテンツ全体
- 適切なエラーログでエラーを適切に処理します
- パフォーマンスのためにキャッシュを含む適切なヘッダーを設定します
コンテンツ構造に合わせてカスタマイズする
コレクション名を調整する
上記の例では、複数のコレクションを使用しています。ブログコレクションしかない場合は、簡略化します。
export const GET: APIRoute = async () => {
const posts = await getCollection("blog"); // コレクション名に合わせて調整してください
const publishedPosts = posts
.filter(post => !post.data.draft)
.sort((a, b) => new Date(b.data.date).getTime() - new Date(a.data.date).getTime());
const content = `# あなたのブログ名
${publishedPosts
.map((post) => `# ${post.data.title}
https://yourwebsite.com/blog/${post.data.slug || post.id}
${post.data.description}
${post.body}
`).join('\n\n')}`;
return new Response(content, {
headers: { "Content-Type": "text/plain; charset=utf-8" },
});
};
コンテンツフィルタリングの追加
特定のカテゴリを除外したり、おすすめコンテンツのみを含めたりすることができます。
// おすすめの投稿のみを含めます
const featuredPosts = posts.filter(post => post.data.featured && !post.data.draft);
// 特定のカテゴリを除外します
const filteredPosts = posts.filter(post =>
!post.data.draft && !['internal', 'private'].includes(post.data.category)
);
llms.txtを使用する利点
1. AIの発見可能性の向上
AIツールは、複数のページをクロールすることなく、コンテンツライブラリ全体をすばやく理解できます。
2. AI応答のためのより良いコンテキスト
ユーザーがコンテンツに関連する質問をすると、AIモデルは包括的で構造化された情報にアクセスできます。
3. AI時代のSEO
検索がAI搭載の結果へと進化するにつれて、AI消費のための構造化されたコンテンツを持つことが重要になります。
4. パフォーマンス上の利点
静的生成とは、llms.txtファイルがビルド時に作成されることを意味し、高速な応答時間を提供します。
llms.txtの実装をテストする
エンドポイントを実装した後、次の方法でテストします。
- エンドポイントに直接アクセスします:
https://yoursite.com/llms.txt - コンテンツ構造を確認して、すべての投稿が含まれていることを確認します
- フォーマットがクリーンで読みやすいことを確認します
- llms.txtコンテンツを分析するように依頼してAIツールでテストします
llms.txtのベストプラクティス
コンテンツを最新の状態に保つ
新しいコンテンツを公開するときは、サイトを再構築してllms.txtを定期的に更新します。
関連するメタデータを含める
AIがコンテキストを理解するのに役立つように、公開日、カテゴリ、および説明を追加します。
コンテンツを明確に構造化する
一貫した見出し形式と、セクション間の明確な区切りを使用します。
ファイルサイズを監視する
数百もの投稿があるサイトの場合は、コンテンツをページ分割またはフィルタリングして、ファイルを管理しやすい状態に保つことを検討してください。
結論
Astroウェブサイト用のllms.txtファイルを作成することは、AI言語モデルがコンテンツにアクセスできるようにするための簡単な方法です。このアプローチでは、Astroのコンテンツコレクションを活用して、サイトのコンテンツの構造化された包括的なビューを作成します。
AIがコンテンツの発見にとってますます重要になるにつれて、llms.txtを実装すると、AI搭載の検索ランドスケープでウェブサイトの可視性が向上します。実装はシンプルで高性能であり、Astroビルドプロセスの一部として簡単に保守できます。
今すぐllms.txtの実装を開始して、コンテンツがAI搭載の検索と発見の未来に対応できるようにしてください。
よくある質問
llms.txtとsitemap.xmlの違いは何ですか?
sitemap.xmlは検索エンジンのクローラー用にページをリストしますが、llms.txtは、言語モデルが理解および処理するように最適化された形式で実際のコンテンツを提供します。
llms.txtファイルはどのくらいの頻度で更新する必要がありますか?
Astroサイトを再構築すると、llms.txtファイルが自動的に更新されるため、コンテンツ公開スケジュールに合わせて最新の状態に保たれます。
llms.txtに画像やメディアを含めることはできますか?
llms.txtはテキストベースであるため、ファイル自体ではなく、画像とメディアの説明を含めます。AIが効果的に処理できるテキストコンテンツに焦点を当てます。
llms.txtはSEOに影響しますか?
いいえ、llms.txtは従来のSEOに悪影響を与えることはありません。AIツールがコンテンツにアクセスできるようにすることで、既存のSEO戦略を補完するように設計されています。
llms.txtファイルのサイズはどのくらいにする必要がありますか?
厳密な制限はありませんが、妥当な範囲に保ってください。数百もの投稿があるサイトの場合は、最も重要または最新のコンテンツのみを含めるようにフィルタリングすることを検討してください。