オープンソースのベクトルデータベースChromaDBを使用して、セマンティック検索アプリケーションを構築する

ChromaDBを使用してセマンティック検索アプリを構築する

はじめに

AIアプリケーションとユースケースの台頭に伴い、AIアプリケーションを容易にし、AI開発者が実世界のアプリケーションを構築するためのさまざまなツールとテクノロジーが増えています。そのようなツールの中で、今日はChromaDBの動作と機能について学びます。ChromaDBは、GPT3.5、GPT-4、またはその他のOSモデルなどのAIモデルからの埋め込みを格納するためのオープンソースのベクトルデータベースです。埋め込みは、任意のAIアプリケーションパイプラインの重要なコンポーネントです。コンピュータはベクトルのみを処理するため、すべてのデータは埋め込みの形式でベクトル化されて意味検索アプリケーションで使用される必要があります。

それでは、実際のコード例を使用してChromaDBの動作について詳しく説明しましょう!

この記事はData Science Blogathonの一部として公開されました。

ChromaDBの基礎とライブラリのインストール

ChromaDBは、大規模な言語モデルアプリケーションを開発および構築するためにベクトル埋め込みを格納するために設計されたオープンソースのベクトルデータベースです。このデータベースは、LLMアプリケーションのための知識、スキル、および事実を格納するために簡単にします。

ChromaDBは、LLMアプリケーションと統合された場合のChromaDBの動作を示しています。ChromaDBを使用すると、次の機能を実行できます。

  • 埋め込みとそのメタデータをIDとともに格納する
  • ドキュメントとクエリを埋め込む
  • 埋め込みを検索する

ChromaDBは非常に使いやすく、LLMパワードアプリケーションと簡単に設定できます。開発者の生産性を向上させるために設計されており、開発者にとって使いやすいツールです。

それでは、Python環境とJavascript環境にChromaDBをインストールしましょう。Jupyter Notebookでも実行でき、データサイエンティストや機械学習エンジニアがLLMモデルで実験できます。

Pythonのインストール

# Python環境にChromaDBをインストール
pip install chromadb

Javascriptのインストール

# JS環境にChromaDBをインストール
npm install --save chromadb # yarn add chromadb

ライブラリのインストールが完了したら、次のセクションでそのさまざまな機能について学びます。

ChromaDBの機能と動作

Google ColabなどのJupyter Notebook環境を使用してデモを行うことができます。Google Colab、Kaggle、またはローカルのノートブック環境で以下のハンズオン演習を行うことができます。

ChromaDBコレクションの作成

# chromadbをインポートしてクライアントを作成する
import chromadb

client = chromadb.Client()
collection = client.create_collection("my-collection")

上記のコードでは、リポジトリフォルダ内に「my-collection」というコレクションを作成するためにクライアントオブジェクトをインスタンス化しました。

コレクションは、後でさまざまなアプリケーションのためにクエリするために埋め込み、ドキュメント、およびその他の追加のメタデータが格納される場所です。

コレクションにドキュメントを追加する

# DBにドキュメントを追加する
collection.add(
    documents=["これは猫に関するドキュメントです", "これは車に関するドキュメントです",
     "これはバイクに関するドキュメントです"],
    metadatas=[{"category": "動物"}, {"category": "乗り物"}, 
    {"category": "乗り物"}],
    ids=["id1", "id2","id3"]
)

これで、いくつかのサンプルドキュメントをメタデータとIDと共に格納するために追加しました。

ChromaDBは、テキストドキュメントを格納し、トークン化、ベクトル化、およびインデックス作成を自動的に処理します。

コレクションデータベースのクエリ

# DBからデータを取得するためにクエリを実行する
results = collection.query(
    query_texts=["乗り物"],
    n_results=1
)

------------------------------[Results]-------------------------------------
{'ids': [['id2']],
 'embeddings': None,
 'documents': [['これは車に関するドキュメントです']],
 'metadatas': [[{'category': '乗り物'}]],
 'distances': [[0.8069301247596741]]}

コレクションデータベース上で単純に「query()」関数を呼び出すだけで、入力クエリに基づいて最も類似したテキストがメタデータとIDとともに返されます。この例では、「vehicle」メタデータを含む類似したテキストがクエリで返されます。

サンプルドキュメントを使用した意味的検索アプリケーション

意味的検索は、技術業界で最も人気のあるアプリケーションの1つであり、Google、Baiduなどのウェブ検索で使用されています。言語モデルは、個人レベルまたはビジネス組織のための大量のデータの埋め込みにより、このようなアプリケーションの開発を可能にします。

ChromaDB内で意味的検索アプリケーションを作業するために、いくつかのサンプルドキュメントを含む「pets」フォルダを使用します。ローカルフォルダには以下のファイルがあります:

ローカルフォルダからファイルをインポートし、「file_data」に保存しましょう。

# ペットフォルダからファイルをVectorDBに保存するためにインポート
import os

def read_files_from_folder(folder_path):
    file_data = []

    for file_name in os.listdir(folder_path):
        if file_name.endswith(".txt"):
            with open(os.path.join(folder_path, file_name), 'r') as file:
                content = file.read()
                file_data.append({"file_name": file_name, "content": content})

    return file_data

folder_path = "/content/pets"
file_data = read_files_from_folder(folder_path)

上記のコードは、「pets」フォルダからファイルを取得し、それらをすべてのファイルのリストとして「file_data」に追加します。これらのファイルは、クエリ目的の埋め込みとしてChromaDBに保存するために使用されます。

# file_dataからデータを取得し、chromadbコレクションを作成する
documents = []
metadatas = []
ids = []

for index, data in enumerate(file_data):
    documents.append(data['content'])
    metadatas.append({'source': data['file_name']})
    ids.append(str(index + 1))

# ペットファイルのコレクションを作成する
pet_collection = client.create_collection("pet_collection")

# ファイルをchromadbコレクションに追加する
pet_collection.add(
    documents=documents,
    metadatas=metadatas,
    ids=ids
)

上記のコードは、ファイルとメタデータをファイルのリストから取得し、「pet_collection」という名前のChromaDBコレクションに追加します。

ここで注意する必要があるのは、デフォルトではchromadbがsentence transformersからの「all-MiniLM-L6-v2」埋め込みモデルを使用することです。では、結果を確認するためにコレクションにクエリを実行しましょう。

# データベースにクエリを実行してベクトル化されたデータから回答を取得する
results = pet_collection.query(
    query_texts=["ペット動物の栄養ニーズは何ですか?"],
    n_results=1
)

results

コレクションをクエリすると、埋め込みドキュメントからクエリに最も類似したドキュメントが自動的に見つかり、出力が生成されます。また、出力にはクエリに対して特定のドキュメントがどれだけ近かったかを示す距離メトリックも表示されます。

異なる埋め込みモデルの使用

これまでは入力テキストのベクトル化にデフォルトの埋め込みモデルを使用してきましたが、ChromaDBではsentence transformerライブラリからさまざまな他のモデルも使用できます。同じペットドキュメントを意味的検索アプリケーションに埋め込むために「paraphrase-MiniLM-L3-v2」モデルを使用します。

(注意:以下のコードを実行する前に、sentence_transformersライブラリをインストールしてください)

# sentence transformersをインポートする
from sentence_transformers import SentenceTransformer

model = SentenceTransformer('paraphrase-MiniLM-L3-v2')

documents = []
embeddings = []
metadatas = []
ids = []

# file_dataを列挙して各ドキュメントとメタデータをコレクションする
for index, data in enumerate(file_data):
    documents.append(data['content'])
    embedding = model.encode(data['content']).tolist()
    embeddings.append(embedding)
    metadatas.append({'source': data['file_name']})
    ids.append(str(index + 1))

# 新しいChromaDBを作成し、埋め込みを使用してデータを追加およびクエリする
pet_collection_emb = client.create_collection("pet_collection_emb")

# ペットファイルをpet_collection_embデータベースに追加する
pet_collection_emb.add(
    documents=documents,
    embeddings=embeddings,
    metadatas=metadatas,
    ids=ids
)

上記のコードでは、入力ファイルをエンコードし、新しいコレクションに追加するために「paraphrase-MiniLM-L3-v2」モデルを使用しています。

これで、データベースを再度クエリして最も類似した結果を取得することができます。

# テキストクエリを書き込んでコレクションに送信する
query = "一般的に人々が所有する異なる種類のペットは何ですか?"
input_em = model.encode(query).tolist()

results = pet_collection_emb.query(
    query_embeddings=[input_em],
    n_results=1
)
results

ChromaDBでサポートされる埋め込み

埋め込みは、AIアプリケーションのあらゆる種類のデータを保存するためのネイティブな方法です。テキスト、画像、音声、ビデオデータなどを、アプリケーションの要件に応じて表現することができます。

ChromaDBは、OpenAI、Sentence transformers、Cohere、Google PaLM APIなど、さまざまな埋め込みプロバイダから多くのAIモデルをサポートしています。ここでは、いくつかのモデルを見てみましょう。

Sentence Transformer埋め込み

# sentence transformerライブラリから任意のモデルをロードする
sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction(
model_name="all-MiniLM-L6-v2")

上記のコードを使用することで、利用可能なモデルから任意のモデルを使用することができます。モデルのリストはこちらで確認できます。

OpenAIモデル

ChromaDBは、OpenAIの埋め込みモデルAPIを使用するためのラッパー関数を提供しています。

# OpenAI埋め込みを呼び出すための関数
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
                api_key="YOUR_API_KEY",
                model_name="text-embedding-ada-002"
            )

ChromaDB関数の詳細な情報については、公式のドキュメントを参照してください。

Githubのコードリポジトリ: こちらをクリックしてください

結論

まとめると、ベクトルデータベースは生成型AIアプリケーションの主要な構築要素です。ChromaDBは、さまざまなLLMベースのアプリケーションで広く使用されているベクトルデータベースの1つです。このブログでは、ChromaDBのさまざまな機能とコード例を学びました。

キーポイント

  1. ChromaDBのさまざまな機能をコード例で学びました。
  2. シェマンティックサーチアプリケーションでのChromaDBの使用例について学びました。
  3. 最後に、ChromaDBがサポートするOpenAI、Cohere、およびsentence transformersなどの埋め込みの種類を紹介しました。

よくある質問

この記事のメディアはAnalytics Vidhyaの所有ではなく、著者の裁量で使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more