1
0

LangChainでFAISSのドキュメントを一括取得してID指定で削除する

Posted at

タイトルの方法です。

それぞれ a.txt には大文字のA が入っているようなシンプルなテキスト3つを用意してロードします。

from pprint import pprint
from langchain.document_loaders.text import TextLoader
doc_a = TextLoader("./data/a.txt").load()
doc_b = TextLoader("./data/b.txt").load()
doc_c = TextLoader("./data/c.txt").load()

pprint((doc_a,doc_b,doc_c))
([Document(page_content='A', metadata={'source': './data/a.txt'})],
 [Document(page_content='B', metadata={'source': './data/b.txt'})],
 [Document(page_content='C', metadata={'source': './data/c.txt'})])

これらをDBに取り込みます。

from langchain.vectorstores.faiss import FAISS
db = FAISS.from_documents(documents=doc_a,embedding=llm)
db.add_documents(doc_b)
db.add_documents(doc_c)

まずDBのデータを検索でなく、一括取得する方法です。( _ 始まりの変数なのですぐ変更になってしまう可能性も高いです)

pprint(db.docstore._dict)

ここで出力されるe5ef500d-1e31-467d-af14-55f156debac5のような Keyとなっている部分がDocumentのIDとなります。

{'1a0abd38-3059-46d0-9ded-9082ad25f876': Document(page_content='C', metadata={'source': './data/c.txt'}),
 '53892d26-24b8-4288-999f-266336f902b5': Document(page_content='A', metadata={'source': './data/a.txt'}),
 'e5ef500d-1e31-467d-af14-55f156debac5': Document(page_content='B', metadata={'source': './data/b.txt'})}

このIDを指定して delete() メソッドを利用すればDocumentをDBから削除可能です。

例えば以下のようにすると B のDocumentを削除可能です。

# 削除前の検索
print(db.similarity_search("b",k=1))
# -> [Document(page_content='B', metadata={'source': './data/b.txt'})]

# Bのドキュメントを削除
db.delete(ids=["e5ef500d-1e31-467d-af14-55f156debac5"])

# 削除後の検索
print(db.similarity_search("b",k=1))
# -> [Document(page_content='C', metadata={'source': './data/c.txt'})]

ids は複数していできるので、上記で db.docstore._dict の結果をmetadataでフィルタして指定するなども可能です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0