Docs Menu
Docs Home
/
MongoDB Atlas
/

Atlas 에서 효율적인 벡터 저장 및 수집을 위한 데이터 설정

임베딩을 BSON BinData vector 하위 유형 float32 또는 vector 하위 유형 int8 벡터로 변환할 수 있습니다. 다음 사용 사례에는 BSON binData vector 하위 유형을 권장합니다.

  • 임베딩 모델에서 양자화된 벡터를 인덱스 해야 합니다.

  • 부동 소수점 벡터가 많으나 mongod 에서 저장 및 WiredTiger 풋프린트(예: 디스크 및 메모리 사용량)를 줄이고 싶습니다.

BinData vector 형식은 요소 배열에 비해 클러스터 의 디스크 공간이 약 3배 적습니다. int8int1 벡터와 같은 대체 유형으로 벡터를 인덱스 하여 컬렉션 에 대한 Atlas Vector Search 인덱스 를 빌드 하는 데 필요한 메모리를 줄일 수 있습니다.

아직 binData 벡터가 없는 경우 컬렉션 에 데이터를 쓰기 전에 지원되는 운전자 를 사용하여 임베딩을 이 형식으로 변환할 수 있습니다. 이 페이지에서는 임베딩을 BinData vector 하위 유형으로 변환하는 단계를 안내합니다.

BSON BinData vector 하위 유형 float32int8 벡터 변환은 PyMongo 드라이버 v4.10 이상에서 지원됩니다.

임베딩을 BSON BinData vector 하위 유형으로 변환하려면 다음이 필요합니다.

  • MongoDB 버전 6.0.11, 7.0.2 이상을 실행 하는 Atlas cluster .

    사용자의 IP 주소 가 Atlas 프로젝트의 액세스 목록에 포함되어 있는지 확인하세요.

  • Colab 과같은 대화형 Python 노트북을 실행 수 있는 환경입니다.

  • 바이트 벡터 출력을 지원하는 임베딩 모델에 액세스할 수 있습니다.

    다음 임베딩 모델 제공자는 int8int1 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 모델. 예시 를 시도하려면 중괄호({ })에 표시된 값을 유효한 값으로 바꾸세요.

1

다음 명령을 실행하여 PyMongo 드라이버 를 설치합니다.

pip install pymongo

PyMongo v4.10 이상의 운전자 를 설치해야 합니다.

예제

PyMongo 및 Cohere 설치

pip --quiet install pymongo cohere
2

예제

가져올 샘플 데이터

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.",
]
3

이 단계는 데이터에서 임베딩을 아직 생성하지 않은 경우에 필요합니다. 이미 임베딩을 생성한 경우 이 단계를 건너뛰세요. 데이터에서 임베딩을 생성하는 방법에 학습 보려면 벡터 임베딩을 만드는 방법을 참조하세요.

예제

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
4

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))
5

컬렉션 의 문서 내에 이미 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)
6

Atlas UI 에서 프로그래밍 방식으로 데이터를 로드할 수 있습니다. Atlas UI 에서 데이터를 로드하는 방법을 학습 보려면 데이터 삽입 을 참조하세요. 다음 단계와 관련 예제는 PyMongo 운전자 를 사용하여 프로그래밍 방식으로 데이터를 로드하는 방법을 보여줍니다.

  1. 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")
  2. Atlas cluster 에 데이터를 로드합니다.

    예제

    client = pymongo.MongoClient(MONGO_URI)
    db = client["{DB-NAME}"]
    db.create_collection("{COLLECTION-NAME}")
    col = db["{COLLECTION-NAME}"]
    col.insert_many(documents)
7

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)
8

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)
9

프로그래밍 방식으로 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 데모는 이 노트를 참조하세요.

돌아가기

벡터 임베딩을 만드는 방법