llms.txt ve AI çağında SEO stratejileri
Google aramadan gelen trafik hâlâ önemli, ama artık kullanıcıların bir kısmı sorusunu ChatGPT'ye, Perplexity'ye ya da Claude'a soruyor. Cevap doğrudan modelin çıktısında beliriyorsa, kullanıcı sitenize hiç girmiyor. Daha da kötüsü: model sitenizin içeriğinden beslenmişse bile kaynak olarak sizi göstermeyebiliyor. Bu yeni gerçeklikte iki soru var: içeriğiniz LLM'lerin eğitim verisine ve retrieval pipeline'ına doğru biçimde giriyor mu? Ve bunu kontrol edebiliyor musunuz?
Klasik SEO neden yetmiyor
Geleneksel SEO, Googlebot'un sayfayı render edip indekslemesi üzerine kurulu. Title tag, meta description, canonical URL, sitemap.xml, robots.txt... Bunların hepsi arama motorlarının HTML'i anlaması için tasarlandı. LLM tabanlı asistanlar ise farklı çalışıyor.
Bir LLM, eğitim aşamasında web'den toplanan büyük bir korpusu işler. Inference zamanında ise (özellikle RAG tabanlı sistemlerde) kullanıcının sorusuna cevap üretmek için canlı kaynaklara başvurabilir. Her iki durumda da modelin ihtiyaç duyduğu şey, makinenin kolayca ayrıştırabileceği düz metin. JavaScript ile render edilen, reklam ve navigasyon gürültüsüyle dolu bir HTML sayfası, bu iş için verimsiz bir format.
Google'ın arama sonuçlarında "AI Overview" bölümü bile bu gerçeği gösteriyor: Google kendi LLM'ini beslerken bile sayfanın ana içeriğini çıkarmak için ekstra çaba harcıyor. Küçük sitelerin bu çıkarımda kaybolması sürpriz değil.
llms.txt nedir
llms.txt, 2024 sonlarında Jeremy Howard tarafından önerilen bir standart. Henüz bir RFC değil, ama konsept basit: sitenizin kök dizinine bir /llms.txt dosyası koyuyorsunuz. Bu dosya, sitenin LLM'lere yönelik bir özetini ve içerik haritasını içeriyor. robots.txt'in AI dünyasındaki karşılığı değil, daha çok sitemap.xml'in LLM'ler için optimize edilmiş hali.
Dosya Markdown formatında. Yapısı şöyle:
# Site Adı
> Sitenin kısa açıklaması. Bir ya da iki cümle.
## Docs
- [Başlangıç Rehberi](https://example.com/docs/getting-started.md): Kurulum ve ilk adımlar
- [API Referansı](https://example.com/docs/api-reference.md): Tüm endpoint'lerin listesi
- [Mimari Kararlar](https://example.com/docs/architecture.md): Neden bu yapıyı tercih ettik
## Blog
- [Performans İyileştirmeleri](https://example.com/blog/perf.md): v2.3 sürümündeki değişikliklerBirkaç dikkat çekici nokta var. Bağlantılar tercihen .md uzantılı dosyalara işaret ediyor, çünkü amaç HTML yerine düz metin sunmak. Her bağlantının yanındaki kısa açıklama, modelin hangi kaynağa başvurması gerektiğini anlamasını kolaylaştırıyor.
Bunun yanında llms-full.txt adında ikinci bir dosya daha koyabilirsiniz. Bu dosya, sitenin tüm içeriğini tek bir Markdown dosyasında birleştirir. Küçük ve orta ölçekli dokümantasyon siteleri için bu mantıklı: model tek bir istekle tüm bağlamı alır.
Pratikte llms.txt nasıl oluşturulur
Statik bir site ya da blog için bu dosyayı elle yazmak mümkün. Ama içerik sık değişiyorsa build sürecine entegre etmek daha doğru. Aşağıda Node.js ile basit bir üretici:
import { readdir, readFile, writeFile } from "node:fs/promises";
import { join } from "node:path";
import matter from "gray-matter";
interface Post {
title: string;
slug: string;
excerpt: string;
}
async function generateLlmsTxt(contentDir: string, baseUrl: string) {
const files = await readdir(contentDir);
const posts: Post[] = [];
for (const file of files) {
if (!file.endsWith(".md")) continue;
const raw = await readFile(join(contentDir, file), "utf-8");
const { data } = matter(raw);
if (data.title && data.slug && data.excerpt) {
posts.push({
title: data.title,
slug: data.slug,
excerpt: data.excerpt,
});
}
}
const lines = [
"# Teknik Blog",
"",
"> Yazılım geliştirme, TypeScript ve frontend ekosistemi üzerine yazılar.",
"",
"## Yazılar",
"",
...posts.map(
(p) => `- [${p.title}](${baseUrl}/yazilar/${p.slug}.md): ${p.excerpt}`
),
];
await writeFile("public/llms.txt", lines.join("\n"), "utf-8");
}
generateLlmsTxt("content/posts", "https://example.com");Burada dikkat edilmesi gereken şey: bağlantıların .md versiyonuna işaret etmesi. Sunucu tarafında /yazilar/slug.md isteğini karşılayacak bir route eklemeniz gerekiyor. Next.js kullanıyorsanız route handler ile bunu çözebilirsiniz:
// app/yazilar/[slug].md/route.ts
import { readFile } from "node:fs/promises";
import { join } from "node:path";
import { NextResponse } from "next/server";
export async function GET(
_req: Request,
{ params }: { params: Promise<{ slug: string }> }
) {
const { slug } = await params;
const cleanSlug = slug.replace(/\.md$/, "");
const filePath = join(process.cwd(), "content/posts", `${cleanSlug}.md`);
try {
const content = await readFile(filePath, "utf-8");
return new NextResponse(content, {
headers: { "Content-Type": "text/markdown; charset=utf-8" },
});
} catch {
return new NextResponse("Not found", { status: 404 });
}
}AI crawler'ları yönetmek
llms.txt içerik sunma tarafı. Ama bir de erişim kontrolü var. OpenAI'ın GPTBot'u, Google'ın Google-Extended'ı, Anthropic'in ClaudeBot'u, Common Crawl'ın CCBot'u gibi crawler'lar sitenizi ziyaret ediyor. Bunları robots.txt ile kontrol edebilirsiniz:
User-agent: GPTBot
Allow: /yazilar/
Disallow: /admin/
Disallow: /api/
User-agent: ClaudeBot
Allow: /yazilar/
Disallow: /admin/
User-agent: Google-Extended
Disallow: /
User-agent: CCBot
Disallow: /Burada bir tercih yapmanız gerekiyor. Google-Extended'ı engellediğinizde Google'ın AI Overview'da çıkma şansınız düşebilir, ama arama indekslemesi etkilenmez (o hâlâ Googlebot üzerinden çalışır). GPTBot'u engellediğinizde ChatGPT'nin browse özelliği sitenize erişemez.
Benim tercihim: blog içeriğini AI crawler'lara açık tutmak. İçeriğin okunması ve referans gösterilmesi, engellenmesinden daha faydalı. Perplexity gibi araçlar kaynak linkini veriyor; bu da trafik demek.
Yapılandırılmış veri ve Schema.org
LLM'ler JSON-LD formatındaki yapılandırılmış veriyi doğrudan "anlamıyor" gibi görünebilir, ama RAG pipeline'larında indeksleme yapan sistemler bu veriyi kullanıyor. Google'ın kendi arama LLM'i de Schema.org markup'ını hesaba katıyor.
Bir blog yazısı için minimum yapılandırılmış veri şöyle:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "TechArticle",
"headline": "llms.txt ve AI çağında SEO",
"datePublished": "2025-07-13",
"dateModified": "2025-07-13",
"author": {
"@type": "Person",
"name": "Yazar Adı",
"url": "https://example.com/hakkimda"
},
"description": "LLM'lere yönelik site optimizasyonu ve llms.txt standardı",
"mainEntityOfPage": "https://example.com/yazilar/llms-txt-rehberi"
}
</script>Article yerine TechArticle kullanmak, teknik içerik olduğunu açıkça belirtiyor. dateModified alanı, içeriğin güncelliğini hem arama motorlarına hem de AI sistemlerine gösteriyor.
Bunun ötesinde, SSS formatında içerik sunuyorsanız FAQPage schema'sı eklemek mantıklı. Google'ın AI Overview'ı soru-cevap formatındaki yapılandırılmış veriyi sıklıkla kaynak olarak kullanıyor.
İçerik formatı: LLM'lerin okuması kolay mı?
Bir sayfanın LLM tarafından doğru anlaşılıp anlaşılmayacağını etkileyen birkaç somut faktör var.
İlk ve en belirgin olanı: semantik HTML. <article>, <main>, <section> gibi etiketler kullanmak, hem erişilebilirlik hem de AI tarafından içerik çıkarımı için fark yaratıyor. Navigasyon, footer ve sidebar gürültüsü, ana içerikten ayrılabilir olmalı.
İkincisi: sayfa başına tek bir net konu. LLM'ler RAG ile bir sayfayı chunk'lara ayırırken, birden fazla farklı konuyu kapsayan uzun sayfalar karışıklık yaratıyor. Her sayfa tek bir soruyu yanıtlamalı.
Üçüncüsü: başlık hiyerarşisi. H1 > H2 > H3 sıralamasını bozmamak, modelin içerik yapısını anlamasını kolaylaştırıyor. Bu zaten iyi bir SEO pratiği, ama AI için de geçerli.
Mevcut siteye entegrasyon kontrol listesi
Bir teknik blog ya da dokümantasyon sitesine AI görünürlüğü eklemek için yapılacakları sıralayayım:
- Kök dizine
/llms.txtekleyin. İçeriğinizin Markdown bağlantılarını ve kısa açıklamalarını listeleyin. - Her yazının
.mdversiyonunu sunan bir endpoint oluşturun. - robots.txt'te AI crawler'lar için bilinçli bir karar verin: izin verin ya da engelleyin, ama varsayılanı bilinçsiz bırakmayın.
- JSON-LD ile
TechArticleveyaArticleschema'sı ekleyin. - Sayfaların
<main>etiketi içinde temiz, semantik HTML sunduğundan emin olun.
Küçük bir site için bu işlerin tamamı bir öğleden sonrayı alır.
Gerçekten işe yarıyor mu?
Burası dürüst olunması gereken nokta. llms.txt henüz yaygın olarak desteklenmiyor. Cursor, Mintlify ve bir kaç dokümantasyon aracı bunu okuyor; ama ChatGPT ya da Claude'un inference zamanında /llms.txt dosyanıza baktığına dair bir kanıt yok. Standart hâlâ erken aşamada.
Ama bu, yapmanın anlamsız olduğu anlamına gelmiyor. AI asistan ekosistemi hızlı değişiyor. Bugün standart olmayan bir uygulama, yarın varsayılan hale gelebilir. sitemap.xml de bir zamanlar "bunu kimse kullanmıyor" denilen bir dosyaydı. llms.txt'in maliyeti düşük (bir Markdown dosyası), potansiyel getirisi yüksek.
Yapılandırılmış veri ve temiz HTML tarafı ise zaten kanıtlanmış pratikler. Google'ın AI Overview'ının yapılandırılmış veriyi kullandığı, Google'ın kendi dokümantasyonunda (Search Central, Mayıs 2025 güncellemesi) belirtiliyor.
AI destekli arama araçları kaynak göstermeye devam ettikçe, API tasarımı gibi teknik içeriklerin LLM'ler tarafından doğru indekslenmesi trafik kaynağı olmaya devam edecek. Öte yandan, MCP sunucusu yazma gibi AI araçlarıyla doğrudan ilgili içerikler, bu ekosistemdeki geliştiriciler tarafından zaten AI asistanları üzerinden keşfediliyor.
Sonuç basit: llms.txt dosyasını ekleyin, yapılandırılmış veriyi düzgün tutun, crawler politikanızı bilinçli belirleyin. Bunların hiçbiri mevcut SEO'nuza zarar vermez, ama AI arama trafiği büyüdükçe fark yaratır.