会話してるカラスのイラスト

ブログで llms.txt を提供してみた

従来のウェブサイトは人間用のマークアップが主であり、bot が情報を収集するために無駄な情報が多く含まれています。一方でウェブサイトを提供する側にとっても AI エージェントにより過剰なスクレイピングによりサーバーの負荷がかかることが問題となっています。LLM に適したコンテンツを提供するために Answer.AI の共同創業者である Jeremy Howard 氏により `llms.txt` というファイルが提案されました。

Note

2025 年 3 月現在では llms.txt は標準化されていない仕様です。この記事に書かれている内容は今後の変更により古くなる可能性があります。

ChatGPT や Grok, Claude, Gimini などの大規模言語モデルはますますウェブサイトの情報に依存してきています。特に最近登場した Deep Research はエージェント型のモデルがウェブサイトを巡回し、多段階のリサーチを自動で実行できるように設計されています。Deep Research が効果的に機能するためには AI エージェントが効率的にウェブサイトの情報を取得できることが重要です。

しかし従来のウェブサイトは人間向けのマークアップが主であり、AI ボットが情報を収集する際には多くの障壁があります。装飾のための CSS, 広告, 複雑な JavaScript などの要素は、本質的な情報の抽出を困難にしています。さらに、ウェブサイト運営者側からすると、AI エージェントによる過剰なスクレイピングがサーバー負荷を増大させるという新たな問題も浮上しています。

このような課題を解決し、LLM に最適化されたコンテンツを提供するために、Answer.AI の共同創業者である Jeremy Howard 氏により llms.txt という新しい標準ファイルが提案されました。

llms.txt とは

llms.txt は、シンプルかつ構造化されたマークダウン形式のファイルです。このフォーマットは人間と LLM の両方が容易に理解できるだけでなく、プログラムによる自動処理も可能な設計となっています。仕様ではウェブサイトのルートパス(/llms.txt)に配置することとされています。

このファイルにはウェブサイトの簡単な情報やガイダンスと詳細なマークダウンファイルへのリンクが含まれています。さらに LLM が読むのに役立つ情報を含むページには元のページの URL に .md を追加したマークダウン形式のファイルを提供することも提案されています。例えば https://azukiazusa.dev/blog/inline-conditional-css-if-function というブログ記事に対しては https://azukiazusa.dev/blog/inline-conditional-css-if-function.md というマークダウン形式のファイルを提供します。

提案には llms.txtllms-full.txt という 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 のアプローチに従っています。ウェブサイトの情報を bot に提供するという点では robots.txtsitemap.xml と同じ目的ですが、それぞれ異なる特徴を持ちます。

  • sitemap.xml は検索エンジン向けのすべてのページのリストを提供する。一方で llms.txt は AI エージェント向けに厳選されたページのリストを提供する。
  • robots.txt はどのページをクローラーが巡回してもよいかを伝えるが、ページのコンテキスト情報が含まれていない。llms.txt によりコンテキストを補完できる。
  • robots.txt は定期的に巡回するクローラーに対してどのアクセスが許容されるかを制御する。llms.txt はユーザーが特定のトピックに関する情報を要求する場合にオンデマンドで使用される(llms.txt の普及が進めば通常のトレーニングでも使用される可能性がある)
  • robots.txtsitemap.xml は検索エンジン向けに設計されているが、llms.txt は LLM 向けに設計されている

llms.txt の形式

llms.txt ファイルはマークダウン形式で記述します。これは現時点で言語モデルが最も理解しやすい形式であるためです。また llms.txt のマークダウンは特定の形式に従って書かれるため、プログラミング言語で処理することも可能です。

マークダウンには以下のセクションが含まれます。

  • ウェブサイトの名前を記載した h1(#)要素。必須のセクション
  • ウェブサイトの短い要約を含む引用(>)ブロック
  • 0 個以上の見出しを除く任意のタイプのマークダウンセクション(段落、リストなど)
  • 0 個以上の h2(##)要素で区切られたセクション。詳細情報が含まれたマークダウンファイルへのリンクのリストを提供する
    • リンクのリストは - [name](URL): description の形式で記述する
  • ## Optional で始まる特別なセクション。このセクションはスキップしても問題ない二次情報を提供する

llms.tsx ファイルの例は以下の通りです。

# My Website
 
> This is a website that provides information about various topics.
 
## Docs
 
- [Post 1](https://example.com/post1.md): This is the first post.
- [Post 2](https://example.com/post2.md): This is the second post.
 
## Optional
 
- [Forum](https://example.com/forum): A place to discuss topics.

llms.txt を作成する

llms.txt ファイルを作成するためにはウェブサイト概要と各ページの詳細情報をまとめる llms.txt ファイル自身と各ページの詳細情報を含むマークダウンファイルを作成する必要があります。これらのページの作成を自動化するツールがいくつか提供されています。

私の場合はツールを使って生成するメリットを感じなかったため、静的ビルドする際に記事の一覧を取得して作成するようにしました。簡単に実装例を紹介します。

前提として、このブログは SvelteKit で構築されていて Contentful から記事を取得してページを静的に生成しています。

SvelteKit では +server.ts ファイルで API ルートを定義します。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) によって運営されている技術ブログです。主に Web フロントエンド周辺の技術について書いています。
 
## Blog Posts
 
${items
  .map(
    (item) =>
      `- [${item.title}](${siteUrl}/blog/${item.slug}.md): ${item.about}`,
  )
  .join("\n")}
  `;
 
// HTTP リクエスト Verb に対応する変数名を export することで 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.xmlsitemap.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("Not found", { 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 が提供されているウェブサイトは以下のリンクで確認できます。

AI エージェントから llms.txt を利用する

2025 年現在ではクローラーのように LLM が自動で llms.txt を検出してインデックスを作成することはありません。AI エージェントを利用するユーザーが手動で情報を提供する必要があります。

例えば AI コードエディタである Cursor では @docs シンボル機能により指定した URL を参照してより正確な回答を得ることができます。この際に llms-full.txt ファイルの URL を指定するといった使い方が考えられます。これにより AI エージェントが効率的に情報を取得できることが期待されます。

まとめ

  • LLM がウェブサイトの情報を取得する際には llms.txt というファイルが提案されている
  • llms.txtllms-full.txt という 2 つの異なるファイルがある
  • llms.txt はマークダウン形式で記述され、ウェブサイトの概要と各ページの詳細情報を提供する
  • llms-full.txt はウェブサイトの全てのページに関する情報を 1 つのファイルにまとめたもの
  • llms.txt はウェブサイトのルートパスに配置される
  • llms.txt のマークダウンは以下のセクションを含む
    • ウェブサイトの名前を記載した h1(#)要素
    • ウェブサイトの短い要約を含む引用(>)ブロック
    • 0 個以上の見出しを除く任意のタイプのマークダウンセクション
    • 0 個以上の h2(##)要素で区切られたセクション。詳細情報が含まれたマークダウンファイルへのリンクのリストを提供する
    • ## Optional で始まる特別なセクション

参考

記事の理解度チェック

以下の問題に答えて、記事の理解を深めましょう。

llms.txt はどの形式で記述されるか?

  • JSON

    もう一度考えてみましょう

  • XML

    もう一度考えてみましょう

  • マークダウン

    正解!

  • プレーンテキスト

    もう一度考えてみましょう