在Atlas中设置数据以进行高效向量存储和摄取
您可以将嵌入转换为 BSON BinData vector
子类型float32
或vector
子类型int8
向量。我们建议在以下使用案例中使用BSON binData
vector
子类型:
您需要对嵌入模型中的量化向量进行索引。
您有大量浮点向量,但希望减少
mongod
中的存储和WiredTiger占用空间(例如磁盘和内存使用量)。
与元素数组相比, BinData vector
格式在集群中所需的磁盘空间大约减少三倍。它允许您使用备用类型(例如int8
和int1
向量)对向量进行索引,从而减少为集合构建Atlas Vector Search索引所需的内存。
如果您还没有binData
向量,则可以在将数据写入集合之前使用任何支持的驾驶员将嵌入转换为这种格式。本页将引导您完成将嵌入转换为BinData vector
子类型的步骤。
支持的驱动程序
BSON BinData vector
PyMongo驱动程序v 4.10或更高版本支持子类型float32
和int8
向量转换。
先决条件
要将嵌入转换为BSON BinData vector
子类型,您需要满足以下条件:
运行MongoDB 6.0.11 、 7.0.2或更高版本的Atlas 集群。
确保您的IP解决包含在Atlas项目的访问权限列表中。
运行交互式Python笔记本(例如 Colab)的环境。
访问支持字节向量输出的嵌入模型。
以下嵌入模型提供程序支持
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 v 4.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 集群。
您可以从Atlas用户界面加载数据,也可以以编程方式加载数据。要学习;了解如何从Atlas用户界面加载数据,请参阅插入数据。以下步骤和相关示例演示了如何使用PyMongo驾驶员以编程方式加载数据。
连接到您的 Atlas 集群。
例子
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 集群。
例子
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 用户界面、 Atlas CLI、 Atlas Administration 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
嵌入模型在示例数据上执行此过程的高级演示,请参阅此 Notebook。