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

Passage 는 텍스트를 고정해

~12 min · passages, durability, pinning, content-addressing-limit

Level 0불 꺼진 심지
0 XP0/33 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"문서 어디든 한 바이트가 바뀌면 해시가 바뀌고 — 거기서 파생된 모든 chunk id 도 바뀌어. content-addressing 은 재구축을 살아남아. 편집은 못 살아남아."

content-addressing 의 한계

앞에서 아름다운 속성을 배웠어: chunk id 는 내용에서 계산되니, 인덱스를 영원히 purge 하고 재구축해도 모든 citation 이 여전히 resolve 돼. 사실이야 — 그리고 노려볼 가치가 있는 정확한 경계가 있어. chunk id 는 문서의 해시에서 파생돼. 그 문서 어디든 한 글자를 편집하면 — 첫 문단 오타를 고치면 — doc_sha256 이 바뀌어. 그 문서의 모든 chunk id 가 함께 바뀌어. 뭐가 깨져서가 아니라, 이제 진짜로 다른 내용이라서.

재구축-안정은 편집-안정이 아냐

이건 다른 두 보장이고, 헷갈리기 쉬워:

  • 재구축-안정: 같은 내용을 다시 수집하면 같은 id 를 내. content-addressing 이 이걸 완전히 줘.
  • 편집-안정: 소스 문서가 편집돼도 참조가 살아남아. content-addressing 은 이걸 전혀 안 줘 — 그리고 옳게도, id 가 내용이 바뀌었다고 정직하게 보고하는 거니까.

검색엔 편집-불안정이 괜찮아 — 재색인하고 넘어가. 증거엔 치명적이야. 2년 전에 만든 claim 이, 그 뒤 오타를 고친 에세이의 passage 로 뒷받침되는데, 그 오타 때문에 증발하게 둘 순 없어.

그래서 증거는 텍스트를 복사해

증거 레이어의 답은 무뚝뚝하고 옳아: 고정된 passage 는 mint 시점에 정확한 텍스트를 복사해, 온전한 provenance 와 함께. 나중에 resolve 할 포인터가 아니라 — 그게 중요하다고 정한 순간에 얼린, 그 단어들의 실제 복사본. provenance(코퍼스, 경로, offset, 해시, profile) 가 같이 타서 여전히 소스를 찾아갈 수 있어. 근데 텍스트 자체가 passage 레코드 에 있어. 그 복사본이 내구성 있는 산출물이고, 포인터는 내려앉을 수도 아닐 수도 있는 편의야.

내구성 있는 증거엔 내용을 복사해 — 참조로는 부족해. 가변 소스를 거쳐 resolve 되는 어떤 참조든 그 소스의 변경으로 무효화될 수 있어. 네 기록의 핵심 전부가 미래를 살아남는 거라면, 기록은 그것이 있던 곳으로 가는 길 안내가 아니라 그것 자체를 담아야 해. 포인터도 지켜 — 맥락을 다시 찾는 법이니까 — 근데 포인터가 유일한 복사본이 되게 절대 두지 마.

다른 두 일을 위해 둘 다 지켜

passage 레코드는 결국 둘 다 쥐어, 의도적으로, 다른 일을 하니까. 복사된 텍스트는 "내가 정확히 뭘 인용했지?" 에 답해 — 영구히, 소스에 뭐가 일어났든 상관없이. provenance 는 "이게 어디서 왔고, 아직 거기 있나?" 에 답해 — 그게 바로 나중에 재검증이 citation 이 여전히 live 인지, 옮겨졌는지, drift 했는지 보고하는 데 쓸 거야. 어느 쪽도 다른 걸 대체 안 해. 이건 엔진 다른 데와 같은 2-of-2 본능이야: 상대가 못 덮는 실패 모드를 덮는 기록 둘.

Code

Pin = 텍스트 복사 + provenance 동반·python
def pin_passage(chunk) -> Passage:
    """Mint a passage: COPY the exact text, and carry provenance alongside it."""
    return Passage(
        text=chunk.text,                    # <-- the copy. This is the durable part.
        corpus_id=chunk.corpus_id,          # provenance below: how to re-find it
        doc_relpath=chunk.doc_relpath,
        doc_sha256=chunk.doc_sha256,        # will go stale if the doc is ever edited
        char_start=chunk.char_start,
        char_end=chunk.char_end,
        chunk_id=chunk.id,                  # ditto — a pointer, not the evidence
        minted_at=now(),
    )

# Fix a typo in paragraph 1 of that document tomorrow:
#   -> doc_sha256 changes -> every chunk_id in the doc changes -> the pointer rots.
#   -> passage.text is untouched. The evidence survives. That's why we copied.

External links

Exercise

오늘 인용이나 참조를 어떻게 저장하는지 봐 — 북마크, 노트 속 링크, 페이지 번호. 각각 물어: 소스가 내일 편집되면(삭제가 아니라 — 그냥 편집), 네 기록이 원래 읽은 게 뭔지 여전히 정확히 말해줄까? 답이 아니오인 걸 하나 찾아, 링크 옆 노트에 정확한 텍스트를 복사해 고쳐. 그게 손으로 한 고정된 passage 야.
Hint
느껴야 할 구분은 삭제 대 편집이야. 대부분 삭제('페이지가 사라지면?') 를 대비하고 편집('페이지가 바뀌었는데 링크는 여전히 되고, 이제 다른 말을 하면?') 을 잊어. 조용한 편집이 더 흔하고 더 위험한 경우고 — 복사본만이 그걸 막아.

Progress

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

댓글 0

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

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