개요
이 가이드 에서는 Django MongoDB 백엔드를 사용하여 MongoDB Vector Search 쿼리를 수행하는 방법을 학습 수 있습니다. 이 기능 사용하면 문서에서 시맨틱 검색 수행할 수 있습니다. 시맨틱 검색 제공된 검색 또는 구문 텀 의미는 비슷하지만 반드시 동일하지는 않은 정보를 찾는 검색 유형입니다.
샘플 데이터
이 가이드 의 예제에서는 Atlas 샘플 데이터 세트의 sample_mflix.embedded_movies 컬렉션 나타내는 MovieWithEmbeddings 모델을 사용합니다. MovieWithEmbeddings 모델 클래스의 정의는 다음과 같습니다.
from django.db import models from django_mongodb_backend.fields import ArrayField class MovieWithEmbeddings(models.Model): title = models.CharField(max_length=200) runtime = models.IntegerField(default=0) plot_embedding = ArrayField(models.FloatField(), size=1536, null=True, blank=True) class Meta: db_table = "embedded_movies" managed = False def __str__(self): return self.title
MovieWithEmbeddings 모델에는 모델 메타데이터 지정하는 내부 Meta 클래스와 모델의 문자열 표현을 정의하는 __str__() 메서드가 포함되어 있습니다. 이러한 모델 기능에 대해 학습 모델 생성 가이드 의모델 정의를 참조하세요.
코드 예제 실행
Python 대화 셸 사용하여 코드 예제를 실행 수 있습니다. 셸 에 들어가려면 프로젝트의 루트 디렉토리 에서 다음 명령을 실행 .
python manage.py shell
Python 셸 입력한 후 다음 모델 및 모듈을 가져와야 합니다.
from <your application name>.models import MovieWithEmbeddings
모델과 Python 인터랙티브 셸 사용하여 MongoDB 문서와 상호 작용 Django 애플리케이션 만드는 방법을 Movie 학습 Django MongoDB 백엔드 시작하기 튜토리얼을 참조하세요.
벡터 검색 수행
중요
쿼리 요구 사항
MongoDB 벡터 검색 쿼리를 수행하려면 먼저 컬렉션 에 벡터 검색 인덱스 생성해야 합니다. 장고 MongoDB 백엔드를 사용하여 벡터 검색 인덱스 만드는 방법을 학습 인덱스 만들기 가이드 에서 벡터 검색 인덱스를 참조하세요.
장고 MongoDB 백엔드를 사용하여 시맨틱 의미를 기반으로 데이터를 쿼리 할 수 있습니다. MongoDB Vector Search 쿼리 쿼리 벡터 또는 검색 나 텀 의 의미를 나타내는 숫자 배열 기반으로 결과를 반환합니다. MongoDB 이 쿼리 벡터를 문서의 벡터 필드에 저장된 벡터와 비교합니다.
벡터 검색 기준을 지정하려면 django_mongodb_backend.expressions 모듈에서 제공하는 SearchVector 표현식 클래스의 인스턴스 만듭니다. 이 표현식 $vectorSearch MongoDB 파이프라인 단계에 해당합니다. 다음 인수를 SearchVector() 생성자에 전달합니다.
path: 쿼리 할 필드 입니다.query_vector: 검색 기준을 나타내는 숫자 배열 . 쿼리 벡터에 대해 자세히 학습하려면 MongoDB Atlas 문서에서 벡터 를 참조하세요.limit: 반환할 최대 결과 수입니다.num_candidates: (선택 사항) 쿼리에 대해 고려할 문서 수입니다.exact: (선택 사항) 등가 최근접 이웃(ENN) 검색을 수행할지 여부를 나타내는 불리언 값입니다. 기본값 은False입니다. 등가 최근접 이웃 검색에 대해 자세히 학습하려면 MongoDB Atlas 문서의 등가 최근접 이웃 검색 을 참조하세요.filter: (선택 사항) 쿼리 결과에 적용 할 필터하다 .
그런 다음 장고의 QuerySet API 에서 SearchVector 인스턴스 annotate 메서드에 전달하여 Vector Search 쿼리 실행 . 다음 코드는 벡터 검색 쿼리 수행하기 위한 구문을 보여줍니다.
from django_mongodb_backend.expressions import SearchVector Model.objects.annotate( score=SearchVector( path="<field name>", query_vector=[<vector values>], limit=<number>, num_candidates=<number>, exact=<boolean>, filter=<filter expression> ) )
기본 벡터 검색 예제
이 예시 sample_mflix.embedded_movies 컬렉션 에서 MongoDB Vector Search 쿼리 실행합니다. 쿼리 다음 조치를 수행합니다.
plot_embedding벡터 필드 쿼리합니다.결과를
5문서로 제한합니다.150후보를 고려하는 근사치 근접 이웃(ANN) 벡터 검색 지정합니다. ANN 검색에 대해 자세히 학습하려면 MongoDB Atlas 문서에서 ANN 검색 을 참조하세요.
vector_values = [float(i % 10) * 0.1 for i in range(1536)] MovieWithEmbeddings.objects.annotate( score=SearchVector( path="plot_embedding", query_vector=vector_values, limit=5, num_candidates=150, exact=False, ) )
<QuerySet [<MovieWithEmbeddings: Berserk: The Golden Age Arc I - The Egg of the King>, <MovieWithEmbeddings: Rollerball>, <MovieWithEmbeddings: After Life>, <MovieWithEmbeddings: What Women Want>, <MovieWithEmbeddings: Truth About Demons>]>
팁
앞의 코드 예시 임의의 벡터를 query_vector 인수에 전달합니다. 검색 또는 구문 텀 의미를 나타내는 벡터를 생성하는 방법을 학습하려면 MongoDB Atlas 문서에서 벡터 임베딩을 수동으로 생성하는 방법 을 참조하세요.
벡터 검색 점수 예시
MongoDB Vector Search 쿼리 에서 반환되는 모든 문서 에 관련성 점수를 할당합니다. 결과 집합에 포함된 문서는 관련성 점수가 가장 높은 순서에서 가장 낮은 순서로 정렬됩니다.
쿼리 결과에 이 점수를 포함하려면 장고의 QuerySet API 에서 values() 메서드를 사용할 수 있습니다. score 필드 values() 메서드에 인수로 전달합니다.
다음 예시 이전 예시 와 동일한 벡터 검색 쿼리 실행 하고 문서의 벡터 검색 관련성 점수를 출력하는 방법을 보여줍니다.
vector_values = [float(i % 10) * 0.1 for i in range(1536)] MovieWithEmbeddings.objects.annotate( score=SearchVector( path="plot_embedding", query_vector=vector_values, limit=5, num_candidates=150, exact=False, ) ).values("title", "score")
<QuerySet [{'title': 'Berserk: The Golden Age Arc I - The Egg of the King', 'score': 0.47894009947776794}, {'title': 'Rollerball', 'score': 0.45006513595581055}, {'title': 'After Life', 'score': 0.42825883626937866}, {'title': 'What Women Want', 'score': 0.4211753308773041}, {'title': 'Truth About Demons', 'score': 0.4194544851779938}]>
추가 정보
MongoDB Vector Search에 대해 자세히 학습 MongoDB Atlas 설명서에서 다음 리소스를 참조하세요.