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
'LLM & Generative AI > RAG in Practice' 카테고리의 다른 글
[LangChain RAG 구축 시리즈 Ep.11] 🔄 Retrieval QA 실습: 문서 기반 답변 구성 (1) | 2025.04.05 |
---|---|
[LangChain RAG 구축 시리즈 Ep.10] 🧪 벡터 검색 결과 해석하기 (top-k, score 등) (1) | 2025.04.05 |
[LangChain RAG 구축 시리즈 Ep.08] 🧠 OpenAI Embedding 실습: JSON을 임베딩해보기 (1) | 2025.04.05 |
[LangChain RAG 구축 시리즈 Ep.07] 💬 사용자 질문을 벡터와 어떻게 매칭할까? (1) | 2025.04.05 |
[LangChain RAG 구축 시리즈 Ep.06] 📝 텍스트 vs 구조형 데이터: 어떻게 임베딩할까? (1) | 2025.04.05 |