LoginSignup
13
10

Chroma db × langchainでpersistする際の注意点

Last updated at Posted at 2023-07-06

gradio + langchain でチャットボットを作成した。

langchain                0.0.216
chromadb                 0.3.22

Documentオブジェクトからchroma dbでデータベースを作成している。最初に作成する際には以下のようにpersistディレクトリを設定している。

これはうまくいかない
db = Chroma.from_documents(documents,
                           embeddings,
                           persist_directory=persist_directory, 
                           collection_name="pdfs")

しかし、ボットを再起動すると、persist済みのディレクトリを指定してそこからデータベースを作成したにも関わらず、推論時に
Index not found, please create an instance before queryingと言われてしまった。

Githubのissueを見てみると、同様のエラーが挙がっていた。
https://github.com/hwchase17/langchain/issues/2491

結論から言うと、最初にデータベースを作成する際にfrom_documentsメソッドは使ってはダメなようだ(このissueだいぶ前だけど結局depricateもbugfixもされてないのだろうか)。

まずChromaをインスタンス化てからadd_documents()してpersist()する方法だとボットを再起動してもpersistがちゃんと使用される。

最初にデータベースを作成するとき
# settings for ChromaDB
client_settings = chromadb.config.Settings(
        chroma_db_impl="duckdb+parquet",
        persist_directory=persist_directory, 
        anonymized_telemetry=False
    )
# create instance
db = Chroma(
        collection_name="langchain_store",
        embedding_function=embeddings,
        client_settings=client_settings,
        persist_directory=persist_directory,
    )
# add docs
db.add_documents(documents=documents, embedding=embeddings)
db.persist()

persistされたデータベースを使用するとき
# settings for ChromaDB
client_settings = chromadb.config.Settings(
        chroma_db_impl="duckdb+parquet",
        persist_directory=persist_directory, 
        anonymized_telemetry=False
    )
db = Chroma(
    collection_name="langchain_store",
    embedding_function=embeddings,
    client_settings=client_settings,
    persist_directory=persist_directory,
)
chroma_retriever = db.as_retriever()

追記 2023.8.18

LangchainとChromaのバージョンが上がり、データベースの作り方が変わった。
Chromaの引数のclient_settingsclientになり、clientchromadb.PersistentClientで指定するようになった。

langchain                 0.0.265
chromadb                  0.4.6
import chromadb
from chromadb.config import Settings

persist_directory = 'your_persist_path'
client = chromadb.PersistentClient(path=persist_directory)

# 新しいDBの作成
db = Chroma(
            collection_name="langchain_store",
            embedding_function=embeddings,
            client=client,
            )
db.add_documents(documents=documents, embedding=embeddings)

# persistされたデータベースを使用するとき
db = Chroma(
    collection_name="langchain_store",
    embedding_function=embeddings,
    client=client,
)

# データベースからretriever作成
retriever = db.as_retriever(search_kwargs={"k": 3}) # Topkもここの引数で指定できる
13
10
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
13
10