Want to Become a Sponsor? Contact Us Now!🎉

langchain-tutorials
LangChain을 활용한 Qdrant를 이용한 고급 벡터 검색

LangChain을 활용한 Qdrant를 이용한 고급 벡터 검색

Published on

Qdrant 소개: LangChain용 벡터 유사도 검색 엔진

언어 모델링과 텍스트 기반 응용 분야에서 비슷한 벡터를 효율적으로 검색하고 검색하는 능력은 중요합니다. 관련 문서 찾기, 사용자 쿼리 매칭 또는 의미 기반 매칭 수행 등 번역문의 능력을 대폭 강화할 수 있는 강력하고 편리한 벡터 유사도 검색 엔진이 필요한 경우 Qdrant가 등장합니다.

Qdrant는 벡터 유사도 검색 엔진으로, 추가 페이로드와 함께 벡터를 저장, 검색 및 관리하기 위한 편리한 API를 제공하는 프로덕션 레디 서비스를 제공합니다. 대규모 벡터 검색을 효율적으로 처리하고 고급 매칭 요구에 대한 상세한 필터링 기능을 제공합니다. Qdrant는 신경망이나 의미 기반 매칭, 퍼싯 검색 등을 필요로하는 응용 프로그램에 특히 유용합니다.

기사 요약

  • Qdrant는 추가 페이로드를 포함한 벡터를 저장, 검색 및 관리하기 위한 편리한 API를 제공하는 벡터 유사도 검색 엔진입니다.
  • 맞춤 매칭 요구에 적합한 상세한 필터링 기능을 제공합니다.
  • Qdrant는 LangChain에서 코사인 유사도 검색 또는 최대 마진 관련성(MMR) 검색에 리트리버로 사용될 수 있습니다.
<AdComponent />

Qdrant 클라이언트 설치 및 OpenAI API 키 설정하기

LangChain에서 Qdrant를 사용하려면 먼저 qdrant-client 패키지를 설치해야 합니다. 이 패키지는 Qdrant와 상호 작용하기 위한 필요한 클라이언트 라이브러리를 제공합니다. 다음 명령을 사용하여 설치할 수 있습니다.

%pip install --upgrade --quiet qdrant-client

다음으로, OpenAI 임베딩을 사용하여 유사성 검색을 수행하는 데 필요한 OpenAI API 키를 설정해야 합니다. Python에서 getpassos 모듈을 사용하여 API 키를 설정할 수 있습니다.

import getpass
import os
 
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API 키:")

LangChain에서 문서 로딩 및 분할하기

Qdrant 클라이언트가 설치되고 OpenAI API 키가 설정된 후에는 LangChain에서 문서를 로딩하고 분할할 수 있습니다. 이를 위해 LangChain 커뮤니티 모듈에서 제공하는 TextLoader 클래스를 사용하여 문서를 로드할 수 있습니다.

from langchain_community.document_loaders import TextLoader
 
loader = TextLoader("/경로/문서.txt")
documents = loader.load()

문서를 로드한 후, LangChain 텍스트 분할 모듈에서 제공하는 CharacterTextSplitter 클래스를 사용하여 이를 작은 청크로 분할할 수 있습니다. 이는 대형 문서 처리 또는 텍스트의 특정 부분에서 검색을 수행해야 할 때 유용합니다.

from langchain_text_splitters import CharacterTextSplitter
 
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

서로 다른 모드에서 Qdrant에 연결하기

문서를 로드하고 분할한 후, 배포 요구 사항에 따라 다양한 모드에서 Qdrant에 연결할 수 있습니다. Qdrant는 로컬 모드, 온프레미스 서버 배포 및 Qdrant Cloud를 비롯한 여러 배포 옵션을 지원합니다.

메모리 내 저장소를 사용하는 로컬 모드

로컬 모드에서는 서버없이 Qdrant를 실행하고 데이터를 메모리에만 저장할 수 있습니다. 이 모드는 빠른 실험 및 테스트에 유용합니다. 메모리 내 저장소를 사용하는 로컬 모드에서 Qdrant에 연결하려면 Qdrant.from_documents 메서드를 사용하고 location 매개변수를 :memory:로 지정하면 됩니다.

from langchain_community.vectorstores import Qdrant
from langchain_openai import OpenAIEmbeddings
 
embeddings = OpenAIEmbeddings()
 
qdrant = Qdrant.from_documents(docs, embeddings, location=":memory:", collection_name="나의_문서")

디스크 저장소를 사용하는 로컬 모드

로컬 모드에서 데이터를 디스크에 유지하려면 Qdrant 데이터가 저장될 경로를 지정합니다. 이는 큰 데이터 세트를 처리해야 할 때나 데이터를 세션 간에 유지해야 할 때 유용합니다. 디스크 저장소를 사용하는 로컬 모드에서 Qdrant에 연결하려면 Qdrant.from_documents 메서드를 사용하고 path 매개변수를 지정하면 됩니다.

qdrant = Qdrant.from_documents(docs, embeddings, path="/tmp/local_qdrant", collection_name="나의_문서")

온프레미스 서버 배포

대규모 배포에서는 Docker 컨테이너나 Kubernetes 배포로 로컬에서 실행 중인 Qdrant 인스턴스에 연결할 수 있습니다. 온프레미스 서버 배포에서 Qdrant에 연결하려면 Qdrant 인스턴스의 URL을 지정하고 prefer_grpc 매개변수를 True로 설정하여 성능을 높일 수 있습니다.

url = "<---여기에 qdrant url 입력--->"
qdrant = Qdrant.from_documents(docs, embeddings, url=url, prefer_grpc=True, collection_name="나의_문서")

Qdrant Cloud

완전히 관리되는 Qdrant 클러스터를 선호하는 경우 Qdrant Cloud 계정을 설정하고 제공된 URL 및 API 키를 사용하여 클러스터에 연결할 수 있습니다. 이 옵션은 Qdrant를 배포하기 위한 확장 가능하고 안전한 솔루션을 제공합니다. Qdrant Cloud에서 Qdrant에 연결하려면 Qdrant.from_documents 메서드에서 URL 및 API 키를 지정해야 합니다.

url = "<---여기에 qdrant cloud 클러스터 url 입력--->"
api_key = "<---api 키--->"
qdrant = Qdrant.from_documents(docs, embeddings, url=url, prefer_grpc=True, api_key=api_key, collection_name="나의_문서")

다음 섹션에서는 Qdrant 컬렉션에서 유사도 검색을 수행하고 검색 결과의 유사도 점수를 검색하는 방법을 탐색합니다.

계속됩니다...

langchain Qdrant

다른 모드에서 Qdrant에 연결하기

Qdrant는 요구 사항에 따라 다른 연결 모드를 제공합니다. Qdrant를 로컬에서 실행하거나 온프레미스 또는 클라우드에 배포하려는 경우, 귀하의 요구에 맞는 옵션이 있습니다.

인메모리 스토리지를 사용한 로컬 모드

로컬 모드에서는 Qdrant 서버 없이 Qdrant를 실행할 수 있습니다. 이는 테스트 및 디버깅 목적으로 사용하거나 작은 양의 벡터만 저장할 때 유용합니다. 이 모드에서는 임베딩이 완전히 메모리에 유지되며 클라이언트가 파괴될 때 손실됩니다.

인메모리 스토리지를 사용하여 로컬 모드에서 Qdrant에 연결하려면 다음 코드를 사용할 수 있습니다:

from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceEmbeddings
 
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
qdrant = Qdrant.from_documents(
    documents, embeddings, location=":memory:", collection_name="my_collection"
)

디스크 스토리지를 사용한 로컬 모드

로컬 모드에서 벡터를 디스크에 유지하려면 벡터가 저장될 경로를 지정할 수 있습니다. 이를 통해 벡터를 실행 사이에 재사용하고 매번 처음부터 시작하는 것을 피할 수 있습니다.

디스크 스토리지를 사용하여 로컬 모드에서 Qdrant에 연결하려면 다음 코드를 사용할 수 있습니다:

from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceEmbeddings
 
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
qdrant = Qdrant.from_documents(
    documents, embeddings, path="/path/to/storage", collection_name="my_collection"
)

온프레미스 서버 배포

온프레미스에서 Qdrant를 배포하려면 공식 Helm 차트를 사용하여 도커 컨테이너 또는 쿠버네티스 배포를 사용할 수 있습니다. Qdrant 서비스의 URL을 제공해야 합니다.

온프레미스 서버 배포에서 Qdrant에 연결하려면 다음 코드를 사용할 수 있습니다:

import qdrant_client
from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceEmbeddings
 
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
client = qdrant_client.QdrantClient("<qdrant-url>", api_key="<qdrant-api-key>")
qdrant = Qdrant(client=client, collection_name="my_collection", embeddings=embeddings)

Qdrant Cloud

Qdrant Cloud를 사용하려면 해당하는 URL 및 API 키를 제공하여 연결할 수 있습니다.

Qdrant Cloud에 연결하려면 다음 코드를 사용할 수 있습니다:

from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceEmbeddings
 
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
qdrant = Qdrant.from_documents(
    documents, embeddings, url="<qdrant-url>", api_key="<qdrant-api-key>", collection_name="my_collection"
)

이러한 다른 연결 모드를 사용하여 Qdrant를 LangChain 애플리케이션에 쉽게 통합하고 강력한 벡터 유사도 검색 기능을 활용할 수 있습니다.

Qdrant 컬렉션에서 유사도 검색 수행하기

Qdrant 컬렉션에 연결한 후 컬렉션에 저장된 벡터에서 유사도 검색을 수행할 수 있습니다. 이를 통해 주어진 쿼리 벡터와 유사한 벡터를 찾을 수 있습니다.

유사도 검색을 수행하려면 쿼리 벡터를 제공하고 검색 결과로 검색할 최근접 이웃의 수를 지정해야 합니다. Qdrant는 최근접 이웃과 유사도 점수를 반환합니다.

Qdrant를 사용하여 유사도 검색을 수행하는 예제입니다:

# Query vector
query_vector = [0.1, 0.2, 0.3, 0.4, 0.5]
 
# Number of nearest neighbors to retrieve
k = 5
 
# Perform similarity search
results = qdrant.search(query_vector, k)

results 객체에는 최근접 이웃과 해당 유사도 점수가 포함됩니다. 이 정보를 사용하여 결과를 추가 처리하고 분석할 수 있습니다.

Qdrant의 다양한 필터링 기능 활용하기

Qdrant는 벡터 속성 또는 벡터와 관련된 payload 속성에 대한 특정 기준에 따라 검색 결과를 좁힐 수 있는 다양한 필터링 기능을 제공합니다.

LangChain에서 Qdrant의 필터링 기능을 사용하는 몇 가지 예입니다:

벡터 속성으로 필터링하기

# 특정 속성 값으로 필터링
results = qdrant.search(query_vector, k, filter={"vector_attributes": {"attribute_name": "attribute_value"}})
 
# 속성 값의 범위로 필터링
results = qdrant.search(query_vector, k, filter={"vector_attributes": {"attribute_name": {"gte": 10, "lte": 20}}})

Payload 속성으로 필터링하기

# 특정 페이로드 속성 값으로 필터링
results = qdrant.search(query_vector, k, filter={"payload_attributes": {"attribute_name": "attribute_value"}})
 
# 페이로드 속성 값의 범위로 필터링
results = qdrant.search(query_vector, k, filter={"payload_attributes": {"attribute_name": {"gte": 10, "lte": 20}}})

이러한 필터링 기능을 사용하여 쉽게 검색 결과를 좁힐 수 있으며, 특정 기준을 충족하는 벡터를 검색할 수 있습니다.

최대 마진 탐색(MMR)을 사용하여 다양한 결과 검색하기

유사도 검색을 수행하는 것 외에도 Qdrant는 최대 마진 탐색(MMR) 검색 방법을 사용하여 다양한 결과를 검색하는 기능을 제공합니다. MMR 검색은 관련성과 다양성을 모두 갖춘 문서 집합을 찾아 검색 공간의 더 포괄적인 표현을 제공합니다. MMR 검색을 수행하려면 쿼리 벡터, 검색할 가장 가까운 이웃의 수 및 관련성과 다양성 사이의 균형을 제어하는 다양성 매개변수를 제공해야 합니다.

다음은 Qdrant를 사용하여 MMR 검색을 수행하는 예입니다:

# 쿼리 벡터
query_vector = [0.1, 0.2, 0.3, 0.4, 0.5]
 
# 검색할 가장 가까운 이웃의 수
k = 5
 
# 다양성 매개변수
lambda_param = 0.5
 
# MMR 검색 수행
results = qdrant.mmr_search(query_vector, k, lambda_param)

results 객체에는 다양한 가장 가까운 이웃과 유사도 점수가 포함됩니다. 다양성 매개변수를 조정함으로써 검색 결과에서 관련성과 다양성 사이의 균형을 제어할 수 있습니다.

LangChain에서 리트리버로서 Qdrant 사용하기

Qdrant는 코사인 유사성 검색과 MMR 검색 모두에서 LangChain의 리트리버로 사용할 수 있습니다. Qdrant를 LangChain 애플리케이션에 통합함으로써 강력한 벡터 유사성 검색 기능을 활용하여 검색 성능과 정확성을 향상시킬 수 있습니다.

코사인 유사성 검색의 리트리버로서 Qdrant를 사용하려면 다음 코드를 사용할 수 있습니다:

from langchain.retrievers import QdrantRetriever
 
retriever = QdrantRetriever(qdrant)
results = retriever.retrieve_cosine(query_vector, k)

MMR 검색의 리트리버로서 Qdrant를 사용하려면 다음 코드를 사용할 수 있습니다:

from langchain.retrievers import QdrantRetriever
 
retriever = QdrantRetriever(qdrant)
results = retriever.retrieve_mmr(query_vector, k, lambda_param)

LangChain에서 Qdrant를 리트리버로 사용함으로써 언어 모델 기반 애플리케이션에 쉽게 벡터 유사성 검색 기능을 통합할 수 있습니다.

결론

이 글에서는 Qdrant에 연결하는 방법, Qdrant 컬렉션에서 유사성 검색을 수행하는 방법, Qdrant의 다양한 필터링 기능을 활용하는 방법, MMR 검색을 사용하여 다양한 결과를 검색하는 방법, 그리고 Qdrant를 LangChain의 리트리버로 사용하는 방법을 살펴보았습니다. Qdrant를 LangChain 애플리케이션에 통합함으로써 강력한 벡터 유사성 검색 엔진을 활용하여 검색 성능과 정확성을 향상시킬 수 있습니다.

Anakin AI - The Ultimate No-Code AI App Builder