llms.txt и LLM-краулеры: что реально влияет на цитируемость, а что — миф

Вокруг Generative Engine Optimization (GEO — оптимизация видимости не в выдаче Google, а в ответах генеративных движков: ChatGPT, Perplexity, Claude, AI Overviews) уже сложился рынок обещаний. Самое частое из них: «повесьте файл llms.txt — и вас начнут цитировать модели». Это удобное и почти полностью ложное утверждение. Здесь мы разберём, что говорят живые замеры, чем llms.txt полезен на самом деле, и что реально двигает цитируемость: краулеры и структура контента, а не волшебный файл.

Все цифры в статье — замеры конкретных компаний, а не независимый стандарт: у разных источников разные выборки и месяцы, они не сходятся и могут устареть к моменту чтения. Точные имена ботов и формулировки вендоров меняются несколько раз за год — сверяйте их по официальным спискам в день настройки, а не по памяти (в том числе по этой статье).

Часть I. Рамка: модель краулит и цитирует, а не ранжирует

Чтобы понимать, «что влияет», надо увидеть разницу двух механизмов.

Классический поиск строит индекс документов и ранжирует их по запросу: страница либо попадает в топ-10 выдачи, либо нет. Владелец сайта борется за позицию.

Генеративный движок устроен иначе и работает в двух режимах, которые путают:

  • Через обучение (training). Текст попал в обучающую выборку модели — и модель «помнит» про вас как факт, без обращения к сайту в момент ответа. Здесь ваш контент конкурирует за то, чтобы быть в корпусе.
  • Через живой поиск (retrieval / grounding). Модель в момент ответа сходит в интернет, прочитает страницы и соберёт ответ с цитатами. Здесь ваш контент конкурирует за то, чтобы его прочитали и процитировали именно сейчас.

Отсюда два практических вывода, которые определяют всю статью:

  • Тот факт, что модель ответила про вас, не значит, что она прочитала ваш сайт. Она могла «вспомнить» это из обучения — или наоборот, процитировать третьесторонний источник, а не вас. Отсюда рождается задача «мерить, откуда берётся ответ» — это отдельная часть GEO, но техническая подготовка начинается здесь.
  • Два режима используют разных ботов. Обучение и живой retrieval — это разные user-agent’ы с разной политикой в robots.txt. Закрыть их одними руками — типичная самострельная ошибка. Разбор — в Части IV.

Промежуточный миф, который из-за этой путаницы и расползся: «есть один файл-рубильник, который включает видимость в моделях». Это llms.txt. Разберём его по замерам.

Часть II. Миф о llms.txt: что показали замеры

llms.txt — это предлагаемый стандарт: текстовый файл в корне сайта (https://example.test/llms.txt), где в markdown-формате перечислены ключевые страницы, чтобы LLM «быстрее сориентировалась». Идея красивая. Данные упрямые.

Замер Ahrefs по логам 137 000 доменов. Около 28% доменов публикуют llms.txt (выборка технически продвинутая, на открытом веде доля ниже). Из примерно 38 000 доменов с валидным файлом любкой трафик получили лишь около 1 100 — то есть 97% файлов не запросил никто. Разрез тех, кто всё-таки запрашивал, важнее общей доли:

  • SEO-аудит-инструменты — 21%,
  • неопознанные боты — 14%,
  • обычные пауки вроде Googlebot — 13%,
  • инструменты профилирования стека — 11%,
  • краулеры живого retrieval (ChatGPT, Perplexity) — около 1%.

То есть основную аудиторию файла составляют coding-агенты (10% запросов) и training-краулеры (5%) — те, кому нужен «указатель по сайту/документации», а не поисковые модели, которые генерируют цитаты. Отдельно забавная деталь замера: 12% запросов делали инструменты, которые сами проверяют и оценивают наличие llms.txt — индустрия изучает себя, пока настоящей аудитории почти нет.

Замер SE Ranking по 300 000 доменов искал другую вещь — связь между наличием файла и частотой цитирования. Связи не обнаружено. Файл не делает сайт цитируемым.

Позиция Google, зафиксированная в документации. В лог изменений Google (changelog) внесли правку «Clarifying guidance on llms.txt files»: для появления в Google Search файл не нужен, а его наличие «не навредит и не поможет» видимости и позициям — Google Search его игнорирует. Скорее всего, вы увидите там же прямую формулировку в духе «не нужно создавать отдельные машиночитаемые AI-файлы, чтобы появляться в поиске». Джон Мюллер из Google называл llms.txt «не для поиска» («not done for search») и «временным костылём, чтобы сэкономить токены» для AI-инструментов для кода.

Оговорка методики: «запросы» ≠ «повлияло». Замеры фиксируют, обращались ли к файлу, а не учитывали ли его содержимое. Но при 97% файлов без единого обращения это различие почти не спасает тезис «файл двигает трафик».

Вывод Части II: обещание «повесьте llms.txt — и вас цитировали модели» не подтверждается ни одним из трёх независимых наблюдений. Это новый meta keywords: ритуал из SEO-прошлого, перенесённый в AI-настоящее без evidence.

Часть III. Для чего llms.txt всё-таки нужен

Отрицательный результат — не повод выбрасывать файл. У llms.txt есть честное применение, просто оно не про SEO-позиции:

  1. Карта сайта для coding-агентов и людей-исследователей. Это единственная аудитория, которую подтверждают замеры. Если у вас документация, открытые веса, API — агент, который пишет код против вашего сервиса, по llms.txt быстрее найдёт нужную страницу, чем обходя весь сайт. Здесь файл — вежливость и экономия чужих токенов (та самая «костыль-для-токенов» формулировка), а не буст в выдаче.
  2. Машиночитаемый индекс для будущего. Стандарт молодой. Держать актуальный, короткий, честный llms.txt — дешёвая гигиена на случай, если retrieval-краулеры начнут его читать. Плата за это — ноль (файл игнорируют), риск — ноль (Google прямо говорит: не вредит).
  3. Дисциплина структуры. Пока вы руками пишете «вот 15 страниц, которые важны», вы честно отвечаете себе на вопрос «что у меня вообще должно находиться в AI-ответах». Это побочный, но реальный профит — он же и главный кандидат в «что реально влияет» (Часть V).

Чего файл не делает и не должен делать в ваших ожиданиях: не индексирует сайт (за это отвечают обычные краулеры и sitemap), не повышает цитируемость, не заменяет schema, не защищает от scraping (см. Части IV и врезку про инъекцию ниже).

⚠️ Побочный риск, о котором почти не пишут. Есть данные, что один исследовательский краулер целенаправленно обходил llms.txt именно как поверхность prompt-injection: агент, доверяющий содержимому файла, можно попытаться проинструктировать через него. Если вы генерируете llms.txt автоматически из пользовательского контента (комментарии, поля, UGC), в файл может попасть текст, который агент прочитает как команду. Правило то же, что для вывода модели в AI-безопасности: содержимое llms.txt — недоверенный ввод для того, кто его читает. Не кладите туда то, чем не готовы «кормить» агента как инструкцию.

Практический минимум файла — короткий, без выдуманных обещаний:

# Example Service
> Краткое, честное описание: что это за сайт и для кого.

## Документация
- [Быстрый старт](https://example.test/docs/quickstart)
- [Справочник API](https://example.test/docs/api)

## Опционально
- [Changelog](https://example.test/changelog)

Три вещи, которые здесь важны больше «магии»: название и одна строка описания (что это), реальные ссылки на ключевые страницы (не весь сайт), отсутствие инструкций-приказов агенту. На сайте есть страница-конструктор, которая собирает такой файл по разделам без ручной вёрстки — https://codestack.space/konstruktor-fajla-llms-txt/.

Часть IV. Краулеры: разделение «обучение» и «ответ» — вот где рубильник

Если и искать в технической части GEO настоящий переключатель видимости, это не файл, а robots.txt и то, каких ботов вы в нём открываете. Ключевая идея, которую теряет большинство статей «про GEO»: у каждого вендора обычно два разных бота с двумя разными задачами.

  • Бот обучения (training) — собирает контент в обучающую выборку моделей. Его политика («не использовать мой текст для тренировки») через него и задаётся.
  • Бот ответа (retrieval / search / grounding) — выходит в интернет в момент ответа пользователю, чтобы процитировать свежий источник.

Смотри таблицу по подтверждённым публичным спискам вендоров (имена и поведение проверяйте в день настройки — они меняются):

User-agentВендорРольЕсли Disallow
GPTBotOpenAIобучение моделейконтент не пойдёт в тренировку
OAI-SearchBotOpenAIживой поиск/grounding для ответов ChatGPTне появитесь в ответах ChatGPT со ссылкой на сайт
PerplexityBotPerplexityretrieval для ответов Perplexityнет цитат в Perplexity
ClaudeBotAnthropicобучение/индекс Claudeконтент не пойдёт в тренировку/индекс
Claude-SearchBotAnthropicпоиск для ответов Claudeне появитесь в ответах Claude
Google-ExtendedGoogleиспользование контента в AI-функциях (отдельно от Googlebot)не используется для обучения генеративных моделей Google
CCBotCommon Crawlоткрытый корпус для обучениятекст не попадёт в открытый датасет Common Crawl

Здесь и есть та ошибка, о которой предупреждает план серии. Веб-мастер, который одним росчерком ставит User-agent: * Disallow: / или блокирует «всех AI-ботов», в уверенности, что защищает контент от обучения, заодно вырезает себя из ответов retrieval-ботов — из ChatGPT, Perplexity, Claude. Защита от тренировки и участие в ответах — это разные строки, и их надо настраивать раздельно.

# Раздельная политика: закрыли обучение, открыли ответ
# (имена и синтаксис сверяйте по официальному списку вендора в день настройки)

User-agent: GPTBot              # краулер ОБУЧЕНИЯ OpenAI
Disallow: /

User-agent: OAI-SearchBot       # краулер ОТВЕТОВ ChatGPT (grounding)
Allow: /

User-agent: PerplexityBot       # краулер ОТВЕТОВ Perplexity
Allow: /

User-agent: ClaudeBot           # обучение Anthropic
Disallow: /

User-agent: Claude-SearchBot    # ответы Claude
Allow: /

# обычный поиск и индексация — отдельными правилами (Googlebot и т.д.)

Логика настройки простая: спросите себя отдельно «хочу ли, чтобы мой текст тренировал чужие модели» и «хочу ли, чтобы модель ссылалась на меня в ответе». Это два разных ответа, и у большинства честных издателей второй — «да», а первый — «нет». robots.txt конструктор помогает не перепутать строки: https://codestack.space/konstruktor-robots-txt/.

Но есть потолок, о котором надо знать: robots.txt — соглашение, а не стена. Публично задокументирован случай (Cloudflare, со ссылкой на логи), когда один retrieval-сервис намеренно обходил robots.txt: краулер с ротацией user-agent и IP, который то и не пытался прочитать директивы. Пока robots.txt работает как джентльменское соглашение с честными ботами, он не останавливает того, кто решил не подчиняться. Практический вывод: robots.txt — необходимый, но недостаточный контроль; для реальной защиты приватных данных нужен не файл в публичном каталоге, а аутентификация и закрытые разделы (сопутствующая гигиена — в OWASP Top 10 и Защите API).

Часть V. Структура и schema: вот что действительно двигает цитируемость

Раз файл не работает, а краулеры лишь «допускают» вас до retrieval — что же влияет на то, процитируют ли вас среди допущенных? Ответ совпадает с тем, что работает в обычном качестве контента, и это подмечают замеры: модели цитируют то, из чего удобно извлечь готовое утверждение. Не «повесили файл», а «полезно, авторитетно, структурировано для извлечения» (тот же принцип, что в Этике и SEO AI-контента: качество важнее формата-обёртки).

Технические приёмы, которые повышают шанс попасть в ответ:

1. Заголовки-тезисы, а не заголовки-вопросы. Retrieval извлекает по абзацу под заголовком. Если под ## стоит законченное утверждение с числом, его проще процитировать, чем «воду». Сравните: «llms.txt и цитируемость» (тема) против «97% llms.txt не получают ни одного запроса» (утверждение). Второе — готовая цитата.

2. Самодостаточные абзацы. Модель часто берёт один фрагмент без всего контекста страницы. Фраза «этот метод», «как показано выше» обрывается при извлечении. Каждый важный абзац должен читаться сам по себе: с подлежащим, числом и ссылкой на то, о чём речь.

3. Явные числа, даты, источники. Генеративный ответ любит проверяемые величины. «Рост ~31–39% выдач по замеру X от месяца Y» цитируется охотнее, чем «AI Overviews стало много». Держите конкретику и указывайте, чей это замер (это ещё и защита от того, что вас процитируют с чужой цифрой).

4. Q&A-структура под ответ. Когда пользователь спрашивает модель, она ищет в источнике форму «вопрос → прямой ответ». Раздел, построенный как вопрос и ответ на него в первых строках, ложится в генеративный ответ почти дословно.

5. schema.org — но прагматично, а не «для галочки». Машинные разметки Article, FAQPage, HowTo, сущности автора (Person/Organization) помогают движку корректно распознать, кто это написал, о чём и какой тип документа. Это не «кнопка цитирования», а снижение шанса быть неверно истолкованным. Ключевое поле для GEO-цели — author/publisher и дата: модели чаще ссылаются на источник с явным авторством (привет E-E-A-T из SEO-серии).

{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Does llms.txt improve AI search visibility?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Based on independent log analyses (2026), no: about 97% of llms.txt files receive zero requests, and Google Search states it ignores the file. Keep it as a courtesy map for coding agents, not as an SEO ranking signal."
      }
    }
  ]
}

Здесь важно, что текст ответа — законченное утверждение с источником и датой, а не обещание. Ровно такое поле и превращается в цитату.

6. Быстрый и чистый рендер. Retrieval-бот читает HTML. Если контент под lazy load по клику, в <canvas>, за паузой загрузки или «включите JS» — живой поиск может увидеть пустую оболочку. Серверный рендер основного текста — это не «SEO-совет из 2015», это то, что делает страницу читаемой сейчас для бота ответа. (Структурную часть — заголовки, читаемость, интент — подробно разбирает SEO-аудит текста; здесь — только AI-специфичный угол.)

Общий смысл Части V: в GEO выигрывает не файл-обёртка, а текст, который уже хорош для человека-исследователя. Миф в том, что это два разных дела; правда в том, что почти всё совпадает с quality-SEO.

Часть VI. Проверь себя за вечер и приоритет действий

Соберём вывод в порядок действий и в мини-скрипт самопроверки — без платных дашбордов, на том же стеке PHP.

Приоритет GEO-гигиены (по убыванию реального эффекта):

  1. Открыть retrieval-ботов в robots.txt, закрыв только training-ботов, если не хотите обучать чужие модели. Это единственный пункт с доказанным механизмом «закрыл — выпал из ответов».
  2. Переписать заголовки в утверждения и сделать абзацы самодостаточными, с числами и датами.
  3. Добавить schema Article/FAQPage с явным автором.
  4. Убедиться, что основной текст рендерится на сервере.
  5. И только потом — llms.txt: короткий, честный, без приказов агенту, без ожиданий трафика.

Быстрая диагностика — что у вас сейчас стоит по этим пунктам (адрес и боты подставьте свои; домены условные):

PHP
<?php
// Мини-проверка GEO-доступности: отдаётся ли llms.txt и открыты ли retrieval-боты.
$base = 'https://example.test';

$paths = ['/llms.txt', '/robots.txt', '/sitemap.xml'];
foreach ($paths as $p) {
    $ch = curl_init($base . $p);
    curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 8]);
    $body = (string) curl_exec($ch);
    $code = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    printf("%-12s HTTP %d  %d bytes\n", $p, $code, strlen($body));
}

// Парсим robots.txt: находим Disallow: / для retrieval-ботов — это красный флаг.
$robots = @file_get_contents($base . '/robots.txt');
$retrieval = ['OAI-SearchBot', 'PerplexityBot', 'Claude-SearchBot'];
foreach ($retrieval as $bot) {
    $blocked = false;
    if ($robots) {
        // грубый разбор блоков User-agent (не для продакшена, для быстрой оценки)
        $blocks = preg_split('/\n\s*\n/', $robots);
        foreach ($blocks as $b) {
            if (preg_match('/user-agent:\s*' . preg_quote($bot, '/') . '\b/i', $b)
                && preg_match('/disallow:\s*\/\s*$/im', $b)) {
                $blocked = true;
            }
        }
    }
    printf("%-16s %s\n", $bot, $blocked ? 'ЗАКРЫТ для ответов — вы не цитируетесь' : 'открыт/не указан');
}

Скрипт нарочито грубый (реальный разбор robots.txt сложнее), но он за минуту отвечает на главный вопрос Части IV: не закрыли ли вы себя от ответов одним «Disallow: / для всех». Проверка «что модель реально говорит о вашем сайте» — это уже не скрипт, а запросы: их удобно прогнать руками через чат-ассистент на сайте, спросив его «что ты знаешь про example.test и откуда» и сверив с тем, что модель отвечает из коробки: https://codestack.space/ai-pomoshhnik-dlja-koda/. А чтобы такие проверки делать регулярно и не вручную — это следующая статья серии.

Чек-лист граблей

  • Повесили llms.txt и ждёте AI-трафик → замеры показывают ~97% файлов без запросов и «Google Search игнорирует файл»; трафик не придёт от самого файла.
  • Ставите User-agent: * Disallow: / «от всех AI-ботов» → вместе с обучением вырезаете и retrieval-ботов → исчезаете из ответов ChatGPT/Perplexity/Claude.
  • Не различаете GPTBot (обучение) и OAI-SearchBot (ответы) → путаете «не тренируй мою модель» с «не показывай меня в ответе»; настраивайте раздельно.
  • Думаете, robots.txt — это стена от scraping → есть задокументированный обход через ротацию UA/IP; приватное закрывайте аутентификацией, не публичным директивой.
  • Доверяете цифрам одного вендора без оговорки → выборки и месяцы разные, цифры не сходятся; всегда указывайте источник и дату замера.
  • Пишете заголовки-вопросы и «водные» абзацы → retrieval не может извлечь утверждение → вас не цитируют; заголовки = тезисы, абзацы = самодостаточные.
  • Прячете основной текст за JS-рендер/lazy load → живой поиск читает пустую оболочку; рендерьте текст на сервере.
  • Ставите schema «для галочки» без автора и даты → движок неверно истолковывает источник; заполняйте author/publisher/дату.
  • Кладёте в автосгенерируемый llms.txt пользовательский контент → поверхность prompt-injection для агента, который ему доверяет; фильтруйте содержимое.
  • Считаете GEO отдельной дисциплиной от SEO → почти всё, что двигает цитируемость, совпадает с quality-SEO (полезность, авторитет, структура).

👤 Зарегистрируйтесь, чтобы добавить материал в закладки.