📚

【LangChain】FAISSのドキュメント情報を全部取得する

に公開

はじめに

LangChain の FAISS のドキュメントを一括で取得する方法を検索すると、以下のような方法が見つかります。

db = FAISS.load_local(
    "faiss",
    embeddings,
    allow_dangerous_deserialization=True
)
print(db.docstore._dict)

しかしこの方法だと、エディターで type check を行っている場合怒られることがあります。

なぜ怒られるのか

_dict は InMemoryDocstore() のメンバー変数であり、

https://github.com/langchain-ai/langchain-community/blob/main/libs/community/langchain_community/docstore/in_memory.py#L10-L15

LangChain の FAISS では、from_document などで作成するとデフォルトで InMemoryDocstore() が使われるようになっていますが、

https://github.com/langchain-ai/langchain-community/blob/main/libs/community/langchain_community/vectorstores/faiss.py#L1002

FAISS のメンバー変数 docstore の型は普通の Docstore であり

https://github.com/langchain-ai/langchain-community/blob/main/libs/community/langchain_community/vectorstores/faiss.py#L203-L215

Docstore は _dict をメンバ変数として持っていないことが原因です。

https://github.com/langchain-ai/langchain-community/blob/main/libs/community/langchain_community/docstore/base.py#L9-L23

どうすればいいのか

以下のようにすると、FAISS に定義されているものだけで全てのドキュメントを取得することができます。

db = FAISS.load_local(
    "faiss",
    embeddings,
    allow_dangerous_deserialization=True
)

ids = list(db.index_to_docstore_id.values())
documents = db.get_by_ids(ids)

以下のようにすると、db.docstore._dict と同じ形で取得できます。

docstore_dict = {key: doc for key, doc in zip(ids, documents)}
print(docstore_dict)
GitHubで編集を提案

Discussion