0

0

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

心靈之曲

心靈之曲

发布时间:2025-11-03 11:18:33

|

680人浏览过

|

来源于php中文网

原创

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的连接参数。连接字符串通常包含用户名、密码、集群地址以及认证源。

Tago AI
Tago AI

AI生成带货视频,专为电商卖货而生

下载
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应用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1567

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1228

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1204

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

192

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

131

2025.08.07

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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