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

정제가 품질 레버야

~12 min · curation, conversion-seam, clean-at-adapter, garbage-in-garbage-out

Level 0불 꺼진 심지
0 XP0/33 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"엔진이 틀린 게 아니었어. 코퍼스가 담은 걸 충실히 완성했고 — 코퍼스가 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 를 쥐고, 모든 하류 경로 — 검색, 완성, 전부 — 가 깨끗한 텍스트를 캐. 경계에서의 고침 하나가 모든 증상을 한 번에 치유했어, 다 같은 오염된 소스를 공유했으니까.

품질은 변환 경계에 살아 — 거기서 정제하고, 쿼리 경로에서 절대 안 해. 결과가 쓰레기일 때, 솔깃한 고침은 사용 지점의 필터야. 참아: 그 필터는 증상 하나를 다루는데 오염은 다른 데 다 계속 흘러. adapter 에서, 스냅샷으로, 입력을 고쳐, 그럼 그 코퍼스의 모든 소비자가 깨끗한 데이터를 공짜로 얻어. 정제는 검색 시스템을 개선하는 가장 레버리지 높은 곳이야 — 깨끗한 코퍼스가 그저 그런 엔진을 훌륭해 보이게 하고, 더러운 코퍼스가 훌륭한 엔진을 고장 난 것처럼 보이게 해.

원본이 아니라 스냅샷으로 정제해

결정적 제약 하나가 전체를 붙들어: 정제는 변환된 스냅샷으로 일어나고, chunk 텍스트는 그 변환된 텍스트의 정확한 조각으로 남아. 원본 소스 파일을 되짚어 정제하려 편집하지 않아 — 그건 소스-절대-안-건드림 규칙을 위반해. 추출기는 지저분한 원본을 읽고, 깨끗한 prose 를 내고, 그걸 스냅샷해. 원본은 있던 그대로 남고; 스냅샷은 정제된 읽기고; offset 과 해시는 다 스냅샷을 가리켜. 정제와 '원본은 제자리에 남음' 이 완벽히 공존해, 정제가 소스가 아니라 captured 레이어에 내려앉으니까.

Code

adapter 에서 정제: prose 를 스냅샷으로 추출, 소스는 그대로 둬·python
def extract_prose(raw_html_ish: str) -> str:
    """A site-extract-style adapter: turn tag-polluted content into clean prose."""
    title = frontmatter_title(raw_html_ish)          # pull a heading from metadata
    body = strip_html_tags(raw_html_ish)             # remove <div class=...> soup
    prose_parts = []
    for key, value in mine_structured_text(raw_html_ish):
        if is_identifier_key(key):
            continue                                  # block 'class', 'data-emotion', etc.
        if len(value) >= 20:                          # prose floor: no fragment survives
            prose_parts.append(value)
    text = join_prose([title, body, *prose_parts])
    return text
    # This text is what gets snapshotted and chunked. The messy original on disk
    # is never edited — cleaning lands in the captured snapshot, not the source.

External links

Exercise

시스템이 나쁜 출력을 준 때를 떠올려. 진단 질문을 던져: 로직이 틀렸어, 입력이 더러웠어? 입력이 더러웠던 경우, 고침이 어디 속하는지 정해 — 사용 지점(출력의 필터) 아니면 입력 경계(들어올 때 데이터 정제). 경계에서 정제하는 대신 출력에서 필터하면 뭐가 깨질지 나열해.
Hint
출력에서 필터링은 딱 한 소비자를 고치고 같은 더러운 데이터의 다른 모든 소비자마다 재구현해야 해. 입력 경계에서 정제는 모든 소비자를 한 번에, 영원히 고쳐. 같은 오염이 여러 곳에 나타나면, 고침이 상류, 경계에 속한다는 증거야.

Progress

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

댓글 0

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

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