llms.txt, robots.txt und Seiten als Markdown ausliefern
Agenten lesen anders als Browser. Das bekommt jede generierte Website: llms.txt, eine Richtlinie für benannte KI-Crawler und jede Seite als Markdown.
Ein wachsender Teil der Menschen, die von einem kleinen Unternehmen hören werden, wird dessen Website nie besuchen. Sie fragen ein Modell, und das Modell antwortet mit dem, was es lesen konnte.
Damit ist "Kann ein Agent diese Website lesen?" eine Frage der Reichweite und keine technische Spielerei. Daraus folgen drei Dinge, und jede hier generierte Website bekommt alle drei, ohne dass man darum bitten muss.
robots.txt sollte die KI-Crawler beim Namen nennen
Sagt man nichts zu ihnen, fallen sie auf User-agent: * zurück. Das ist keine Richtlinie, sondern ein geerbter Standard.
Deshalb nennen wir sie: die Such- und Antwort-Agenten, die Quellenangaben zurückschicken - OAI-SearchBot, ChatGPT-User, Claude-SearchBot, Claude-User, PerplexityBot - und die Trainings-Crawler GPTBot, ClaudeBot, Google-Extended, meta-externalagent. Jeder von ihnen erbt genau dieselbe Disallow-Liste wie alle anderen: kein Bot bekommt die API, und kein Bot bekommt eine Seite nur für Mitglieder.
Sie zu nennen heißt nicht, großzügig zu sein. Es heißt, dass die Richtlinie irgendwo aufgeschrieben ist, wo man sie bewusst ändern kann.
llms.txt ist ein Inhaltsverzeichnis, kein Werbetext
Die llms.txt-Konvention ist einfach: eine Überschrift, eine einabsätzige Zusammenfassung als Blockquote, dann verlinkte Abschnitte. Ein Modell, das dort landet, soll in einem Abruf erkennen können, was diese Website ist und wo die wichtigen Seiten liegen, ohne etwas zu rendern.
Unsere wird aus der Website-Definition generiert, und das ist wichtiger, als es klingt. Die Auflistung wird nach derselben Regel für öffentlich/privat gefiltert wie die Sitemap:
# Piekarnia Lune
> A sourdough bakery in Kraków. Bread baked daily, cakes to order,
> open from seven.
## Pages
- [Menu](https://...): What we bake, and what it costs.
- [Order a cake](https://...): Wedding and birthday cakes, two weeks' notice.Eine Liste, dreimal gelesen - von der Sitemap, von llms.txt und vom robots-Meta-Tag. Die drei können sich nicht widersprechen, weil es nichts abzugleichen gibt.
Jede Seite auch als Markdown
Der schnellste Weg, missverstanden zu werden, ist, den Leser eine Seite voller Layout parsen zu lassen, um drei Sätze zu finden. Deshalb antwortet jede Seite jeder generierten Website sowohl als HTML als auch als Markdown:
- Sende
Accept: text/markdown, und du bekommst die Seite unter derselben URL als Markdown. - Oder häng
.mdan den Pfad, für die vielen Agenten, die nicht verhandeln.
Die Regeln, die das sauber halten, sind es wert, genannt zu werden. Es ist ein Rewrite, keine Weiterleitung. Es passiert nur bei einer ausdrücklichen text/markdown-Anfrage, nie bei */* - ein Browser, der "alles" schickt, will die Seite. Beide Antworten tragen Vary: Accept, damit ein geteilter Cache nicht allen denselben Body ausliefert. Und die Markdown-Variante ist noindex, damit sie nie in der Suche mit der Seite konkurriert, von der sie eine Kopie ist.
Der Serialisierer läuft über die Website-Definition statt über das gerenderte HTML, deshalb kommt das Ergebnis so sauber heraus: Ein Feature-Abschnitt wird zur Liste, ein FAQ zu Überschriften mit Antworten, eine Preistabelle zur Tabelle. Eine Karte oder ein Buchungskalender wird zu einer ehrlichen Zeile, die sagt, was dort ist, statt zu einer Erfindung dessen, was sie gezeigt hätte.
Es gilt auch für uns
Dieser Beitrag ist unter derselben URL mit .md am Ende verfügbar. Genauso jede andere Seite auf crea.site, und unsere eigene llms.txt listet sie auf.
Ein Website-Baukasten, dessen eigene Seiten ein Agent nicht lesen kann, argumentiert gegen sich selbst.