양자화된 벡터를 수집하는 방법
임베딩을 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
하위 유형 float32
및 int8
벡터 변환은 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 노트북을 만든 후 노트북에서 다음 단계를 수행합니다. 예시 를 사용해 보려면 자리 표시자를 유효한 값으로 바꾸세요.
필요한 라이브러리를 설치합니다.
다음 명령을 실행하여 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를 사용하여 샘플 데이터에서 임베딩 생성하기
자리 표시자 | 유효한 값 |
---|---|
<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
임베딩에서 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))
<span tabindex=\"\" class=\" \">BSON 벡터 임베딩을 사용하여 문서를 만드세요.<a class=\" \" href=\" \" title=\" \"><svg xmlns=\" \" width=\" \" height=\" \" fill=\" \" viewbox=\" \" class=\" \" role=\" \" aria-label=\" \"><path fill=\" \" d=\" \"> <path fill=\" \" d=\" \">
컬렉션의 문서 내에 이미 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)
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 인덱스를 생성할 수 있습니다. 자세한 내용은 벡터 검색용 필드 인덱싱 방법을 참조하세요.
예시
샘플 컬렉션에 대한 인덱스 만들기
자리 표시자 | 유효한 값 |
---|---|
<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)
Atlas Vector Search 쿼리를 실행하는 함수를 정의합니다.
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)
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}]
필요한 라이브러리를 설치합니다.
다음 명령을 실행하여 PyMongo 드라이버 를 설치합니다. 필요한 경우 임베딩 모델 제공자 로부터 라이브러리를 설치할 수도 있습니다. 이 작업을 완료하는 데 몇 분 정도 걸릴 수 있습니다.
pip install pymongo
PyMongo v4.10 이상 버전의 드라이버를 설치해야 합니다.
예시
PyMongo 및 Cohere 설치
pip --quiet install pymongo cohere
벡터 임베딩을 생성하고 임베딩을 BSON 호환 형식으로 변환하는 함수를 정의합니다.
임베딩 모델을 사용하여 다음을 수행하는 함수를 정의해야 합니다.
기존 데이터에 임베딩이 없는 경우 기존 데이터에서 임베딩을 생성합니다.
임베딩을 BSON 벡터로 변환합니다.
예시
임베딩을 생성하고 변환하는 함수
자리 표시자 | 유효한 값 |
---|---|
<COHERE-API-KEY> | 코히어용 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 ) 17 embedding = response.embeddings[0] 18 return embedding 19 20 # Function to convert embeddings to BSON-compatible format 21 def generate_bson_vector(vector, vector_dtype): 22 return Binary.from_vector(vector, vector_dtype)
Atlas cluster 에 연결하고 기존 데이터를 조회 합니다.
다음을 제공해야 합니다.
임베딩을 생성하려는 데이터베이스 및 컬렉션 이 포함된 Atlas cluster 에 연결하기 위한 연결 문자열입니다.
임베딩을 생성하려는 컬렉션 이 포함된 데이터베이스 의 이름입니다.
임베딩을 생성하려는 컬렉션 의 이름입니다.
예시
데이터 액세스를 위해 Atlas 클러스터에 연결
자리 표시자 | 유효한 값 |
---|---|
<ATLAS-CONNECTION-STRING> | 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.")
컬렉션에 Atlas Vector Search 인덱스를 생성합니다.
Atlas UI, Atlas CLI, Atlas 관리 API 및 MongoDB 드라이버를 사용하여 원하는 언어 Atlas Vector Search 인덱스를 만들 수 있습니다. 학습 내용은 벡터 검색을 위한 필드 인덱싱 방법을 참조하세요.
예시
컬렉션에 대한 인덱스 만들기
자리 표시자 | 유효한 값 |
---|---|
<INDEX-NAME> | vector 유형 인덱스 의 이름입니다. |
1 from pymongo.operations import SearchIndexModel 2 3 vector_search_index_definition = { 4 "fields":[ 5 { 6 "type": "vector", 7 "path": "embedding", 8 "similarity": "dotProduct", 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 쿼리를 실행하는 함수
자리 표시자 | 유효한 값 |
---|---|
<INDEX-NAME> | vector 유형 인덱스 의 이름입니다. |
<NUMBER-OF-CANDIDATES-TO-CONSIDER> | 검색 중에 사용할 가장 가까운 이웃의 수입니다. |
<NUMBER-OF-DOCUMENTS-TO-RETURN> | 결과에서 반환할 문서 수입니다. |
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)
Atlas Vector Search 쿼리를 실행합니다.
Atlas Vector Search 쿼리를 프로그래밍 방식으로 실행할 수 있습니다. 자세한 내용은 벡터 검색 쿼리 실행을 참조하세요.
예시
샘플 Atlas Vector Search 쿼리 실행
1 from pprint import pprint 2 3 query_text = "ocean view" 4 float32_results = run_vector_search(query_text, collection, "embedding") 5 6 print("results from float32 embeddings") 7 pprint(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
임베딩 모델을 사용하여 샘플 데이터에 대한 이 절차의 고급 데모를 보려면 이 노트북을 참조하세요.