Skip to main content

MongoDB Atlas

MongoDB Atlas 是一个完全托管的云数据库,可在 AWS、Azure 和 GCP 上使用。它现在支持在 MongoDB 文档数据上进行原生向量搜索。

本笔记本展示了如何使用 MongoDB Atlas Vector Search 将嵌入向量存储在 MongoDB 文档中,创建向量搜索索引,并使用近似最近邻算法进行 KNN 搜索。

它使用了 MongoDB Atlas Search 中可用的 knnBeta 运算符。此功能处于公共预览阶段,可供评估目的使用,以验证功能,并从公共预览用户那里收集反馈。不建议在生产环境中使用,因为我们可能会引入破坏性更改。

要使用 MongoDB Atlas,您必须首先部署一个集群。我们有一个永久免费的集群层级可供使用。 要开始,请访问 Atlas 这里:快速入门

pip install pymongo
import os
import getpass

MONGODB_ATLAS_CLUSTER_URI = getpass.getpass("MongoDB Atlas 集群 URI:")

我们想要使用 OpenAIEmbeddings,所以我们需要设置我们的 OpenAI API 密钥。

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API 密钥:")

现在,让我们在您的集群上创建一个向量搜索索引。在下面的示例中,embedding 是包含嵌入向量的字段的名称。请参阅文档以获取有关如何定义 Atlas Vector Search 索引的更多详细信息。 您可以将索引命名为 langchain_demo,并在命名空间 lanchain_db.langchain_col 上创建索引。最后,在 MongoDB Atlas 的 JSON 编辑器中编写以下定义:

{
"mappings": {
"dynamic": true,
"fields": {
"embedding": {
"dimensions": 1536,
"similarity": "cosine",
"type": "knnVector"
}
}
}
}
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import MongoDBAtlasVectorSearch
from langchain.document_loaders import TextLoader

loader = TextLoader("../../../state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings()
from pymongo import MongoClient

# 初始化 MongoDB Python 客户端
client = MongoClient(MONGODB_ATLAS_CLUSTER_URI)

db_name = "langchain_db"
collection_name = "langchain_col"
collection = client[db_name][collection_name]
index_name = "langchain_demo"

# 将文档插入 MongoDB Atlas,并附带它们的嵌入向量
docsearch = MongoDBAtlasVectorSearch.from_documents(
docs, embeddings, collection=collection, index_name=index_name
)

# 在查询的嵌入向量和文档的嵌入向量之间执行相似性搜索
query = "What did the president say about Ketanji Brown Jackson"
docs = docsearch.similarity_search(query)
print(docs[0].page_content)

您还可以直接实例化向量存储并执行查询,如下所示:

# 初始化向量存储
vectorstore = MongoDBAtlasVectorSearch(
collection, OpenAIEmbeddings(), index_name=index_name
)

# 在查询和摄取的文档之间执行相似性搜索
query = "What did the president say about Ketanji Brown Jackson"
docs = vectorstore.similarity_search(query)

print(docs[0].page_content)