Docs Menu
Docs Home
/
MongoDB Atlas
/

양자화된 벡터를 수집하는 방법

임베딩을 BSON BinData vector 하위 유형 float32 또는 vector 하위 유형 int8 벡터로 변환할 수 있습니다.

다음 사용 사례에는 BSON binData vector 하위 유형을 권장합니다.

  • 임베딩 모델에서 양자화된 벡터 출력을 인덱싱해야 합니다.

  • 많은 수의 float 벡터가 있지만, mongod에서 스토리지 및 WiredTiger 설치 공간(예: 디스크 및 메모리 사용량)을 줄이려고 합니다.

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

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

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

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

  • MongoDB 버전 6.0.11, 7.0.2 또는 그 이상의 버전을 실행하는 Atlas 클러스터.

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

  • Colab과 같은 대화형 Python 노트북을 실행하기 위한 환경입니다.

  • 바이트 벡터 출력을 지원하는 임베딩 모델 액세스.

    다음 임베딩 모델 제공자는 int8 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 노트북을 만든 후 노트북에서 다음 단계를 수행합니다. 예시 를 사용해 보려면 자리 표시자를 유효한 값으로 바꾸세요.

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를 사용하여 샘플 데이터에서 임베딩 생성하기

자리 표시자
유효한 값
<COHERE-API-KEY>
코히어용 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"]
).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 벡터 임베딩이 있는 경우 이 단계를 건너뛰세요.

예시

샘플 데이터로 문서 만들기

자리 표시자
유효한 값
<FIELD-NAME-FOR-INT8-TYPE>
int8 값이 있는 필드 의 이름입니다.
<FIELD-NAME-FOR-FLOAT32-TYPE>
float32 값이 있는 필드 의 이름입니다.
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에 연결합니다.

    자리 표시자
    유효한 값
    <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")
  2. 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)
7

Atlas UI, Atlas CLI, Atlas 관리 API, MongoDB 드라이버를 사용하여 Atlas Vector Search 인덱스를 생성할 수 있습니다. 자세한 내용은 벡터 검색용 필드 인덱싱 방법을 참조하세요.

예시

샘플 컬렉션에 대한 인덱스 만들기

자리 표시자
유효한 값
<FIELD-NAME-FOR-INT8-TYPE>
int8 값이 있는 필드 의 이름입니다.
<FIELD-NAME-FOR-FLOAT32-TYPE>
float32 값이 있는 필드 의 이름입니다.
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,
}
]
}
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 쿼리에 대한 파이프라인을 정의합니다.

예시

자리 표시자
유효한 값
<FIELD-NAME-FOR-FLOAT32-TYPE>
float32 값이 있는 필드 의 이름입니다.
<INDEX-NAME>
vector 유형 인덱스 의 이름입니다.
<NUMBER-OF-CANDIDATES-TO-CONSIDER>
검색 중에 사용할 가장 가까운 이웃의 수입니다.
<NUMBER-OF-DOCUMENTS-TO-RETURN>
결과에서 반환할 문서 수입니다.
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}]
1

다음 명령을 실행하여 PyMongo 드라이버 를 설치합니다. 필요한 경우 임베딩 모델 제공자 로부터 라이브러리를 설치할 수도 있습니다. 이 작업을 완료하는 데 몇 분 정도 걸릴 수 있습니다.

pip install pymongo

PyMongo v4.10 이상 버전의 드라이버를 설치해야 합니다.

예시

PyMongo 및 Cohere 설치

pip --quiet install pymongo cohere
2

임베딩 모델을 사용하여 다음을 수행하는 함수를 정의해야 합니다.

  • 기존 데이터에 임베딩이 없는 경우 기존 데이터에서 임베딩을 생성합니다.

  • 임베딩을 BSON 벡터로 변환합니다.

예시

임베딩을 생성하고 변환하는 함수

자리 표시자
유효한 값
<COHERE-API-KEY>
코히어용 API 키입니다.
1import os
2import pymongo
3import cohere
4from bson.binary import Binary, BinaryVectorDtype
5
6# Specify your OpenAI API key and embedding model
7os.environ["COHERE_API_KEY"] = "<COHERE-API-KEY>"
8cohere_client = cohere.Client(os.environ["COHERE_API_KEY"])
9
10# Function to generate embeddings using Cohere
11def get_embedding(text):
12 response = cohere_client.embed(
13 texts=[text],
14 model='embed-english-v3.0',
15 input_type='search_document'
16 )
17 embedding = response.embeddings[0]
18 return embedding
19
20# Function to convert embeddings to BSON-compatible format
21def generate_bson_vector(vector, vector_dtype):
22 return Binary.from_vector(vector, vector_dtype)
3

다음을 제공해야 합니다.

  • 임베딩을 생성하려는 데이터베이스 및 컬렉션 이 포함된 Atlas cluster 에 연결하기 위한 연결 문자열입니다.

  • 임베딩을 생성하려는 컬렉션 이 포함된 데이터베이스 의 이름입니다.

  • 임베딩을 생성하려는 컬렉션 의 이름입니다.

예시

데이터 액세스를 위해 Atlas 클러스터에 연결

자리 표시자
유효한 값
<ATLAS-CONNECTION-STRING>
Atlas 연결 string. 자세한 내용은 드라이버를 통한 연결을 참조하세요.
1# Connect to your Atlas cluster
2mongo_client = pymongo.MongoClient("<ATLAS-CONNECTION-STRING>")
3db = mongo_client["sample_airbnb"]
4collection = db["listingsAndReviews"]
5
6# Filter to exclude null or empty summary fields
7filter = { "summary": {"$nin": [None, ""]} }
8
9# Get a subset of documents in the collection
10documents = collection.find(filter).limit(50)
11
12# Initialize the count of updated documents
13updated_doc_count = 0
4
  1. 데이터에 아직 임베딩이 없는 경우 임베딩 모델을 사용하여 데이터에서 임베딩을 생성합니다. 데이터에서 임베딩을 생성하는 방법에 학습 보려면 벡터 임베딩을 만드는 방법을 참조하세요.

  2. 다음 예시 의 줄에 표시된 대로 임베딩을 BSON 벡터로 변환합니다. 7

  3. Atlas cluster 의 컬렉션 에 임베딩을 업로드합니다.

이 작업을 완료하는 데 몇 분 정도 걸릴 수 있습니다.

예시

컬렉션에 임베딩 생성, 변환 및 로드

1for 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
16print(f"Updated {updated_doc_count} documents with BSON embeddings.")
5

Atlas UI, Atlas CLI, Atlas 관리 API 및 MongoDB 드라이버를 사용하여 원하는 언어 Atlas Vector Search 인덱스를 만들 수 있습니다. 학습 내용은 벡터 검색을 위한 필드 인덱싱 방법을 참조하세요.

예시

컬렉션에 대한 인덱스 만들기

자리 표시자
유효한 값
<INDEX-NAME>
vector 유형 인덱스 의 이름입니다.
1from pymongo.operations import SearchIndexModel
2
3vector_search_index_definition = {
4 "fields":[
5 {
6 "type": "vector",
7 "path": "embedding",
8 "similarity": "dotProduct",
9 "numDimensions": 1024,
10 }
11 ]
12}
13
14search_index_model = SearchIndexModel(definition=vector_search_index_definition, name="<INDEX-NAME>", type="vectorSearch")
15
16collection.create_search_index(model=search_index_model)

인덱스 작성에는 약 1분 정도가 소요됩니다. 인덱스가 작성되는 동안 인덱스는 초기 동기화 상태에 있습니다. 빌드가 완료되면 컬렉션의 데이터 쿼리를 시작할 수 있습니다.

6

Atlas Vector Search 쿼리를 실행하는 함수는 다음 작업을 수행해야 합니다.

  • 쿼리 텍스트에 대한 임베딩을 생성합니다.

  • 쿼리 텍스트를 BSON 벡터로 변환합니다.

  • Atlas Vector Search 쿼리에 대한 파이프라인을 정의합니다.

예시

Atlas Vector Search 쿼리를 실행하는 함수

자리 표시자
유효한 값
<INDEX-NAME>
vector 유형 인덱스 의 이름입니다.
<NUMBER-OF-CANDIDATES-TO-CONSIDER>
검색 중에 사용할 가장 가까운 이웃의 수입니다.
<NUMBER-OF-DOCUMENTS-TO-RETURN>
결과에서 반환할 문서 수입니다.
1def 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)
7

Atlas Vector Search 쿼리를 프로그래밍 방식으로 실행할 수 있습니다. 자세한 내용은 벡터 검색 쿼리 실행을 참조하세요.

예시

샘플 Atlas Vector Search 쿼리 실행

1from pprint import pprint
2
3query_text = "ocean view"
4float32_results = run_vector_search(query_text, collection, "embedding")
5
6print("results from float32 embeddings")
7pprint(list(float32_results))
results from float32 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 임베딩 모델을 사용하여 샘플 데이터에 대한 이 절차의 고급 데모를 보려면 이 노트북을 참조하세요.

돌아가기

벡터 임베딩을 만드는 방법