Chroma DBとは?Python定番ベクトルDBを試す

AIテキスト

RAGでは、ユーザーからの質問に答える際に、まず知識ベースから関連情報を「検索(Retrieval)」し、その情報を基にLLMが「生成(Generation)」を行います。

まず知識ベースをChroma DBで準備しましょう。

Chroma DBとは?  Pythonで使えるRAGの定番ライブラリ

Chroma DB は、ベクトルデータベース(埋め込み特化DB)です。
主に RAG(Retrieval Augmented Generation) や 類似検索 用途で使われます。

  • テキスト・画像などを変換したベクトル(embedding)を保存
  • クエリもベクトル化して 意味的に近いデータを高速検索
  • ローカル完結で使える(サーバー必須ではない)

pipのみでPythonから簡単に扱えることがメリットで、個人用ではRAGの定番ライブラリとなっています。

公式サイトトップページ Chroma

環境の準備

まずPython環境の準備を済ませておきます。バージョンは3.11系がバランスが良いでしょう。 https://pareido.jp/basic/pyenv-basic/

Python環境が整ったら、Chroma DBのライブラリをインストールします。

pip install chromadb

インストールが終われば早速コーディングに移ります。

サンプルデータの準備

まず、サンプルデータを用意します。

ここでは「おみくじ」を題材にテストデータをChatGPTに作ってもらいました。

大吉:今日は新しい挑戦が実を結びやすい日です。思い切った行動が良い流れを呼び込みます。
大吉:迷っていた決断に追い風が吹きます。直感を信じて動くと成果につながります。
大吉:周囲の協力を得やすい運気です。積極的に声をかけると道が開けます。
中吉:これまでの努力が少しずつ評価され始めます。焦らず継続することが大切です。
中吉:目立った成果は出なくても、基礎固めに向いた一日です。
中吉:周囲との調整役に回ることで、後のチャンスにつながります。
小吉:大きな進展はありませんが、小さな気づきが得られる日です。
小吉:身近な人との会話の中にヒントがあります。聞き役に回ると良いでしょう。
小吉:無理をせず、できることを一つずつ片付けると安心感が生まれます。
吉:安定した運気で、日常作業を丁寧に進めると評価が高まります。
吉:計画通りに物事が進みやすい日です。基本を大切にしましょう。
吉:派手さはありませんが、堅実な選択が後で効いてきます。
末吉:思い通りに進まない場面がありますが、経験として蓄積されます。
末吉:一度立ち止まって状況を整理すると、次の一手が見えてきます。
末吉:遠回りに見える選択が、結果的に安全な道になるでしょう。
凶:無理に進めるとトラブルが起きやすい日です。慎重さを優先しましょう。
凶:判断を急がず、準備や見直しに時間を使うのが無難です。
凶:今日は守りを重視すると、余計な失敗を避けられます。

実際はテキストファイルやMDファイルを読み込むことが多く、パフォーマンスLLMのコンテキスト長などの制約も考えながら、チャンク分割等のチューニングが必要になります。 ここではシンプルに、行単位の短いデータを利用しています。

PythonからのChroma DB実行

下記のようなPythonコードを準備します。

from chromadb import Client
from chromadb.config import Settings

# Chroma DB をインメモリで初期化
client = Client(Settings(persist_directory=None))
collection = client.create_collection(name="sample_texts")

# サンプルデータ
texts = [
    "大吉:今日は新しい挑戦が実を結びやすい日です。思い切った行動が良い流れを呼び込みます。",
    "大吉:迷っていた決断に追い風が吹きます。直感を信じて動くと成果につながります。",
    "大吉:周囲の協力を得やすい運気です。積極的に声をかけると道が開けます。",
    (テストデータを列挙...)
]

# 各行をそのままドキュメントとして登録
for i, text in enumerate(texts):
    collection.add(
        documents=[text],
        ids=[str(i)]
    )

# 確認用:クエリに近い文章を検索
result = collection.query(
    query_texts=["吉"],
    n_results=2
)

print(result["documents"])

このコードを実行すると、Chroma DBにテキストが登録され、指定したクエリ(ここでは”吉”)に近い文章が検索されます。

[['吉:計画通りに物事が進みやすい日です。基本を大切にしましょう。', '吉:派手さはありませんが、堅実な選択が後で効いてきます。']]

初回はembeddingモデル(“all-MiniLM-L6-v2”)のダウンロードが自動で始まり、少し待たされます。

all-MiniLM-L6-v2 は Sentence-Transformers 系の軽量な埋め込み(embedding)モデルです。Microsoft の MiniLM を蒸留して得られた小型モデルをベースに、文埋め込み生成向けに最適化されています。高速・軽量(CPUでも実用的)、出力次元は 384 次元、意味検索・クラスタリング・類似度計算に向く。コスト重視のユースケースで広く使われます。大規模モデルや専用の高精度埋め込み(例:MPNet系や大規模APIモデル)より精度は劣るが、速度とコストのバランスが良のが特徴です。

これでRAGの「検索(Retrieval)」部分が動作することを確認できました。

まとめ

RAGは、LLMの弱点を補うために外部知識ベースを活用する強力な手法です。

Chroma DBを使った簡単な実装例を通じて、RAGの基本的な流れを理解できました。

今後は、より高度な検索アルゴリズムや大規模な知識ベースを組み合わせて、実用的なRAGシステムを構築していきます。

タイトルとURLをコピーしました