"넌 책을 원하는 게 아냐. 문단을 원해. chunking 은 문단이 어디서 끝나는지 정하는 거야."
대체 왜 chunk 해?
문서 통째는 틀린 검색 단위야. 누가 특정 아이디어를 검색하는데 만 단어짜리 에세이 전체를 돌려주면 거의 쓸모없어 — 관련 구절이 그 안에 묻혀 있어. 그리고 임베딩 모델엔 딱딱한 토큰 천장이 있어; 임의로 긴 문서를 한 방에 벡터화 못 해. 그래서 문서가 chunk 로 잘려: 정밀한 답이 되고 임베딩 모델의 창에 맞을 만큼 작고, 일관된 생각을 담을 만큼 큰 구절. 검색이 실제로 돌려주는 건 문서가 아니라 chunk 야.
chunk 가 원자야
엔진의 모든 게 chunk 를 최소 단위로 지어져. chunk 가 색인되는 것, 임베딩되는 것, 순위 매겨지는 것, 인용되는 것이야. 검색의 원자야 — 엔진 관점에선 나눌 수 없어. 그리고 인용 단위라, 온전한 provenance 를 지녀야 해: 어느 문서에서 왔는지, 그 문서 어디에 정확히 앉는지, 누구나 검증하게 하는 해시. chunk 는 그냥 텍스트 조각이 아냐. 어디 사는지 정확히 아는 텍스트 조각이야.
canonical 텍스트로의 문자 offset
chunk 의 위치는 문자 offset — char_start 와 char_end — 으로 UTF-8 디코드된 문서 텍스트에 기록돼. byte offset 이 아니라(멀티바이트 문자 나타나는 순간 깨져), 줄 번호가 아니라(모호하고 부서지기 쉬워), 문서 id 로 해시된 정확히 같은 canonical 텍스트로의 문자 위치야. 이게 chunk 를 다시-자를 수 있게 만들어: 문서와 두 offset 을 주면, 동일한 범위를 자르고 chunk 해시로 확인할 수 있어. canonical 텍스트로의 offset 이, 검증할 수 있는 citation 과 믿어야만 하는 citation 의 차이야.
문서-통째 변형
chunk 가 원자라는 데서 규칙 하나가 더 흘러: 문서가 바뀌면, 어느 개별 chunk 가 옮겨졌는지 알아내 패치하려 하지 마. 그 문서의 모든 chunk 를 삭제하고 새로 계산한 세트를 하나의 원자적 트랜잭션으로 재삽입해. chunk 별 패치는 효율적으로 들리지만 오염 공장이야 — 잘못 계산된 경계 하나면 offset 이 텍스트와 안 맞아. 문서 통째가 변경의 가장 작은 안전한 단위고, 원자적 교체가 인덱스를 매 순간 정직하게 유지해.