AI는 왜 마크다운으로 일할까
TOC
이 블로그 저장소에 .md 파일이 101개 있다. 글 38편은 그렇다 치고, 나머지가 이상하다.
docs/superpowers/specs/2026-10-15-blog-i18n-design.md
docs/superpowers/plans/2026-10-15-i18n-routes-and-ui.md
docs/worklog/2026-10-26-search-appearance.md
AGENTS.md
설계 문서, 구현 계획, 작업 기록. 전부 AI와 같이 일하면서 생긴 것들이다. 게다가 AGENTS.md는 내가 만들지도 않았다 — next dev를 돌리면 Next가 알아서 만들어 놓는다. 지워도 다시 생긴다.
왜 하필 마크다운일까. JSON이 더 구조적이고, HTML이 더 표현력 있고, 그냥 txt가 더 단순한데.
재봤다.
토큰을 재보자
같은 내용 — 소제목 하나, 문단 하나, 목록 셋, 표 한 줄 — 을 네 가지 형식으로 쓰고 토큰을 셌다.
| 형식 | 바이트 | 토큰 | 마크다운 대비 |
|---|---|---|---|
| markdown | 354 | 100 | 기준 |
| HTML | 501 | 173 | 1.73배 |
| JSON | 900 | 242 | 2.42배 |
| 평문 | 305 | 80 | 0.80배 |
HTML은 1.7배, JSON은 2.4배다.
LLM에게 토큰은 곧 돈이고 시간이고, 무엇보다 한 번에 볼 수 있는 양이다. 컨텍스트 창이 20만 토큰이라면 마크다운으로는 문서 2천 개를 볼 수 있는 자리에 JSON으로는 826개밖에 못 넣는다.
어디서 차이가 나나
구조를 표시하는 비용을 따로 쟀다.
| 표현 | 마크다운 | HTML |
|---|---|---|
| 제목 | ## 제목 → 2 |
<h2>제목</h2> → 9 |
| 목록 항목 | - 항목 → 3 |
<li>항목</li> → 7 |
| 강조 | **굵게** → 5 |
<strong>굵게</strong> → 8 |
| 링크 | [링크](url) → 9 |
<a href="url">링크</a> → 13 |
제목이 4.5배다. HTML은 <h2>를 쓰고 </h2>로 닫는데, 닫는 쪽은 새로운 정보를 하나도 주지 않는다. 마크다운의 ##는 줄바꿈이 닫아 준다.
JSON은 더하다. 중괄호, 따옴표, 콜론, 쉼표, 들여쓰기까지 전부 토큰이다.
실제 글로도 재봤다
합성 예제는 내가 유리하게 만들 수 있으니, 이 블로그의 글 19편을 같은 렌더러(renderPostBody)로 돌려 원본과 결과물을 비교했다.
| 글 | md 토큰 | HTML 토큰 | 배수 |
|---|---|---|---|
| ai-developer-responsibility | 4,704 | 10,097 | 2.15배 |
| swe-bench | 3,451 | 5,131 | 1.49배 |
| npm-tgz | 3,755 | 6,437 | 1.71배 |
| Oxc | 1,849 | 5,074 | 2.74배 |
| NDJSON-JSON | 813 | 2,893 | 3.56배 |
| 19편 합계 | 27,560 | 69,560 | 2.52배 |
42,000 토큰 차이다. 표와 코드블록이 많은 글일수록 배수가 커진다 — NDJSON-JSON이 3.56배인 건 짧은 목록 항목이 많아서다. 항목당 <li></li>가 붙는다.
AI에게 "이 블로그 글 전체를 읽고 분류해 줘"라고 시킬 때, 마크다운이면 2만 7천 토큰, HTML이면 7만 토큰이다.
그런데 평문이 더 싸다
표를 다시 보면 걸리는 게 있다. 평문이 마크다운보다 20% 싸다. 그럼 평문을 쓰면 되지 않나.
안 된다. 평문에는 "이게 제목이다"라는 정보가 없기 때문이다.
캐싱 동작
코드 캐싱은 파싱과 컴파일 결과를 저장해 시작 시간을 줄인다.
콜드 런: 처음 방문
첫 줄이 제목인지, 그냥 짧은 문장인지 알 수 없다. 셋째 줄이 목록 항목인지 문단인지도 모른다. 사람은 눈치로 읽지만 기계는 추측해야 하고, 추측은 틀린다.
마크다운은 그 20%를 내고 모호함을 없앤다. ##가 있으면 제목이고, -가 있으면 목록이다. 구조를 얻는 값으로 20%는 싸다.
마크다운의 자리는 "구조가 있는 것 중에 가장 싼 것"이다. 구조를 버리면 20% 아끼고, 구조를 더 격식 있게 표현하면 73%에서 142%를 더 낸다.
깨졌을 때가 진짜 이유다
여기가 가장 중요한데 잘 이야기되지 않는다.
LLM은 토큰을 하나씩 순서대로 뱉는다. 되돌아가서 고치지 못한다. 그러니 중간에 한 글자를 틀릴 수 있다. 그때 무슨 일이 생기는지가 형식마다 다르다.
같은 내용을 마크다운과 JSON으로 쓰고, 각각 한 글자씩만 지웠다.
마크다운 : 닫는 ** 중 하나를 지움
JSON : 닫는 } 를 지움
결과:
| 형식 | 독자에게 도달한 글자 |
|---|---|
| 마크다운 | 60자 / 57자 (105%) |
| JSON | 0자 / 57자 (0%) |
JSON은 전멸한다.
SyntaxError: Expected ',' or '}' after property value
in JSON at position 118
파서가 던지고 끝이다. 118번째 글자에서 틀렸는데 1번째 글자부터 못 읽는다. 내용의 99%가 멀쩡해도 0%가 도달한다.
마크다운은 글자가 전부 살아남는다. 강조가 안 걸릴 뿐이다. 105%인 건 짝을 잃은 * 하나가 글자로 그냥 보이기 때문이다. 그게 전부다.
이 차이를 부르는 이름이 있다. 실패 모드가 완만하다(graceful degradation).
- JSON·XML은 전부 아니면 전무다. 문법이 깨지면 파싱 자체가 실패한다
- 마크다운은 깨진 만큼만 잃는다. 문법으로 못 읽은 기호는 그냥 글자가 된다
생성하는 쪽이 완벽하지 않다면, 두 번째가 압도적으로 낫다.
이 블로그도 그 성질에 한 번 기댄 적이 있다. 한국어 본문에서 **1.96%**였다 같은 강조가 안 걸리는 문제가 있었는데 — 닫는 ** 앞이 구두점이고 뒤가 조사라 CommonMark가 강조로 안 본다 — 그래도 글자는 다 보였다. 깨진 건 굵게 표시뿐이었다.
사람과 기계가 같은 파일을 본다
지금까지는 전부 "기계에게 싸다"는 이야기였다. 그런데 이게 다였다면 더 싼 포맷이 이겼을 것이다.
진짜 이유는 하나 더 있다. 사람도 읽는다.
마크다운은 2004년에 John Gruber가 만들었고, 설계 목표가 "마크업처럼 보이지 않는 마크업"이었다. 렌더링하지 않은 원본이 그대로 읽히는 것 — 그게 전부였다.
20년 뒤 그 성질이 전혀 다른 데서 쓸모가 생겼다.
| 사람 | 기계 | |
|---|---|---|
| 읽기 | 에디터에서 그대로 | 토큰 적게 |
| 쓰기 | 문법 안 외워도 됨 | 틀려도 덜 깨짐 |
| 고치기 | 한 줄 수정 | 한 줄 수정 |
| 리뷰 | git diff로 보임 |
— |
마지막 줄이 크다. JSON이나 바이너리 문서는 한 글자를 고쳐도 diff가 엉망이 되는데, 마크다운은 고친 줄만 바뀐다. AI가 문서를 고쳤을 때 "뭘 바꿨는지" 사람이 5초 만에 확인할 수 있다.
AGENTS.md
이게 표준이 됐다. AGENTS.md는 2025년 8월 OpenAI 주도로 Google, Cursor, Factory가 함께 만든 명세고, 2025년 12월 Linux Foundation의 Agentic AI Foundation에 기증됐다. 6만 개 넘는 오픈소스 프로젝트가 쓰고 있다고 한다.
내용은 그냥 마크다운이다. 스키마도, 버전 필드도, frontmatter도 없다.
## This is NOT the Next.js you know
This version has breaking changes — APIs, conventions, and file
structure may all differ from your training data.
이 저장소의 AGENTS.md에 실제로 들어 있는 내용이다. Next가 써 놓은 것이고, 읽는 대상은 AI지만 내가 읽어도 그대로 읽힌다. 스키마를 정의했다면 이렇게 못 썼다.
확실하지 않은 것
흔히 "학습 데이터에 마크다운이 많아서"라고들 한다. 그럴듯하고 아마 맞겠지만, 나는 확인할 방법이 없다. 어느 모델도 학습 데이터 구성을 공개하지 않는다.
그래서 이 글에서는 뺐다. 위의 네 가지 — 토큰, 구조, 실패 모드, 사람이 읽음 — 는 전부 직접 재거나 문서로 확인한 것이다.
정리
- 토큰이 싸다. 같은 내용이 HTML의 1/1.7, JSON의 1/2.4. 이 블로그 글 19편 기준 42,000 토큰 차이
- 그래도 평문보다는 20% 비싸다. 그 20%로 "무엇이 제목인지"를 산다. 마크다운은 구조가 있는 것 중 가장 싼 것이다
- 깨져도 읽힌다. 한 글자가 틀렸을 때 JSON은 0%가 살아남고 마크다운은 100%가 살아남는다. 한 토큰씩 뱉는 기계에게 이게 결정적이다
- 사람과 기계가 같은 파일을 본다.
git diff에 보이고, 리뷰할 수 있고, 한 줄만 고칠 수 있다
마크다운이 AI 시대를 위해 설계된 건 아니다. 2004년에 "마크업처럼 보이지 않게" 만든 것이 20년 뒤 사람과 기계가 공유할 수 있는 거의 유일한 형식이 됐을 뿐이다.
AI가 md 파일로 일하는 건 트렌드가 아니라, 조건이 맞아떨어진 결과다.
참고
- Markdown — Daring Fireball (John Gruber, 2004)
- CommonMark Spec
- AGENTS.md
- AGENTS.md가 Linux Foundation으로 — InfoQ
- 측정에 쓴 토크나이저: gpt-tokenizer
- 글 19편 측정은 이 저장소의
app/lib/posts/render.ts를 그대로 사용
