langchain使用FAISS存储向量后,怎么往向量库里补充新的向量?

不然每次修改本地数据后,都需要重新生成一份向量,太消耗token了。

代码如下:

from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS

loader = TextLoader("data/data1.txt", encoding="utf8")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
db = FAISS.from_documents(texts, OpenAIEmbeddings())
db.save_local("myindex")


# 通过上述步骤,我在本地生成了一个名称为`myindex`的文件夹,存储生成的向量
# 接下来,我有一些新的文本,怎么在`myindex`文件夹中,补充这些文本生成的向量进去
loader2 = TextLoader("data/data1.txt", encoding="utf8")
documents2 = loader.load()
texts2 = text_splitter.split_documents(documents2)
# ......

版本:

  • windows 10
  • Python 3.10.0
  • langchain 0.0.212

要往langchain使用FAISS存储向量的向量库中添加新的向量,您可以遵循以下步骤:

1.首先,确保您已经初始化了向量库并连接到FAISS向量存储库。

2.使用向量存储库的add_vector方法将新的向量添加到库中。此方法接受两个参数:向量的唯一标识符和向量本身。

示例代码如下:

vector_id = "new_vector_id"
vector = [1, 2, 3, ...]  # 新的向量

vectorstore.add_vector(vector_id, vector)

您可以根据您的需求将新的向量及其唯一标识符传递给add_vector方法。

3.添加完新的向量后,可以通过调用向量存储库的commit方法将更改提交到向量库中。

示例代码如下:

vectorstore.commit()

这将确保新的向量已成功添加到向量库中。

通过这些步骤,您可以使用FAISS存储向量的langchain库往向量库中补充新的向量.

合并#

您还可以合并两个FAISS向量存储

db1 = FAISS.from_texts(["foo"], embeddings)db2 = FAISS.from_texts(["bar"], embeddings) 
db1.docstore._dict 
{'e0b74348-6c93-4893-8764-943139ec1d17': Document(page_content='foo', lookup_str='', metadata={}, lookup_index=0)} 
db2.docstore._dict 
{'bdc50ae3-a1bb-4678-9260-1b0979578f40': Document(page_content='bar', lookup_str='', metadata={}, lookup_index=0)} 
db1.merge_from(db2) 
db1.docstore._dict 
{'e0b74348-6c93-4893-8764-943139ec1d17': Document(page_content='foo', lookup_str='', metadata={}, lookup_index=0), 'd5211050-c777-493d-8825-4800e74cfdb6': Document(page_content='bar', lookup_str='', metadata={}, lookup_index=0)} 
1 个赞

谢谢,就是这个方法!