Docs 菜单
Docs 主页
/
MongoDB Atlas
/

在Atlas中设置数据以进行高效向量存储和摄取

您可以将嵌入转换为 BSON BinData vector子类型float32vector子类型int8向量。我们建议在以下使用案例中使用BSON binData vector子类型:

  • 您需要对嵌入模型中的量化向量进行索引。

  • 您有大量浮点向量,但希望减少mongod中的存储和WiredTiger占用空间(例如磁盘和内存使用量)。

与元素数组相比, BinData vector格式在集群中所需的磁盘空间大约减少三倍。它允许您使用备用类型(例如int8int1向量)对向量进行索引,从而减少为集合构建Atlas Vector Search索引所需的内存。

如果您还没有binData向量,则可以在将数据写入集合之前使用任何支持的驾驶员将嵌入转换为这种格式。本页将引导您完成将嵌入转换为BinData vector子类型的步骤。

BSON BinData vector PyMongo驱动程序v 4.10或更高版本支持子类型float32int8向量转换。

要将嵌入转换为BSON BinData vector子类型,您需要满足以下条件:

  • 运行MongoDB 6.0.11 、 7.0.2或更高版本的Atlas 集群。

    确保您的IP解决包含在Atlas项目的访问权限列表中。

  • 运行交互式Python笔记本(例如 Colab)的环境。

  • 访问支持字节向量输出的嵌入模型。

    以下嵌入模型提供程序支持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 v 4.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用户界面加载数据,也可以以编程方式加载数据。要学习;了解如何从Atlas用户界面加载数据,请参阅插入数据。以下步骤和相关示例演示了如何使用PyMongo驾驶员以编程方式加载数据。

  1. 连接到您的 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")
  2. 将数据加载到Atlas 集群。

    例子

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

您可以使用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)
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 嵌入模型在示例数据上执行此过程的高级演示,请参阅此 Notebook。

后退

如何创建向量嵌入