faiss 默认是覆盖索引模式,langchain文档提供了merge的方式,我们试试看能达到我们想要的增加索引的效果吗
def save_documents_slice(documents, index="finance_index",slice_size= 100):
print("documents:", str(len(documents)))
docs = text_splitter.split_documents(documents)
print("docs:", str(len(docs)))
len_doc = len(docs)
db_num = 1##定义第一个初始值,当为1时使用原始db,否则新建一个db
for i in range(0,len_doc , slice_size):
slice_docs = docs[i:i+slice_size]
print("当前第:",str(i))
item_slice_docs = []
for doc in slice_docs:
# print("page_content",doc.page_content)
if len(doc.page_content) < 50:
print("当前内容过少跳过:",doc.page_content)
continue;
item_slice_docs.append(doc)
if item_slice_docs:
if db_num == 1:
db = FAISS.from_documents(slice_docs, embeddings)
else:
db1 = FAISS.from_documents(slice_docs, embeddings)
db.merge_from(db1)##新的db和原始db合并,
db_num+=1
db.save_local(index)
return db
方法中真对大数据量,增加了切片方式进行插入,同时利用merge方式,创建两个db,最终合并成完整的向量数据,下面验证一下吧
all_list = db.docstore._dict
print(len(all_list))
可以看到最后的数量是都存进去了