如何将新增Chroma向量数据库合并至已有库以节省资源?
如何合并已有Chroma向量数据库与新的向量数据库
我已有一个现成的Chroma向量数据库,希望将后续传入的新向量数据库合并到已有库中,避免每次运行程序时重新创建大型文本块数据库造成资源浪费。我尝试过合并、扩展和拼接操作,但都没生效,目前编写的添加文档代码如下:
def store_save_text(self,texts): self.persist_directory = 'vdb_langchain_doc_small' # Check if the vectordb already exists if os.path.exists(self.persist_directory): # print("Vectordb already exists. Loading from disk...") existing_db=Chroma(persist_directory=self.persist_directory, embedding_function=self.embeddings_open) for doc in texts: existing_db.add_document(doc, embedding=self.embeddings_open) existing_db.persist() existing_db = None else: vectordb = Chroma.from_documents(documents=texts, embedding=self.embeddings_open, persist_directory=self.persist_directory) vectordb.persist() vectordb = None def load_from_disc(self): self.persist_directory = 'vdb_langchain_doc_small' self.vectordb = Chroma(persist_directory=self.persist_directory, embedding_function=self.embeddings_open)
可行实现方法
1. 修正现有文档添加逻辑
你的代码中误用了add_document(单数)方法,Chroma推荐使用add_documents(复数)直接传入文档列表,无需循环调用,既简化代码也提升效率。修正后的代码如下:
def store_save_text(self, texts): self.persist_directory = 'vdb_langchain_doc_small' if os.path.exists(self.persist_directory): existing_db = Chroma(persist_directory=self.persist_directory, embedding_function=self.embeddings_open) # 直接传入文档列表,批量添加 existing_db.add_documents(texts, embedding=self.embeddings_open) existing_db.persist() del existing_db # 显式删除释放资源 else: vectordb = Chroma.from_documents( documents=texts, embedding=self.embeddings_open, persist_directory=self.persist_directory ) vectordb.persist() del vectordb
2. 合并两个独立Chroma数据库
如果要合并的是另一个已持久化的Chroma数据库(而非新文档),可以通过提取源库文档再添加到目标库的方式实现:
def merge_chroma_dbs(self, source_persist_dir): # 加载已有目标数据库 target_db = Chroma(persist_directory=self.persist_directory, embedding_function=self.embeddings_open) # 加载待合并的源数据库 source_db = Chroma(persist_directory=source_persist_dir, embedding_function=self.embeddings_open) # 提取源库的文档和元数据 source_data = source_db.get() source_docs = source_data['documents'] source_metadatas = source_data['metadatas'] # 批量添加到目标库 target_db.add_documents(documents=source_docs, metadatas=source_metadatas) target_db.persist() # 释放资源 del target_db del source_db
3. 关键注意事项
- 必须确保两个数据库使用完全相同的嵌入模型,否则向量维度不匹配会导致合并失败或查询异常
- 合并后可通过
print(target_db._collection.count())验证文档数量,确认合并结果 - 合并过程中尽量复用数据库连接,避免频繁创建/删除实例以提升效率
内容的提问来源于stack exchange,提问作者Mohit
相关产品推荐
相关产品推荐

