如何将LangChain生成的FAISS向量存储至MongoDB并实现相似性检索?
可行方案:将FAISS向量存储迁移至MongoDB并实现相似性检索
核心思路
LangChain原生支持MongoDB作为向量存储介质,可通过以下步骤完成FAISS向量的迁移,并基于MongoDB实现相似性检索:
步骤1:确认MongoDB环境要求
- 使用MongoDB 6.0及以上版本(本地部署或MongoDB Atlas均可),该版本支持向量索引功能
- 创建目标数据库与集合,例如
db_name="langchain_db"、collection_name="pdf_vectors"
步骤2:从FAISS导出向量与文档
从已构建的FAISS vectorstore中提取所有嵌入向量及对应文档元数据:
# 假设已构建好faiss_vectorstore实例 docs_and_vectors = faiss_vectorstore.get_documents_with_embeddings() documents = [doc for doc, _ in docs_and_vectors] embeddings = [vec for _, vec in docs_and_vectors]
步骤3:将数据写入MongoDB
使用LangChain的MongoDBAtlasVectorStore类(本地MongoDB同样适用)完成批量写入:
from langchain.vectorstores import MongoDBAtlasVectorStore from langchain.embeddings.openai import OpenAIEmbeddings from pymongo import MongoClient # 初始化MongoDB客户端 client = MongoClient("mongodb://localhost:27017/") # 替换为你的MongoDB连接字符串 db = client["langchain_db"] collection = db["pdf_vectors"] # 初始化嵌入模型(需与生成FAISS向量的模型一致) embeddings_model = OpenAIEmbeddings() # 写入向量与文档到MongoDB vectorstore_mongo = MongoDBAtlasVectorStore.from_documents( documents=documents, embedding=embeddings_model, collection=collection, index_name="vector_index" # 后续要创建的向量索引名称 )
步骤4:创建MongoDB向量索引
通过代码或MongoDB控制台创建向量索引,保障检索效率:
# 代码方式创建向量索引 collection.create_index( {"embedding": "vector"}, name="vector_index", vectorSearchOptions={ "type": "vectorSearch", "numDimensions": 1536, # 与OpenAIEmbeddings的维度匹配(text-embedding-ada-002为1536) "similarity": "cosine" } )
步骤5:基于MongoDB执行相似性检索
完成上述操作后,直接调用MongoDB向量存储的similarity_search方法即可:
# 初始化MongoDB向量存储实例 vectorstore_mongo = MongoDBAtlasVectorStore( collection=collection, embedding=embeddings_model, index_name="vector_index" ) # 执行检索 query = "你的检索prompt内容" similar_docs = vectorstore_mongo.similarity_search(query, k=3) # 输出检索结果 for doc in similar_docs: print(doc.page_content) print("---")
注意事项
- 嵌入模型的维度必须与MongoDB向量索引的
numDimensions完全一致,否则会导致检索失败 - 若使用MongoDB Atlas,可直接在控制台可视化创建向量索引,无需编写代码
- 批量写入大量数据时建议分批次处理,避免连接超时
内容的提问来源于stack exchange,提问作者Shuhul Handoo
相关产品推荐
相关产品推荐

