
本文旨在解决在langchain中使用amazon documentdb作为向量存储时遇到的常见问题。尽管documentdb与mongodb兼容,但其向量搜索api有所不同,导致直接使用mongodb atlas集成会失败。文章将详细介绍langchain针对documentdb提供的专用集成方案,并提供示例代码,指导用户正确配置和使用documentdb作为高效的向量存储。
随着大型语言模型(LLMs)和生成式AI应用的兴起,向量数据库已成为存储和检索非结构化数据(如文本嵌入)的关键组件。Langchain作为一个强大的LLM应用开发框架,提供了与多种向量存储的集成能力。Amazon DocumentDB,作为一款与MongoDB兼容的文档数据库服务,近期也推出了向量搜索功能,这为开发者提供了更多选择。然而,在使用Langchain集成DocumentDB作为向量存储时,开发者可能会遇到一些特定的挑战。
许多开发者在尝试将Amazon DocumentDB与Langchain集成时,可能会自然而然地想到复用Langchain中针对MongoDB Atlas的向量存储集成(例如MongoDBAtlasVectorSearch)。这主要是因为DocumentDB宣称与MongoDB兼容。然而,实际操作中,这种尝试往往会导致错误,例如ValueError: 'Database' object is not callable。
问题的核心在于,尽管Amazon DocumentDB在核心数据模型和API上与MongoDB高度兼容,但其向量搜索功能的底层实现和查询API与MongoDB Atlas的向量搜索存在显著差异。这意味着,为MongoDB Atlas设计的Langchain集成模块并不能完全适用于DocumentDB的向量搜索功能。试图强制使用会导致API调用不匹配,进而引发运行时错误。
为了解决这一兼容性问题,Langchain已经推出了针对Amazon DocumentDB的专用向量存储集成。这一集成模块充分考虑了DocumentDB向量搜索API的特点,为开发者提供了原生且高效的连接与操作方式。通过使用这个专用的集成,开发者可以避免上述的兼容性问题,并充分利用DocumentDB的向量搜索能力。
以下是使用Langchain的DocumentDBVectorSearch模块集成Amazon DocumentDB的详细步骤和示例代码。
在开始之前,请确保您已满足以下条件:
pip install langchain-community pymongo boto3
首先,您需要从langchain_community.vectorstores.docdb导入DocumentDBVectorSearch类,并设置DocumentDB的连接参数。连接字符串通常包含用户名、密码、集群地址以及认证源。
import os
from pymongo import MongoClient
from langchain_community.vectorstores.docdb import DocumentDBVectorSearch
from langchain_community.embeddings import BedrockEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain_core.documents import Document
# DocumentDB 连接信息
# 推荐使用环境变量或安全配置管理这些敏感信息
DOCDB_CONNECTION_STRING = os.environ.get("DOCDB_CONNECTION_STRING")
DOCDB_DB_NAME = "your_database_name"
DOCDB_COLLECTION_NAME = "your_collection_name"
DOCDB_INDEX_NAME = "vector_index" # 确保在DocumentDB中已创建此向量索引
if not DOCDB_CONNECTION_STRING:
raise ValueError("DOCDB_CONNECTION_STRING 环境变量未设置。")
# 初始化MongoDB客户端
client = MongoClient(DOCDB_CONNECTION_STRING)
db = client[DOCDB_DB_NAME]
collection = db[DOCDB_COLLECTION_NAME]
# 初始化嵌入模型
# 这里以Amazon Bedrock Embeddings为例
bedrock_embeddings = BedrockEmbeddings(
model_id="amazon.titan-embed-text-v1",
region_name="us-east-1" # 根据您的AWS区域调整
)注意事项:
接下来,您需要准备要存储的文本数据,并使用选定的嵌入模型将其转换为向量。
# 示例文档
raw_documents = [
"Langchain是一个用于开发LLM应用的框架。",
"Amazon DocumentDB提供了MongoDB兼容的数据库服务,现在支持向量搜索。",
"向量搜索是检索非结构化数据的重要技术。",
"Bedrock Embeddings是Amazon提供的文本嵌入服务。"
]
# 文档分割器(如果需要处理长文档)
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = []
for i, text in enumerate(raw_documents):
# 将原始文本包装成Langchain的Document对象
# 也可以使用text_splitter.create_documents([text])来处理更长的文本
docs.append(Document(page_content=text, metadata={"source": f"doc_{i}"}))
# 如果文档是字符串列表,也可以直接传入
# docs = text_splitter.create_documents(raw_documents)使用DocumentDBVectorSearch.from_documents方法可以将文档及其嵌入直接上传到DocumentDB。这个方法会自动处理嵌入的生成和文档的存储。
print("开始上传文档到DocumentDB...")
vector_store = DocumentDBVectorSearch.from_documents(
documents=docs,
embedding=bedrock_embeddings,
collection=collection, # 传入pymongo的collection对象
index_name=DOCDB_INDEX_NAME,
)
print("文档上传成功!")一旦文档被存储,您就可以使用similarity_search或as_retriever方法进行向量相似度搜索。
# 执行相似度搜索
query = "什么是Langchain和向量搜索?"
print(f"\n执行相似度搜索,查询: '{query}'")
results = vector_store.similarity_search(query, k=2)
print("\n搜索结果:")
for i, doc in enumerate(results):
print(f"--- 结果 {i+1} ---")
print(f"内容: {doc.page_content}")
print(f"元数据: {doc.metadata}")
# 也可以将其用作检索器
retriever = vector_store.as_retriever(search_kwargs={"k": 1})
retrieved_docs = retriever.invoke(query)
print(f"\n使用检索器获取结果 (k=1):")
for i, doc in enumerate(retrieved_docs):
print(f"--- 检索结果 {i+1} ---")
print(f"内容: {doc.page_content}")
print(f"元数据: {doc.metadata}")通过遵循本教程,开发者可以有效避免在Langchain中集成Amazon DocumentDB作为向量存储时可能遇到的常见陷阱,并成功构建基于DocumentDB向量搜索能力的LLM应用。
以上就是Langchain中集成Amazon DocumentDB作为向量存储的指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号