Jak udělat web čitelný pro AI agenty
LLMS.txt, ReadMe.LLM a další věci, které se možná stanou brzy standardem...
Minule jsem psal o MCP, protokolu, který umožňuje AI agentům pracovat s vaším webem. Dnes popíšu další návrhy, které zatím ještě nejsou tak široce přijaté jako MCP, ale jsou takříkajíc “v naději”.
llms.txt
AI agenti, kteří hledají odpovědi (ano, třeba Perplexity) při prohledávání webu (“deep research”) čelí poměrně zásadní výzvě: najít smysluplný obsah v moderní HTML stránce přes všechny ty styly a nesémantické divy a skripty. HTML je děláno pro prohlížeč a člověka, ale strojové zpracování je utrpení. Sice jsou knihovny, jako Mozilla Readability, které se snaží v té záplavě divů a odstavců najít to, co je obsah stránky a odfiltrovat všechna menu a skryté položky a patičky a postranní sloupce a lišty, ale s všelijakým výsledkem.
Pro LLM to znamená, že když hledá informace pro uživatele v textu, co má 8000 znaků, tak musí lovit ve změti značek. Proto přišel návrh jménem llms.txt.
Kdybych ho měl k něčemu přirovnat, tak k sitemaps
. Zatímco sitemap
používá XML strukturu k tomu, aby vyhledávacímu robotu řekl, kde jsou jednotlivé podsekce a podstránky, tak llms.txt
slouží k tomu, aby jazykovému modelu (LLM) řekl, co kde najde a co tam je.
Technicky jde o textový soubor, kde je ve formátu Markdown popsáno, co na vašem webu najde. Je umístěný buď v kořenovém adresáři (https://example.com/llms.txt
) nebo ve /.well-known/llms.txt
.
Struktura souboru obsahuje definované sekce v definovaném pořadí:
H1 s názvem projektu nebo stránky (jediná povinná sekce)
Blockquote s krátkým shrnutím projektu, obsahující klíčové informace nezbytné pro pochopení zbytku souboru
Žádná, jedna, nebo více markdown sekcí (např. odstavce, seznamy atd.) jakéhokoli typu kromě nadpisů, obsahující podrobnější informace o projektu a instrukce, jak interpretovat poskytnuté soubory
Žádná, jedna nebo více markdown sekcí ohraničených nadpisy H2, obsahující "seznamy souborů" (URL, kde jsou k dispozici další podrobnosti)
Žádná nebo jedna sekce “Optional” se speciálním významem - pokud je uvedena, může ji LLM přeskočit, když potřebuje rychlý přehled.
Každý "seznam souborů" je markdown seznam obsahující povinný markdown hyperlink
[název](url)
, pak volitelně:
a poznámky o souboru
Obecně tedy nějak takto:
# Název
> Volitelný popis zde
Volitelné detaily zde
## Název sekce
- [Název odkazu](https://odkaz_url): Volitelné detaily odkazu
## Optional
- [Název odkazu](https://odkaz_url)
Příklad pro fiktivní restauraci:
# Restaurace U Modré Kočky
> Rodinný podnik zaměřený na moderní českou kuchyni s důrazem na lokální suroviny.
- Otevřeno denně 11 :00 – 23 :00
- Kapacita 60 míst
- Wi-Fi zdarma
- Zahrádka v klidném dvoře
## Menu
- [Stálý jídelní lístek](https://example.com/menu.pdf): Aktuální nabídka sezónních specialit
- [Polední menu](https://example.com/obed.pdf): Všední dny 11 :00 – 15 :00, dvě polévky a tři hlavní chody
- [Nápojový lístek](https://example.com/napoje.pdf): Řemeslná piva z minipivovarů, moravská vína
## Rezervace
- [Online rezervace](https://example.com/rezervace): Okamžité potvrzení e-mailem
- [Telefon](tel:+420123456789): Denně 10 :00 – 22 :00
## Sociální sítě
- [Instagram](https://instagram.com/umodrekocky): Fotky jídel a zákulisí kuchyně
- [Facebook](https://facebook.com/umodrekocky): Novinky a události
- [TikTok](https://tiktok.com/@umodrekocky): Krátká videa z přípravy pokrmů
## Optional
- [Recenze Google](https://g.page/r/CZ-Umodrekocky/review)
- [Dárkové poukazy](https://example.com/poukazy)
Příklady reálných llms.txt souborů najdete na llmstxt.site, seznam produktů a společností, které se k llms.txt hlásí, najdete v llms.txt directory nebo v llmstxt hubu. Můžete se pro inspiraci podívat třeba na llms.txt od Anthropic
Součástí návrhu je i návrh dělat k HTML souborům (např. “/jak-na-llm.html”) jejich MD variantu, optimalizovanou pro LLM, a používat pro ně stejný název s příponou .md (“jak-na-llm.html.md”) - např. u dokumentace FastHTML máte soubor “pro lidi” (https://www.fastht.ml/docs/tutorials/by_example.html) a “pro LLM” (https://www.fastht.ml/docs/tutorials/by_example.html.md)
Návrh počítá i se souborem llms-full.txt, kde crawler najde kompletní dokumentaci (jako například zde pro Anthropic API) - čímž se dostáváme už k dalšímu návrhu.
ReadMe.LLM
Když píšete kód a používáte Copilot nebo Cursor nebo další LLM pro psaní kódu, možná si říkáte: Jak se dozví správné používání té které knihovny?
A speciálně pro tento účel je navržený ReadMe.LLM.
Tento návrh byl vyvinutý na UC Berkeley a představuje dokumentaci, určenou pro LLM: strukturovaný formát využívající prvky ze softwarové knihovny k usnadnění generování kódu.
Jako soubor ReadMe.md poskytuje základní informace lidským vývojářům, tak ReadMe.LLM poskytuje tyto informace LLM. Poskytnutí dokumentace v tomto formátu by mělo pomoci LLM nástrojům pro psaní kódu pochopit, jak se s vaší knihovnou pracuje.
Základní myšlenkou je, že dokumentace by měl být jeden LLM soubor, který se vejde do kontextu LLM. Současná dokumentace je často členěná na jednotlivé soubory, s obrázky a kde čím, a je orientovaná na lidského čtenáře. Jenže doba…
(zde si dáme pauzu na nářky nad tím, jak je doba hrozná a poctivou ruční kodéřinu vytlačují matlači kódu s LLM… - už to máte? - tak ještě chvilku… jojo, hrůza…)
… je už taková, že dokumentaci bude pravděpodobně číst spíš LLM než živý člověk.
Ostatně, ten paper z Berkeley to popisuje názorně:

Autoři neříkají striktně jaký má být formát nebo co má obsahovat. Omezují se na doporučení rozdělit toto readme do sekcí rules
, library_description
a context
a formátují ho jako XML. Zamýšlený způsob použití je ten, že vezmete readme.llm z GitHubu knihovny, kterou chcete použít, zkopírujete ho do LLM a požádáte, ať vypracuje kód. LLM je víceméně jedno, jestli bude zpracovávat XML nebo MD, ale u XML snáz identifikuje sekce. A jak říkám: jde o návrh, nikoli o standard.
<readme-llm version="0.1">
<rules>
1. Nevolej funkce, které zde nejsou uvedené.
2. Vracej vždy validní JSON.
</rules>
<library_description>
PhotonJS je knihovna pro fotonické výpočty na čipech kompatibilních s WebGPU.
</library_description>
<context>
<signature>
Device.open() -> Promise<Device>
</signature>
<example>
<![CDATA[
import { Device } from 'photonjs';
const dev = await Device.open();
]]>
</example>
</context>
</readme-llm>
Autoři udělali spoustu testů, jak takový strojově zpracovatelný ReadMe.LLM zvýší kvalitu vygenerovaného kódu (tl;dr - hodně moc!) Vám jako vývojářům to ze začátku možná práci přidělá, ale už jsou k dispozici nástroje pro generování tohoto readme formátu. Ano, musíte ho udržovat aktualizovaný pro každou verzi (ale to děláte i s readme, že? Že?!)
Google-Extended
Tahle pasáž potěší ty, co se bojí, že se AI bude na jejich unikátním obsahu trénovat. Google v dubnu aktualizoval popis svého Extended crawleru a v ní zveřejnil následující implementaci pro robots.txt:
User-agent: Google-Extended
Disallow: /
User-agent: Googlebot
Disallow:
Výše uvedená pravidla říkají, že Googlebot na váš web může, ale Gemini se na něm trénovat nesmí. Je důležité poznamenat, že Google-Extended neblokuje použití obsahu v AI Overviews, které jsou považovány za součást hlavního vyhledávacího prostředí Google. Pro blokování AI Overviews je nutné použít meta tag "nosnippet", který však také blokuje obsah z běžného vyhledávání. (Viz Should you block Google Extended?)
Existuje i návrh, který má za cíl přidat informace o licenci či povolení / zákaz automatického zpracování obsahu do robots.txt i do HTTP hlaviček (X-License-Info
, X-Legal-Notice
apod.)
Asi je důležité, abych explicitně poznamenal, že vše, co jsem zde popsal, jsou návrhy. Zejména ty poslední dva. Jestli se tím budou LLM scrapery řídit nebo ne je ve hvězdách a vynutitelné to není.
Praxe
V praktické doušce popíšu to, co je mi nejbližší, tj. média, a přístup, jakým v nich hodlám implementovat právě llms.txt.
Keep reading with a 7-day free trial
Subscribe to Kladu odpory to keep reading this post and get 7 days of free access to the full post archives.