벡터 양자화
이 페이지의 내용
참고
다음에 대한 Atlas Vector Search 지원 은 Preview 기능 으로 사용할 수 있습니다.
BSON BinData 하위
vector
유형int1
수집.자동 스칼라 양자화.
자동 이진 양자화.
Atlas Vector Search 는 벡터 임베딩에서 이중 또는 32비트 부동 소수점 값의 자동 양자화를 지원합니다. 또한 임베딩 제공자로부터 스칼라 및 이진 양자화된 벡터를 수집하고 인덱스 할 수 있습니다.
양자화 정보
양자화는 완전 충실도 벡터를 더 적은 비트로 축소하는 프로세스 입니다. 축소된 표현 벡터를 인덱스 하므로 벡터 검색 인덱스 에 각 벡터를 저장 하는 데 필요한 메인 메모리의 양을 줄여 더 많은 벡터 또는 더 높은 차원의 벡터를 저장 수 있습니다. 이러한 방식으로 양자화는 리소스 소비를 줄이고 속도를 향상시킵니다. 따라서 일반적으로 10M 벡터를 초과하는 많은 수의 벡터가 있는 애플리케이션에는 양자화를 권장합니다.
스칼라 양자화
스칼라 양자화에는 먼저 인덱싱된 벡터의 각 차원에 대한 최소값과 최대값을 식별하여 차원의 값 범위 를 설정하는 작업이 포함됩니다. 그런 다음 범위 를 동일한 크기의 간격 또는 빈으로 나눕니다. 마지막으로 각 부동 소수점 값을 빈에 매핑하여 연속 부동 소수점 값을 불연속적인 정수로 변환합니다. Atlas Vector Search 에서 이 양자화는 벡터 임베딩의 RAM 비용 을1/4
양자화 전 비용 의 1/4( )로 줄입니다.
바이너리 양자화
이진 양자화에는 각 차원에 대해 중간점을 으로 가정하는 것이 0
포함되며, 이는 일반적으로 1
OpenAI의 와 같이 길이 로 정규화된 임베딩에 text-embedding-3-large
적합합니다. 그런 다음 벡터의 각 값을 중간점과 비교하여 1
중간점보다 크면 이진 값, 중간점보다 작거나 같으면 이진 값 를 0
할당합니다. Atlas Vector Search 에서 이 양자화는 벡터 임베딩의 RAM 비용 을1/24
양자화 전 비용 의 24분의 1( )로 줄입니다. 이 아닌 이유는 벡터 값과 별도로 1/32
Hierarchical Navigable Small Worlds 그래프 자체를 포함하는 데이터 구조가 압축되지 않기 때문입니다.
쿼리 를 실행 때 Atlas Vector Search 는 쿼리 벡터와 인덱싱된 이진 벡터를 효율적으로 비교할 수 있도록 동일한 중점을 사용하여 쿼리 벡터의 부동 소수점 값을 이진 벡터로 변환합니다. 그런 다음 이진 인덱스 의 결과와 관련된 원래 부동 소수점 값을 사용하여 이진 비교에서 식별된 후보를 재평가하여 점수를 다시 매겨 결과를 더욱 세분화합니다. 전체 충실도 벡터는 디스크의 자체 데이터 구조에 저장되며, 이진 양자화를 구성하거나 이진 또는 스칼라 양자화된 벡터에 대해 정확한 검색 을 수행할 때 재채점하는 동안에만 참조됩니다.
요구 사항:
다음 표는 양자화된 벡터를 자동으로 양자화하고 수집하기 위한 요구 사항을 보여줍니다.
요구 사항 | int1 수집의 경우 | int8 수집의 경우 | 자동 스칼라 양자화의 경우 | 자동 이진 양자화의 경우 |
---|---|---|---|---|
인덱스 정의 설정 필요 | No | No | 예 | 예 |
BSON | 예 | 예 | No | No |
mongod 의 스토리지 |
|
| binData(float32) array(float32) | binData(float32) array(float32) |
지원되는 유사성 메서드 |
| cosine euclidean dotProduct | cosine euclidean dotProduct | cosine euclidean dotProduct |
지원되는 차원 수 | 8의 배수 | 1에서 4096 | 1에서 4096 | 8의 배수 |
ENN 검색 지원 | 의ENN | 의ENN | 의ENN | 의ENN |
벡터의 자동 양자화를 활성화하는 방법
벡터 임베딩의 이중 또는 32비트 실수 값을 int8
(스칼라) 및 binary
와 같은 더 작은 숫자 유형으로 자동으로 양자화하도록 Atlas Vector Search 를 구성할 수 있습니다.
대부분의 임베딩 모델의 경우 점수 재지정을 포함한 이진 양자화를 권장합니다.QAT 가 아닌 저차원 모델을 사용하려면 표현 손실이 적고 표현 용량 손실이 적은 스칼라 양자화를 사용합니다.
혜택
Atlas Vector Search 는 스칼라 양자화 및 점수 재지정을 통한 이진 양자화를 위한 네이티브 기능을 제공합니다. 자동 양자화는 벡터의 효율적인 처리 를 위해 저장 및 계산 리소스를 줄임으로써 애플리케이션의 확장성 성과 비용 절감을 향상시킵니다. 자동 양자화는 의 RAM mongot
을 3.75스칼라의 경우 x, 바이너리의 24경우 x만큼 줄입니다. 벡터 값은 각각 4x 및 32x 축소되지만 Hierarchical Navigable Small Worlds 그래프 자체는 축소되지 않습니다. 이렇게 하면 가장 높은 볼륨과 확장하다 에서도 성능이 향상됩니다.
사용 사례
완전 충실도 벡터가 많은 경우, 일반적으로 10M 벡터를 초과하는 경우 자동 양자화를 권장합니다. 양자화 후 벡터를 검색할 때 정확도를 저하시키지 않으면서 축소된 표현 벡터를 인덱스 할 수 있습니다.
절차
double
또는 32비트 float
값을 자동으로 양자화하려면 다음을 수행합니다.
Atlas Vector Search 인덱스 에서 원하는 양자화 유형을 지정합니다.
신규 또는 기존 Atlas Vector Search 인덱스 fields.quantization
에서 인덱스 정의의 필드에 다음 양자화 유형 중 하나를 지정합니다.
scalar
: 32비트 입력 벡터에서 바이트 벡터를 생성합니다.binary
: 32비트 입력 벡터에서 비트 벡터를 생성합니다.
doubles
또는 32비트 float
값의 배열 이 아닌 데이터에 자동 양자화를 지정하면 Atlas Vector Search 는 벡터를 인덱싱 하는 대신 해당 벡터를 자동으로 무시하며 해당 벡터는 건너뜁니다.
인덱스 를 만들거나 업데이트 합니다.
인덱스 작성에는 약 1분 정도가 소요됩니다. 인덱스가 작성되는 동안 인덱스는 초기 동기화 상태에 있습니다. 빌드가 완료되면 컬렉션의 데이터 쿼리를 시작할 수 있습니다.
사전 양자화된 벡터를 수집하는 방법
Atlas Vector Search 는 임베딩 제공자의 스칼라 및 이진 양자화된 벡터의 수집 및 인덱싱 도 지원합니다. 아직 양자화된 벡터가 없는 경우 임베딩을 BSON BinData vector
하위 유형 float32
, int1
또는 int8
벡터로 변환할 수 있습니다.
참고
다음에 대한 Atlas Vector Search 지원 은 Preview 기능 으로 사용할 수 있습니다.
BSON BinData 하위
vector
유형int1
수집.자동 스칼라 양자화.
자동 이진 양자화.
사용 사례
다음 사용 사례에는 BSON binData
vector
하위 유형을 권장합니다.
임베딩 모델에서 양자화된 벡터 출력을 인덱싱해야 합니다.
많은 수의 float 벡터가 있지만,
mongod
에서 스토리지 및 WiredTiger 설치 공간(예: 디스크 및 메모리 사용량)을 줄이려고 합니다.
혜택
BinData 형식은 요소 배열에 비해 클러스터 의 디스크 공간이 약 3배 적습니다. 또는 벡터와 같은 대체 유형으로 벡터를 인덱스 하여 컬렉션 vector
int1
에 int8
대한 Atlas Vector Search 인덱스 를 빌드 하는 데 필요한 메모리를 줄일 수 있습니다. 의 RAM mongot
3.75을 스칼라의 경우 x,24바이너리의 경우 x만큼 줄입니다. 벡터 값은 4각각 x 및 32x만큼 축소되지만 Hierarchical Navigable Small Worlds 그래프 자체는 축소되지 않습니다.
binData
벡터가 아직 없는 경우 컬렉션에 데이터를 쓰기 전에 지원되는 드라이버를 사용하여 임베딩을 이 형식으로 변환할 수 있습니다. 이 페이지에서는 임베딩을 BinData vector
하위 유형으로 변환하는 단계를 안내합니다.
지원되는 드라이버
BSON BinData vector
하위 유형 float32
, int1
및 int8
벡터 변환은 PyMongo 드라이버 v 이상에서4.10 지원됩니다.
전제 조건
임베딩을 BSON BinData vector
하위 유형으로 변환하려면 다음이 필요합니다.
MongoDB 버전 6.0.11, 7.0.2 또는 그 이상의 버전을 실행하는 Atlas 클러스터.
IP 주소가 Atlas 프로젝트의 액세스 목록에 포함되어 있는지 확인하세요.
Colab 같은 대화형 Python 노트북을 실행할 수 있는 환경입니다.
바이트 벡터 출력을 지원하는 임베딩 모델 액세스.
다음 임베딩 모델 제공자 지원
int8
또는int1
binData
벡터를 지원합니다.임베딩 모델 제공자임베딩 모델embed-english-v3.0
nomic-embed-text-v1.5
jina-embeddings-v2-base-en
mxbai-embed-large-v1
이러한 임베딩 모델 제공자를 사용하여
binData
벡터를 생성할 수 있습니다. 이러한 모델은 모두 양자화를 인식하도록 훈련되어 있기 때문에 스칼라 양자화는 이러한 모델에 대한 재현율을 유지합니다. 따라서 이러한 모델에 의해 생성된 스칼라 양자화된 임베딩의 재현율 저하는 과 같은 더 낮은 차원에서도 384 최소화됩니다.
절차
이 절차의 예제에서는 새 데이터 또는 기존 데이터와 Cohere의 embed-english-v3.0
모델을 사용합니다. 새 데이터에 대한 예시 에서는 자체 데이터로 바꿀 수 있는 샘플 텍스트 문자열을 사용합니다. 기존 데이터의 예시 에서는 데이터베이스 의 컬렉션 에서 임베딩이 없는 문서의 listingsAndReviews
sample_airbnb
하위 집합을 사용하며, 이는 자체 데이터베이스 및 컬렉션 (임베딩 유무에 관계없이)으로 대체할 수 있습니다.binData
새 데이터에 대해 벡터를 만들지, 아니면 이미 Atlas cluster 에 있는 데이터에 대해 벡터를 만들지 여부에 따라 탭 을 선택하세요.
확장자가 .ipynb
인 파일 을 저장하여 대화형 Python 노트북을 만든 후 노트북에서 다음 단계를 수행합니다. 예시 를 사용해 보려면 자리 표시자를 유효한 값으로 바꾸세요.
필요한 라이브러리를 설치합니다.
다음 명령을 실행하여 PyMongo 드라이버 를 설치합니다. 필요한 경우 임베딩 모델 제공자 로부터 라이브러리를 설치할 수도 있습니다. 이 작업을 완료하는 데 몇 분 정도 걸릴 수 있습니다.
pip install pymongo
PyMongo v4.10 이상 버전의 드라이버를 설치해야 합니다.
예시
PyMongo 및 Cohere 설치
pip --quiet install pymongo cohere
BSON 벡터를 생성하려는 데이터를 노트북에 로드합니다.
예시
가져올 샘플 데이터
data = [ "The Great Wall of China is visible from space.", "The Eiffel Tower was completed in Paris in 1889.", "Mount Everest is the highest peak on Earth at 8,848m.", "Shakespeare wrote 37 plays and 154 sonnets during his lifetime.", "The Mona Lisa was painted by Leonardo da Vinci.", ]
(조건부)데이터에서 임베딩을 생성합니다.
이 단계는 데이터에서 임베딩을 아직 생성하지 않은 경우에 필요합니다. 이미 임베딩을 생성했다면 이 단계를 건너뛰세요. 데이터에서 임베딩을 생성하는 방법에 대한 자세한 내용은 벡터 임베딩 생성 방법을 참조하세요.
예시
Cohere를 사용하여 샘플 데이터에서 임베딩 생성하기
자리 표시자 | 유효한 값 |
---|---|
| 코히어용 API 키입니다. |
import cohere api_key = "<COHERE-API-KEY>" co = cohere.Client(api_key) generated_embeddings = co.embed( texts=data, model="embed-english-v3.0", input_type="search_document", embedding_types=["float", "int8", "ubinary"] ).embeddings float32_embeddings = generated_embeddings.float int8_embeddings = generated_embeddings.int8 int1_embeddings = generated_embeddings.ubinary
임베딩에서 BSON 벡터를 생성합니다.
PyMongo 드라이버를 사용하면 네이티브 벡터 임베딩을 BSON 벡터로 변환할 수 있습니다.
예시
함수를 정의하고 실행하여 BSON 벡터 생성하기
from bson.binary import Binary, BinaryVectorDtype def generate_bson_vector(vector, vector_dtype): return Binary.from_vector(vector, vector_dtype) # For all vectors in your collection, generate BSON vectors of float32, int8, and int1 embeddings bson_float32_embeddings = [] bson_int8_embeddings = [] bson_int1_embeddings = [] for i, (f32_emb, int8_emb, int1_emb) in enumerate(zip(float32_embeddings, int8_embeddings, int1_embeddings)): bson_float32_embeddings.append(generate_bson_vector(f32_emb, BinaryVectorDtype.FLOAT32)) bson_int8_embeddings.append(generate_bson_vector(int8_emb, BinaryVectorDtype.INT8)) bson_int1_embeddings.append(generate_bson_vector(int1_emb, BinaryVectorDtype.PACKED_BIT))
BSON 벡터 임베딩을 사용하여 문서를 만듭니다.
컬렉션의 문서 내에 이미 BSON 벡터 임베딩이 있는 경우 이 단계를 건너뛰세요.
예시
샘플 데이터로 문서 만들기
자리 표시자 | 유효한 값 |
---|---|
|
|
|
|
|
|
def create_docs_with_bson_vector_embeddings(bson_float32_embeddings, bson_int8_embeddings, bson_int1_embeddings, data): docs = [] for i, (bson_f32_emb, bson_int8_emb, bson_int1_emb, text) in enumerate(zip(bson_float32_embeddings, bson_int8_embeddings, bson_int1_embeddings, data)): doc = { "_id":i, "data": text, "<FIELD-NAME-FOR-FLOAT32-TYPE>":bson_f32_emb, "<FIELD-NAME-FOR-INT8-TYPE>":bson_int8_emb, "<FIELD-NAME-FOR-INT1-TYPE>":bson_int1_emb, } docs.append(doc) return docs documents = create_docs_with_bson_vector_embeddings(bson_float32_embeddings, bson_int8_embeddings, bson_int1_embeddings, data)
Atlas 클러스터에 데이터를 로드합니다.
Atlas UI에서 프로그래밍 방식으로 데이터를 로드할 수 있습니다. Atlas UI에서 데이터를 로드하는 방법을 알아보려면 데이터 삽입을 참조하세요. 다음 단계와 관련 예시에서는 PyMongo 드라이버를 사용하여 프로그래밍 방식으로 데이터를 로드하는 방법을 보여줍니다.
Atlas cluster에 연결합니다.
자리 표시자유효한 값<ATLAS-CONNECTION-STRING>
Atlas 연결 string. 자세한 내용은 드라이버를 통한 연결을 참조하세요.
예시
import pymongo MONGO_URI = "<ATLAS-CONNECTION-STRING>" def get_mongo_client(mongo_uri): # establish the connection client = pymongo.MongoClient(mongo_uri) if not MONGO_URI: print("MONGO_URI not set in environment variables") Atlas 클러스터에 데이터를 로드합니다.
자리 표시자유효한 값<DB-NAME>
데이터베이스의 이름입니다.
<COLLECTION-NAME>
지정된 데이터베이스 에 있는 컬렉션 의 이름입니다.
예시
client = pymongo.MongoClient(MONGO_URI) db = client["<DB-NAME>"] db.create_collection("<COLLECTION-NAME>") col = db["<COLLECTION-NAME>"] col.insert_many(documents)
컬렉션에 Atlas Vector Search 인덱스를 생성합니다.
Atlas UI, Atlas CLI, Atlas 관리 API, MongoDB 드라이버를 사용하여 Atlas Vector Search 인덱스를 생성할 수 있습니다. 자세한 내용은 벡터 검색용 필드 인덱싱 방법을 참조하세요.
예시
샘플 컬렉션에 대한 인덱스 만들기
자리 표시자 | 유효한 값 |
---|---|
|
|
|
|
|
|
import time from pymongo.operations import SearchIndexModel vector_search_index_definition = { "fields":[ { "type": "vector", "path": "<FIELD-NAME-FOR-FLOAT32-TYPE>", "similarity": "dotProduct", "numDimensions": 1024, }, { "type": "vector", "path": "<FIELD-NAME-FOR-INT8-TYPE>", "similarity": "dotProduct", "numDimensions": 1024, }, { "type": "vector", "path": "<FIELD-NAME-FOR-INT1-TYPE>", "similarity": "euclidean", "numDimensions": 1024, } ] } search_index_model = SearchIndexModel(definition=vector_search_index_definition, name="<INDEX-NAME>", type="vectorSearch") col.create_search_index(model=search_index_model)
Atlas Vector Search 쿼리를 실행하는 함수를 정의합니다.
Atlas Vector Search 쿼리를 실행하는 함수는 다음 작업을 수행해야 합니다.
쿼리 텍스트를 BSON 벡터로 변환합니다.
Atlas Vector Search 쿼리에 대한 파이프라인을 정의합니다.
예시
자리 표시자 | 유효한 값 |
---|---|
|
|
|
|
|
|
|
|
| 검색 중에 사용할 가장 가까운 이웃의 수입니다. |
| 결과에서 반환할 문서 수입니다. |
def run_vector_search(query_text, collection, path): query_text_embeddings = co.embed( texts=[query_text], model="embed-english-v3.0", input_type="search_query", embedding_types=["float", "int8", "ubinary"] ).embeddings if path == "<FIELD-NAME-FOR-FLOAT32-TYPE>": query_vector = query_text_embeddings.float[0] vector_dtype = BinaryVectorDtype.FLOAT32 elif path == "<FIELD-NAME-FOR-INT8-TYPE>": query_vector = query_text_embeddings.int8[0] vector_dtype = BinaryVectorDtype.INT8 elif path == "<FIELD-NAME-FOR-INT1-TYPE>": query_vector = query_text_embeddings.ubinary[0] vector_dtype = BinaryVectorDtype.PACKED_BIT bson_query_vector = generate_bson_vector(query_vector, vector_dtype) pipeline = [ { '$vectorSearch': { 'index': '<INDEX-NAME>', 'path': path, 'queryVector': bson_query_vector, 'numCandidates': <NUMBER-OF-CANDIDATES-TO-CONSIDER>, 'limit': <NUMBER-OF-DOCUMENTS-TO-RETURN> } }, { '$project': { '_id': 0, 'data': 1, 'score': { '$meta': 'vectorSearchScore' } } } ] return collection.aggregate(pipeline)
Atlas Vector Search 쿼리를 실행합니다.
Atlas Vector Search 쿼리를 프로그래밍 방식으로 실행할 수 있습니다. 자세한 내용은 벡터 검색 쿼리 실행을 참조하세요.
예시
from pprint import pprint query_text = "tell me a science fact" float32_results = run_vector_search(query_text, col, "<FIELD-NAME-FOR-FLOAT32-TYPE>") int8_results = run_vector_search(query_text, col, "<FIELD-NAME-FOR-INT8-TYPE>") int1_results = run_vector_search(query_text, col, "<FIELD-NAME-FOR-INT1-TYPE>") print("results from float32 embeddings") pprint(list(float32_results)) print("--------------------------------------------------------------------------") print("results from int8 embeddings") pprint(list(int8_results)) print("--------------------------------------------------------------------------") print("results from int1 embeddings") pprint(list(int1_results))
results from float32 embeddings [{'data': 'Mount Everest is the highest peak on Earth at 8,848m.', 'score': 0.6578356027603149}, {'data': 'The Great Wall of China is visible from space.', 'score': 0.6420407891273499}] -------------------------------------------------------------------------- results from int8 embeddings [{'data': 'Mount Everest is the highest peak on Earth at 8,848m.', 'score': 0.5149182081222534}, {'data': 'The Great Wall of China is visible from space.', 'score': 0.5136760473251343}] -------------------------------------------------------------------------- results from int1 embeddings [{'data': 'Mount Everest is the highest peak on Earth at 8,848m.', 'score': 0.62109375}, {'data': 'The Great Wall of China is visible from space.', 'score': 0.61328125}]
필요한 라이브러리를 설치합니다.
다음 명령을 실행하여 PyMongo 드라이버 를 설치합니다. 필요한 경우 임베딩 모델 제공자 로부터 라이브러리를 설치할 수도 있습니다. 이 작업을 완료하는 데 몇 분 정도 걸릴 수 있습니다.
pip install pymongo
PyMongo v4.10 이상 버전의 드라이버를 설치해야 합니다.
예시
PyMongo 및 Cohere 설치
pip --quiet install pymongo cohere
벡터 임베딩을 생성하고 임베딩을 BSON 호환 형식으로 변환하는 함수를 정의합니다.
임베딩 모델을 사용하여 다음을 수행하는 함수를 정의해야 합니다.
기존 데이터에 임베딩이 없는 경우 기존 데이터에서 임베딩을 생성합니다.
임베딩을 BSON 벡터로 변환합니다.
예시
임베딩을 생성하고 변환하는 함수
자리 표시자 | 유효한 값 |
---|---|
| 코히어용 API 키입니다. |
1 import os 2 import pymongo 3 import cohere 4 from bson.binary import Binary, BinaryVectorDtype 5 6 # Specify your OpenAI API key and embedding model 7 os.environ["COHERE_API_KEY"] = "<COHERE-API-KEY>" 8 cohere_client = cohere.Client(os.environ["COHERE_API_KEY"]) 9 10 # Function to generate embeddings using Cohere 11 def get_embedding(text): 12 response = cohere_client.embed( 13 texts=[text], 14 model='embed-english-v3.0', 15 input_type='search_document', 16 embedding_types=["float"] 17 ) 18 embedding = response.embeddings.float[0] 19 return embedding 20 21 # Function to convert embeddings to BSON-compatible format 22 def generate_bson_vector(vector, vector_dtype): 23 return Binary.from_vector(vector, vector_dtype)
1 import os 2 import pymongo 3 import cohere 4 from bson.binary import Binary, BinaryVectorDtype 5 6 # Specify your OpenAI API key and embedding model 7 os.environ["COHERE_API_KEY"] = "<COHERE-API-KEY>" 8 cohere_client = cohere.Client(os.environ["COHERE_API_KEY"]) 9 10 # Function to generate embeddings using Cohere 11 def get_embedding(text): 12 response = cohere_client.embed( 13 texts=[text], 14 model='embed-english-v3.0', 15 input_type='search_document', 16 embedding_types=["int8"] 17 ) 18 embedding = response.embeddings.int8[0] 19 return embedding 20 21 # Function to convert embeddings to BSON-compatible format 22 def generate_bson_vector(vector, vector_dtype): 23 return Binary.from_vector(vector, vector_dtype)
1 import os 2 import pymongo 3 import cohere 4 from bson.binary import Binary, BinaryVectorDtype 5 6 # Specify your OpenAI API key and embedding model 7 os.environ["COHERE_API_KEY"] = "<COHERE-API-KEY>" 8 cohere_client = cohere.Client(os.environ["COHERE_API_KEY"]) 9 10 # Function to generate embeddings using Cohere 11 def get_embedding(text): 12 response = cohere_client.embed( 13 texts=[text], 14 model='embed-english-v3.0', 15 input_type='search_document', 16 embedding_types=["ubinary"] 17 ) 18 embedding = response.embeddings.ubinary[0] 19 return embedding 20 21 # Function to convert embeddings to BSON-compatible format 22 def generate_bson_vector(vector, vector_dtype): 23 return Binary.from_vector(vector, vector_dtype)
Atlas cluster 에 연결하고 기존 데이터를 조회 합니다.
다음을 제공해야 합니다.
임베딩을 생성하려는 데이터베이스 및 컬렉션 이 포함된 Atlas cluster 에 연결하기 위한 연결 문자열입니다.
임베딩을 생성하려는 컬렉션 이 포함된 데이터베이스 의 이름입니다.
임베딩을 생성하려는 컬렉션 의 이름입니다.
예시
데이터 액세스를 위해 Atlas 클러스터에 연결
자리 표시자 | 유효한 값 |
---|---|
| Atlas 연결 string. 자세한 내용은 드라이버를 통한 연결을 참조하세요. |
1 # Connect to your Atlas cluster 2 mongo_client = pymongo.MongoClient("<ATLAS-CONNECTION-STRING>") 3 db = mongo_client["sample_airbnb"] 4 collection = db["listingsAndReviews"] 5 6 # Filter to exclude null or empty summary fields 7 filter = { "summary": {"$nin": [None, ""]} } 8 9 # Get a subset of documents in the collection 10 documents = collection.find(filter).limit(50) 11 12 # Initialize the count of updated documents 13 updated_doc_count = 0
컬렉션 에 임베딩을 생성, 변환 및 로드합니다.
데이터에 아직 임베딩이 없는 경우 임베딩 모델을 사용하여 데이터에서 임베딩을 생성합니다. 데이터에서 임베딩을 생성하는 방법에 학습 보려면 벡터 임베딩을 만드는 방법을 참조하세요.
다음 예시 의 줄에 표시된 대로 임베딩을 BSON 벡터로 변환합니다. 7
Atlas cluster 의 컬렉션 에 임베딩을 업로드합니다.
이 작업을 완료하는 데 몇 분 정도 걸릴 수 있습니다.
예시
컬렉션에 임베딩 생성, 변환 및 로드
1 for doc in documents: 2 # Generate embeddings based on the summary 3 summary = doc["summary"] 4 embedding = get_embedding(summary) # Get float32 embedding 5 6 # Convert the float32 embedding to BSON format 7 bson_float32 = generate_bson_vector(embedding, BinaryVectorDtype.FLOAT32) 8 9 # Update the document with the BSON embedding 10 collection.update_one( 11 {"_id": doc["_id"]}, 12 {"$set": {"embedding": bson_float32}} 13 ) 14 updated_doc_count += 1 15 16 print(f"Updated {updated_doc_count} documents with BSON embeddings.")
1 for doc in documents: 2 # Generate embeddings based on the summary 3 summary = doc["summary"] 4 embedding = get_embedding(summary) # Get int8 embedding 5 6 # Convert the float32 embedding to BSON format 7 bson_int8 = generate_bson_vector(embedding, BinaryVectorDtype.INT8) 8 9 # Update the document with the BSON embedding 10 collection.update_one( 11 {"_id": doc["_id"]}, 12 {"$set": {"embedding": bson_int8}} 13 ) 14 updated_doc_count += 1 15 16 print(f"Updated {updated_doc_count} documents with BSON embeddings.")
1 for doc in documents: 2 # Generate embeddings based on the summary 3 summary = doc["summary"] 4 embedding = get_embedding(summary) # Get int1 embedding 5 6 # Convert the float32 embedding to BSON format 7 bson_int1 = generate_bson_vector(embedding, BinaryVectorDtype.PACKED_BIT) 8 9 # Update the document with the BSON embedding 10 collection.update_one( 11 {"_id": doc["_id"]}, 12 {"$set": {"embedding": bson_int1}} 13 ) 14 updated_doc_count += 1 15 16 print(f"Updated {updated_doc_count} documents with BSON embeddings.")
컬렉션에 Atlas Vector Search 인덱스를 생성합니다.
Atlas UI, Atlas CLI, Atlas 관리 API 및 MongoDB 드라이버를 사용하여 원하는 언어 Atlas Vector Search 인덱스를 만들 수 있습니다. 학습 내용은 벡터 검색을 위한 필드 인덱싱 방법을 참조하세요.
예시
컬렉션에 대한 인덱스 만들기
자리 표시자 | 유효한 값 |
---|---|
|
|
1 from pymongo.operations import SearchIndexModel 2 3 vector_search_index_definition = { 4 "fields":[ 5 { 6 "type": "vector", 7 "path": "embedding", 8 "similarity": "euclidean", 9 "numDimensions": 1024, 10 } 11 ] 12 } 13 14 search_index_model = SearchIndexModel(definition=vector_search_index_definition, name="<INDEX-NAME>", type="vectorSearch") 15 16 collection.create_search_index(model=search_index_model)
인덱스 작성에는 약 1분 정도가 소요됩니다. 인덱스가 작성되는 동안 인덱스는 초기 동기화 상태에 있습니다. 빌드가 완료되면 컬렉션의 데이터 쿼리를 시작할 수 있습니다.
Atlas Vector Search 쿼리를 실행하는 함수를 정의합니다.
Atlas Vector Search 쿼리를 실행하는 함수는 다음 작업을 수행해야 합니다.
쿼리 텍스트에 대한 임베딩을 생성합니다.
쿼리 텍스트를 BSON 벡터로 변환합니다.
Atlas Vector Search 쿼리에 대한 파이프라인을 정의합니다.
예시
Atlas Vector Search 쿼리를 실행하는 함수
자리 표시자 | 유효한 값 |
---|---|
|
|
| 검색 중에 사용할 가장 가까운 이웃의 수입니다. |
| 결과에서 반환할 문서 수입니다. |
1 def run_vector_search(query_text, collection, path): 2 query_embedding = get_embedding("query_text") 3 bson_query_vector = generate_bson_vector(query_embedding, BinaryVectorDtype.FLOAT32) 4 5 pipeline = [ 6 { 7 '$vectorSearch': { 8 'index': '<INDEX-NAME>', 9 'path': path, 10 'queryVector': bson_query_vector, 11 'numCandidates': <NUMBER-OF-CANDIDATES-TO-CONSIDER>, # for example, 20 12 'limit': <NUMBER-OF-DOCUMENTS-TO-RETURN> # for example, 5 13 } 14 }, 15 { 16 '$project': { 17 '_id': 0, 18 'name': 1, 19 'summary': 1, 20 'score': { '$meta': 'vectorSearchScore' } 21 } 22 } 23 ] 24 25 return collection.aggregate(pipeline)
1 def run_vector_search(query_text, collection, path): 2 query_embedding = get_embedding("query_text") 3 bson_query_vector = generate_bson_vector(query_embedding, BinaryVectorDtype.INT8) 4 5 pipeline = [ 6 { 7 '$vectorSearch': { 8 'index': '<INDEX-NAME>', 9 'path': path, 10 'queryVector': bson_query_vector, 11 'numCandidates': <NUMBER-OF-CANDIDATES-TO-CONSIDER>, # for example, 20 12 'limit': <NUMBER-OF-DOCUMENTS-TO-RETURN> # for example, 5 13 } 14 }, 15 { 16 '$project': { 17 '_id': 0, 18 'name': 1, 19 'summary': 1, 20 'score': { '$meta': 'vectorSearchScore' } 21 } 22 } 23 ] 24 25 return collection.aggregate(pipeline)
1 def run_vector_search(query_text, collection, path): 2 query_embedding = get_embedding("query_text") 3 bson_query_vector = generate_bson_vector(query_embedding, BinaryVectorDtype.PACKED_BIT) 4 5 pipeline = [ 6 { 7 '$vectorSearch': { 8 'index': '<INDEX-NAME>', 9 'path': path, 10 'queryVector': bson_query_vector, 11 'numCandidates': <NUMBER-OF-CANDIDATES-TO-CONSIDER>, # for example, 20 12 'limit': <NUMBER-OF-DOCUMENTS-TO-RETURN> # for example, 5 13 } 14 }, 15 { 16 '$project': { 17 '_id': 0, 18 'name': 1, 19 'summary': 1, 20 'score': { '$meta': 'vectorSearchScore' } 21 } 22 } 23 ] 24 25 return collection.aggregate(pipeline)
Atlas Vector Search 쿼리를 실행합니다.
Atlas Vector Search 쿼리를 프로그래밍 방식으로 실행할 수 있습니다. 자세한 내용은 벡터 검색 쿼리 실행을 참조하세요.
예시
샘플 Atlas Vector Search 쿼리 실행
1 from pprint import pprint 2 3 query_text = "ocean view" 4 query_results = run_vector_search(query_text, collection, "embedding") 5 6 print("results from your embeddings") 7 pprint(list(query_results))
results from your embeddings [{'name': 'Your spot in Copacabana', 'score': 0.5468248128890991, 'summary': 'Having a large airy living room. The apartment is well divided. ' 'Fully furnished and cozy. The building has a 24h doorman and ' 'camera services in the corridors. It is very well located, close ' 'to the beach, restaurants, pubs and several shops and ' 'supermarkets. And it offers a good mobility being close to the ' 'subway.'}, {'name': 'Twin Bed room+MTR Mongkok shopping&My', 'score': 0.527062714099884, 'summary': 'Dining shopping conveniently located Mongkok subway E1, airport ' 'shuttle bus stops A21. Three live two beds, separate WC, 24-hour ' 'hot water. Free WIFI.'}, {'name': 'Quarto inteiro na Tijuca', 'score': 0.5222363471984863, 'summary': 'O quarto disponível tem uma cama de solteiro, sofá e computador ' 'tipo desktop para acomodação.'}, {'name': 'Makaha Valley Paradise with OceanView', 'score': 0.5175154805183411, 'summary': 'A beautiful and comfortable 1 Bedroom Air Conditioned Condo in ' 'Makaha Valley - stunning Ocean & Mountain views All the ' 'amenities of home, suited for longer stays. Full kitchen & large ' "bathroom. Several gas BBQ's for all guests to use & a large " 'heated pool surrounded by reclining chairs to sunbathe. The ' 'Ocean you see in the pictures is not even a mile away, known as ' 'the famous Makaha Surfing Beach. Golfing, hiking,snorkeling ' 'paddle boarding, surfing are all just minutes from the front ' 'door.'}, {'name': 'Cozy double bed room 東涌鄉村雅緻雙人房', 'score': 0.5149975419044495, 'summary': 'A comfortable double bed room at G/F. Independent entrance. High ' 'privacy. The room size is around 100 sq.ft. with a 48"x72" ' 'double bed. The village house is close to the Hong Kong Airport, ' 'AsiaWorld-Expo, HongKong-Zhuhai-Macau Bridge, Disneyland, ' 'Citygate outlets, 360 Cable car, shopping centre, main tourist ' 'attractions......'}]
3단계의 sample_airbnb.listingsAndReviews
네임스페이스 에서 50
개의 문서를 무작위로 선택했기 때문에 결과가 다를 수 있습니다. 선택한 문서와 생성된 임베딩은 사용자 환경에 따라 다를 수 있습니다.
Cohere embed-english-v3.0
임베딩 모델을 사용하여 샘플 데이터에 대한 이 절차의 고급 데모를 보려면 이 노트북을 참조하세요.
쿼리 결과 평가
ANN 검색 결과가 양자화된 벡터에 대해 ENN 검색 결과와 얼마나 일치하는지 평가하여 Atlas Vector Search 쿼리 의 정확성을 측정할 수 있습니다. 즉, 동일한 쿼리 기준에 대한 ANN 검색 결과를 ENN 검색 결과와 비교하고 ANN 검색 결과에 ENN 검색 결과에 가장 가까운 이웃이 포함되는 빈도를 측정할 수 검색.
쿼리 결과를 평가하는 방법에 대한 데모는 쿼리 결과의 정확성을 측정하는 방법을 참조하세요.