데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      AKS에 Qdrant 배포하기: 쉽게 시작하는 Qdrant와 RAG 개발 환경

      broccoli 24.10.21
      3,107 5 0
      DEVOTEE 요약
      Qdrant는 최근 RAG와 결합하여 벡터DB로 선택되었고, Azure Kubernetes Service(AKS)를 통해 빠르고 간편하게 개발 환경에 배포되어 활용되고 있습니다. 글에서는 Qdrant의 HNSW 알고리즘을 이용한 빠른 벡터 검색과 Kubernetes의 확장성을 통해, 개발 단계의 복잡한 설정을 피하면서도 안정적인 검색 환경을 유지할 수 있는 방법을 소개하였습니다. 배포 및 설정 과정에서 고객은 kubectl 명령으로 네임스페이스 생성, PVC 설정, 외부 접근을 위한 서비스 및 Ingress 설정 등을 통하여 빠르게 Qdrant를 운영할 수 있으며, 이는 상용 시스템 구축 시 안정성과 성능 향상에 기여할 수 있습니다.
      DEVOTEE 추천 블로그

      RAG와 Qdrant

      최근 RAG 관련 업무를 진행하면서 벡터DB가 필요하게 되어 팀 내 논의를 거쳐 Qdrant를 선택하였습니다.

      현재 개발 환경을 구축하여 이를 활용하고 있으며, 이에 대한 내용을 공유드리고자 합니다.

      최근 벡터 검색과 유사도 기반 검색이 많은 관심을 받고 있습니다.

      Qdrant와 같은 벡터 데이터베이스는 검색 및 추천 시스템에서 그 성능을 입증하고 있으며,

      특히 Retrieval-Augmented Generation(RAG)과 결합해 놀라운 성능을 발휘할 수 있습니다.

      이번 글에서는 Azure Kubernetes Service(AKS)를 이용해 Qdrant를 손쉽고 빠르게 개발 환경에 배포하고,

      Ingress를 통해 도메인 기반으로 접근할 수 있도록 하는 방법을 소개하고자 합니다.

      1. 빠르고 간편하게 시작하는 Qdrant: 개발 환경의 첫걸음

      Qdrant는 벡터 데이터베이스로써, 빠른 벡터 검색을 제공해 AI 애플리케이션 개발에 큰 도움을 줍니다.

      특히 개발 초기 단계에서 손쉽게 Qdrant를 배포하고 테스트하는 것은 매우 중요합니다.

      복잡한 인프라 구성을 피하고 빠르게 설치하고 활용해 봄으로써, RAG와 같은 복합적인 환경에서도 데이터 검색 및 활용을 간편하게 시작할 수 있습니다.

      이 글에서는 Azure Kubernetes Service(AKS)를 활용하여 Qdrant를 빠르게 배포하고, 필요한 최소한의 설정만으로도 바로 사용할 수 있는 환경을 만드는 데 중점을 두겠습니다.

      2. RAG란 무엇인가?

      RAG(Retrieval-Augmented Generation)는 외부 지식을 검색해 언어 모델의 응답 품질을 향상시키는 방법입니다.

      예를 들어, 사용자가 질문했을 때, 관련된 정보를 외부 데이터베이스에서 검색하여 언어 모델이 더욱 정확하고 풍부한 답변을 생성할 수 있도록 돕습니다.

      Qdrant는 이러한 RAG 구조에서 매우 중요한 벡터 검색 역할을 담당합니다.

      3. Qdrant의 강점: HNSW, 확장성, 성능

      Qdrant는 빠른 설치뿐만 아니라, 여러 가지 강점으로 개발자에게 강력한 도구가 되어줍니다.

      - HNSW 알고리즘으로 빠른 벡터 검색

      Qdrant는 HNSW(Hierarchical Navigable Small World) 알고리즘을 사용해 벡터 공간에서 빠르고 효율적으로 유사한 결과를 검색할 수 있습니다.

      이를 통해 수백만 개의 벡터 데이터 중에서도 의미적으로 가장 유사한 정보를 빠르게 찾을 수 있어 RAG와 같은 시스템에서 매우 중요한 역할을 합니다.

      - 확장 가능한 아키텍처

      Kubernetes에 Qdrant를 배포함으로써 확장성을 간단하게 확보할 수 있습니다.

      Kubernetes는 필요에 따라 Qdrant 인스턴스를 쉽게 확장할 수 있는 기능을 제공하므로, 데이터 증가나 요청 수요에 따라 Qdrant의 검색 성능을 유지할 수 있습니다.

      이는 빠르게 변화하는 개발 환경에서 큰 장점이 됩니다.

      - 성능 최적화

      Qdrant는 벡터 데이터를 인덱싱하고 검색하는 데 있어서 메모리와 디스크 I/O를 효율적으로 활용해 높은 성능을 제공합니다.

      개발자는 Qdrant를 통해 실시간으로 데이터를 검색하고, RAG 구조를 이용해 AI 모델이 보다 나은 결과를 생성하도록 할 수 있습니다.


      RAG 시스템 구축하기

      1. AKS로 손쉽게 시작하는 Qdrant 배포: 준비 단계

      이제 Kubernetes 클러스터와 kubectl이 준비되었다고 가정하고, Qdrant를 배포하는 방법을 단계적으로 설명하겠습니다.

      네임스페이스 qdrant를 생성하여 관련 리소스를 관리하는 것부터 시작해보겠습니다.

      네임스페이스 생성

      kubectl create namespace qdrant

      이렇게 네임스페이스를 생성하여 Qdrant 리소스를 명확하게 관리할 준비를 마쳤습니다.

      2. 데이터를 안전하게 저장하기 위한 PVC 설정

      빠르게 테스트하면서도 데이터를 안전하게 저장하기 위해 PersistentVolumeClaim(PVC)을 생성합니다.

      이 PVC는 개발 단계에서도 데이터의 안정성을 확보할 수 있도록 도와줍니다.

      PVC 생성 YAML

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: qdrant-pvc
        namespace: qdrant
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: managed-csi
        resources:
          requests:
            storage: 10Gi

      PVC를 설정한 후, 아래 명령어로 적용합니다.

      kubectl apply -f qdrant-pvc.yaml

      이제 Qdrant 데이터가 안전하게 저장될 수 있는 스토리지를 확보했습니다.

      3. 외부 접근을 위한 서비스 설정

      Qdrant를 손쉽게 테스트할 수 있도록, Kubernetes 서비스 타입을 LoadBalancer로 설정하여 외부에서 접근할 수 있는 환경을 만듭니다.

      서비스 YAML 파일

      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.yaml

      4. Qdrant 배포하기: Deployment 설정

      Qdrant를 빠르게 배포하고 테스트할 수 있는 기본 Deployment를 구성합니다.

      권장 리소스가 소규모 프로덕션 환경용으로 CPU: 2-4 vCPU, 메모리: 4-8GB 이지만, 개발 환경에서 1core, 2GB 메모리로 구축하여 잘 운영을 하고 있습니다.

      Deployment YAML 파일

      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-pvc

      Qdrant Deployment를 생성합니다.

      kubectl apply -f qdrant-deployment.yaml

      이렇게 하면 Qdrant가 클러스터에서 실행되며, 데이터를 안전하게 저장할 수 있습니다.

      5. 도메인 접근을 위한 Ingress 설정

      개발 단계에서 외부에서 쉽게 접근할 수 있도록 Ingress를 설정하여 도메인을 통해 Qdrant에 접근할 수 있게 합니다.

      처음 구축하고 운영하던 중에 ingress 통과하지 못하는 케이스 발생이 있어 아래와 같은 annotion 설정을 추가하게 되었습니다.

      • Qdrant는 벡터 데이터베이스로써 대용량 데이터를 다루기 때문에 요청과 응답의 크기가 크고, 검색 작업이 오래 걸릴 수 있습니다.

      • proxy-body-size: "1G": 큰 데이터를 업로드할 수 있도록 요청 크기를 1GB로 설정.

      • proxy-read-timeout: "3600": 긴 쿼리 처리 시간 동안 충분한 응답 대기 시간을 확보.

      • proxy-send-timeout: "3600": 대량의 검색 결과를 전송할 때 전송 시간 초과를 방지.

      • proxy-connect-timeout: "3600": Qdrant와의 연결이 지연되는 상황에서도 안정적인 연결을 유지하기 위해 충분한 연결 대기 시간을 설정.

      Ingress YAML 파일

      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

      6. 모든 것이 잘 동작하는지 확인하기

      이제 모든 리소스가 잘 배포되었는지 확인해 보겠습니다.

      kubectl get pods -n qdrant
      kubectl get svc -n qdrant
      kubectl get ingress -n qdrant

      포드가 Running 상태이고, 서비스와 Ingress가 정상적으로 설정되어 있다면 이제 준비가 완료된 것입니다.

      7. Qdrant에 접근하여 테스트하기

      개발자라면 빠르게 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가 성공적으로 배포된 것입니다!


      결론: 빠르고 간편하게 시작하는 Qdrant와 RAG 개발 환경

      이번 글에서는 Azure Kubernetes Service(AKS)에서 Qdrant를 빠르게 배포하고, RAG 환경을 손쉽게 구성하는 방법을 소개했습니다.

      Qdrant의 HNSW 알고리즘은 벡터 검색에서 매우 빠르고 정확한 성능을 제공하며, Kubernetes를 통한 확장성 덕분에 데이터가 증가하더라도 안정적인 검색 환경을 유지할 수 있습니다.

      이러한 특성 덕분에, RAG와 같은 고도화된 AI 응용 프로그램에서도 Qdrant는 핵심 역할을 할 수 있습니다.

      초기 개발 단계에서 복잡한 설정을 피하고 빠르게 개발 환경을 구성하는 것은 매우 중요한데, Kubernetes와 AKS를 이용하면 Qdrant를 손쉽게 시작하고 테스트할 수 있습니다.

      개발 환경은 한 달 넘게 문제없이 잘 운영되고 있습니다. 이제 상용 시스템 구축을 준비 중이며, 개발 환경보다 안정성과 성능을 더욱 중요하게 고려해야 합니다.

      Qdrant는 샤딩과 데이터 복제를 지원하므로, 멀티 노드 구성을 통해 상용 시스템의 요구사항을 충분히 충족할 수 있을 것으로 기대됩니다.

      앞으로도 이러한 클라우드 네이티브 기술을 활용하여 AI 기반 솔루션을 더욱 효율적이고 빠르게 개발해 보세요!


      부록: 벡터DB 비교

      특징

      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 및 페이로드를 통한 유연한 통합

      다양한 데이터 소스 및 도구와의 통합 지원

      내장된 벡터화 모듈과 플러그인을 통한 확장성

      추가 기능

      벡터에 키-값 쌍 페이로드 지원, 하이브리드 검색

      다양한 인덱스 유형 지원, 대용량 데이터 처리에 적합

      내장 벡터화 모듈 제공, 하이브리드 검색 지원

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      broccoli 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기