🙆

【LangChain】chromadbを使ってローカルの文章(PDF・ワード)をembeddingした上で格納する

2023/05/07に公開

ChromaDBは、文書の埋め込みデータを格納・管理し、文書間の類似性を効率的に検索できるデータベースです。

LangChainからも使え、以下のコードのように数行のコードでChromaDBの中にembeddingしたPDFやワードなどの文章データを格納することが出来ます。

from langchain.vectorstores import Chroma
texts = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
vectordb = Chroma.from_documents(texts, embeddings)

ChromaDBはオープンソースで、Pythonベースで書かれており、FastAPIのクラスを使用することで、ChromaDBに格納されている埋め込みデータを効率的に操作し、類似性検索やデータの追加・更新・削除などを行うことができます。

文章のインデックスを作るところがポイントでして、
近似最近傍検索を実現するためのインデックス構造であるHNSW (Hierarchical Navigable Small World) を利用したインデックスクラスを実装しています。高次元データ(ベクトル)間の類似度に基づいて、近いデータを効率的に検索出来ます。HNSW はhnswlibライブラリを使って実装されており、L2ノルム、コサイン類似度、内積の3種類の距離計算方法が利用可能です。

HNSWについてのchatGPTの回答
HNSW(Hierarchical Navigable Small World)は、高次元データを効率的に検索するための近似最近傍検索アルゴリズムです。これは、高次元データ(例えば、画像やテキストから抽出された特徴ベクトルなど)の間の類似度に基づいて、近いデータを迅速に探すことができるアルゴリズムです。HNSWは、効率的な空間分割とグラフ構造を利用して、データポイント間の最短経路を見つけることによって、近似最近傍検索を高速化します。

具体的には、HNSWは以下の特徴を持っています。

階層構造: データポイントは、複数のレベルに分布しており、上位レベルでは全体的な空間構造を表現し、下位レベルではより局所的な空間構造を表現します。これにより、検索の際には、上位レベルから順に下位レベルへと移動していき、効率的に近似最近傍を探索することができます。

グラフ構造: 各データポイントは、グラフ上のノードとして表現され、類似度に基づいて他のノードとエッジで接続されています。これにより、グラフをたどることで、近いデータポイントを効率的に見つけることができます。

柔軟性: HNSWは、さまざまな距離計算方法(L2ノルム、コサイン類似度、内積など)に対応しており、多様なアプリケーションで利用することができます。

HNSWは、データベースや機械学習アプリケーションなど、高次元データを効率的に検索する必要があるさまざまな分野で使用されています。

要は、chatGPTを使ったchatbotを作る時に文章をembeddingして、質問文から類似度の高い回答を効率的に取ってきたい時に使うと便利だよということです。

Discussion