RAG의 정밀도를 높이는 『의미 있는 태그 지정』을 설계해 보았다
요약
본 기사는 RAG 및 AI 에이전트의 정밀도를 높이기 위해 단순한 태그 지정 방식을 넘어, 검색, 추천, 접근 제어까지 작동하는 구조화된 '태그 체계' 설계 프레임워크를 제시합니다. 이 시스템은 콘텐츠의 의미적 축을 7가지 핵심 차원과 추가적인 8개 확장 차원으로 분류하고, 각 태그에 가중치(Weight)를 부여하여 메타데이터로 활용할 수 있도록 설계되었습니다. 최종적으로는 LLM이 생텍스트를 입력받아 구조화된 JSON 형태의 태그와 가중치를 반환하도록 시스템 프롬프트를 제작하는 과정과 아키텍처를 공개합니다. 이 체계는 하이브리드 검색(메타데이터 필터링 + 시맨틱 벡터 검색)을 가능하게 하여 정확도와 효율성을 동시에 높입니다.
핵심 포인트
- 태그 지정은 단순한 분류가 아닌, 검색/추천/액세스 제어까지 작동하는 구조화된 프레임워크로 설계되어야 한다.
- 콘텐츠의 의미를 포괄하기 위해 7가지 핵심 차원(domain, nuance 등)과 8가지 확장 차원(provenance, sensitivity 등)을 정의했다.
- 태그는 단순히 존재하는 것이 아니라 '가중치(Weight)'와 결합하여 콘텐츠의 중심성 및 근접도를 표현한다.
- 기술 아키텍처 측면에서, 태그를 플랫한 메타데이터 페이로드로 Vector DB에 저장하고, 이를 활용해 2단계 하이브리드 검색 전략을 구현할 수 있다.
- LLM 시스템 프롬프트를 통해 비정형 생텍스트(Raw Text)로부터 구조화된 JSON 형태의 태그와 가중치를 자동으로 추출하는 파이프라인을 구축했다.
서론
RAG나 AI 에이전트(AI Agent)를 위해 콘텐츠를 정리하면서, "태그 지정이란 결국 무엇을 설계해야 하는 걸까?"라는 의문에서 시작된 검토 메모. 단순히 #ai #python과 같은 평면적인 태그가 아니라, 검색·추천·액세스 제어(Access Control)까지 작동하는 태그 체계를 설계하기 위한 프레임워크를 정리했다.
최종적으로는 LLM에 입력할 시스템 프롬프트(System Prompt)까지 제작하여, 생텍스트(Raw Text)를 던지면 구조화된 태그 JSON이 반환되는 상태로 만들었다. 본 기사는 그 설계 과정과 결과물을 통째로 공개하는 스크랩이다.
📌
표기에 대하여: 태그 ID(domain/finance 등)와 JSON의 키 이름(category, weight 등)은 코드 식별자이므로 영어 kebab-case를 그대로 유지하고 있다. URL/DB/코드에서 다루기 쉽고, 일본 개발자들 사이에서도 일반적인 관례이다. 해설문·주석은 전부 일본어.
1. 태그의 7가지 핵심 차원
태그는 "의미의 축"으로 분류하지 않으면 뒤섞인다. 최소한 다음과 같이 나누고 싶다.
| 차원 | 무엇을 나타내는가 | 네임스페이스(Namespace) 예시 |
|---|---|---|
| domain (무엇에 관한 이야기인가) | 산업·분야·주제 | domain/fintech , subject/machine-learning |
| nuance (어떻게 말하고 있는가) | 톤·확신도·난이도 | tone/skeptical , level/advanced |
| type (형식) | 자산의 구조·기능 | type/whitepaper , purpose/tutorial |
| lifecycle (언제의 상태인가) | 워크플로우 단계·신선도 | status/published , lifecycle/evergreen |
| audience (누구를 향한 것인가) | 페르소나·퍼널·액세스 | persona/cfo , funnel/awareness |
| action (다음 단계) | CTA·전제 조건·후속 경로 | cta/book-demo , requires/python3 |
| geo_reg (어디를 향한 것인가) | 지역·언어·규제 | geo/global , compliance/gdpr |
2. 확장 차원 (8개 추가)
검토를 진행하면서 "이거 7차원으로는 부족하지 않나?"라는 생각이 들어 추가한 차원.
| 차원 | 무엇을 나타내는가 | 네임스페이스(Namespace) 예시 |
|---|---|---|
| provenance | 출처·저자·파생 관계 | source/* , author/* , derived-from/* |
| sensitivity | 기밀도·PII(개인정보) 유무 | class/internal , pii/customer |
| modality | 매체 (Substrate) | media/text , media/code , media/video |
| temporality | 내용이 가리키는 사건의 시간 | event-time/2024-q3 , valid-until/2026 |
| intent | 저자의 전달 의도 | intent/inform , intent/persuade , intent/decide |
| relationships | 타 콘텐츠와의 엣지(Edge) | supersedes/* , prereq/* , contradicts/* |
| confidence | 정보원의 신뢰성 | evidence/peer-reviewed , evidence/firsthand |
| risk | 적용 시의 리스크 | risk/deprecated , risk/security |
혼동하기 쉬운 포인트:
- "사내 전용", "PII를 포함함" 등
sensitivity는 토픽으로부터 추측하는 것이 아니라 명시적인 기술이 있는 경우에만 부여한다. temporality≠lifecycle
temporality는 내용이 가리키는 사건의 시간이며,lifecycle은 자산 자체의 워크플로우 시간이다.confidence≠nuance/certainty
전자는 정보원의 신뢰성 클래스이며, 후자는 저자가 표명한 확신도이다.
3. 근접도와 가중치 부여 (Proximity Weighting)
태그는 "중심성"에 따라 가중치를 변경한다.
⚠️
파생적인 가중치(시간 감쇠, 정보원 권위의 승수, 태그 희소성 부스트 등)는 태그 지정 계층에서는 계산하지 않습니다. 순수한 가중치만 출력하여 하류 파이프라인에서 합성합니다.
4. 기술 아키텍처
4.1 RDB 매핑
content_tags
중간 테이블을 다중 컬럼으로 구성합니다:
content_id | tag_category | tag_value | weight | tier
-----------|--------------|--------------------|--------|-----------
12345 | domain | subject/python | 1.0 | core
...
4.2 AI 통합 (Vector DB에 투입)
카테고리 태그를 플랫한 메타데이터 페이로드로 전개하여 Vector DB의 문서에 첨부합니다.
4.3 하이브리드 검색 전략
LLM으로부터의 자연어 쿼리는,
- 먼저 사용자 의도를 파싱하여
카테고리 × 가중치로 메타데이터 필터링(후보 집합을 좁힘) - 그 후에
시맨틱 벡터 검색을 실행하는
2단 구조입니다. 이것이 하이브리드 검색입니다. 태그 계층이 필터 역할을 할 수 있기 때문에, 벡터 검색의 정확도와 비용 두 가지 모두가 낮아집니다.
4.4 가중치 발전 개념
근접도의 3개 계층(및 제외)은 '중심성'만을 표현합니다. 실제 운영에서는 다음 수정자를 별도 컬럼으로 가집니다:
- 시간 감쇠 (Time Decay) —
event-time과 현재 일시로부터exp(-λ·age_days)를 계산합니다. 규제/보안 관련 분야에서는 필수적입니다.lifecycle/evergreen으로 감쇠를 면제합니다. - 정보원 권위의 승수 (Provenance Multiplier) —
provenance의 티어(1차 정보 > 파생 > 소문)가 검색 시 가중치를 스케일링합니다. - 희소성 부스트 (Tag-IDF) — 희귀한 태그일수록 식별력이 높습니다. 코퍼스 전체의 역빈도를 사전에 계산합니다.
- 피드백 교정 (Feedback Calibration) — 어떤 태그가 실제로 히트를 발생시켰는지 로그하고, 오프라인에서 가중치를 재조정합니다.
5. 운영 파이프라인
- 2단계 태그 지정
Pass 1: 자유 생성(다음 절의 시스템 프롬프트)
Pass 2: 정규화 LLM 호출로{raw, canonical, action: keep | alias | new}를 반환하고, 새로운 태그는 검토 큐로 보냅니다. - 태그 거버넌스 (Tag Governance) — 각 정규 태그는
proposed → active → aliased → deprecated의 라이프사이클을 가집니다.alias는 이전 ID를 유지하고,deprecated는 리태깅 작업에 연쇄적으로 영향을 줍니다. - 공기어 그래프 (Co-occurrence Graph) — 태그 쌍의 희소 행렬을 만들어, (a) 강한 상관관계 쌍 중 한쪽이 없을 때 누락된 태그를 제안하고, (b) 낮은 친화도 클러스터에 있는 태그를 오분류 후보로 플래그 지정하며, (c) 근사 동의어를 수렴시킵니다.
- 청크 단위 vs 문서 단위 — 문서의 태그는 청크에 상속되지만, 청크 고유의 태그도 추가할 수 있습니다.
parent_content_id와scope컬럼으로 관리합니다. - 태그 인식 청크 분할 (Tag-aware Chunking) — 태그 경계가 청크 내부에 떨어지는 경우, 그곳에서 자르는 것이 임베딩 시 의미가 손상되는 것을 방지합니다.
6. 검색 계층의 개념
- 필수 필터 vs 권장 필터 —
compliance/gdpr는 하드 제약(hard constraint)이고,persona/cfo는 소프트 부스트입니다. 쿼리 파서가 이를 구별합니다. - 쿼리 시 태그 전개 (Query Time Tag Expansion) — `
공기(Co-occurrence) 그래프나 시노님 맵(Synonym Map)을 사용 -
가중치 × 의도 매칭으로 재순위화 (Re-ranking) — 벡터 검색의 top-k를 Σ(tag_weight × intent_match)로 재정렬 -
티어(Tier) 단계 필터 — 저렴한 core 태그만으로 1차 필터링. 리콜(Recall)이 낮으면 adjacent로 확장, tangential은 최후의 수단으로 사용
7. 자동 태그 지정 시스템 프롬프트 (최종판)
생텍스트(Raw text)를 던지면 위 15차원의 구조화된 JSON이 반환되는 LLM용 시스템 프롬프트. 그대로 복사해서 붙여넣으면 작동함.
당신은 콘텐츠 태그 지정 엔진입니다. 받은 생텍스트마다 다음 차원에 따라 콘텐츠를 분류하고, 각 태그에 근접도에 기반한 가중치와 소스 내의 근거(evidence)를 포함한 구조화된 JSON을 출력하십시오.
# 태그 지정 차원
명확한 근거가 있는 차원에만 태그를 지정하십시오. 해당하지 않는 차원은 건너뛰고, 빈칸을 채우기 위해 허구의 내용을 생성하지 마십시오.
...
8. Few-shot Examples
프롬프트에 포함할 실례. 새로운 차원의 사용법과 "근거가 없는 카테고리는 건너뛴다"는 동작을 학습시키는 역할.
Example 1 — 초보자용 튜토리얼
INPUT:
"5분 만에 작성하는 첫 Python 스크립트. 변수, print 문, 간단한 루프를 다룹니다. 프로그래밍 미경험자도 OK — 마지막에는 사용자 이름으로 인사하는 스크립트가 완성됩니다. 다음 회차는 파일 읽기."
OUTPUT:
{
"tags": [
{"category": "domain", "tag": "subject/python", "weight": 1.0, "tier": "core", "polarity": "positive", "evidence": "5분 만에 작성하는 첫 Python 스크립트"},
...
Example 2 — 경영진 대상 화이트페이퍼 (White Paper)
INPUT:
"금융 리더를 위한 경영진 브리핑: 고객 접점의 금융 워크플로우(Workflow)에서 생성형 AI를 전개할 때, EU AI 법과 GDPR이 어떻게 교차하는가. 이사회 수준의 리스크 체크리스트와 권장되는 분기별 감사 사이클을 포함함. 2026년 Q2 발행, 발행처는 FinReg Council."
OUTPUT:
{
"tags": [
{"category": "domain", "tag": "domain/finance", "weight": 1.0, "tier": "core", "polarity": "positive", "evidence": "금융 리더를 위한 경영진 브리핑"},
...
Example 3 — 오피니언 기사 (근거가 없는 카테고리는 건너뜀)
INPUT:
"이번 주에도 역시 'AI가 방사선 전문의를 대체할 것'이라는 헤드라인이 떴다. 병원 IT와 임상 워크플로우 설계의 경계에서 15년간 일해온 입장에서, 매번 똑같은 도표를 돌려쓰는 것에는 진절머리가 난다. 모델이 개선되고 있는 것은 사실이다. 하지만 처리량(Throughput)이 병목(Bottleneck)인 영상 진단 부문이 2027년까지 대체될 일은 없다. 내가 감사한 3개의 병원 시스템에서 실제로 일어나고 있는 일을 쓰겠다."
OUTPUT:
{
"tags": [
{"category": "domain", "tag": "domain/healthcare", "weight": 1.0, "tier": "core", "polarity": "positive", "evidence": "내가 감사한 3개의 병원 시스템"},
...
Example 4 — 비권장 가이드 (부의 가중치 · 관계 · 리스크)
INPUT:
"레거시 인증 가이드 — 최종 업데이트 2022년. 사내 이용 전용. 현재는 OAuth 2.1로 이관 완료(oauth-2-1-migration-guide 참조). SDK v3를 계속 사용하는 고객을 위해 온라인에 남겨두었으나, 내부의 /auth/v1 엔드포인트는 2026년 Q4에 삭제 예정. 신규 연동 시 레거시 bearer 토큰 플로우는 사용하지 말 것 — PKCE를 지원하지 않으며, 보안 리스크로 간주됨."
OUTPUT:
{
"tags": [
{"category": "domain", "tag": "domain/authentication", "weight": 1.0, "tier": "core", "polarity": "positive", "evidence": "레거시 인증 가이드"},
...
요약
- 태그는 **의미의 축 (semantic axis)**을 기준으로 나누면 무너지지 않는다 (최종적으로 15차원)
- 근접도 가중치 (proximity weight) (1.0 / 0.6 / 0.2 / -1.0)를 함께 저장하면 검색 정밀도가 차원이 다르게 변한다
- LLM에는 **근거 (evidence)가 포함된 구조화된 JSON (structured JSON)**을 출력하게 함으로써 환각 (hallucination)을 급격히 줄인다
- 파생 가중치 (시간 감쇠, IDF, 권위)는 하류 (downstream) 단계에서 계산한다. 태그 지정 층에서는 가공되지 않은 신호 (raw signal)만을 다룬다
- "근거가 없는 카테고리는 건너뛴다"라는 규칙이 효과적이므로, 무리하게 채우려 하지 않는다
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기