C.W.K.
Stream
Lesson 01 of 04 · published

chunking, 검색의 원자

~12 min · chunking, offsets, atom, whole-document

Level 0불 꺼진 심지
0 XP0/33 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"넌 책을 원하는 게 아냐. 문단을 원해. chunking 은 문단이 어디서 끝나는지 정하는 거야."

대체 왜 chunk 해?

문서 통째는 틀린 검색 단위야. 누가 특정 아이디어를 검색하는데 만 단어짜리 에세이 전체를 돌려주면 거의 쓸모없어 — 관련 구절이 그 안에 묻혀 있어. 그리고 임베딩 모델엔 딱딱한 토큰 천장이 있어; 임의로 긴 문서를 한 방에 벡터화 못 해. 그래서 문서가 chunk 로 잘려: 정밀한 답이 되고 임베딩 모델의 창에 맞을 만큼 작고, 일관된 생각을 담을 만큼 큰 구절. 검색이 실제로 돌려주는 건 문서가 아니라 chunk 야.

chunk 가 원자야

엔진의 모든 게 chunk 를 최소 단위로 지어져. chunk 가 색인되는 것, 임베딩되는 것, 순위 매겨지는 것, 인용되는 것이야. 검색의 원자야 — 엔진 관점에선 나눌 수 없어. 그리고 인용 단위라, 온전한 provenance 를 지녀야 해: 어느 문서에서 왔는지, 그 문서 어디에 정확히 앉는지, 누구나 검증하게 하는 해시. chunk 는 그냥 텍스트 조각이 아냐. 어디 사는지 정확히 아는 텍스트 조각이야.

canonical 텍스트로의 문자 offset

chunk 의 위치는 문자 offset — char_startchar_end — 으로 UTF-8 디코드된 문서 텍스트에 기록돼. byte offset 이 아니라(멀티바이트 문자 나타나는 순간 깨져), 줄 번호가 아니라(모호하고 부서지기 쉬워), 문서 id 로 해시된 정확히 같은 canonical 텍스트로의 문자 위치야. 이게 chunk 를 다시-자를 수 있게 만들어: 문서와 두 offset 을 주면, 동일한 범위를 자르고 chunk 해시로 확인할 수 있어. canonical 텍스트로의 offset 이, 검증할 수 있는 citation 과 믿어야만 하는 citation 의 차이야.

원자를 정의하고, 자기 주소를 지니게 만들어. 모든 검색 시스템엔 돌려주는 최소 단위가 있어. 네 것이 뭔지 의도적으로 정하고, 그 단위를 자기-위치화하게 만들어: 소스와 정확한 위치를 알아야, 어떤 결과든 되짚어 처음부터 재검증할 수 있어. 어디서 왔는지 못 말하는 원자는 인용될 수 없고 — 인용 불가한 결과는 그냥 소문이야.

문서-통째 변형

chunk 가 원자라는 데서 규칙 하나가 더 흘러: 문서가 바뀌면, 어느 개별 chunk 가 옮겨졌는지 알아내 패치하려 하지 마. 그 문서의 모든 chunk 를 삭제하고 새로 계산한 세트를 하나의 원자적 트랜잭션으로 재삽입해. chunk 별 패치는 효율적으로 들리지만 오염 공장이야 — 잘못 계산된 경계 하나면 offset 이 텍스트와 안 맞아. 문서 통째가 변경의 가장 작은 안전한 단위고, 원자적 교체가 인덱스를 매 순간 정직하게 유지해.

Code

chunk 은 소스에서 자기의 정확하고 검증 가능한 위치를 알아·python
def chunk_document(text: str, profile) -> list[Chunk]:
    """Cut a document into chunks, each carrying its exact offsets into `text`."""
    chunks, cursor = [], 0
    for span in split_paragraphs(text, max_chars=profile.max_chars):
        start = text.index(span, cursor)      # character offset into canonical text
        end = start + len(span)
        chunks.append(Chunk(
            text=span,
            char_start=start,                  # re-sliceable: text[start:end] == span
            char_end=end,
            chunk_sha256=sha256(span),         # verifiable
        ))
        cursor = end
    return chunks

# On change: delete ALL of a document's chunks, reinsert the new set atomically.
# Never try to patch individual chunks — that's where offsets drift out of sync.

External links

Exercise

긴 문서를 잡아 자연 경계에서 손으로 chunk 로 잘라. 각 chunk 마다, 시작·끝 문자 offset 을 적어. 이제 검증해: text[start:end] 가 그 chunk 를, 문자 하나하나, 정확히 돌려줘? offset 이 하나라도 어긋나면, 엔진이 왜 canonical 텍스트로의 offset 을 기록하고 해시로 재검증하는지 방금 느낀 거야 — 작은 drift 가 모든 citation 을 조용히 깨.
Hint
좋은 chunk 기록의 테스트는 문서 더하기 offset 이 모호함 없이 정확한 chunk 를 재구성할 수 있냐야. '아, 그리고 끝 개행을 벗겼지' 도 기억해야 했다면, offset 이 canonical 텍스트를 안 가리키는 거고 — 그 틈이 검증이 실패하는 곳이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.