LLM & Generative AI/RAG in Practice

[LangChain RAG 구축 시리즈 Ep.09] 🗂️ ChromaDB로 벡터 저장소 구성하기

ygtoken 2025. 4. 5. 20:04
728x90

이 글에서는 앞에서 생성한 임베딩 벡터를 ChromaDB에 저장하고,
이 벡터들을 기반으로 문서 검색이 가능하도록
Retriever 객체를 구성하는 전체 과정을 실습합니다.


🎯 목표

  • LangChain에서 ChromaDB 벡터 저장소 구성하기
  • JSON → 자연어 문서 → 벡터 → Chroma 저장
  • 저장된 벡터에 대해 질문(query)으로 검색 테스트

🔧 ChromaDB란?

Chroma는 로컬에서 작동하는 빠르고 간단한 벡터 DB입니다.

장점 설명
✅ 설치 필요 없음 LangChain과 함께 자동 동작
✅ 검색 속도 빠름 작은 실습/PoC에 적합
✅ 오픈소스 커스터마이징 가능

📝 Step 1. 문서 벡터화 후 ChromaDB에 저장하기

from langchain.vectorstores import Chroma               # Chroma 벡터 DB import
from langchain.embeddings import OpenAIEmbeddings       # OpenAI 임베딩 import

# ✅ 샘플 문서 리스트 (자연어 기반 텍스트 문서)
documents = [
    "📂 테이블명: products\n🧾 컬럼 목록:\n- product_id (long)\n- name (string)\n🧩 파티션: category",
    "📂 테이블명: customers\n🧾 컬럼 목록:\n- customer_id (long)\n- name (string)\n- region (string)\n🧩 파티션: region"
]

# ✅ OpenAI 임베딩 모델 생성
embedding_model = OpenAIEmbeddings()

# ✅ 문서를 벡터로 임베딩하고 ChromaDB에 저장
vectordb = Chroma.from_texts(           # from_texts()는 자동으로 벡터 생성 및 저장까지 수행
    texts=documents,                    # 자연어 문서 리스트
    embedding=embedding_model,         # 사용할 임베딩 모델
    collection_name="iceberg_tables"   # 벡터 컬렉션 이름
)

🔍 Step 2. 검색기(Retriever) 생성

# ✅ ChromaDB에서 벡터 검색기를 생성
retriever = vectordb.as_retriever(                   # Chroma 객체에서 검색 기능 활성화
    search_kwargs={"k": 1}                           # top-k 결과 1개만 반환하도록 설정
)

💬 Step 3. 질문(Query)으로 문서 검색해보기

# ✅ 사용자 질문 입력
query = "상품 정보를 담고 있는 테이블이 뭐야?"

# ✅ 관련된 문서 검색
results = retriever.get_relevant_documents(query)    # 질문을 벡터화한 후, 유사 문서 검색

# ✅ 결과 출력
print(results[0].page_content)                       # 가장 유사한 문서 내용 출력

 

예상 출력:

📂 테이블명: products
🧾 컬럼 목록:
- product_id (long)
- name (string)
🧩 파티션: category

➡️ 사용자의 질문 벡터와 가장 유사한 문서를 반환한 결과입니다.


📂 Step 4. Chroma 저장소 디스크에 저장하고 재사용하기 (선택)

# ✅ 로컬 디스크 경로에 저장
vectordb.persist()                                   # 임베딩 벡터 데이터를 저장

# ✅ 나중에 재불러오기
vectordb = Chroma(                                   # 기존 ChromaDB에서 로드
    persist_directory="./chroma_db",                 # 저장된 디렉토리 경로
    embedding_function=embedding_model,
    collection_name="iceberg_tables"
)

이 과정을 통해 서버 재시작 후에도 벡터DB 재사용이 가능합니다.


📎 요약 및 핵심 정리

  • ChromaDB는 LangChain에서 가장 쉽게 사용할 수 있는 벡터 저장소입니다.
  • OpenAI 임베딩으로 생성한 벡터를 저장하면, 유사도 기반 검색이 가능합니다.
  • Retriever 객체를 통해 질문 → 문서 검색 → GPT 전달 흐름이 완성됩니다.
728x90