robots.txt의 AI 봇 구분: 학습을 막으려다 ChatGPT 검색에서 빠진 두 앱
듀오랩스 이름으로 운영하는 형제 앱 스무 개의 robots.txt를 하나씩 열어 본 적이 있습니다. 그중 두 곳에 이런 줄이 있었습니다.
User-agent: OAI-SearchBot
Disallow: /
User-agent: PerplexityBot
Disallow: /바로 위 주석에는 "학습용 AI 크롤러는 막는다"고 적혀 있었습니다. 의도는 학습을 막는 것이었는데, 막힌 것은 검색이었습니다. 이 두 앱은 그동안 ChatGPT 검색과 Perplexity 답변에 나올 수 없었습니다.
AI 봇은 전부 학습용이라는 오해
AI 회사의 크롤러를 하나로 묶어 생각하기 쉽습니다. AI가 우리 글을 가져가는 것이 싫으면 AI 봇을 막으면 된다는 식입니다. 실제로는 한 회사가 목적이 다른 봇을 여럿 돌립니다.
OpenAI 문서에 따르면 GPTBot은 생성형 모델 학습용이고, OAI-SearchBot은 ChatGPT 검색에 사이트를 보여 주기 위한 것입니다. 문서는 OAI-SearchBot을 막은 사이트는 ChatGPT 검색 답변에 나오지 않는다고 분명히 적습니다. Anthropic도 같은 구조입니다. ClaudeBot은 학습, Claude-SearchBot은 검색 품질, Claude-User는 사용자가 질문했을 때 페이지를 가져오는 역할입니다.
| 목적 | OpenAI | Anthropic |
|---|---|---|
| 모델 학습 | GPTBot | ClaudeBot |
| 검색 색인 | OAI-SearchBot | Claude-SearchBot |
| 사용자 요청 시 열람 | ChatGPT-User | Claude-User |
학습을 막고 싶다면 첫 줄만 막아야 합니다. 두 번째 줄을 막는 것은 구글봇을 막는 것과 같은 효과입니다. 검색에서 사라집니다.
주석과 코드가 반대였던 이유
두 앱의 코드를 보면 실수의 모양이 보였습니다. 학습 봇 목록을 만들면서 이름에 "Bot"이 들어간 AI 회사의 크롤러를 한데 모은 것으로 보였습니다. 주석은 의도를 정확히 적었고, 목록만 넓었습니다.
같은 조사에서 반대 방향의 어긋남도 나왔습니다. 한 앱의 운영 문서는 "학습용 AI 크롤러를 막는다"고 적었는데 코드는 전부 허용하고 있었습니다. 다른 앱의 정책 문서는 학습을 거부한다고 적었고, 정작 본진은 학습을 허용하고 있었습니다. robots.txt는 앱마다 따로 쓰고, 방침은 문서마다 따로 적다 보니 스무 개가 저마다의 방침을 갖게 된 것입니다.
학습 봇까지 허용하기로 한 판단
고치면서 질문을 하나 더 해야 했습니다. 검색 봇을 풀어 주는 것은 당연한데, 학습 봇은 계속 막을 것인가.
저는 전부 허용하기로 했습니다. 이유는 두 가지입니다. 학습 봇을 막아도 검색 노출은 달라지지 않습니다. 검색에 쓰이는 봇은 따로 있기 때문입니다. 반대로 허용하면 다음 세대 모델이 듀오랩스라는 회사와 우리가 쓴 글을 알고 있을 가능성이 생깁니다. 블로그 글은 이미 CC BY 4.0으로 공개하고 있어서, 학습을 막는 것은 블로그의 라이선스 방침과도 맞지 않았습니다.
이 판단은 회사마다 다를 수 있습니다. 유료 콘텐츠를 파는 곳이라면 학습을 막는 것이 맞습니다. 다만 그 경우에도 검색 봇은 따로 열어 두어야 합니다. 막을 이유가 학습에 있다면 학습 봇만 막는 것이 정확한 표현입니다.
방침을 한 줄로, 확인은 기계에게
스무 개 앱에서 같은 실수가 다시 나오지 않으려면 방침이 한곳에 있어야 합니다. 그래서 앱을 만드는 공통 스타터 템플릿의 robots 규칙에 "AI 검색 봇 명시 허용, 학습 봇은 그룹 방침 한 줄을 따른다"를 넣기로 했습니다. 새 앱은 처음부터 같은 규칙으로 태어납니다.
이미 있는 앱은 사람이 매번 열어 볼 수 없습니다. 공개 호스트 목록을 돌면서 robots.txt에 검색 봇 차단이 있는지를 주기적으로 확인하는 점검을 두는 것이 다음 할 일입니다. robots.txt는 틀려도 아무 에러를 내지 않습니다. 사이트는 멀쩡히 열리고, 검색 결과에서만 조용히 빠집니다.
OpenAI 문서에 따르면 robots.txt를 고친 뒤 검색 시스템에 반영되기까지 24시간쯤 걸립니다. 제가 고친 것은 9월 29일이었습니다. 그 전까지 이 두 앱이 AI 검색에서 얼마나 빠져 있었는지는 이제 알 수 없습니다. 알 수 있는 것은 앞으로 같은 줄이 다시 들어가면 점검이 먼저 알려 준다는 것뿐입니다.
함께 읽기
- 구글·네이버·Bing·다음 웹마스터 도구 비교: 서브도메인이 많을 때 갈리는 것서브도메인 열세 개를 검색엔진에 등록하는 데 구글은 DNS 레코드 한 줄이었고, 네이버는 같은 일을 열세 번 반복해야 했습니다. 두 도구의 기능 목록은 비슷합니다. 사이트맵을 받고, 소유를 확인하고, 수집 현황을 보여 줍니다. 갈리는 것은 무엇을 사이트 하나로 세는가였습니다.
- 네이버 서치어드바이저 서브도메인 등록: 사이트맵·RSS·수집 요청이 하는 일서브도메인 사이트맵을 본진 사이트에 넣었더니 네이버가 받지 않았습니다. https://duolabs.co.kr 로 등록해 둔 사이트의 사이트맵 제출 칸에 https://cdn.duolabs.co.kr/sitemap.xml 을 넣고 확인을 누르자, 화면 아래에 빨간 띠가 떴습니다.
- JSON-LD @id 하나로 회사가 둘이 되는 문제: #org와 #organization형제 앱 스무 개의 구조화 데이터(JSON-LD)를 모아 보다가 회사가 두 개인 것을 발견했습니다. 여섯 곳은 발행자를 이렇게 가리켰습니다.
- 형제 서비스 스무 개의 llms.txt: 본진을 허브로, 앱은 가리키기만듀오랩스 본진의 llms.txt를 다시 읽어 봤습니다. AI가 사이트를 이해하도록 요약해 두는 파일입니다. 서비스 상세로는 웹 개발 페이지 하나가 올라 있었습니다. 그런데 듀오랩스 이름으로 돌아가는 형제 앱은 스무 개입니다. 업무 시스템, AI 자동화, 3D, ERP 같은 데모까지, AI가 "듀오랩스는 무엇을 만드나"를…
- UTM 값 14종을 9종으로: 형제 앱 스무 개의 유입 측정 어휘 정리듀오랩스 형제 앱 스무 개는 거의 모두 본진으로 가는 "제작 문의" 링크를 달고 있습니다. 어느 앱에서 온 문의가 많은지 보려고 링크의 UTM을 모아 봤습니다. utmcampaign은 대부분 crossappcta로 같았습니다. 문제는 utmmedium이었습니다. 값이 14가지였습니다.