随着大数据的迅猛发展,如何高效检索和分析海量非结构化数据成为了一大挑战。Amazon DocumentDB作为一种与MongoDB兼容的文档数据库,集成了强大的向量搜索功能,可以让我们轻松地对海量文档进行相似性检索。本文将通过一个完整的示例,带你深入了解如何利用Amazon DocumentDB的向量搜索功能。
技术背景介绍
Amazon DocumentDB(与MongoDB兼容)让开发者可以利用他们已经熟悉的MongoDB命令进行数据库操作,同时支持现代的向量搜索,使得复杂的文本检索和分析更为便利。通过使用近似最近邻(ANN)算法,如“余弦距离”、“欧氏距离”和“点积”,DocumentDB可以高效进行文本相似性搜索。
核心原理解析
向量搜索的基本原理是将文本数据转换为向量形式,通过计算查询向量与文档向量的相似性来排序搜索结果。Amazon DocumentDB 默认创建的HNSW索引(Hierarchical Navigable Small World)保证了高效的向量搜索性能。
代码实现演示
以下代码演示了如何使用Amazon DocumentDB进行向量搜索。我们将从文本文件加载文档,创建索引,并进行相似性查询。
import os
import getpass
from pymongo import MongoClient
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
# 设置DocumentDB连接字符串
CONNECTION_STRING = getpass.getpass("DocumentDB Cluster URI:")
# 设置OpenAI API环境变量
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"
# 加载文本文件
SOURCE_FILE_NAME = "state_of_the_union.txt"
loader = TextLoader(SOURCE_FILE_NAME)
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
# 初始化OpenAIEmbedding
openai_embeddings = OpenAIEmbeddings(
deployment=os.getenv("OPENAI_EMBEDDINGS_DEPLOYMENT"),
model=os.getenv("OPENAI_EMBEDDINGS_MODEL_NAME")
)
# 创建DocumentDB客户端
client = MongoClient(CONNECTION_STRING)
collection = client["izzy_test_db"]["izzy_test_collection"]
# 创建向量存储
vectorstore = DocumentDBVectorSearch.from_documents(
documents=docs,
embedding=openai_embeddings,
collection=collection,
index_name="izzy-test-index"
)
# 配置索引
vectorstore.create_index(dimensions=1536, similarity_algorithm=DocumentDBSimilarityType.COS)
# 执行相似性搜索
query = "What did the President say about Ketanji Brown Jackson"
docs = vectorstore.similarity_search(query)
print(docs[0].page_content)
应用场景分析
- 大规模文本分析:适用于需要分析大量文本文档的场景,比如法律文本、医疗记录等。
- 推荐系统:利用用户行为日志转化为向量进行相似性计算,帮助构建精确的推荐系统。
- 智能问答系统:结合向量搜索与自然语言处理模型,可以创建智能问答系统。
实践建议
- 数据清洗:在将数据加载到DocumentDB之前,确保数据已经过清洗来减少噪声。
- 性能优化:根据数据量和查询频率调整HNSW索引的参数,以达到性能和精度的平衡。
- 安全性考虑:确保在生产环境中使用安全的API密钥和连接字符串。
如果遇到问题欢迎在评论区交流。
—END—