Atlas 에서 효율적인 벡터 저장 및 수집을 위한 데이터 설정
임베딩을 BSON BinData vector
하위 유형 float32
또는 vector
하위 유형 int8
벡터로 변환할 수 있습니다. 다음 사용 사례에는 BSON binData
vector
하위 유형을 권장합니다.
임베딩 모델에서 양자화된 벡터를 인덱스 해야 합니다.
부동 소수점 벡터가 많으나
mongod
에서 저장 및 WiredTiger 풋프린트(예: 디스크 및 메모리 사용량)를 줄이고 싶습니다.
BinData vector
형식은 요소 배열에 비해 클러스터 의 디스크 공간이 약 3배 적습니다. int8
및 int1
벡터와 같은 대체 유형으로 벡터를 인덱스 하여 컬렉션 에 대한 Atlas Vector Search 인덱스 를 빌드 하는 데 필요한 메모리를 줄일 수 있습니다.
아직 binData
벡터가 없는 경우 컬렉션 에 데이터를 쓰기 전에 지원되는 운전자 를 사용하여 임베딩을 이 형식으로 변환할 수 있습니다. 이 페이지에서는 임베딩을 BinData vector
하위 유형으로 변환하는 단계를 안내합니다.
지원되는 드라이버
BSON BinData vector
하위 유형 float32
및 int8
벡터 변환은 PyMongo 드라이버 v4.10 이상에서 지원됩니다.
전제 조건
임베딩을 BSON BinData vector
하위 유형으로 변환하려면 다음이 필요합니다.
MongoDB 버전 6.0.11, 7.0.2 이상을 실행 하는 Atlas cluster .
사용자의 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
벡터를 생성할 수 있습니다.
절차
확장자가 인 파일 을 저장하여 대화형 Python 노트북을 만든 .ipynb
후 노트북에서 다음 단계를 수행합니다. 이 절차의 예제에서는 샘플 데이터를 사용하며 Cohere의 embed-english-v3.0
모델. 예시 를 시도하려면 중괄호({ }
)에 표시된 값을 유효한 값으로 바꾸세요.
필요한 라이브러리를 설치합니다.
다음 명령을 실행하여 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를 사용하여 샘플 데이터에서 임베딩 생성
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"] ).embeddings float32_embeddings = generated_embeddings.float int8_embeddings = generated_embeddings.int8
임베딩에서 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 and int8 embeddings bson_float32_embeddings = [] bson_int8_embeddings = [] for i, (f32_emb, int8_emb) in enumerate(zip(float32_embeddings, int8_embeddings)): bson_float32_embeddings.append(generate_bson_vector(f32_emb, BinaryVectorDtype.FLOAT32)) bson_int8_embeddings.append(generate_bson_vector(int8_emb, BinaryVectorDtype.INT8))
BSON 벡터 임베딩을 사용하여 문서를만듭니다.
컬렉션 의 문서 내에 이미 BSON 벡터 임베딩이 있는 경우 이 단계를 건너뛰세요.
예제
샘플 데이터에서 문서 만들기
def create_docs_with_bson_vector_embeddings(bson_float32_embeddings, bson_int8_embeddings, data): docs = [] for i, (bson_f32_emb, bson_int8_emb, text) in enumerate(zip(bson_float32_embeddings, bson_int8_embeddings, data)): doc = { "_id":i, "data": text, "{FIELD-NAME-FOR-INT8-TYPE}":bson_int8_emb, "{FIELD-NAME-FOR-FLOAT32-TYPE}":bson_f32_emb, } docs.append(doc) return docs documents = create_docs_with_bson_vector_embeddings(bson_float32_embeddings, bson_int8_embeddings, data)
Atlas cluster 에 데이터를 로드합니다.
Atlas UI 에서 프로그래밍 방식으로 데이터를 로드할 수 있습니다. Atlas UI 에서 데이터를 로드하는 방법을 학습 보려면 데이터 삽입 을 참조하세요. 다음 단계와 관련 예제는 PyMongo 운전자 를 사용하여 프로그래밍 방식으로 데이터를 로드하는 방법을 보여줍니다.
Atlas cluster에 연결합니다.
예제
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 cluster 에 데이터를 로드합니다.
예제
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": "euclidean", "numDimensions": 1024, }, { "type": "vector", "path": "{FIELD-NAME-FOR-INT8-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"] ).embeddings if path == "{FIELD-NAME-FOR-FLOAT32-TYPE}": query_vector = query_text_embeddings.float[0] vector_dtype = BinaryVectorDtype.FLOAT32 else: query_vector = query_text_embeddings.int8[0] vector_dtype = BinaryVectorDtype.INT8 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}") print("results from float32 embeddings") pprint(list(float32_results)) print("--------------------------------------------------------------------------") print("results from int8 embeddings") pprint(list(int8_results))
results from float32 embeddings [{'data': 'Mount Everest is the highest peak on Earth at 8,848m.', 'score': 0.4222325384616852}, {'data': 'The Great Wall of China is visible from space.', 'score': 0.4112812876701355}, {'data': 'The Mona Lisa was painted by Leonardo da Vinci.', 'score': 0.3871753513813019}, {'data': 'The Eiffel Tower was completed in Paris in 1889.', 'score': 0.38428616523742676}, {'data': 'Shakespeare wrote 37 plays and 154 sonnets during his lifetime.', 'score': 0.37546128034591675}] -------------------------------------------------------------------------- results from int8 embeddings [{'data': 'Mount Everest is the highest peak on Earth at 8,848m.', 'score': 4.619598996669083e-07}, {'data': 'The Great Wall of China is visible from space.', 'score': 4.5106872903488693e-07}, {'data': 'The Mona Lisa was painted by Leonardo da Vinci.', 'score': 4.0036800896814384e-07}, {'data': 'The Eiffel Tower was completed in Paris in 1889.', 'score': 3.9345573554783186e-07}, {'data': 'Shakespeare wrote 37 plays and 154 sonnets during his lifetime.', 'score': 3.797164538354991e-07}]
Cohere의 임베딩 모델을 사용하는 샘플 데이터에 대한 이 절차의 고급 embed-english-v3.0
데모는 이 노트를 참조하세요.