従来のウェブサイトは主に人間に読みやすいマークアップを使用して設計されており、ボットが収集するには過剰な情報を含んでいます。一方、ウェブサイト提供者は、AIエージェントによる過剰なスクレイピングのためにサーバー負荷の問題に直面しています。LLM最適化されたコンテンツを提供するために、Answer.AIの共同創設者であるジェレミー・ハワードは、llms.txtというファイルを提案しました。
注意: 2025年3月現在、llms.txtは標準化された仕様ではありません。この記事の情報は、将来の変更により古くなる可能性があります。
llms.txtとは何ですか?
ChatGPT、Grok、Claude、Geminiのような大規模言語モデルは、ウェブサイト情報にますます依存しています。特に、最近の「Deep Research」のような開発は、エージェントベースのモデルがウェブサイトをブラウジングし、マルチステージの研究を自動的に実行できるように設計されています。Deep Researchが効果的に機能するためには、AIエージェントがウェブサイトから情報を効率的に取得することが非常に重要です。
しかし、従来のウェブサイトは主に人間向けのマークアップを使用しており、AIボットが情報を集める際に多くの障壁を生じさせています。装飾用のCSS、広告、複雑なJavaScriptなどの要素は、重要な情報を抽出するのを難しくしています。さらに、ウェブサイト運営者は、AIエージェントによる過剰なスクレイピングのために新たなサーバー負荷の問題に直面しています。
これらの課題に対処し、LLM最適化されたコンテンツを提供するために、Answer AIの共同創設者であるジェレミー・ハワードは、llms.txtという新しい標準ファイルを提案しました。
/llms.txtファイル – llms-txtは、LLMが推論時にウェブサイトを使用するのを助けるための情報を提供するために、/llms.txtファイルの使用を標準化する提案です。
llms.txtのフォーマット
llms.txtはシンプルで構造化されたマークダウンフォーマットのファイルです。このフォーマットは、人間とLLMの両方が簡単に理解できるように設計されており、自動処理にも適しています。仕様は、ウェブサイトのルートパスに配置することを要求しています(/llms.txt)。
このファイルには、ウェブサイトに関する基本情報とガイダンス、詳細なマークダウンファイルへのリンクが含まれています。また、LLMに有用な情報を含むページのマークダウン版を提供することも提案されています。元のページURLに.mdを追加することで実現されます。
たとえば、以下のブログ記事に対して:
https://apidog.com/blog/top-postman-alternative-open-source/のマークダウン版は、https://apidog.com/blog/top-postman-alternative-open-source.mdで利用可能です。
提案には2つの異なるファイルが含まれています:
- llms.txt:ウェブサイトの概要で、詳細なページはマークダウンファイルへのリンクを通じて提供されます。
- llms-full.txt:ウェブサイトのすべてのページに関する情報を1つのファイルに編纂します。
llms-full.txtの例としては、Cloudflareのドキュメントがすべてのコンテンツを1つのファイルにまとめており、非常に大きなテキストボリュームとなります:
https://developers.cloudflare.com/llms-full.txt
llms.txtは既存のウェブ標準と共存するように設計されています。標準化されたファイルパスアプローチは、/robots.txtおよび/sitemap.xmlのそれに従っています。robots.txtおよびsitemap.xmlと同様にウェブサイト情報をボットに提供することを目的としつつ、それぞれに異なる特性があります:
- sitemap.xmlは検索エンジンのためのすべてのページのリストを提供しますが、llms.txtはAIエージェントのためのキュレーションされたページのリストを提供します。
- robots.txtはクローラーに訪問可能なページを伝えますが、ページコンテキスト情報は含まれていません。llms.txtはコンテキストを追加することでこれを補完できます。
- robots.txtは定期的に訪れるクローラーに対するアクセスが許可されるページを制御しますが、llms.txtは特定のトピックに関する情報が要求されたときにオンデマンドで使用されます(ただし、llms.txtが広く普及すると、通常のトレーニングでも使用される可能性があります)。
- robots.txtおよびsitemap.xmlは検索エンジン向けに設計されていますが、llms.txtはLLM向けに設計されています。
llms.txtのフォーマットの説明
llms.txtファイルはマークダウン形式で記述されており、これは現在、言語モデルが最も簡単に理解できるフォーマットです。さらに、llms.txtのマークダウンは特定の構造に従っており、プログラミング言語によって処理できるようになっています。
マークダウンには以下のセクションが含まれています:
- ウェブサイト名を持つh1 (#) 要素。これは必須のセクションです。
- ウェブサイトの簡単な概要を含む引用 (>) ブロック。
- 見出し以外の任意の種類のマークダウンセクションがゼロまたはそれ以上。
- 詳細情報を含むマークダウンファイルへのリンクのリストを提供するh2 (##) 要素で区切られたゼロまたはそれ以上のセクション。
- リンクリストは、次の形式で記述されます: - 名前: 説明
- ## Optionalで始まる特別なセクションは、スキップすることができる二次情報を提供します。
llms.txtファイルの例を示します:
# 私のウェブサイト
> これはさまざまなトピックについての情報を提供するウェブサイトです。
## ドキュメント
- [投稿1](<https://example.com/post1.md>): これは最初の投稿です。
- [投稿2](<https://example.com/post2.md>): これは2番目の投稿です。
## オプショナル
- [フォーラム](<https://example.com/forum>): トピックを議論する場所です。
ウェブサイトのためのllms.txtの作成
llms.txtファイルを作成するためには、ウェブサイトの概要と詳細情報へのリンクを含むllms.txtファイル自体、そして各ページの詳細情報を含むマークダウンファイルの両方を準備する必要があります。これらのページの作成を自動化するためのツールがいくつかあります:
- Mintlify — 必要なドキュメントを難なく作成
- dotenvx/llmstxt: sitemap.xmlをllms.txtに変換
- llms.txtを生成
私の場合、ツールを使用することにあまり利益を感じなかったので、静的にサイトを構築するときに記事のリストを取得してそれを作成しました。以下はシンプルな実装の例です:
背景として、このブログはSvelteKitで構築されており、Contentfulから記事を取得してページを静的に生成します。
SvelteKitでは、APIルートは+server.tsファイルで定義されます。export const prerender = trueと宣言することで、APIルートを静的に生成できます。src/routes/llms.tsx/+server.tsファイルを作成し、以下のように書きます(簡略化されたコード例を示します):
// src/routes/llms.tsx/+server.ts
import type { RequestHandler } from "@sveltejs/kit";
import RepositoryFactory, { POST } from "../../repositories/RepositoryFactory";
// PostRepositoryはContentfulから記事を取得するためのクラスです
const PostRepository = RepositoryFactory[POST];
export const prerender = true;
const siteUrl = "...";
type Item = {
title: string;
slug: string;
about: string;
};
// llms.txtコンテンツを生成する関数
const renderLlmsTxt = (items: Item[]) => `# azukiazusaのテックブログ2
> これは[azukiazusa](<https://github.com/azukiazusa1>)が運営する技術ブログです。主にウェブフロントエンド技術について書いています。
## ブログ投稿
${items
.map(
(item) =>
`- [${item.title}](${siteUrl}/blog/${item.slug}.md): ${item.about}`,
)
.join("\\\\n")}
`;
// HTTPリクエスト動詞に対応する変数名をエクスポートすると、APIルートとして認識されます
export const GET: RequestHandler = async () => {
const posts = await PostRepository.findAll();
const feed = renderLlmsTxt(posts);
const headers = {
"Content-Type": "text/markdown; charset=utf-8",
};
return new Response(feed, {
headers,
});
};
このアプローチは、rss.xmlやsitemap.xmlのようなファイルを生成するのと似ています。
各ブログ投稿のマークダウンファイルについては、私もAPIルートを作成し、静的に生成しました。src/routes/blog/[slug].md/+server.tsファイルを作成し、次のように書きました:
// src/routes/blog/[slug].md/+server.ts
import type { RequestHandler } from "@sveltejs/kit";
import RepositoryFactory, {
POST,
} from "../../../repositories/RepositoryFactory";
const PostRepository = RepositoryFactory[POST];
export const prerender = true;
export const GET: RequestHandler = async ({ params }) => {
const { slug } = params;
const post = await PostRepository.find(slug);
if (!post) {
return new Response("見つかりません", { status: 404 });
}
const blogPost = post.blogPostCollection.items[0];
const body = `# ${blogPost.title}
${blogPost.article}
`;
return new Response(body, {
headers: {
"Content-Type": "text/markdown; charset=utf-8",
},
});
};
生成されたファイルの内容は、http://azukiazusa.dev/llms.txtにアクセスすることで確認できます。
llms.txtの採用例
llms.txtまたはllms-full.txtを提供しているウェブサイトは以下のリンクから確認できます:
- llmstxt.site
- /llms.txtディレクトリ
AIエージェントとのllms.txtの使用
2025年現在、LLMはクローラーのように自動的にllms.txtを検出してインデックスを作成することはできません。AIエージェントのユーザーは、手動で情報を提供する必要があります。
たとえば、AIコーディングエディタであるCursorでは、@docsシンボル機能を使用して、より正確な回答のために指定されたURLを参照できます。この場合、llms-full.txtファイルのURLを指定することが期待されます。これにより、AIエージェントが情報を効率的に取得できると考えられています。
llms.txtの要約
- llms.txtファイルは、LLMがウェブサイトの情報を取得するために提案されています
- 2つの異なるファイルが存在します:llms.txtとllms-full.txt
- llms.txtはマークダウン形式で書かれ、ウェブサイトの概要と各ページの詳細情報を提供します
- llms-full.txtはウェブサイトのすべてのページに関する情報を単一のファイルに編纂します
- llms.txtはウェブサイトのルートパスに配置されます
- llms.txtのマークダウンには以下のセクションが含まれます:
- ウェブサイト名を持つh1 (#) 要素
- ウェブサイトの簡単な概要を含む引用 (>) ブロック
- 見出し以外の任意のタイプのマークダウンセクションがゼロまたはそれ以上
- リンクのリストを提供するh2 (##) 要素で区切られたゼロまたはそれ以上のセクション
- ## Optionalで始まる特別なセクション