Signal Scoring Pipeline: 결정론적 지식 분류 시스템
대부분의 지식 관리는 감에 의존합니다. “중요한 것 같아서” 노트를 저장합니다. 6개월 후 7,000개의 노트가 쌓이고 어떤 것이 중요한지 알 수 없게 됩니다. 저는 그 답을 알려주는 결정론적 점수화 파이프라인을 구축했습니다.
이 시스템은 733줄의 Python 코드입니다. 들어오는 모든 신호를 4개의 가중 차원에 걸쳐 점수화하고, 복합 점수를 계산하여, 12개 도메인 폴더 중 하나, 수동 검토를 위한 인박스, 또는 폐기로 라우팅합니다. 수동 태깅이 없습니다. 절대 실행되지 않는 “나중에 검토”도 없습니다. 알고리즘이 결정합니다.
요약
가중 복합 점수(관련성 35%, 실행 가능성 30%, 깊이 20%, 권위성 15%)가 각 신호에 대해 0.0-1.0 등급을 산출합니다. 라우팅은 세 가지 임계값을 사용합니다: >= 0.55는 도메인 폴더에 자동 기록, >= 0.30은 수동 검토 대기열에 추가, < 0.30은 조용히 건너뜁니다. 14개월에 걸쳐 7,700개 이상의 노트가 처리되었으며, Development(2,837개)와 Design(1,709개)이 분포를 지배합니다. 가장 흥미로운 결함: 깊이 차원은 콘텐츠 품질이 아닌 메타데이터 풍부도를 측정하므로, 꽃 사진에 대한 태그가 잘 달린 트윗이 0.85점을 받습니다.
감에 의존하는 방식의 문제
저는 Obsidian을 지식 베이스로 사용합니다. RSS 피드, Twitter 북마크, GitHub 스타, 뉴스레터, 수동 캡처를 통해 신호가 들어옵니다. 파이프라인 이전에는 모든 신호가 단일 인박스 폴더로 향했습니다. 두 달 만에 400개 이상의 미처리 노트가 쌓였습니다.
표준적인 조언(“매주 검토하고, 작성하면서 태그를 달고, 폴더 시스템을 사용하세요”)은 검토가 실제로 이루어진다고 가정합니다. 실제로는 이루어지지 않습니다. 인박스는 쓰기 전용이 됩니다: 항목은 들어오지만 나가지 않습니다. 캡처한 지식은 캡처하지 않은 지식과 기능적으로 동일해집니다. Clay Shirky는 이 문제를 정확하게 표현했습니다: “정보 과부하가 아닙니다. 필터 실패입니다.”8
저는 한 번 정의하고 균일하게 적용하는 기준을 사용하여, 제가 읽는 것보다 빠르게 7,700개 이상의 노트를 평가할 수 있는 시스템이 필요했습니다. 추천 엔진이 아닙니다. 점수화 알고리즘입니다.
복합 점수
점수화 공식은 4개 차원의 가중 선형 결합으로, 다기준 의사결정 분석(MCDA)의 표준 접근법입니다:9
composite = (
relevance * 0.35 +
actionability * 0.30 +
depth * 0.20 +
authority * 0.15
)
각 차원은 0.0에서 1.0 사이의 부동소수점 값을 생성합니다. 공식은 복합 점수를 소수점 세 자리로 반올림합니다. 가중치는 의도적인 우선순위를 반영합니다: 나에게 중요한 것(관련성)이 내가 활용할 수 있는 것(실행 가능성)보다 높고, 이는 메타데이터가 얼마나 풍부한지(깊이)보다 높으며, 이는 출처가 얼마나 신뢰할 수 있는지(권위성)보다 높습니다.1
4개 차원
관련성 (35%): 관심사 매칭
관련성은 40개 이상의 항목을 포함하는 수동 큐레이션된 키워드 사전을 사용하며, 각 항목은 0.15(nft)에서 1.0(claude code, swiftui)까지 점수가 매겨집니다. 점수화는 최고 매치와 전체 매치 평균을 혼합합니다:
# 60% best match, 40% average of all matches
return min(1.0, best_score * 0.6 + avg_score * 0.4)
매치가 없는 항목은 0.0이 아닌 0.25의 기준선을 받습니다. 시스템은 알 수 없는 주제를 관련 없는 주제보다 덜 가혹하게 처벌합니다. 기준선은 가장 자주 조정되는 매개변수입니다: 너무 높으면 관련 없는 콘텐츠가 인박스에 넘쳐나고, 너무 낮으면 진정으로 새로운 관심사가 보기도 전에 필터링됩니다.2
실행 가능성 (30%): 학습 잠재력
실행 가능성은 22개의 행동 지향 키워드에 매칭합니다: tutorial, guide, how-to, build, github.com. URL은 특별 처리를 받습니다:
if "github.com" in url:
hits += 2 # Repositories are inherently actionable
if "/docs" in url or "/tutorial" in url:
hits += 1
점수화는 선형이 아닌 계단 함수 기반입니다: 0 히트 → 0.10, 1 히트 → 0.40, 2 히트 → 0.60, 3+ 히트 → min(1.0, 0.70 + hits * 0.05). 계단 함수는 실행 가능성 신호의 양보다 존재 자체에 더 큰 보상을 줍니다. 하나의 튜토리얼 링크가 키워드 3개와 4개의 차이보다 더 가치가 있습니다.3
깊이 (20%): 메타데이터 풍부도
깊이는 순수하게 구조적입니다. 콘텐츠 품질이 아닌 필드의 존재 여부와 길이를 측정합니다:
| 신호 | 점수 |
|---|---|
| 제목 있음 | +0.20 |
| 설명 있음 | +0.20 |
| 설명 > 50자 | +0.15 |
| 설명 > 150자 | +0.15 |
| 태그 있음 | +0.15 |
| 태그 3개 이상 | +0.10 |
| URL 있음 | +0.05 |
| 최대 | 1.00 |
깊이는 제가 가장 신뢰하지 않는 차원입니다. 전체 설명과 4개의 태그가 달린 꽃 사진 트윗이 깊이 0.85점을 받습니다. 풍부한 메타데이터, 관련 없는 콘텐츠. 깊이는 “출처가 구조화된 데이터를 제공했다”를 대리 측정하는 것이며, 이는 품질과 상관관계가 있지만 품질을 보장하지는 않습니다.4
권위성 (15%): 출처 신뢰도
권위성은 0.40의 기준선에서 시작하여 출처 유형에 따라 조정됩니다:
if source in ("twitter", "x"): score = 0.50
elif source in ("blog", "newsletter"): score = 0.60
elif source in ("github", "docs"): score = 0.70
도메인 허용 목록은 상향 조정만 합니다(하향 조정은 하지 않습니다): github.com, anthropic.com, apple.com, arxiv.org, docs.python.org 등은 권위성을 최소 0.75로 설정합니다. 허용 목록은 이러한 출처가 기본적으로 더 높은 신뢰를 받을 자격이 있다는 판단을 인코딩합니다.
임계값 라우팅
세 가지 라우팅 구간이 각 점수화된 신호의 처리 방식을 결정합니다:
THRESHOLD_AUTO_WRITE = 0.55 # → domain folder
THRESHOLD_INBOX = 0.30 # → 00-Inbox (manual review)
# Below 0.30 → silently skipped
파이프라인은 0.55 이상의 점수를 받은 신호를 태그와 제목 매칭에서 추론된 12개 도메인 폴더 중 하나에 직접 기록합니다. 중간 범위 신호(0.30-0.55)는 수동 검토를 위한 인박스로 이동합니다. 0.30 미만은 볼트에 도달하지 않습니다.
0.30-0.55 범위는 시스템의 확신이 가장 낮은 “모호한 영역”입니다. 선택적 --llm-triage 플래그는 이러한 신호를 Claude에게 보내 평가하도록 하며, 복합 점수를 최대 ±0.20까지 조정하여 신호가 자동 기록 임계값을 넘을 수 있게 합니다. Claude는 모호한 신호만 봅니다. 고점수나 저점수 신호는 절대 보지 않습니다. 결정론적 점수화기가 이미 처리한 신호에 API 토큰을 사용하는 것은 낭비입니다.5
도메인 추론은 투표 시스템을 사용합니다. 각 태그는 도메인에 매핑되고, 제목의 각 키워드는 투표를 추가합니다. 가장 많은 투표를 받은 도메인이 선택됩니다. 동점은 딕셔너리 순서로 결정됩니다(사실상 임의적). 기본 폴백: “Inspiration.”
결과
14개월에 걸쳐 7,700개 이상의 노트 처리 결과:
| 도메인 | 노트 수 | 전체 비율 |
|---|---|---|
| Development | 2,837 | 36.8% |
| Design | 1,709 | 22.2% |
| Inspiration | 565 | 7.3% |
| Claude-Code | 414 | 5.4% |
| AI-Tools | 414 | 5.4% |
| Productivity | 346 | 4.5% |
| Ideas | 296 | 3.8% |
| Science | 231 | 3.0% |
| Health-Life | 191 | 2.5% |
| Architecture | 142 | 1.8% |
| Startups | 26 | 0.3% |
| Tools | 22 | 0.3% |
| Inbox | 420 | 5.5% |
분포는 현실을 반영합니다. 저는 다른 어떤 것보다 개발과 디자인 콘텐츠를 더 많이 소비합니다. 인박스 항목(420개)은 모호한 영역, 즉 알고리즘이 확신을 가지고 자동 라우팅할 수 없었던 신호를 나타냅니다.6
알고리즘이 틀린 부분
깊이 함정
네모필라 꽃 사진 트윗이 composite 0.36, relevance 0.25, actionability 0.10, depth 0.85, authority 0.50을 기록했습니다. 깊이(0.85)와 권위성(0.50)이 거의 0에 가까운 관련성과 실행 가능성을 보상했기 때문에 인박스로 라우팅되었습니다. 풍부한 메타데이터, 관련 없는 콘텐츠: 예쁜 꽃 사진이었습니다.
이 사례는 메타데이터 프록시 점수화의 근본적인 한계를 보여줍니다. 깊이는 “콘텐츠가 가치 있다”가 아니라 “출처가 구조화된 데이터를 제공했다”를 측정합니다. Twitter는 모든 트윗에 대해 전체 설명과 태그를 제공합니다. 아침 식사에 대한 태그가 잘 달린 트윗도 깊이 0.85점을 받습니다. 정보 검색 연구에서는 이 근본적인 긴장을 정밀도/재현율 트레이드오프라고 부릅니다: 재현율(관련 있는 모든 것을 포착하는 것)을 최적화하면 필연적으로 거짓 양성이 유입됩니다.10
고려했지만 기각한 수정안: 깊이 가중치를 0.20에서 0.10으로 줄이면 태그가 잘 달린 관련 없는 콘텐츠의 거짓 양성이 줄어들지만, 메타데이터가 부족한 출처에서 오는 진정으로 깊이 있는 콘텐츠에도 불이익을 줍니다. 현재 가중치는 타협점입니다.
관련성 기준선 문제
매치가 없는 관련성의 0.25 기준선은 합리적인 출처에서 온 잘 구조화된 신호라면 최소 0.30점을 받아 인박스에 도착한다는 것을 의미합니다. 기준선은 거짓 양성 하한선을 만듭니다: 인박스에 태그가 잘 달려 있고 합리적인 출처에서 왔지만 제 관심사와 전혀 관련 없는 신호가 쌓입니다.
실제 수정안: 주기적인 인박스 검토는 여전히 필요합니다. 파이프라인은 검토 대상을 7,700개 항목에서 420개로 줄여(약 95% 감소) 주지만, 모호한 영역에 대한 수동 검토를 완전히 제거할 수는 없습니다.
구현 노트
파이프라인은 CLI 도구로 실행됩니다. 입력은 신호의 JSON 배열(RSS, Twitter API, 또는 수동 입력)이며, 출력은 도메인 폴더에 기록되는 Obsidian 호환 마크다운 파일입니다.
python triage.py --input signals.json --vault ~/obsidian-signals/
python triage.py --input signals.json --vault ~/obsidian-signals/ --llm-triage
python triage.py --input signals.json --min-score 0.60 # Stricter routing
사전 필터링은 점수화 전에 실행됩니다: 기존 볼트 노트에 대한 URL 중복 제거, 빈 콘텐츠 필터링, 노이즈 출처 차단 목록. 중복 노트와 스팸 출처는 점수화 단계에 도달하지 않습니다.
점수화 함수는 순수합니다: 부수 효과, API 호출, 파일시스템 접근이 없습니다. 각 함수는 신호 딕셔너리를 받아 점수 딕셔너리를 반환합니다. 이 순수한 접근 방식은 격리된 테스트를 가능하게 하고, 모호한 부분 집합에서만 실행되는 LLM 분류 단계와 조합이 가능하게 합니다.7
핵심 시사점
분류 시스템을 구축하는 엔지니어를 위해:
-
결정론적 점수화는 대규모에서 수동 큐레이션을 이깁니다. 14개월 동안 7,700개의 노트. 수동 분류에는 50시간 이상의 검토 시간이 필요했을 것입니다. 파이프라인은 몇 분 만에 약 95%의 라우팅률(5.5%만 수동 검토 필요)로 처리했습니다.
-
메타데이터 프록시에는 알려진 실패 모드가 있습니다. 깊이는 품질이 아닌 구조를 측정합니다. 권위성은 정확성이 아닌 출처를 측정합니다. 두 프록시 모두 집계 규모에서는 작동하지만 개별 신호 수준에서는 예측 가능한 거짓 양성을 생성합니다. 실패 모드를 인정하는 것이 알고리즘이 “잘 작동한다”고 주장하는 것보다 정직합니다.
지식 관리 실무자를 위해:
-
가중 복합 점수는 실제 우선순위를 드러냅니다. 35/30/20/15의 가중치는 임의적이지 않습니다. 특정 판단을 인코딩합니다: 관련성이 실행 가능성보다 중요하고, 실행 가능성이 메타데이터 풍부도보다 중요하며, 메타데이터 풍부도가 출처 신뢰도보다 중요합니다. 가중치를 명시적이고 조정 가능하게 만드는 것이 시스템과 습관의 차이입니다.
-
모호한 영역은 줄일 수 없습니다. 0.30에서 0.55 사이의 신호는 진정으로 모호합니다: 결정론적 점수화기가 해결할 수 없습니다. LLM 분류가 도움이 되지만 영역을 제거하지는 못합니다. 모호한 부분 집합에 대한 수동 검토는 여전히 필요합니다.
이 글을 생산성 팁이 아닌 엔지니어링 문제로 구성했습니다. 복합 점수화는 항목의 결정론적 라우팅이 필요한 모든 도메인에 적용됩니다: 지원 티켓, 콘텐츠 검토, 리드 자격 평가, 이상 감지. 제 구체적인 가중치와 임계값은 개인적 우선순위를 인코딩하지만, 아키텍처는 범용적입니다. 축적된 지식이 어떻게 비선형적 가치를 창출하는지에 대해서는 정신적 복리를 참조하세요. 프롬프트 엔지니어링을 위한 OODA Loop는 관련 패턴을 탐구합니다: 직관의 대안으로서의 구조화된 관찰. 각 파이프라인 구성요소(점수화, 라우팅, 분류)는 독립적으로 유용하며 다른 구성요소와 결합하여 복리 효과를 발생시키는 복리 엔지니어링 패턴을 따릅니다.
-
가중치 분포를 수학적으로 도출하지 않았습니다. 6개월간의 사용을 통해 조정했습니다. 초기 가중치는 균등(25/25/25/25)이었습니다. 높은 깊이, 낮은 관련성의 신호(태그가 잘 달린 관련 없는 콘텐츠)가 인박스에 넘쳐나는 것을 관찰한 후 관련성을 35%로 높였습니다. 높은 관련성이지만 실용적 적용이 없는 이론적 콘텐츠가 사용되지 않은 채 쌓이는 것을 관찰한 후 실행 가능성을 30%로 높였습니다. ↩
-
매치가 없는 관련성의 0.25 기준선은 의도적인 설계 선택입니다. 이를 0.0으로 설정하면 큐레이션된 키워드 목록 외의 모든 신호가 최대 0.65(0 + 실행 가능성 + 깊이 + 권위성, 관련성 기여 없음)를 받게 되어, 진정으로 새로운 주제가 자동 기록 임계값에 도달하는 것이 거의 불가능해집니다. ↩
-
실행 가능성에 대해 선형 점수화 대신 계단 함수 점수화를 선택한 이유는 실행 가능성이 연속 변수보다 이진 변수에 더 가깝기 때문입니다. 튜토리얼은 실행 가능합니다. 튜토리얼에 대한 뉴스 기사는 그렇지 않습니다. 계단 함수는 이 이진적 특성을 기울기보다 잘 포착합니다. ↩
-
원래 깊이 차원의 이름을 “품질”로 짓고 콘텐츠 풍부도를 측정하려 했습니다. 실제로는 메타데이터 풍부도를 측정한다는 것을 관찰한 후, 지표가 실제로 포착하는 것을 반영하기 위해 “깊이”로 이름을 변경했습니다. 이름 변경은 지표가 측정하는 것에 대한 의도적인 정직함입니다. ↩
-
LLM 분류는 Claude Code CLI(
claude --print --model opus)를 사용하며, 점수 조정(-0.20에서 +0.20)과 도메인 분류를 요청하는 구조화된 프롬프트를 사용합니다. 저자의 비용 추정: 신호당 약 $0.02-0.04. 전체 7,700개 신호에 대해 LLM 분류를 실행하면 $150-300이 소요됩니다. 420개의 모호한 신호에 대해서만 실행하면 $8-17이 소요됩니다. ↩ -
2026년 2월 기준 저자의 도메인 분포 데이터. 수치는 2024년 12월 이후 누적 라우팅을 반영합니다. 분포는 3개월 차부터 안정되었으며, Development와 Design이 지속적으로 라우팅된 신호의 55-60%를 차지합니다. ↩
-
순수 점수화 함수는 의도적인 아키텍처 결정으로 선택했습니다. 대안(중복을 확인하기 위해 파일시스템을 검사하거나 데이터 보강을 위해 API를 호출하는 점수화 함수)은 더 정확했겠지만 모킹 없이는 테스트할 수 없었을 것입니다. 순수한 접근 방식은 일부 정확성을 포기하고 테스트 가능성과 조합 가능성을 얻었습니다. ↩
-
Clay Shirky, “It’s Not Information Overload. It’s Filter Failure,” Web 2.0 Expo 기조연설, 2008. youtube.com/watch?v=LabqeJEOQyI. Shirky의 프레이밍은 직접적으로 적용됩니다: 400개 이상의 미처리 노트가 있는 인박스는 정보의 과부하가 아니라 필터링의 부재입니다. Alvin Toffler, Future Shock, Random House, 1970도 참조하세요. 이 책은 너무 많은 정보에 노출되었을 때 의사결정의 어려움으로서 “정보 과부하”라는 용어를 만들었습니다. ↩
-
가중 선형 결합은 다기준 의사결정 분석(MCDA)의 표준 기법입니다. 여기서의 접근 방식은 가장 오래된 MCDA 방법 중 하나인 단순화된 가중 합산 모델(WSM)입니다. 복합 점수화를 위한 가중치 도출의 정전적 논의로는 Saaty, T.L., The Analytic Hierarchy Process, McGraw-Hill, 1980을 참조하세요. 여기서 사용된 더 단순한 가산 모델에 대해서는 Fishburn, P.C., “Additive Utilities with Incomplete Product Set,” Journal of Mathematical Psychology, 4(1), pp. 104-110, 1967을 참조하세요. ↩
-
정밀도/재현율 트레이드오프는 정보 검색의 근본적인 개념입니다. 재현율(더 많은 관련 항목을 포착하는 것)을 높이면 필연적으로 관련 없는 항목이 더 많이 유입되어 정밀도가 감소합니다. 깊이 차원은 잘 구조화된 모든 신호에 보상을 줌으로써 재현율을 최적화하며, 이것이 관련 없지만 태그가 잘 달린 콘텐츠가 임계값을 통과하는 이유입니다. Manning, C.D., Raghavan, P., & Schütze, H., Introduction to Information Retrieval, Cambridge University Press, 2008, Chapter 8을 참조하세요. nlp.stanford.edu/IR-book/ ↩