Каждый день все больше и больше людей используют ChatGPT, Perplexity и другие инструменты искусственного интеллекта для поиска и обобщения контента. Как обсуждалось в одной из моих предыдущих статей о SEO to SAO, это всего лишь вопрос времени, когда большая часть посещений веб-сайтов и блогов будет поступать от AI-агентов.
Когда дело доходит до обеспечения доступности вашего контента для языковых моделей, есть более простой способ, чем сложные решения для сканирования, особенно для статически сгенерированных сайтов, созданных с помощью Astro. В этой статье я проведу вас через создание файла llms.txt, который предоставляет ваш контент блога для LLM в чистом, структурированном формате.
Что такое llms.txt?
Файл llms.txt концептуально похож на robots.txt, но разработан специально для языковых моделей. Он предоставляет структурированное, текстовое представление вашего контента, которое легко анализировать и понимать LLM.
LLM не очень хорошо справляются с навигацией по нескольким страницам по ссылкам. Вместо этого LLM очень хорошо извлекают контент с одной страницы и сохраняют его в своей памяти. Именно здесь llms.txt становится бесценным.
Почему инструменты сканирования, такие как Crawl4AI, могут быть избыточными
Такие инструменты, как Crawl4AI, предлагают мощные возможности сканирования веб-сайтов для LLM. Хотя они идеально подходят для создания LLMs.txt для динамических сайтов, они могут быть избыточными для статических сайтов.
Особенно для сайтов Astro, где контент обычно хранится в виде файлов Markdown с frontmatter, у вас уже есть идеально структурированный контент, готовый к непосредственному предоставлению.
Реализация конечной точки llms.txt в Astro
Вот как можно сгенерировать файлы llms.txt для вашего сайта Astro.
Создайте файл по адресу src/pages/llms.txt.ts (или src/pages/api/llms.txt.ts в зависимости от вашей конфигурации Astro) и добавьте следующий код:
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 = `# Your Website Name - Complete Content Guide
This document contains the complete content from your website.
Website: https://yourwebsite.com
Last Updated: ${new Date().toISOString().split('T')[0]}
## Blog Content
${sortedBlogs
.map((post) => `#
## ${post.data.title}
URL: https://yourwebsite.com/blog/${post.data.slug || post.id}
Published: ${post.data.date}
Category: ${post.data.category}
Author: ${post.data.author}
Description: ${post.data.description}
${post.body}
---`).join('\n\n')}
## Additional Content Sections
${activeFeatures
.map((feature) => `#
## ${feature.data.title}
URL: https://yourwebsite.com/${feature.data.slug}
Category: ${feature.data.category}
${feature.data.description}
${feature.body}
---`).join('\n\n')}
---
This content is provided to help AI assistants understand your website's offerings and provide accurate information.`;
return new Response(content, {
headers: {
"Content-Type": "text/plain; charset=utf-8",
"Cache-Control": "public, max-age=3600" // Cache for 1 hour
},
});
} catch (error) {
console.error('Error generating llms.txt:', error);
return new Response('Error generating llms.txt', { status: 500 });
}
};
Контент блога
${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}
Дополнительные разделы контента
${feature.data.title}
URL: https://yourwebsite.com/${feature.data.slug} Категория: ${feature.data.category} ${feature.data.description}
${feature.body}
Как работает этот код
Этот код создает конечную точку API, которая:
- Извлекает все посты из ваших коллекций контента с помощью
getCollection() - Отфильтровывает черновой контент, чтобы включить только опубликованные статьи.
- Сортирует контент по дате, чтобы показывать самый свежий контент первым.
- Создает структурированный текстовый файл, начиная с заголовка вашего сайта
- Включает для каждого поста:
- Заголовок поста в качестве заголовка
- Прямую ссылку на пост
- Метаданные (дата, категория, автор, описание)
- Полный контент поста
- Обрабатывает ошибки корректно с правильным ведением журнала ошибок
- Устанавливает соответствующие заголовки, включая кэширование для повышения производительности
Настройка структуры вашего контента
Настройка имен коллекций
В приведенном выше примере используются несколько коллекций. Если у вас есть только коллекция блога, упростите ее:
export const GET: APIRoute = async () => {
const posts = await getCollection("blog"); // Adjust to your collection name
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 = `# Your Blog Name
${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" },
});
};
Добавление фильтрации контента
Возможно, вы захотите исключить определенные категории или включить только избранный контент:
// Only include featured posts
const featuredPosts = posts.filter(post => post.data.featured && !post.data.draft);
// Exclude specific categories
const filteredPosts = posts.filter(post =>
!post.data.draft && !['internal', 'private'].includes(post.data.category)
);
Преимущества использования llms.txt
1. Улучшенная возможность обнаружения ИИ
Инструменты ИИ могут быстро понять всю вашу библиотеку контента, не сканируя несколько страниц.
2. Лучший контекст для ответов ИИ
Когда пользователи задают вопросы, связанные с вашим контентом, модели ИИ имеют доступ к исчерпывающей структурированной информации.
3. SEO для эры ИИ
Поскольку поиск развивается в сторону результатов на основе ИИ, наличие структурированного контента для потребления ИИ становится решающим.
4. Преимущества производительности
Статическая генерация означает, что ваш файл llms.txt создается во время сборки, что обеспечивает быстрое время ответа.
Тестирование вашей реализации llms.txt
После реализации конечной точки протестируйте ее, выполнив следующие действия:
- Посетите конечную точку напрямую:
https://yoursite.com/llms.txt - Проверьте структуру контента, чтобы убедиться, что все посты включены.
- Убедитесь, что форматирование чистое и читаемое.
- Протестируйте с помощью инструментов ИИ, попросив их проанализировать ваш контент llms.txt.
Рекомендации для llms.txt
Поддерживайте контент в актуальном состоянии
Регулярно обновляйте свой llms.txt, перестраивая свой сайт при публикации нового контента.
Включите соответствующие метаданные
Добавьте даты публикации, категории и описания, чтобы помочь ИИ понять контекст.
Четко структурируйте контент
Используйте согласованные форматы заголовков и четкие разделители между разделами.
Следите за размером файла
Для сайтов с сотнями постов рассмотрите возможность разбиения на страницы или фильтрации контента, чтобы файл оставался управляемым.
Заключение
Создание файла llms.txt для вашего веб-сайта Astro - это простой способ сделать ваш контент доступным для языковых моделей ИИ. Этот подход использует коллекции контента Astro для создания структурированного и всестороннего представления контента вашего сайта.
Поскольку ИИ становится все более важным для обнаружения контента, внедрение llms.txt позиционирует ваш веб-сайт для лучшей видимости в поисковой среде на базе ИИ. Реализация проста, производительна и удобна в обслуживании как часть процесса сборки Astro.
Начните внедрять llms.txt сегодня, чтобы убедиться, что ваш контент готов к будущему поиска и обнаружения на основе ИИ.
Часто задаваемые вопросы
В чем разница между llms.txt и sitemap.xml?
В то время как sitemap.xml перечисляет ваши страницы для поисковых роботов, llms.txt предоставляет фактический контент в формате, оптимизированном для понимания и обработки языковыми моделями.
Как часто следует обновлять файл llms.txt?
Ваш файл llms.txt обновляется автоматически при перестройке вашего сайта Astro, поэтому он остается в актуальном состоянии с вашим графиком публикации контента.
Могу ли я включать изображения и медиафайлы в llms.txt?
llms.txt основан на тексте, поэтому включите описания изображений и медиафайлов, а не сами файлы. Сосредоточьтесь на текстовом контенте, который ИИ может эффективно обрабатывать.
Повлияет ли llms.txt на мой SEO?
Нет, llms.txt не повлияет отрицательно на традиционное SEO. Он разработан для дополнения вашей существующей стратегии SEO, делая контент доступным для инструментов ИИ.
Какого размера должен быть мой файл llms.txt?
Нет строгих ограничений, но соблюдайте разумные пределы. Для сайтов с сотнями постов рассмотрите возможность фильтрации, чтобы включить только ваш самый важный или последний контент.