점점 더 많은 사람들이 ChatGPT, Perplexity 및 기타 AI 도구를 사용하여 콘텐츠를 검색하고 요약하고 있습니다. 제 이전 게시물 중 하나인 SEO에서 SAO로에서 논의한 바와 같이 웹사이트와 블로그 방문의 대부분이 AI 에이전트에서 나올 날이 멀지 않았습니다.
언어 모델이 콘텐츠에 접근할 수 있도록 하는 데 있어 복잡한 크롤링 솔루션보다 더 간단한 방법이 있습니다. 특히 Astro로 구축된 정적으로 생성된 사이트의 경우 더욱 그렇습니다. 이 게시물에서는 블로그 콘텐츠를 깨끗하고 구조화된 형식으로 LLM에 노출하는 llms.txt 파일을 만드는 방법을 안내합니다.
llms.txt란 무엇인가요?
llms.txt 파일은 개념적으로 robots.txt와 유사하지만 언어 모델을 위해 특별히 설계되었습니다. 이는 LLM이 쉽게 구문 분석하고 이해할 수 있는 구조화된 텍스트 기반 콘텐츠 표현을 제공합니다.
LLM은 링크를 통해 여러 페이지를 탐색하는 데 능숙하지 않습니다. 대신 LLM은 단일 페이지에서 콘텐츠를 스크랩하여 메모리에 저장하는 데 매우 능숙합니다. 바로 이 지점에서 llms.txt가 매우 유용해집니다.
Crawl4AI와 같은 크롤링 도구가 과도한 이유
Crawl4AI와 같은 도구는 LLM을 위한 강력한 웹사이트 크롤링 기능을 제공합니다. 동적 사이트용 LLMs.txt를 생성하는 데 이상적이지만 정적 사이트에는 과도할 수 있습니다.
특히 Astro 사이트의 경우 콘텐츠가 일반적으로 프런트매터가 있는 마크다운 파일로 저장되므로 이미 완벽하게 구조화된 콘텐츠를 직접 노출할 준비가 되어 있습니다.
Astro에서 llms.txt 엔드포인트 구현
Astro 사이트용 LLMs.txt 파일을 생성하는 방법은 다음과 같습니다.
src/pages/llms.txt.ts (또는 Astro 구성에 따라 src/pages/api/llms.txt.ts)에 파일을 만들고 다음 코드를 추가합니다.
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 = `# 귀하의 웹사이트 이름 - 전체 콘텐츠 가이드
이 문서에는 웹사이트의 전체 콘텐츠가 포함되어 있습니다.
웹사이트: https://yourwebsite.com
최종 업데이트 날짜: ${new Date().toISOString().split('T')[0]}
## 블로그 콘텐츠
${sortedBlogs
.map((post) => `#
## ${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}
---`).join('\n\n')}
## 추가 콘텐츠 섹션
${activeFeatures
.map((feature) => `#
## ${feature.data.title}
URL: https://yourwebsite.com/${feature.data.slug}
카테고리: ${feature.data.category}
${feature.data.description}
${feature.body}
---`).join('\n\n')}
---
이 콘텐츠는 AI 도우미가 웹사이트의 제공 사항을 이해하고 정확한 정보를 제공하는 데 도움이 되도록 제공됩니다.`;
return new Response(content, {
headers: {
"Content-Type": "text/plain; charset=utf-8",
"Cache-Control": "public, max-age=3600" // 1시간 동안 캐싱
},
});
} catch (error) {
console.error('llms.txt 생성 오류:', error);
return new Response('llms.txt 생성 오류', { status: 500 });
}
};
이 코드의 작동 방식
이 코드는 다음을 수행하는 API 엔드포인트를 만듭니다.
getCollection()을 사용하여 콘텐츠 컬렉션에서 모든 게시물을 가져옵니다.- 게시된 기사만 포함하도록 초안 콘텐츠를 필터링합니다.
- 가장 최근 콘텐츠를 먼저 표시하기 위해 날짜별로 콘텐츠를 정렬합니다.
- 사이트 제목으로 시작하는 구조화된 텍스트 파일을 만듭니다.
- 각 게시물에 대해 다음을 포함합니다.
- 제목을 머리글로 사용
- 게시물에 대한 직접 링크
- 메타데이터 (날짜, 카테고리, 작성자, 설명)
- 전체 게시물 콘텐츠
- 적절한 오류 로깅으로 오류를 정상적으로 처리합니다.
- 성능을 위해 캐싱을 포함하여 적절한 헤더를 설정합니다.
콘텐츠 구조에 맞게 사용자 지정
컬렉션 이름 조정
위의 예에서는 여러 컬렉션을 사용합니다. 블로그 컬렉션만 있는 경우 다음과 같이 단순화합니다.
export const GET: APIRoute = async () => {
const posts = await getCollection("blog"); // 컬렉션 이름에 맞게 조정
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 = `# 귀하의 블로그 이름
${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" },
});
};
콘텐츠 필터링 추가
특정 카테고리를 제외하거나 추천 콘텐츠만 포함할 수 있습니다.
// 추천 게시물만 포함
const featuredPosts = posts.filter(post => post.data.featured && !post.data.draft);
// 특정 카테고리 제외
const filteredPosts = posts.filter(post =>
!post.data.draft && !['internal', 'private'].includes(post.data.category)
);
llms.txt 사용의 이점
1. 향상된 AI 검색 가능성
AI 도구는 여러 페이지를 크롤링하지 않고도 전체 콘텐츠 라이브러리를 빠르게 이해할 수 있습니다.
2. AI 응답에 대한 더 나은 컨텍스트
사용자가 콘텐츠와 관련된 질문을 할 때 AI 모델은 포괄적이고 구조화된 정보에 액세스할 수 있습니다.
3. AI 시대를 위한 SEO
검색이 AI 기반 결과로 발전함에 따라 AI 소비를 위한 구조화된 콘텐츠를 갖는 것이 중요해집니다.
4. 성능 이점
정적 생성은 llms.txt 파일이 빌드 시 생성되어 빠른 응답 시간을 제공함을 의미합니다.
llms.txt 구현 테스트
엔드포인트를 구현한 후 다음 방법으로 테스트합니다.
- 엔드포인트 직접 방문:
https://yoursite.com/llms.txt - 콘텐츠 구조 확인하여 모든 게시물이 포함되었는지 확인
- 서식 확인하여 깔끔하고 읽기 쉬운지 확인
- AI 도구에 llms.txt 콘텐츠 분석을 요청하여 AI 도구로 테스트
llms.txt에 대한 모범 사례
콘텐츠를 최신 상태로 유지
새 콘텐츠를 게시할 때 사이트를 다시 빌드하여 llms.txt를 정기적으로 업데이트합니다.
관련 메타데이터 포함
AI가 컨텍스트를 이해하는 데 도움이 되도록 게시 날짜, 카테고리 및 설명을 추가합니다.
콘텐츠를 명확하게 구성
일관된 제목 형식과 섹션 간의 명확한 구분 기호를 사용합니다.
파일 크기 모니터링
게시물이 수백 개인 사이트의 경우 파일 크기를 관리하기 쉽도록 콘텐츠를 페이지로 나누거나 필터링하는 것을 고려하십시오.
결론
Astro 웹사이트용 llms.txt 파일을 만드는 것은 AI 언어 모델이 콘텐츠에 접근할 수 있도록 하는 간단한 방법입니다. 이 접근 방식은 Astro의 콘텐츠 컬렉션을 활용하여 사이트 콘텐츠의 구조화되고 포괄적인 보기를 만듭니다.
콘텐츠 검색에 AI가 점점 더 중요해짐에 따라 llms.txt를 구현하면 AI 기반 검색 환경에서 웹사이트의 가시성을 높일 수 있습니다. 구현은 간단하고 성능이 뛰어나며 Astro 빌드 프로세스의 일부로 유지 관리가 쉽습니다.
지금 llms.txt 구현을 시작하여 콘텐츠가 AI 기반 검색 및 검색의 미래에 대비할 수 있도록 하십시오.
자주 묻는 질문
llms.txt와 sitemap.xml의 차이점은 무엇인가요?
sitemap.xml은 검색 엔진 크롤러에 대한 페이지를 나열하는 반면, llms.txt는 언어 모델이 이해하고 처리할 수 있도록 최적화된 형식으로 실제 콘텐츠를 제공합니다.
llms.txt 파일을 얼마나 자주 업데이트해야 하나요?
Astro 사이트를 다시 빌드하면 llms.txt 파일이 자동으로 업데이트되므로 콘텐츠 게시 일정에 따라 최신 상태를 유지합니다.
llms.txt에 이미지 및 미디어를 포함할 수 있나요?
llms.txt는 텍스트 기반이므로 파일 자체 대신 이미지 및 미디어에 대한 설명을 포함합니다. AI가 효과적으로 처리할 수 있는 텍스트 콘텐츠에 집중하십시오.
llms.txt가 SEO에 영향을 미치나요?
아니요, llms.txt는 기존 SEO에 부정적인 영향을 미치지 않습니다. AI 도구가 콘텐츠에 접근할 수 있도록 하여 기존 SEO 전략을 보완하도록 설계되었습니다.
llms.txt 파일 크기는 어느 정도여야 하나요?
엄격한 제한은 없지만 합리적으로 유지하십시오. 게시물이 수백 개인 사이트의 경우 가장 중요하거나 최근 콘텐츠만 포함하도록 필터링하는 것을 고려하십시오.