Chromaについて調べた

llamaindex の保存先でChroma → SQLite + Parquet を勧められたが どのようなものか知りたい

🔷 1. Chroma とは?
Chroma は 高速なベクトルストア(類似検索エンジン) です。以下の特徴があります:
* ベクトル(埋め込み)とメタデータの保存・検索が可能
* シンプルなPython APIで操作可能
* ローカルストレージにも対応(クラウド不要)
* LlamaIndexと統合しやすい
LlamaIndex の ChromaVectorStore 経由で使います。

🔷 2. SQLite とは?
SQLite は 軽量な組み込み型データベース です。特徴:
* ファイル1つで完結(.db)
* インストール不要でPythonに組み込み済み
* 小中規模のアプリに最適
👉 Chromaはメタデータやインデックス情報の保存先としてSQLiteを使えます。

🔷 3. Parquet とは?
Parquet は 列指向のファイルフォーマット(Apache Arrowベース)で、以下の特徴があります:
* 高圧縮&高速読み書き
* PandasやPyArrowなどと連携しやすい
* 機械学習や分析によく使われる形式
👉 Chromaでは、埋め込みベクトル自体をParquetに保存するオプションがあります。

🧩 まとめると:この構成の利点
コンポーネント 役割 保存先
Chroma ベクトル検索・管理 –
SQLite メタデータ・インデックス情報 chroma.sqlite3
Parquet 埋め込みベクトルの保存 chroma.parquet
この構成では、以下のような利点があります:
* ✅ クラウド不要・ローカルで完結
* ✅ 速くて軽い
* ✅ LlamaIndexと連携しやすい
* ✅ データ構造が明確(バックアップ・移行しやすい)

必要なマシンスペック

🖥️ 必要なマシンスペックの目安
✅ 最小スペック(数十〜数百ページのPDFを家庭内検索用途で扱う場合)
項目 推奨値
CPU Intel Core i5 / Apple M1 / Ryzen 5 以上
メモリ(RAM) 8GB以上(できれば16GB)
ストレージ SSD(空き容量10GB程度〜)
OS macOS / Windows / Linux(どれでも可)
Python環境 Python 3.9〜3.11 + pipでパッケージ管理可能なこと
✔ 対応可能なこと
* 家電マニュアル、契約書、学校通知PDFを読み込み
* 自然言語で「何ページに書いてある?」などと検索
* 毎日新しいお知らせを追加

⚙ 中規模スペック(数千ページ、複数人で共有など)
項目 推奨値
CPU Intel Core i7 / Apple M1 Pro / Ryzen 7以上
メモリ(RAM) 16GB〜32GB
ストレージ SSD(空き容量50GB以上推奨)
その他 常時稼働できるようファン静音 or ラズパイサーバなど
✔ 対応可能なこと
* 数千ページ以上のマニュアルや書籍、PDFを対象にした検索
* 高速な応答(数秒以内)で快適な対話
* 音声やチャットでの自然なやり取り

💡 小型構成としてRaspberry Piは使える?
* Raspberry Pi 4(4GB〜8GB RAM)でも動作可能ですが、ベクトル埋め込みの生成が非常に遅くなるため、最初のインデックス構築はPCで行い、完成済みのindexだけをRaspberry Piで読み込むといった構成が理想です。

⚠️ 注意点:Chroma+Parquetの重さについて
* Chroma自体は軽量ですが、埋め込みベクトルの生成(特にHuggingFaceの大きなモデル)にはメモリとCPUを多く使います。
* ベクトルの保存(Parquet)は効率的ですが、読み込み時に全体をメモリにロードする動作があるため、数万文書以上扱うなら32GB RAMが望ましいです。

とりあえずm1macbookAIr 16GBでも動作は可能みたい

事例があるかgpt で検索

ローカルでEmbeddingしてローカルLLMでIndex検索するデモ
が近いけど
これは

構成 モジュール
Embedding(埋め込み) 「intfloat/multilingual-e5-large」をHuggingFaceEmbeddingで利用
LLM 「elyza/Llama-3-ELYZA-JP-8B-q4_k_m.gguf」をLlambaCppで利用
ベクトル検索と類似性検索 Faiss
という構成なのでちょっと違った

続・LlamaIndexを使って独自データをQ&AするだけならOpenAI API使わなくてもいいでない?
これは
* LlamaIndex
llama.cpp
の構成
こっちはデータのロード方法が載っているので参考になるかも

あと

Ruri: 日本語に特化した汎用テキスト埋め込みモデル

これも組み合わせてみる

[RAGカスタマイズ] LlamaIndexで情報元のPDFのメタデータを含めた回答を生成する
が多分一番近い

LlamaIndexのデータ形式に関するまとめ
も面白い

GPTによれば

[RAGカスタマイズ] LlamaIndexで情報元のPDFのメタデータを含めた回答を生成する
にあるように
RAGの回答にメタデータを含める
それでは,これらの方法を応用して,RAGで生成する回答に出所となるPDFファイルとそのページを含める方法についてまとめる.大きく3つの手順が必要になる.
1. PDFからDocumentオブジェクトを生成する際に所望のメタデータを含める
2. Retrieverで検索をする際にPostNodeProcessorによりNodeのテキストにメタデータを追加する
3 Synthesizerの出力形式をpydanticで指定し,メタデータが含まれるようにする

で必要なメタデータの保存も可能

Chroma(ChromaDB)でもメタデータは保存・検索可能です

✅ Chroma におけるメタデータの扱い
ChromaDB では、各ドキュメント(レコード)に対して以下の3種類の情報を保存できます:
項目 内容
ids ドキュメントの一意なID
documents 実際のテキスト内容
metadatas 任意のキー・バリューペア
この metadatas に、PDFファイルのファイルパスやページ番号などを含めることができます。

🔧 例:Chroma にメタデータ付きでデータを追加

collection.add(
    documents=["これは1ページ目です", "これは2ページ目です"],
    ids=["doc1", "doc2"],
    metadatas=[
        {"file_path": "sample.pdf", "page": 1},
        {"file_path": "sample.pdf", "page": 2}
    ]
)

このようにして、LlamaIndex の Document.metadata に相当する情報を Chroma にも明示的に渡せます。

✅ LlamaIndex × Chroma でのメタデータの流れ
LlamaIndex 側で SimpleDirectoryReader を使うと、読み込まれた Document に自動的に以下のようなメタデータが付きます:

print(documents[0].metadata)
# 出力例: {'file_path': './docs/sample.pdf', 'page_label': '1', 'page_number': 1}

このメタデータは、VectorStoreIndex を ChromaVectorStore 経由で作る際に、内部的にNodeオブジェクトにコピーされ、Chromaにも反映されます。
構成例:

from llama_index.core import SimpleDirectoryReader, VectorStoreIndex, StorageContext
from llama_index.vector_stores.chroma import ChromaVectorStore

reader = SimpleDirectoryReader(input_dir="./docs")
documents = reader.load_data()

# Chromaの初期化(永続化あり)
from chromadb.config import Settings
from chromadb import PersistentClient

client = PersistentClient(path="./chroma_db")
chroma_store = ChromaVectorStore(chroma_collection=client.get_or_create_collection("my_collection"))

storage_context = StorageContext.from_defaults(vector_store=chroma_store)
index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)

index.storage_context.persist()

🔍 検索時にメタデータも取得できる?
はい。クエリ結果(Node)から、以下のようにメタデータが取得可能です:

response = index.as_query_engine().query("これは何ページの情報ですか?")
for node in response.source_nodes:
    print(node.metadata)

✅ まとめ
項目 Chroma対応 備考
ファイルパスの保存 ✅ metadatas={“file_path”: …}
ページ番号の保存 ✅ metadatas={“page”: …}
LlamaIndex連携時の自動反映 ✅ Document.metadata → Node.metadata → Chroma に自動伝搬

さらに、「特定のPDFファイル+ページに限定して検索したい」といった用途がある場合、Chromaのフィルター検索も可能です
(ただし query() ではなく query_where() 相当を使う必要あり)。希望があればその例も紹介します。

まずはインストールして進める

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です