본문 바로가기
C.W.K.
Stream
Lesson 03 of 04 · published

원본을 가리킬까, 변환본을 붙잡을까

~12 min · referenced, captured, corpus-classes, conversion

Level 0꺼진 심지
0 XP0/33 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"어떤 파일은 그 자체가 글이고, 어떤 파일은 글을 안에 가둔 상자야. 상자라면 먼저 꺼내야 해."

원본으로 삼을 것이 두 종류야

마크다운이나 일반 텍스트는 파일의 바이트가 곧 글이야. 하지만 PDF와 Word 문서, HTML이 뒤섞인 웹페이지는 달라. 읽고 싶은 글이 특정 형식 안에 싸여 있어서 검색하기 전에 깨끗한 텍스트로 꺼내야 하지. Lantern은 이 차이를 referencedcaptured라는 두 코퍼스 종류로 구분해.

참조형(referenced): 파일이 바로 문서일 때

referenced 코퍼스에서는 디스크의 텍스트 파일이 권위 있는 원본이야. 파일을 읽고 chunk로 나누어 색인하면 끝이야. doc_sha256도 파일 자체의 해시를 써. Lantern은 이 파일을 보존한다고 약속하지 않고, 제자리에서 읽어 검색 가능하게 만들 뿐이야. 파일을 잃으면 원본도 사라져.

캡처형(captured): 꺼낸 텍스트가 문서일 때

captured 코퍼스에는 adapter가 필요해. PDF나 DOCX를 마크다운으로 바꾸거나, 웹페이지에서 태그를 걷어내고 본문만 추출하지. 그렇게 얻은 텍스트를 스냅샷 저장소에 보존한 뒤 chunk로 나누어 색인해. 여기서는 스냅샷의 해시가 doc_sha256이 되고 모든 문자 위치도 그 변환된 텍스트를 기준으로 삼아. 원본 바이트의 source_sha256은 따로 기록해서 소스가 그대로라면 비싼 변환을 다시 하지 않게 해.

둘의 차이는 보존 약속이야. referenced 파일이 사라지면 Lantern도 내용을 되살릴 수 없어. 반면 captured 소스가 사라져도 변환된 텍스트는 스냅샷에 남아. 참조형은 색인만 맡고 캡처형은 보존까지 맡아.

검색할 때는 같아 보여도 진실의 자리가 달라

두 종류 모두 chunk를 만들고 같은 검색 API와 출처 정보 형식을 써. 하류에서는 거의 똑같아 보여. 그러나 무엇을 권위 있는 문서로 삼는지는 완전히 달라. referenced는 디스크 파일이고, captured는 변환해 보존한 스냅샷이야. 이 선택 하나가 소스가 사라졌을 때 내용도 함께 사라질지, Lantern 안에 정확한 텍스트가 남을지를 결정해.

그러니 코퍼스 종류는 성능 옵션이 아니야. 소스가 사라졌을 때 무엇을 되찾을 책임이 있는지 정하는 보존 계약이지. 튼튼한 텍스트 파일은 참조형으로 충분하지만, 재현하기 어려운 PDF 변환 결과나 바뀔 수 있는 웹 본문은 캡처형이어야 그 약속을 지킬 수 있어.

Code

Captured 재색인: 바뀐 소스만 변환하고 스냅샷한 뒤 색인해·python
def reindex_captured(corpus) -> dict:
    stats = {"skipped": 0, "converted": 0}
    for src in discover(corpus.roots, corpus.include_globs):
        source_sha = sha256(read_bytes(src))

        if source_sha == last_source_sha(corpus.id, src):
            stats["skipped"] += 1              # unchanged source — no costly convert
            continue

        text = corpus.adapter.convert(src)     # PDF/DOCX/HTML -> clean markdown/prose
        snap_sha = snapshot_store.append(text) # append-only, content-addressed
        # doc_sha256 == snap_sha: offsets refer to the CONVERTED text
        index_document(corpus.id, src, doc_sha=snap_sha,
                       source_sha=source_sha, text=text)
        stats["converted"] += 1
    return stats
# Referenced corpora skip the convert+snapshot steps — the file IS the text.

External links

Exercise

소스를 두 무리로 나눠봐. A에는 제자리에서 바로 읽고 색인해도 되는 텍스트 파일을 두고, B에는 내용이 PDF나 내보낸 문서, 웹페이지 같은 포맷 안에 갇혀 소스가 사라질 수도 있는 자료를 둬. A는 referenced, B는 captured야. B의 각 자료를 깨끗한 텍스트로 바꾸려면 어떤 변환기가 필요한지도 적어.
Hint
B 무리를 가르는 질문은 이거야. '이 파일을 잃어도 정확한 텍스트를 다시 만들 수 있어?' 답이 아니요라면, PDF 안에 갇혔거나 언제 바뀔지 모르는 웹사이트에 기대고 있다는 뜻이니 참조만 해서는 안 되고 캡처가 필요해.

Progress

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

댓글 0

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

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