본문 바로가기
C.W.K.
Stream
Lesson 04 of 05 · published

제값을 하는 메타데이터

~20 min · chunking, metadata

Level 0Scout
0 XP0/41 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

최소한으로 쓸모 있는 메타데이터 스키마

임베딩하는 모든 청크에 다음 정보를 저장해.

  • source — 파일 경로, URL, 문서 ID처럼 원문을 찾을 수 있는 값
  • chunk_index — 원문 안에서 청크가 놓인 순서
  • updated_at — 원문 판본이 갱신된 시각을 나타내는 ISO 타임스탬프
  • doc_type — markdown, pdf, code, html, conversation 같은 문서 형식
  • 쿼리 시점에 거를 조건 — tenant_id, language, project, classification_level 등

순위를 매기기 전에 걸러

실제 검색 서비스에서 가장 큰 성능 향상을 주는 수단은 메타데이터 사전 필터야. 벡터 1000만 개의 코사인 유사도를 모두 계산하면 느리지만, {tenant: 'acme', lang: 'en'} 조건에 맞는 5만 개만 계산하면 빨라. 제대로 된 벡터 저장소라면 모두 where 필터를 지원하니 써야 해.

메타데이터는 출처 기록이기도 해

LLM의 답변에 "출처: handbook.md(2026-04-12 갱신)"을 보여주고 싶다면 그 정보는 메타데이터에서 바로 꺼내야 해. 수집할 때 빼먹은 출처 정보는 나중에 되살리기 어려워.

Code

일관된 메타데이터를 넣어 청크 만들기·python
import hashlib
from pathlib import Path
from datetime import datetime, timezone

def ingest_markdown(path: Path):
    text = path.read_text()
    chunks = splitter.split_text(text)
    updated = datetime.fromtimestamp(path.stat().st_mtime, tz=timezone.utc).isoformat()
    return [
        {
            'id': hashlib.sha1(f'{path}:{i}:{c[:80]}'.encode()).hexdigest(),
            'text': c,
            'metadata': {
                'source': str(path),
                'chunk_index': i,
                'updated_at': updated,
                'doc_type': 'markdown',
                'project': path.parts[-3] if len(path.parts) >= 3 else None,
            },
        }
        for i, c in enumerate(chunks)
    ]

External links

Exercise

직접 관리하는 코퍼스 하나를 골라 모든 청크에 요구할 최소 메타데이터 스키마를 5–7개 필드로 정의해. 실제로 실행할 쿼리를 들어 각 필드가 왜 필요한지 설명하고, 설명할 수 없는 필드는 빼.

Progress

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

댓글 0

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

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