LangChain RAG 시스템 구조 개념 정리

1. 개요

LangChain 기반의 RAG(Retrieval-Augmented Generation) 시스템에서는 정보 수집, 저장, 검색, 응답 생성을 위해 다음 세 가지 핵심 개념을 사용한다:

  • Collection: 문서들의 저장소 역할 (ChromaDB 단위)
  • Document: 실제 본문 콘텐츠와 메타데이터를 담은 객체
  • Metadata: Document에 붙는 부가 정보로, 필터링과 분류에 사용됨

이 문서는 각 개념의 정의와 역할, 그리고 Document와 Metadata의 차이점까지 포함하여 설명한다.


2. 주요 개념 설명

2.1 Collection (컬렉션)

  • 정의: 관련된 Document들을 저장하는 단위. ChromaDB에서 폴더처럼 역할함.
  • 사용 목적: 주제별로 분리된 문서 관리를 통해 검색 범위를 지정 가능.
  • 예시:
    • gov24_service_list: 정부24 서비스 목록
    • youth_policy_list: 청년정책 데이터
    • pdf_sections: PDF에서 추출한 정책 내용
  • 비유: 도서관의 '청년정책 책장', '정부24 책장' 등 주제별 책장

2.2 Document (다큐먼트)

  • 정의: 하나의 본문 텍스트(page_content)와 그에 대한 설명 정보인 메타데이터(metadata)로 구성된 객체
  • 사용 목적: 검색 대상이 되며, LLM이 읽고 요약·답변 생성을 수행할 수 있는 단위
  • 구조 예시:
Document(
    page_content="이 정책은 청년 창업자에게 최대 1억 원의 자금을 지원합니다.",
    metadata={
        "정책명": "청년 창업 지원",
        "지역": "서울",
        "신청기간": "2024-03-01 ~ 2024-03-31"
    }
)
  • 비유: 책 한 권 (본문은 내용, 메타데이터는 표지 정보)

2.3 Metadata (메타데이터)

  • 정의: Document에 부착된 추가 정보. 필터링이나 분류 조건에 사용됨.
  • 사용 목적: 지역, 정책명, 날짜 등 키워드 기반 조건 검색 수행
  • 예시:
{
  "정책명": "청년 창업 지원",
  "지역": "서울",
  "신청기간": "2024-03-01 ~ 2024-03-31"
}
  • 비유: 책 표지의 제목, 저자, 발행일 등

3. Document vs Metadata 구분

핵심 차이

구분 Document Metadata

누가 쓰는가? GPT와 같은 LLM 검색 시스템, 필터 조건
무엇을 위해? 텍스트 이해, 요약, 응답 생성 조건 검색, 분류, 필터링
내용 형식 자유로운 문장, 본문 텍스트 key-value 형식 데이터
사용 예 정책 상세 설명 정책명, 지역, 신청기간 등

함께 쓰는 이유

  • Document만 사용하면 조건 검색이 불가능함 (예: "부산 것만 보여줘" 불가)
  • Metadata만 사용하면 LLM이 내용을 이해할 수 없음 → 답변 생성 불가능
  • 따라서 둘을 조합해서 사용해야 RAG가 제대로 작동함

4. 전체 구조 예시

[Collection] 'youth_policy_list'
└── Document 1
    ├── page_content: "이 정책은 청년 창업을 지원합니다."
    └── metadata:
        ├── 정책명: 청년 창업 지원
        ├── 지역: 서울
        └── 신청기간: 2024-03-01 ~ 2024-03-31

5. 실사용 코드 예시

from langchain.schema import Document

Document(
    page_content="이 정책은 청년 창업을 지원합니다. 최대 1억 원의 지원금을 받을 수 있습니다.",
    metadata={
        "plcyNm": "청년 창업 지원",
        "지역": "서울",
        "신청기간": "2024-03-01 ~ 2024-03-31"
    }
)

ChromaDB에 저장:

collection.add_documents([doc])

6. 참고 링크

'Today I Learned' 카테고리의 다른 글

MVP 벡터 DB 로드 코드  (2) 2025.03.22
BM25, MultiQueryRetriever, Singleton 패턴  (1) 2025.03.21
LAG를 왜 공부해야할까?  (0) 2025.03.10
내가 보려고 정리한 협업 깃 명령어  (2) 2025.03.05
openai로 내용 보강법  (0) 2025.02.21