地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【LLM】ChromaDBとは

www.trychroma.com

ChromaDBは、ベクトルデータを効率的に保存し、検索するためのオープンソースのベクトルデータベースです。特に、機械学習モデルや自然言語処理NLP)で生成される高次元ベクトルを扱うために最適化されています。ChromaDBは、ドキュメントやテキストなどのデータをベクトル形式で保存し、それらのデータ間の類似性検索(Nearest Neighbor Search)を行うことに特化しています。(Chromeに似ていてtypoしそうってこの文章を打ちながら思いましたw)

特徴は以下です。

  • ベクトルの高速検索
    • ChromaDBは、大量の高次元ベクトルに対する類似度検索を効率的に行うために最適化されています。これにより、BERTやGPTなどのモデルで生成されたベクトルを使って、類似するデータを迅速に検索できます。
  • スケーラビリティ: ChromaDBは、大規模なベクトルデータにも対応しており、スケーラブルな形でデータを保存、検索することができます。分散アーキテクチャを採用しているため、クラウド環境や分散システムでの利用も可能です。
  • シンプルなAPI
    • ChromaDBはPythonライブラリとして提供されており、簡単なAPIを使ってデータの挿入や検索を行えます。データサイエンティストやエンジニアが直感的に使える設計です。
    • Goから使うことも一応は可能っぽいです

GitHub - amikos-tech/chroma-go: The Go client for Chroma vector database

  • 多様な検索メソッドのサポート
    • 類似度検索において、L2距離、コサイン類似度など、さまざまな計量手法をサポートしています。ユーザーは、用途に応じて適切な検索手法を選択することができます。

ChromaDBの利用

ChromaDBはクラサバで動かすモードがあるようです。ChromaDBサーバーの起動とかが必要で面倒なのでとりあえずインメモリーの方で動かしてみます。 (とはいえDockerイメージも公開されてるのでシュッと試すことはできそう)

import chromadb

# ChromaDBクライアントの初期化
client = chromadb.Client()

# コレクション(テーブルに相当)を作成
collection = client.create_collection("my_collection")

# サンプルデータ(文とその対応するベクトル)
documents = ["I love machine learning", "Natural language processing is fascinating", "ChromaDB makes vector search easy"]
embeddings = [
    [0.1, 0.2, 0.3],  # 仮のベクトル(実際にはモデルから取得)
    [0.2, 0.1, 0.4],
    [0.4, 0.5, 0.1]
]

# データをコレクションに挿入
collection.add(
    documents=documents,
    embeddings=embeddings,
    ids=["doc1", "doc2", "doc3"]
)

# 類似するベクトルの検索
query_vector = [0.1, 0.2, 0.3]  # クエリとして使用するベクトル
results = collection.query(query_embeddings=[query_vector], n_results=2)

# 検索結果の表示
print("Similar documents:", results["documents"])