LLM 엔지니어링 · RAG 구조 · 이론
청킹 — 검색 단위를 정하는 일이 절반이다
한 줄 요약
청크는 검색의 최소 단위이자 컨텍스트에 들어가는 단위이므로, 너무 크면 노이즈가 섞이고 너무 작으면 문맥이 끊긴다.
왜 이게 필요했나
문서를 통째로 색인하면 두 가지가 무너진다. 첫째, 긴 문서는 여러 주제를 담고 있어 벡터가 평균으로 뭉개진다. 둘째, 검색에 성공해도 컨텍스트에 문서 전체를 넣어야 해서 토큰이 폭발한다.
그래서 문서를 잘라야 하는데, 어떻게 자르느냐가 검색 품질을 좌우한다.
어떻게 동작하나
고정 길이 분할은 N 글자 또는 N 토큰마다 자르는 방식이다. 구현이 단순하지만 문장 중간에서 끊겨 의미가 깨진다.
구분자 기반 분할은 문단이나 문장 경계에서 자른다. 의미 단위를 보존하지만 길이가 들쭉날쭉해진다.
겹침(overlap) 은 인접 청크가 일부를 공유하게 하는 기법이다. 경계에 걸친 정보가 어느 쪽에서도 검색되지 않는 문제를 완화한다. 대가는 저장량과 중복 검색이다.
계층적 분할은 작은 청크로 검색하고 그 청크가 속한 큰 단위를 컨텍스트로 넣는 방식이다. 검색 정밀도와 문맥 완결성을 함께 얻으려는 절충이다.
크기를 정하는 실용적인 기준은 이렇다. 한 청크가 하나의 질문에 답할 수 있는 최소 단위가 되게 한다. 너무 작아 "그것은"이 무엇을 가리키는지 알 수 없다면 문맥이 부족한 것이고, 너무 커서 한 청크에 서로 무관한 주제가 셋 들어 있다면 벡터가 뭉개진 것이다.
현장에서 만나는 모습
표와 코드 블록이 특히 까다롭다. 고정 길이로 자르면 표의 헤더와 본문이 분리되어 양쪽 다 쓸모없어진다. 헤더를 각 조각에 반복해 넣거나, 표는 통째로 하나의 청크로 두는 예외 처리가 필요하다.
메타데이터를 함께 저장하는 것도 중요하다. 문서 제목, 섹션 경로, 갱신일 같은 정보를 청크에 붙여 두면 검색 결과에 문맥을 보태고 필터링에도 쓸 수 있다. 실제로 청크 텍스트 앞에 제목과 섹션을 덧붙여 색인하는 것만으로 검색 품질이 눈에 띄게 오르는 경우가 많다.
마지막으로, 청킹 전략을 바꾸면 전체를 다시 색인해야 한다. 그래서 초기에 평가 집합으로 몇 가지 전략을 비교해 두는 편이 나중에 훨씬 싸게 먹힌다.
다음 실습에서 할 것
문장 단위로 청크를 만들어 문서 30건을 90여 개의 청크로 나누고, 그 단위로 색인해 검색이 문서 단위보다 정밀해지는지 확인한다.