ChromaDBとRAGを組み合わせて Mistral
Mistralを使ったローカルRAGで最もシンプルな構成は、Ollama(生成と、bge-m3による埋め込み計算)にファイルモードのChromaDBを組み合わせるもので、サーバーもPyTorchも不要です。モデルは、8〜12 GBのグラフィックカードならministral-3:8b(6.0 GB、Apache 2.0ライセンス、公称コンテキスト長256K)を標準の選択肢にするとよく、16 GBならministral-3:14b、それより大きい容量ならmistral-small3.2:24b(15 GB)が適しています。忘れてはいけない設定はOllamaのコンテキストウィンドウです。文書の各部分がプロンプトに収まるよう、サイズを引き上げてください。
このガイドでは、2つの Python スクリプトと、ご自身のマシンで実行する Mistral モデルを使い、文書アシスタントを一通り構築します。PDF とテキストファイルを分割して ChromaDB にインデックス化し、検索で見つかった文章の該当箇所をモデルに渡すと、モデルが出典を示しながら回答します。また、グラフィックメモリに応じた Mistral モデルの選び方や、RAG が的外れな回答をする原因となる落とし穴も説明します。
#構築するもの:Mistralを使った完全ローカルのRAG
RAG(検索拡張生成)とは、自分のドキュメントから質問に関係する箇所を探し、それらをモデルのプロンプトに挿入して、その内容に基づいて回答させる手法です。ここで目指すのは、小さなコマンドラインツールです。1つのスクリプトがドキュメントのフォルダをインデックス化し、もう1つのスクリプトが質問を読み取り、ChromaDBで最も近い5つの箇所を検索して、質問とともにOllama経由でMistralモデルに渡します。そして、回答を表示し、その後に参照したファイルを表示します。何もマシンの外には出ません。Ollamaが生成モデルと埋め込みモデルを提供し、ChromaDBがベクトルをローカルフォルダに保存します。
「Mistral」には二つの意味があります。Mistral AI のオープンウェイトモデル(自分でダウンロードして実行するもの、本ガイドの対象)と、同社がホスティングする API(テキストを同社のサーバーに送信するもの)です。機密文書の場合、「100 % ローカル」の要件を満たすのは前者のみです。
#RAGにはどのMistralモデルを選ぶべきか
あなたのドキュメント、あなたのAI:あなたのPDF、メモ、メールを扱う信頼性の高いローカルRAG。何もクラウドに送信しません。
- 永久に利用できるオンラインスペース
- PDF + ファイル
- 生涯アップデート
RAG には特有の要件があります。モデルは厳密な指示(「提示された文章だけを根拠に回答する」)に従い、複数の文章を混同せずに読み、フランス語で回答する必要があります。自由な会話の場合に比べて、モデルのサイズの重要性は低くなります。一方、コンテキストに使えるメモリの重要性は高くなります。以下のサイズは、Ollama ライブラリにデフォルトの量子化で表示されるものです。
| モデル | Ollamaでのサイズ | 公表されているコンテキスト長 | 対象者 |
|---|---|---|---|
| ministral-3:3b | 3.0 GB | 256K | 専用GPUのないマシン向け。簡単な応答に適しており、複雑な指示への対応力は低い |
| ministral-3:8b | 6.0 GB | 256K | VRAM 8~12 GB のグラフィックスカード、またはメモリ16 GB のノート PC 向けの無難な標準選択 |
| ministral-3:14b | 9.1 GB | 256K | 16GBのカード、または中程度のコンテキストを想定した12GBのカード |
| mistral-nemo (12B) | Ollamaのページを見る | 128K | より古く、まだ広く使われている代替手段 |
| mistral-small3.2:24b | 15 GB | 128K | 24GBのGPUカードまたは32GB以上の統合メモリが必要です。フォーマットの指示に対して最も安定しています |
| mistral (7B, バージョン 0.3) | 4.4 GB | 32K | 古いモデル:リソースが非常に限られたマシンに用途を限定 |
Ministral 3ファミリー(3B、8B、14B)は、Mistral 3の発表に記載されているとおり、Apache 2.0ライセンスで公開されています。Ollamaのページでは、エッジ環境への導入を想定して設計され、幅広いハードウェアで動作すると説明されています。2026年に公開されたMistral Small 4は、Hugging Faceのモデルページ名によると総パラメータ数が1,190億で、サーバー向けのハードウェアを対象としています。個人用マシンで使う候補にはなりません。必要なメモリ量の目安を知るには、当サイトのVRAM計算ツールで、モデル本体のメモリ使用量とコンテキストキャッシュの合計を確認できます。
#技術スタック
- 生成
- Ollamaがポート11434のローカルHTTP API経由で提供するMistralモデル。
- Embeddings
- bge-m3 を Ollama で提供: ライブラリのページでは、BAAI による多用途・多言語・多粒度の 567M パラメータモデルとして説明されています。PyTorch と sentence-transformers のインストールを回避できます。
- ベクトルデータベース
- ChromaDB のローカルモード(PersistentClient):フォルダ 1 つ、サーバーなし。Chroma は、Ollama の埋め込み API を呼び出す OllamaEmbeddingFunction というラッパーを提供しています。
- ファイルの読み込み
- テキストを含むPDFにはpypdfを使い、Markdownとプレーンテキストは直接読み込みます。スキャンされたPDFは画像なので、まず文字認識が必要です。
#環境の準備
- 01Ollamaをインストールし、モデルを取得するOllama をインストールし、以下の2つのコマンドで生成モデルと埋め込みモデルをダウンロードしてください。
- 02Python環境を構築Python 3.10 以上。仮想環境はプロジェクトの依存関係を分離して管理します。
- 03ドキュメントを配置するPDF、Markdownファイル、テキストファイルを、スクリプトと同じ場所にあるdocs/フォルダにコピーしてください。
#2. ChromaDBにドキュメントをインデックス化
スクリプトは各ファイルを読み込み、段落の区切りでテキストを約1,800文字の文章断片に分割して、Chromaに渡します。ChromaはOllama経由でbge-m3を呼び出し、ベクトルを計算します。重要なのは2点です。各断片には出典を引用できるようにファイル名をメタデータとして保持し、追加処理は断片を1つずつではなく、バッチ単位で行います。
ファイル名と文章の区切りごとの番号から作成した識別子を使ってupsertを行うことで、スクリプトを再実行できます。同じフォルダを再インデックスしても、文章の各部分は重複して追加されず、更新されます。ただし、ドキュメントが短くなると、余分になった古い部分がデータベースに残る点に注意してください。大きな変更を加えた場合は、chroma_dbフォルダを削除して再インデックスしてください。文章を区切る際の長さの選び方は、チャンキング戦略のガイドで詳しく説明しています。
#3. 質問:検索後に生成
2番目のスクリプトは質問を組み込み、最も近い5つの文章部分を取得して、プロンプトを組み立てます。プロンプト内の指示が決め手です。取得した文章部分だけに基づいて回答し、情報が不足している場合はその旨を認め、ファイルを引用するよう求めます。num_ctxパラメータはコンテキストウィンドウを拡大します。Ollamaのドキュメントによると、デフォルトのウィンドウは4,096トークンで、OLLAMA_CONTEXT_LENGTH変数またはnum_ctxパラメータで変更できます。400〜500トークンの文章部分が5つあり、さらに指示と回答も含めると、4,096トークンではぎりぎりです。コンテキストウィンドウが短すぎると、警告なしに内容が切り捨てられ、モデルは文章部分の末尾を読まないまま回答してしまいます。
#モデルのせいにする前に、ChromaDBが返す内容を確認する
回答の質が悪い場合、原因は検索かモデルのどちらかにあります。検索で適切なパッセージを取得できなかったか、モデルがそのパッセージを適切に利用できなかったかです。モデルを呼び出さずに、検索で取得したパッセージとそれぞれの距離を表示すれば、両者を区別できます。適切なパッセージが上位5件に含まれていなければ、チャンクの分割方法を変えるか、キーワード検索またはリランカーを追加してください。適切なパッセージが含まれているのに回答が誤っている場合は、プロンプト、切り詰められたコンテキスト、またはモデルが原因です。結論を出す前に、一段大きなモデルを試してください。
#メモリ容量の配分:同時にメモリに収める必要があるもの
RAGでは、生成用モデルとベクトル計算用モデルの2つに加え、生成用モデルのコンテキストキャッシュも共存します。Ollamaは各モデルを必要に応じて読み込み、一方をアンロードしてもう一方のために空きを確保することがあります。メモリに余裕がないと、この切り替えのたびに遅延が生じます。表は3つの構成について、おおよその規模を示しています。モデルの容量はOllamaライブラリの値を使用し、それ以外は当サイトのVRAM計算機で精度を高める必要がある計算値です。
| 構成 | 生成モデルのサイズ | 追加項目 | 対象カード |
|---|---|---|---|
| ministral-3:8b + bge-m3 | 6.0 GB | コンテキストキャッシュ、埋め込みモデル(5億6,700万パラメータ、半精度では1GB強)、システムマージン | 8〜12GB |
| ministral-3:14b + bge-m3 | 9.1 GB | 同様です。12 GBでは、長いコンテキストが制約要因になります | 12から16 GB |
| mistral-small3.2:24b + bge-m3 | 15 GB | 同上。十分な余裕を見込む | 24 GB以上 |
#的外れな回答につながる落とし穴
- デフォルトのコンテキスト長が短すぎる
- 上記を参照してください。num_ctxの値を引き上げないと、最後の部分が切り捨てられます。典型的な症状は、ChromaDBが正しい回答を取得しているにもかかわらず、モデルがその回答を見つけられないと言うことです。
- スキャンされたPDFファイル
- pypdfは、すでに含まれているテキストしか読み取れません。スキャン文書では空の結果が返され、その旨をスクリプトが表示します。まず、Tesseractのガイドで説明しているOCR処理を文書に施してください。
- 文脈なしの記述
- 元の文書から切り離された一節(「期間は30日です」)だけでは、何について述べているのか分かりません。各抜粋の先頭に、文書のタイトルまたはセクション名を付けてください。
- ドキュメント内に答えがない質問
- 「そのことをはっきり伝えてください」という指示がなければ、モデルは自分の知識で情報の空白を埋めます。ファイルに答えが含まれていない質問を必ず試してください。
- 識別子および正確な用語
- 契約番号や案件番号は、埋め込みによる検索ではうまく見つかりません。ハイブリッド検索のガイドで説明しているように、キーワード検索を追加してください。
#さらに詳しく
| 改善点 | 労力 | 実施すべきタイミング |
|---|---|---|
| 取得するパッセージ数(k)を5から8に増やす | 1行 | 回答に必要な情報が複数の文章に分散している |
| 段落単位ではなく見出し単位でチャンクに分割 | 中程度 | 構造化された文書(ドキュメント類、条文立ての契約書) |
| BM25とベクトル検索を組み合わせたハイブリッド検索 | 中程度 | 識別子、略語、固有名詞による質問 |
| Reranker (bge-reranker-v2-m3) | 中程度 | 正しい回答は取得されていますが、5番目以降に並びます |
| チャットインターフェース (Open WebUI、FastAPI API) | 状況による | 他の人々がこのツールを使用する必要があります |
| 定期的なバックアップと再インデックス化 | 少ない | ドキュメントフォルダは毎週更新されます |
各改善方法には、それぞれ専用のガイドがあります。手法を積み重ねるよりも、実際の質問30~50問を使って、改善の前後で再現率を測定してください。コードを書かずに使える完成済みのインターフェースを希望する場合は、コードを書かないRAGのガイドでOpen WebUIとAnythingLLMを紹介しています。
#Mistralを使ったRAGに関するよくある質問
ローカルRAGには、どのMistralモデルが適していますか?+
Ollamaはsentence-transformersの代わりにエンベディングを計算できますか?+
文書に答えがあるのに、なぜモデルは答えが見つからないと言うのですか?+
MistralのAPIをOllamaの代わりに使うことは可能ですか?+
全体を再インデックスせずに、新しいドキュメントを追加するにはどうすればよいですか?+
このRAGにはGPUが必要ですか?+
- ChromaDBとOllamaによるローカルRAG:Pythonチュートリアル
- チャンキング戦略
- BM25とベクトル検索を組み合わせたハイブリッド検索
- パイプラインにリランカーを追加する
- VRAM計算機
- Ollamaでコーディング不要のローカルRAG
- 出典:Ollama、ministral-3
- ソース:Ollama、mistral-small3.2
- 出典:Ollama、bge-m3
- 出典:Chroma、Ollamaの埋め込み
- 出典:Ollama FAQ、コンテキストウィンドウ
ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。