如何用MongoDB中保存的Embeddings在LangChain创建Vector Store并构建对话链?
利用MongoDB中已保存的Embedding构建Vector Store与对话链
直接用MongoDBAtlasVectorStore的构造方法从已有集合初始化即可,不用再调用from_texts重新生成Embedding,完全不需要更换对话链类型,原有的ConversationalRetrievalChain可以继续使用。
具体实现步骤
从已有MongoDB集合初始化Vector Store
直接传入你的数据库集合、嵌入模型、向量索引名即可,如果集合里的字段名不是LangChain默认的(比如文本字段不是text,Embedding字段不是embedding),需要手动指定字段映射。代码示例:
def get_existing_vector_store(): embeddings = OpenAIEmbeddings() vector_store = MongoDBAtlasVectorSearch( collection=embeddings_collection, embedding=embeddings, index_name=ATLAS_VECTOR_SEARCH_INDEX_NAME, # 根据你的集合字段名调整,比如: # text_key="pdf_text", # 存储PDF文本块的字段名 # embedding_key="embeddings" # 存储Embedding数组的字段名 ) return vector_store复用原对话链逻辑
拿到初始化好的vector_store后,直接传入原有的get_conversation_chain函数就行,不需要修改对话链的代码。调用示例:
# 打开PDF聊天窗口时,直接获取已有的Vector Store vector_store = get_existing_vector_store() # 构建对话链 conversation_chain = get_conversation_chain(vector_store)
注意事项
- 确保MongoDB Atlas中已经创建了对应的向量搜索索引(即
ATLAS_VECTOR_SEARCH_INDEX_NAME对应的索引),索引要关联到你存储Embedding的字段。 - 集合中的每条文档需要包含文本块内容和对应的Embedding数组,文件名、消息列表等元数据不影响Vector Store的检索,可以保留。
- 如果之前是把整个PDF的Embedding存在一条文档里,建议改成按文本块拆分存储,这样检索的精度会更高,符合对话链的上下文检索需求。
内容的提问来源于stack exchange,提问作者Erick Galván
相关产品推荐
相关产品推荐

