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. 참고 링크
- LangChain Docs: https://docs.langchain.com/docs/components/document/
- ChromaDB Docs: https://docs.trychroma.com/
- 프로젝트 예제 파일: retriever.py, load_youth_policy_data.py, load_pdf_data.py 등
'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 |