청킹 전략 3종 비교 — 「1 조항 = 1 청크」를 재본 적이 없다

무엇을

고정 길이 · 시멘틱 · 「1 조항 = 1 청크」 세 방식으로 각각 인덱스를 적재해 Recall@5·MRR 을 대조한다.

왜 — 미결 항목에 2026-08-27 부터 열려 있다

우리는 「1 조항 = 1 청크」 고정이고 근거도 있다 — 청크가 조항 경계를 넘나들면 doc_id 정확 일치 채점이 깨진다(청크 하나에 doc_id 를 하나만 달 수 있다). 다만 재본 적이 없다. 상용(LG CNS AICC)은 시멘틱 청킹을 쓴다고 밝히고 있다(9.3.1).

재적재가 1초라 비용이 거의 없다 — 안 재고 있는 이유가 비용은 아니다.

먼저 정해야 하는 것 — 채점 방식

시멘틱·고정 길이로 가면 청크마다 «대표 조항 ID» 를 달아야 지금 채점기가 그대로 돈다. 안 달면 Recall 이 «정답을 못 찾아서» 가 아니라 «채점이 못 알아봐서» 떨어지고, 그 둘은 구분이 안 된다. 측정 방법을 먼저 적고 그다음 잰다.

완료 조건


2026-09-15 — 「1 조항 = 1 청크」를 그대로 둔다. 재 보니 가장 높다

채점 방식을 먼저 정했다

실측

측정일 2026-09-15 · 커밋 38f2fc3-dirty · 골든셋 v1-150 B 항목 n96 · 지식베이스 98조항 · KoE5 · CPU
ELASTICSEARCH_URL=http://localhost:9200 .venv/bin/python scripts/compare_chunking.py
실험 인덱스 cgexp-chunk-* (측정 후 삭제) · 결과 data/processed/chunking-compare/2026-09-15.json

전략            청크  평균자  경계넘음 │ 검색   엄격 R@5  hits    MRR │ 느슨 R@5  hits
article           98   121       0  │ bm25     0.833  80/96  0.659 │   0.833  80/96
article           98   121       0  │ dense    0.979  94/96  0.885 │   0.979  94/96
fixed 200/50      94   196      89  │ bm25     0.760  73/96  0.564 │   0.781  75/96
fixed 200/50      94   196      89  │ dense    0.896  86/96  0.728 │   0.927  89/96
semantic p90      79   175      41  │ bm25     0.552  53/96  0.483 │   0.812  78/96
semantic p90      79   175      41  │ dense    0.625  60/96  0.568 │   0.938  90/96

결론

바꾸지 않는다. 결정 기록은 쓰지 않았다 — 채점 기준이 바뀌는 변경이 없다. 이 결과가 조항이 짧고(중앙 121자) 경계 표시가 있는 지금 지식베이스에 대한 것이라는 점은 남긴다. 상용(LG CNS)이 시멘틱을 쓰는 이유는 경계 표시가 없는 긴 문서라서일 수 있다.