728x90
Docker Desktop (Mac M1)에서 Kubernetes를 활용하여 ChromaDB를 배포하고, Python을 사용하여 데이터를 저장 및 검색하는 방법을 정리해보았습니다.
특히, hostPath를 올바르게 설정하여 데이터를 영구 저장하는 방법과 LoadBalancer를 통해 외부에서 접근하는 방법을 포함합니다.
✅ 1. Docker Desktop 환경에서 ChromaDB 설치 개요
Docker Desktop의 내장 Kubernetes 기능을 사용하면 로컬 개발 환경에서 손쉽게 ChromaDB를 실행할 수 있습니다. 그러나 데이터를 영구 저장하려면 Kubernetes hostPath 설정이 필요하며, 외부 접근을 위해 LoadBalancer를 설정해야 합니다.
📌 목표
- Kubernetes에 ChromaDB 배포 (Helm 없이 YAML 적용)
- hostPath를 사용하여 로컬 디렉터리에 데이터 저장
- LoadBalancer를 이용하여 외부에서 접근 가능하도록 설정
- Python을 사용하여 데이터 저장 및 검색 테스트
✅ 2. ChromaDB Kubernetes 배포 (YAML 설정)
아래는 Kubernetes 환경에서 ChromaDB를 배포하는 YAML 파일입니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: chromadb
namespace: rag
spec:
replicas: 1
selector:
matchLabels:
app: chromadb
template:
metadata:
labels:
app: chromadb
spec:
containers:
- name: chromadb
image: chromadb/chroma:0.6.2 # ✅ 최신 버전 사용
ports:
- containerPort: 8000 # 내부 포트 (FastAPI 기본값)
env:
- name: ALLOW_RESET
value: "true" # ✅ 인덱스 초기화 허용
- name: CHROMA_SERVER_HOST
value: "0.0.0.0" # ✅ 외부 접근 가능하도록 설정
- name: CHROMA_SERVER_HTTP_PORT
value: "8000" # ✅ 내부 서버 포트 설정
- name: IS_PERSISTENT
value: "true" # ✅ 데이터 영구 저장 활성화
- name: PERSIST_DIRECTORY
value: "/data" # ✅ 영구 데이터 저장 경로 설정
- name: ANONYMIZED_TELEMETRY
value: "false" # ✅ 익명 통계 전송 비활성화
volumeMounts:
- name: chromadb-data
mountPath: /data
volumes:
- name: chromadb-data
hostPath:
path: /tmp/chromadb-data
type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
name: chromadb
namespace: rag
spec:
type: LoadBalancer
selector:
app: chromadb
ports:
- protocol: TCP
port: 8090
targetPort: 8000
📌 설치 및 실행
kubectl apply -f chromadb.yaml
📌 배포 상태 확인
kubectl get pods -n rag
kubectl get svc -n rag
✅ 3. Python을 이용한 ChromaDB 데이터 저장 및 조회
📌 필수 패키지 설치
pip install chromadb
🔹 1. ChromaDB 데이터 저장
import chromadb
# ✅ 수정된 코드 (HttpClient 사용)
chroma_client = chromadb.HttpClient(host="localhost", port=8090) # 포트 확인 필요
# 컬렉션 생성
collection = chroma_client.get_or_create_collection(name="rag_test")
# 샘플 데이터 삽입
collection.add(
ids=["1", "2"],
documents=["이것은 테스트 문서입니다.", "RAG 시스템 구축 중입니다."],
metadatas=[{"source": "test1"}, {"source": "test2"}]
)
# 검색 테스트
results = collection.query(
query_texts=["RAG 구축"],
n_results=2
)
print(results)
✅ 결과: 데이터가 정상적으로 ChromaDB에 저장됨.
🔹 2. ChromaDB Collection 조회
import chromadb
chroma_client = chromadb.HttpClient(host="localhost", port=8090)
# 저장된 컬렉션 목록 조회
collections = chroma_client.list_collections()
print("저장된 컬렉션 목록:", collections)
📌 결과 예시:
저장된 컬렉션 목록: ["rag_test"]
🔹 3. ChromaDB 데이터 조회
import chromadb
chroma_client = chromadb.HttpClient(host="localhost", port=8090)
# "rag_test" 컬렉션 가져오기
collection = chroma_client.get_collection("rag_test")
# 저장된 데이터 조회
all_docs = collection.get(include=["documents", "metadatas"])
print("저장된 데이터:", all_docs)
📌 결과 예시:
{
"ids": ["1", "2"],
"documents": ["이것은 테스트 문서입니다.", "RAG 시스템 구축 중입니다."],
"metadatas": [{"source": "test1"}, {"source": "test2"}]
}
✅ 4. ChromaDB Swagger UI 활용
📌 Swagger UI 접속
http://localhost:8090/docs
여기서 GET /api/v1/collections?tenant=default_tenant&database=default_database 엔드포인트를 호출하여 현재 저장된 컬렉션 목록을 확인할 수 있습니다.
728x90
'LLM & Generative AI > RAG in Practice' 카테고리의 다른 글
[LangChain RAG 구축 시리즈 Ep.05] 🧩 왜 metadata.json을 문서처럼 다뤄야 할까? (1) | 2025.04.05 |
---|---|
[LangChain RAG 구축 시리즈 Ep.04] ❄️ Iceberg란? 메타데이터 구조와 RAG 연결 (1) | 2025.04.05 |
[LangChain RAG 구축 시리즈 Ep.03] 🧠 LLM은 어디까지 알고 있을까? 외부 지식의 필요성 (1) | 2025.04.05 |
[LangChain RAG 구축 시리즈 Ep.02] 📦 Embedding의 원리와 벡터의 의미 (1) | 2025.04.05 |
[LangChain RAG 구축 시리즈 Ep.01] 🔍 RAG를 구성하는 핵심 컴포넌트 4가지 (1) | 2025.04.05 |