使用LangChain将DocumentDB作为向量存储时遇'Database不可调用'错误求助
问题分析与解决方案
错误原因定位
出现ValueError: Error raised by inference endpoint: 'Database' object is not callable错误,核心原因大概率是以下两种情况之一:
- Collection对象传递错误:你传入的
MONGODB_COLLECTION实际是Database对象而非合法的Collection对象。LangChain的MongoDBAtlasVectorSearch类会对传入的collection执行调用类操作,而Database对象不支持该行为,从而触发报错。 - MongoDBAtlasVectorSearch类的兼容性限制:该类是针对MongoDB Atlas开发优化的,尽管DocumentDB兼容MongoDB API,但部分内部逻辑(比如数据库对象的调用方式)可能存在差异,导致兼容失效。
针对性解决步骤
1. 校验Collection对象的正确性
确保你是按照正确流程获取Collection对象:
# 正确的DocumentDB连接与Collection获取流程 from pymongo import MongoClient client = MongoClient("你的DocumentDB连接字符串") db = client["目标数据库名称"] MONGODB_COLLECTION = db["目标集合名称"] # 这里必须是集合对象,而非数据库对象
检查代码中是否误将db(Database对象)赋值给了MONGODB_COLLECTION,这是最常见的触发该错误的原因。
2. 绕过类方法,手动实现文档插入与向量存储初始化
由于from_documents类方法可能存在兼容问题,可以手动完成文档嵌入、插入与向量存储初始化:
# 1. 手动为文档生成嵌入向量 docs_with_embeddings = [] for doc in docs: # 生成嵌入向量 embedding = bedrock_embeddings.embed_query(doc.page_content) # 构造符合要求的文档结构 doc_item = { "content": doc.page_content, "metadata": doc.metadata, "embedding": embedding } docs_with_embeddings.append(doc_item) # 2. 将文档批量插入DocumentDB集合 MONGODB_COLLECTION.insert_many(docs_with_embeddings) # 3. 手动初始化MongoDBAtlasVectorSearch vector_search = MongoDBAtlasVectorSearch( collection=MONGODB_COLLECTION, embedding=bedrock_embeddings, index_name="你的向量索引名称" # 需要提前在DocumentDB创建对应向量索引 )
3. 确认DocumentDB向量索引已正确创建
向量存储依赖提前创建的向量索引,按照DocumentDB的语法创建符合要求的索引(替换为你的嵌入维度):
// 在DocumentDB的Mongo Shell中执行 db.目标集合名称.createIndex( {"embedding": "vector"}, {"vectorOptions": {"type": "float", "dimensions": 1536}} // 维度需与Bedrock嵌入模型一致 )
4. 升级LangChain版本
检查并升级到最新版LangChain,新版本可能修复了对DocumentDB的兼容问题:
pip install --upgrade langchain langchain-mongodb
内容的提问来源于stack exchange,提问作者thecoders
相关产品推荐
相关产品推荐

