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()
# 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_settings
がclient
になり、client
はchromadb.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もここの引数で指定できる