Langchain中集成Amazon DocumentDB作为向量存储的指南

心靈之曲
发布: 2025-11-03 11:18:33
原创
652人浏览过

Langchain中集成Amazon DocumentDB作为向量存储的指南

本文旨在解决在langchain中使用amazon documentdb作为向量存储时遇到的常见问题。尽管documentdb与mongodb兼容,但其向量搜索api有所不同,导致直接使用mongodb atlas集成会失败。文章将详细介绍langchain针对documentdb提供的专用集成方案,并提供示例代码,指导用户正确配置和使用documentdb作为高效的向量存储。

随着大型语言模型(LLMs)和生成式AI应用的兴起,向量数据库已成为存储和检索非结构化数据(如文本嵌入)的关键组件。Langchain作为一个强大的LLM应用开发框架,提供了与多种向量存储的集成能力。Amazon DocumentDB,作为一款与MongoDB兼容的文档数据库服务,近期也推出了向量搜索功能,这为开发者提供了更多选择。然而,在使用Langchain集成DocumentDB作为向量存储时,开发者可能会遇到一些特定的挑战。

理解Amazon DocumentDB与MongoDB的向量搜索差异

许多开发者在尝试将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对DocumentDB的专用集成

为了解决这一兼容性问题,Langchain已经推出了针对Amazon DocumentDB的专用向量存储集成。这一集成模块充分考虑了DocumentDB向量搜索API的特点,为开发者提供了原生且高效的连接与操作方式。通过使用这个专用的集成,开发者可以避免上述的兼容性问题,并充分利用DocumentDB的向量搜索能力。

如何在Langchain中正确使用DocumentDB作为向量存储

以下是使用Langchain的DocumentDBVectorSearch模块集成Amazon DocumentDB的详细步骤和示例代码。

1. 前置条件

在开始之前,请确保您已满足以下条件:

  • 一个已启用向量搜索功能的Amazon DocumentDB集群。
  • Python环境,并安装了必要的库:langchain-community、pymongo、boto3(如果使用Bedrock embeddings)以及您的嵌入模型库。
  • 已配置AWS凭证,以便访问DocumentDB和Bedrock服务。

2. 安装必要的库

pip install langchain-community pymongo boto3
登录后复制

3. 导入模块并建立连接

首先,您需要从langchain_community.vectorstores.docdb导入DocumentDBVectorSearch类,并设置DocumentDB的连接参数。连接字符串通常包含用户名、密码、集群地址以及认证源。

Amazon ML
Amazon ML

Amazon AMZ机器学习平台

Amazon ML 80
查看详情 Amazon ML
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区域调整
)
登录后复制

注意事项:

  • DOCDB_CONNECTION_STRING应包含完整的连接信息,包括认证参数。
  • DOCDB_INDEX_NAME是您在DocumentDB中为向量搜索功能创建的索引名称。请务必确保该索引已存在并配置正确。

4. 准备文档并生成嵌入

接下来,您需要准备要存储的文本数据,并使用选定的嵌入模型将其转换为向量。

# 示例文档
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)
登录后复制

5. 将文档上传至DocumentDB

使用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("文档上传成功!")
登录后复制

6. 执行向量相似度搜索

一旦文档被存储,您就可以使用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提供的专用向量存储集成(DocumentDBVectorSearch),而不是尝试复用MongoDB Atlas的集成。
  • 向量索引: 确保您的DocumentDB集群已启用向量搜索功能,并且您已在相应的集合上创建了向量索引。index_name参数必须与您在DocumentDB中创建的索引名称一致。
  • 连接字符串: 妥善管理您的DocumentDB连接字符串和凭证,避免硬编码
  • 嵌入模型: Langchain的DocumentDB集成支持多种嵌入模型,您可以根据需求选择,例如Bedrock Embeddings、OpenAI Embeddings等。
  • 性能优化: 对于大规模数据集,考虑DocumentDB集群的扩展性、索引策略以及嵌入模型的选择,以优化搜索性能。

通过遵循本教程,开发者可以有效避免在Langchain中集成Amazon DocumentDB作为向量存储时可能遇到的常见陷阱,并成功构建基于DocumentDB向量搜索能力的LLM应用。

以上就是Langchain中集成Amazon DocumentDB作为向量存储的指南的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号