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)