Google AI Overviews·Perplexity·ChatGPT Search가 RAG(Retrieval-Augmented Generation) 파이프라인으로 인용 후보를 선택할 때, 콘텐츠의 구조 신호는 두 레이어에서 동시에 작동한다. 첫째, HTML 파서가 DOM을 청킹(chunking)할 때 <table>·<li>·<dl> 경계를 자연스러운 분리 지점으로 인식한다. 둘째, 임베딩 모델이 의미 단위를 벡터화할 때 구조화된 항목은 산문(prose)보다 밀도 높은 사실 벡터를 형성해 질의와의 코사인 유사도를 높인다. 즉, 표·리스트·정의문의 인용 우위는 '가독성 선호'가 아니라 파서와 임베딩 레이어의 구조 처리 메커니즘에서 비롯된다.
크롤러·파서가 구조적 콘텐츠를 처리하는 메커니즘
Googlebot과 Perplexity의 RAG 스크레이퍼는 HTML DOM을 파싱해 텍스트 청크를 생성한다. 블록 레벨 태그는 이 과정에서 청크 경계(boundary) 역할을 한다.
- 표(
<table>): 행 단위로 분리 가능한 키-값 쌍을 형성한다.<th scope="col">속성이 있으면 파서가 열 헤더와 데이터 셀의 관계를 명시적으로 파악할 수 있어, LLM이 "A의 B는 C이다" 형태의 사실 문장으로 재조합하기 쉽다. scope 없는 표는 헤더-데이터 관계를 파서가 추론해야 하므로 정확도가 떨어진다. - 순서 없는 목록(
<ul><li>): 각<li>는 독립적인 사실 단위로 취급된다. 산문에서 쉼표로 나열된 항목은 파서가 경계를 추론해야 하지만,<li>는 명시적 분리를 제공해 청킹 오류를 줄인다. 특히 256~512 토큰 단위로 잘리는 RAG 청크에서 항목 중간 단절을 방지한다. - 정의 목록(
<dl><dt><dd>) 및<dfn>: 용어와 정의의 관계를 HTML 시맨틱으로 선언한다. Google Search Central 문서는<dfn>을 지식 패널 연결 신호로 명시하며,<dl>블록은 용어집 페이지의 구조를 파서에게 직접 전달한다.
LLM 인용 결정에서 구조가 작동하는 방식
RAG 파이프라인의 인용 선택은 (1) 질의 임베딩 → (2) 벡터 검색(코사인 유사도) → (3) 리랭킹 → (4) 컨텍스트 삽입 순으로 진행된다. 구조적 콘텐츠는 2단계와 3단계에서 구조적 이점을 갖는다.
- 밀도 높은 사실 벡터: 리스트 항목은 수식어 없이 핵심 사실만 포함하므로 임베딩 벡터가 특정 개체·속성 쌍에 집중된다. "A는 B이다" 형태의 정의문은 "A가 무엇인가?" 질의와의 코사인 유사도가 산문 단락보다 높게 산출되는 경향이 있다(공식 수치 없음, 실험적 추정).
- 청크 독립성: 표의 한 행이나 리스트의 한 항목은 앞뒤 문맥 없이도 의미를 전달할 수 있다. 컨텍스트 단절로 품질이 저하되는 산문 청크와 달리, 구조화 항목은 잘린 청크에서도 일관된 사실성을 유지한다.
- 인용 출처 부착 편의: Perplexity·ChatGPT Search는 인용 번호를 특정 문장 단위에 부착한다. 구조화된 항목은 인용 대상 문장이 명확해 LLM이 출처를 연결하기 쉽다. 산문 단락에서는 어느 문장이 인용 근거인지 모델이 추론해야 한다.
구현 — 인용 최적화 마크업과 JSON-LD
HTML 표: scope 속성 강제 패턴
<th scope> 없는 표는 파서가 헤더-데이터 관계를 추론해야 한다. 아래는 접근성과 파서 인식을 동시에 충족하는 최소 마크업이다.
<table>
<caption>RAG 파이프라인 구조 유형별 처리 방식</caption>
<thead>
<tr>
<th scope="col">구조 유형</th>
<th scope="col">청크 경계</th>
<th scope="col">JSON-LD 보강 타입</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">table + scope</th>
<td>행 단위 자동 분리</td>
<td>ItemList / Table</td>
</tr>
<tr>
<th scope="row">ol > li</th>
<td>항목 단위 자동 분리</td>
<td>ItemList (HowTo)</td>
</tr>
<tr>
<th scope="row">dl > dt + dd</th>
<td>용어-정의 쌍 단위</td>
<td>DefinedTerm</td>
</tr>
</tbody>
</table>
JSON-LD: DefinedTerm과 ItemList 병행 선언
HTML 구조만으로는 의미 관계가 파서에게 암묵적이다. JSON-LD로 명시적 선언을 추가하면 Google 지식 그래프 연결 가능성이 높아지고, 구조화 데이터 테스트 도구로 검증이 가능해진다.
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "DefinedTerm",
"@id": "https://example.com/glossary#rag",
"name": "RAG (Retrieval-Augmented Generation)",
"description": "외부 문서를 실시간 검색해 LLM 응답의 사실 근거로 삽입하는 생성 아키텍처",
"inDefinedTermSet": {
"@type": "DefinedTermSet",
"name": "AI 검색 용어집",
"url": "https://example.com/glossary"
}
},
{
"@type": "ItemList",
"name": "인용 최적화 HTML 구조 유형",
"numberOfItems": 3,
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "HTML 표 (scope 속성 포함)",
"description": "행·열 관계를 명시해 파서의 키-값 추출 지원"
},
{
"@type": "ListItem",
"position": 2,
"name": "순서 있는 목록 (ol > li)",
"description": "절차·우선순위를 li 단위로 분리해 청킹 오류 방지"
},
{
"@type": "ListItem",
"position": 3,
"name": "정의 목록 (dl > dt + dd)",
"description": "용어-정의 쌍을 시맨틱으로 선언해 KG 연결 촉진"
}
]
}
]
}
SEO·AEO·GEO 관점 비교
| 구조 유형 | SEO (검색 랭킹) | AEO (답변 엔진 최적화) | GEO (생성형 인용) |
|---|---|---|---|
| 표 | Rich Snippet 테이블 카드 트리거 | Featured Snippet 직접 발췌 | 행 단위 사실 재조합·인용 부착 |
| 순서 없는 목록 | 구조화 콘텐츠 신호 | Bulleted Answer 추출 | 청크 경계 명확 → 인용 부착 용이 |
| 정의문 | Knowledge Panel 엔티티 연결 | 정의 패널·사전 카드 트리거 | DefinedTerm 매칭으로 인용 우선순위 상승(추정) |
| JSON-LD 보강 | Rich Results 필수 조건 | ItemList 인식률 향상 | DefinedTerm·ItemList 가중치 높음(추정) |
흔한 오해 — "Markdown 표만으로 충분하다"
CMS나 노션에서 Markdown 표를 작성하고 렌더링된 HTML을 그대로 사용하는 경우가 많다. 그러나 대부분의 Markdown 파서(marked.js, remark 등)는 <th scope> 속성을 생성하지 않으며, <caption>도 누락된다. 결과적으로 파서는 첫 행을 헤더로 추론해야 하며 열 관계 정보가 소실된다.
올바른 처리: CMS의 HTML 출력을 후처리 훅으로 보강한다. Next.js·Gatsby 환경에서는 커스텀 rehype 플러그인으로 <table> 요소에 scope 속성을 자동 주입하고, JSON-LD를 페이지 <head>에 삽입한다. WordPress라면 the_content 필터에서 PHP DOMDocument로 <th> 노드를 탐색해 scope를 추가하고, wp_kses_allowed_html 필터로 scope를 허용 속성 목록에 포함시킨다.
검증·측정
- Google Rich Results Test: JSON-LD ItemList·DefinedTerm이 파싱되는지 확인한다. 경고 없이 통과해야 구조 데이터가 색인에 반영된다. 경고 항목은 필수 속성 누락(
name,position)인 경우가 많다. - Search Console 검색 결과 필터: AI Overviews 트리거 여부는 직접 노출되지 않지만, Featured Snippet 등장 빈도와 클릭률(CTR) 변화를 구조 개선 전후 28일 구간으로 비교해 간접 측정할 수 있다.
- Perplexity 수동 조회: 핵심 질의어를 입력하고 출처 패널에 해당 URL이 등장하는지 확인한다. 인용되지 않으면 청크 품질 또는 도메인 권위가 임계치 미만일 가능성이 높다.
- /llms.txt 선언: 표·정의 집약 페이지 URL을
/llms.txt에 명시적으로 열거하면 LLM 에이전트가 사이트 크롤 시 우선 참조 페이지를 인식한다. 현재 사실상 표준화 진행 중이며 강제 신호는 아니다.
<dl><dt><dd>와 <dfn> 중 인용에 더 유리한 것은?
<dfn>은 인라인 맥락에서 용어를 최초 정의하는 단일 시그널이고, <dl><dt><dd>는 여러 용어-정의 쌍을 블록 단위로 묶는 구조다. Google Search Central은 <dfn>을 지식 패널 연결 신호로 명시한다. GEO 인용에 어느 쪽이 더 강한지는 공식 발표 데이터가 없으므로 추정 범위다. 실무 권고는 병용이다: 용어가 처음 등장하는 본문에 <dfn>을 부착하고, 페이지 하단 또는 별도 용어집 페이지에 <dl> 블록을 두어 JSON-LD DefinedTerm으로 보강한다.
표가 이미지(스크린샷)로만 존재하면 크롤러에 어떤 영향을 주는가?
이미지로 렌더링된 표는 크롤러와 LLM 파서 모두에게 불투명(opaque)하다. Google의 이미지 OCR 기술이 일부 텍스트를 읽지만 행·열 관계 정보는 복원되지 않으며, RAG 파이프라인에서 사실 단위 청크로 추출될 가능성이 매우 낮다. 수정 방법은 HTML 표로 재작성하는 것이다. 시각적 표현이 반드시 필요한 경우(복잡한 다색 차트 등)에는 HTML 표를 원문 데이터 소스로 두고, 이미지를 시각 보조로 함께 제공하는 방식을 택한다.
참고 자료
이 글의 권고는 아래 공식 문서·연구를 근거로 합니다.