"엔진이 틀린 게 아니었어. 코퍼스가 담은 걸 충실히 완성했고 — 코퍼스가 HTML 태그 죽을 담고 있었어."
쓰레기 완성
깔끔한 교훈이 있는 war story 하나. 웹 콘텐츠로 코퍼스를 지었는데, phrase 완성이 헛소리로 돌아오기 시작했어: "data emotion playful img class …" 같은 조각 — prose 가 아니라 HTML 속성 부스러기. 완성 기능이 고장 난 것 같았어. 본능은 완성 엔드포인트를 패치해 쓰레기를 걸러내는 거였어. 그 본능이 틀렸고, 왜인지 이해하는 게 이 레슨의 핵심 전부야.
엔진은 올바르게 행동하고 있었어
완성은 phrase 가 실제로 어떻게 이어지는지 코퍼스에서 캐. 색인된 텍스트가 raw HTML 태그와 속성으로 뒤덮였으면, 많은 phrase 의 정직한 연속이 바로 속성 조각이야. 엔진은 오작동이 아니었어 — 오염된 입력에 자기 일을 완벽히 하고 있었어. Garbage in, garbage out, 엔진 통째 레벨에서. 버그는 검색에 있지 않았어; 거기 먹여진 것에 있었어.
엔진이 아니라 코퍼스를 고쳐
그래서 고침은 쿼리 경로가 아니라 변환 봉합선에 속했어. 웹 콘텐츠를 HTML 태그를 깨끗한 prose 로 벗기는 추출기 adapter 로 다시 capture 했어: frontmatter 에서 제목을 뽑고, 마크업을 지우고, identifier 모양 key 를 막으면서 구조화된 데이터에서 prose 를 캐고, 조각이 안 살아남게 최소 길이를 강제해. 이제 스냅샷이 prose 를 쥐고, 모든 하류 경로 — 검색, 완성, 전부 — 가 깨끗한 텍스트를 캐. 경계에서의 고침 하나가 모든 증상을 한 번에 치유했어, 다 같은 오염된 소스를 공유했으니까.
원본이 아니라 스냅샷으로 정제해
결정적 제약 하나가 전체를 붙들어: 정제는 변환된 스냅샷으로 일어나고, chunk 텍스트는 그 변환된 텍스트의 정확한 조각으로 남아. 원본 소스 파일을 되짚어 정제하려 편집하지 않아 — 그건 소스-절대-안-건드림 규칙을 위반해. 추출기는 지저분한 원본을 읽고, 깨끗한 prose 를 내고, 그걸 스냅샷해. 원본은 있던 그대로 남고; 스냅샷은 정제된 읽기고; offset 과 해시는 다 스냅샷을 가리켜. 정제와 '원본은 제자리에 남음' 이 완벽히 공존해, 정제가 소스가 아니라 captured 레이어에 내려앉으니까.