23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
최근 RAG 관련 업무를 진행하면서 벡터DB가 필요하게 되어 팀 내 논의를 거쳐 Qdrant를 선택하였습니다.
현재 개발 환경을 구축하여 이를 활용하고 있으며, 이에 대한 내용을 공유드리고자 합니다.
최근 벡터 검색과 유사도 기반 검색이 많은 관심을 받고 있습니다.
Qdrant와 같은 벡터 데이터베이스는 검색 및 추천 시스템에서 그 성능을 입증하고 있으며,
특히 Retrieval-Augmented Generation(RAG)과 결합해 놀라운 성능을 발휘할 수 있습니다.
이번 글에서는 Azure Kubernetes Service(AKS)를 이용해 Qdrant를 손쉽고 빠르게 개발 환경에 배포하고,
Ingress를 통해 도메인 기반으로 접근할 수 있도록 하는 방법을 소개하고자 합니다.
Qdrant는 벡터 데이터베이스로써, 빠른 벡터 검색을 제공해 AI 애플리케이션 개발에 큰 도움을 줍니다.
특히 개발 초기 단계에서 손쉽게 Qdrant를 배포하고 테스트하는 것은 매우 중요합니다.
복잡한 인프라 구성을 피하고 빠르게 설치하고 활용해 봄으로써, RAG와 같은 복합적인 환경에서도 데이터 검색 및 활용을 간편하게 시작할 수 있습니다.
이 글에서는 Azure Kubernetes Service(AKS)를 활용하여 Qdrant를 빠르게 배포하고, 필요한 최소한의 설정만으로도 바로 사용할 수 있는 환경을 만드는 데 중점을 두겠습니다.
RAG(Retrieval-Augmented Generation)는 외부 지식을 검색해 언어 모델의 응답 품질을 향상시키는 방법입니다.
예를 들어, 사용자가 질문했을 때, 관련된 정보를 외부 데이터베이스에서 검색하여 언어 모델이 더욱 정확하고 풍부한 답변을 생성할 수 있도록 돕습니다.
Qdrant는 이러한 RAG 구조에서 매우 중요한 벡터 검색 역할을 담당합니다.
Qdrant는 빠른 설치뿐만 아니라, 여러 가지 강점으로 개발자에게 강력한 도구가 되어줍니다.
Qdrant는 HNSW(Hierarchical Navigable Small World) 알고리즘을 사용해 벡터 공간에서 빠르고 효율적으로 유사한 결과를 검색할 수 있습니다.
이를 통해 수백만 개의 벡터 데이터 중에서도 의미적으로 가장 유사한 정보를 빠르게 찾을 수 있어 RAG와 같은 시스템에서 매우 중요한 역할을 합니다.
Kubernetes에 Qdrant를 배포함으로써 확장성을 간단하게 확보할 수 있습니다.
Kubernetes는 필요에 따라 Qdrant 인스턴스를 쉽게 확장할 수 있는 기능을 제공하므로, 데이터 증가나 요청 수요에 따라 Qdrant의 검색 성능을 유지할 수 있습니다.
이는 빠르게 변화하는 개발 환경에서 큰 장점이 됩니다.
Qdrant는 벡터 데이터를 인덱싱하고 검색하는 데 있어서 메모리와 디스크 I/O를 효율적으로 활용해 높은 성능을 제공합니다.
개발자는 Qdrant를 통해 실시간으로 데이터를 검색하고, RAG 구조를 이용해 AI 모델이 보다 나은 결과를 생성하도록 할 수 있습니다.
이제 Kubernetes 클러스터와 kubectl이 준비되었다고 가정하고, Qdrant를 배포하는 방법을 단계적으로 설명하겠습니다.
네임스페이스 qdrant를 생성하여 관련 리소스를 관리하는 것부터 시작해보겠습니다.
kubectl create namespace qdrant이렇게 네임스페이스를 생성하여 Qdrant 리소스를 명확하게 관리할 준비를 마쳤습니다.
빠르게 테스트하면서도 데이터를 안전하게 저장하기 위해 PersistentVolumeClaim(PVC)을 생성합니다.
이 PVC는 개발 단계에서도 데이터의 안정성을 확보할 수 있도록 도와줍니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: qdrant-pvc
namespace: qdrant
spec:
accessModes:
- ReadWriteOnce
storageClassName: managed-csi
resources:
requests:
storage: 10GiPVC를 설정한 후, 아래 명령어로 적용합니다.
kubectl apply -f qdrant-pvc.yaml이제 Qdrant 데이터가 안전하게 저장될 수 있는 스토리지를 확보했습니다.
Qdrant를 손쉽게 테스트할 수 있도록, Kubernetes 서비스 타입을 LoadBalancer로 설정하여 외부에서 접근할 수 있는 환경을 만듭니다.
apiVersion: v1
kind: Service
metadata:
name: qdrant
namespace: qdrant
labels:
app: qdrant
spec:
type: LoadBalancer
ports:
- port: 6333
targetPort: 6333
selector:
app: qdrant서비스를 적용한 후 Ingress까지 적용하면 도메인 네임을 통해 Qdrant에 쉽게 접근할 수 있습니다.
kubectl apply -f qdrant-service.yamlQdrant를 빠르게 배포하고 테스트할 수 있는 기본 Deployment를 구성합니다.
권장 리소스가 소규모 프로덕션 환경용으로 CPU: 2-4 vCPU, 메모리: 4-8GB 이지만, 개발 환경에서 1core, 2GB 메모리로 구축하여 잘 운영을 하고 있습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: qdrant
namespace: qdrant
labels:
app: qdrant
spec:
replicas: 1
selector:
matchLabels:
app: qdrant
template:
metadata:
labels:
app: qdrant
spec:
containers:
- name: qdrant
image: "qdrant/qdrant:v1.11.0"
ports:
- containerPort: 6333
resources:
requests:
memory: "2Gi"
cpu: "1"
limits:
memory: "2Gi"
cpu: "1"
volumeMounts:
- name: qdrant-storage
mountPath: /qdrant/storage
volumes:
- name: qdrant-storage
persistentVolumeCl
claimName: qdrant-pvcQdrant Deployment를 생성합니다.
kubectl apply -f qdrant-deployment.yaml이렇게 하면 Qdrant가 클러스터에서 실행되며, 데이터를 안전하게 저장할 수 있습니다.
개발 단계에서 외부에서 쉽게 접근할 수 있도록 Ingress를 설정하여 도메인을 통해 Qdrant에 접근할 수 있게 합니다.
처음 구축하고 운영하던 중에 ingress 통과하지 못하는 케이스 발생이 있어 아래와 같은 annotion 설정을 추가하게 되었습니다.
Qdrant는 벡터 데이터베이스로써 대용량 데이터를 다루기 때문에 요청과 응답의 크기가 크고, 검색 작업이 오래 걸릴 수 있습니다.
proxy-body-size: "1G": 큰 데이터를 업로드할 수 있도록 요청 크기를 1GB로 설정.
proxy-read-timeout: "3600": 긴 쿼리 처리 시간 동안 충분한 응답 대기 시간을 확보.
proxy-send-timeout: "3600": 대량의 검색 결과를 전송할 때 전송 시간 초과를 방지.
proxy-connect-timeout: "3600": Qdrant와의 연결이 지연되는 상황에서도 안정적인 연결을 유지하기 위해 충분한 연결 대기 시간을 설정.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-qdrant
namespace: qdrant
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "1G"
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-connect-timeout: "3600"
spec:
ingressClassName: nginx
rules:
- host: qdrant-dev.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: qdrant
port:
number: 6333
tls:
- hosts:
- qdrant-dev.example.com
secretName: tls-qdrant이제 Ingress 설정을 통해 qdrant-dev.example.com 도메인으로 Qdrant에 쉽게 접근할 수 있습니다.
kubectl apply -f qdrant-ingress.yaml이제 모든 리소스가 잘 배포되었는지 확인해 보겠습니다.
kubectl get pods -n qdrant
kubectl get svc -n qdrant
kubectl get ingress -n qdrant포드가 Running 상태이고, 서비스와 Ingress가 정상적으로 설정되어 있다면 이제 준비가 완료된 것입니다.
개발자라면 빠르게 API를 테스트해보고 싶을 것입니다. 아래와 같이 도메인을 통해 Qdrant에 접근하여 테스트할 수 있습니다.
curl https://qdrant-dev.example.com/collections
{"result":{"collections":[{"name":"example_collection3"},{"name":"semantic_memory"},{"name":"movies"},{"name":"movie_embed-small"},{"name":"test240906_1"},{"name":"movies_collection"},{"name":"test"},{"name":"movies_sparse"},{"name":"movie_embed-large"},{"name":"comapny_240924"},{"name":"example_collection2"},{"name":"episodic_memory"},{"name":"example_collection4"},{"name":"knowledge_240826"},{"name":"scifact"},{"name":"company_240906"},{"name":"products"},{"name":"test240906"},{"name":"movie_240827"},{"name":"movies_dense"},{"name":"test240828"},{"name":"rag_test"},{"name":"0830_test_collection"},{"name":"naver_news"},{"name":"test_collection"}]},"status":"ok","time":0.00001053}정상적인 응답이 온다면 Qdrant가 성공적으로 배포된 것입니다!
이번 글에서는 Azure Kubernetes Service(AKS)에서 Qdrant를 빠르게 배포하고, RAG 환경을 손쉽게 구성하는 방법을 소개했습니다.
Qdrant의 HNSW 알고리즘은 벡터 검색에서 매우 빠르고 정확한 성능을 제공하며, Kubernetes를 통한 확장성 덕분에 데이터가 증가하더라도 안정적인 검색 환경을 유지할 수 있습니다.
이러한 특성 덕분에, RAG와 같은 고도화된 AI 응용 프로그램에서도 Qdrant는 핵심 역할을 할 수 있습니다.
초기 개발 단계에서 복잡한 설정을 피하고 빠르게 개발 환경을 구성하는 것은 매우 중요한데, Kubernetes와 AKS를 이용하면 Qdrant를 손쉽게 시작하고 테스트할 수 있습니다.
개발 환경은 한 달 넘게 문제없이 잘 운영되고 있습니다. 이제 상용 시스템 구축을 준비 중이며, 개발 환경보다 안정성과 성능을 더욱 중요하게 고려해야 합니다.
Qdrant는 샤딩과 데이터 복제를 지원하므로, 멀티 노드 구성을 통해 상용 시스템의 요구사항을 충분히 충족할 수 있을 것으로 기대됩니다.
앞으로도 이러한 클라우드 네이티브 기술을 활용하여 AI 기반 솔루션을 더욱 효율적이고 빠르게 개발해 보세요!
특징 | Qdrant | Milvus | Weaviate |
|---|---|---|---|
구현 언어 | Rust | Go와 C++ | Go |
오픈소스 라이선스 | Apache License 2.0 | Apache License 2.0 | BSD-3-Clause License |
데이터 저장 | 벡터 및 페이로드(키-값 쌍) | 벡터와 스칼라 데이터 | 객체와 벡터 |
인덱싱 알고리즘 | HNSW | IVF, HNSW, ANNOY 등 | HNSW |
API와 SDK | RESTful API, gRPC | SDK(Python, Java, Go, Node.js), RESTful API | GraphQL API, RESTful API |
하이브리드 검색 지원 | 예 (벡터 검색과 필터링 결합) | 예 (벡터 검색과 스칼라 필터링 결합) | 예 (벡터 및 키워드 검색 결합) |
확장성 및 클러스터링 | 수평 확장 및 샤딩 지원 | 분산 배포를 통한 높은 확장성 | 수평 확장 및 모듈식 디자인 |
성능 | Rust 기반으로 인한 높은 성능 | 설정에 따른 성능 변화, 높은 확장성 | 모듈로 인한 약간의 오버헤드 가능성, 전반적으로 양호한 성능 |
커뮤니티 및 지원 | 활발한 커뮤니티, 성장 중 | 큰 커뮤니티, 잘 확립된 지원 체계 | 활발한 커뮤니티, 성장 중 |
사용의 용이성 | 간단한 REST API로 사용이 용이함 | 설정 및 관리에 다소 복잡성이 있음 | GraphQL 지원으로 사용이 직관적임 |
통합 및 호환성 | REST API 및 페이로드를 통한 유연한 통합 | 다양한 데이터 소스 및 도구와의 통합 지원 | 내장된 벡터화 모듈과 플러그인을 통한 확장성 |
추가 기능 | 벡터에 키-값 쌍 페이로드 지원, 하이브리드 검색 | 다양한 인덱스 유형 지원, 대용량 데이터 처리에 적합 | 내장 벡터화 모듈 제공, 하이브리드 검색 지원 |
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.