
この記事では、Ollamaで埋め込み(Embedding)モデルを使い、Python + Chroma DBでベクトル検索やRAGに応用する方法を試してみます。
前回の記事ではChroma DB内部の埋め込み計算を利用しましたが、Ollamaを活用すれば外部モデルの管理が楽になります。
本記事を読むことで、ローカル環境でOllamaのEmbeddingモデルを動かし、Chroma DBにベクトルを保存・検索する基本パイプラインが構築できます。
OllamaのEmbeddingモデルとは
OllamaはLLM実行環境で、Embeddingに特化した軽量モデルも提供しています。
Embeddingとはテキストを数値ベクトルに変換する処理で、類似度検索やRAG(Retrieval-Augmented Generation)に使います。
Ollama公式でもEmbeddingのサポートがあり、CLI・Python・REST APIから呼び出せます。 Embedding models · Ollama Blog
公式ドキュメントでは推奨モデルとして embeddinggemma、qwen3-embedding、all-minilm などが紹介されています。
ここではコンテキスト長に余裕のあるnomic-embed-textを例にとって説明します。
まずはローカルのOllamaにEmbeddingモデルをダウンロードします。ターミナルで次のようにします
例では nomic-embed-text を使いますが、違うモデルを試す場合は適宜読み替えてください。
ollama pull nomic-embed-text
Ollamaのembeddingモデルを使って、Chroma DBの検索を実行してみましょう。
Embeddingモデルを準備する
下記はPythonでOllamaとChroma DBを連携させる例です。
ポイントは2つで、コレクション生成時の埋め込みをOllamaで計算しておくことと、検索時にもOllama経由で埋め込みを計算してChroma DBの検索に用いることです。ここが理解できればコーディング自体は難しくはありません。
import ollama
import chromadb
from chromadb.config import Settings
# Ollamaクライアントの初期化
ollama_client = ollama.Client()
# Chroma DB の初期化
chroma_client = chromadb.Client(Settings())
collection = chroma_client.get_or_create_collection(name="sample_texts")
texts = [
"大吉:今日は新しい挑戦が実を結びやすい日です。思い切った行動が良い流れを呼び込みます。",
"大吉:迷っていた決断に追い風が吹きます。直感を信じて動くと成果につながります。",
"大吉:周囲の協力を得やすい運気です。積極的に声をかけると道が開けます。",
テストデータを列挙...
]
# コレクションにデータを追加(IDと埋め込みを明示的に指定)
if texts:
ids = [f"doc_{i}" for i in range(len(texts))]
embed_resp = ollama.embed(model="nomic-embed-text", input=texts)
collection.add(documents=texts, ids=ids, embeddings=embed_resp.embeddings)
# 検索クエリ
query = "大吉"
# クエリの埋め込みを作成して類似検索
q_embed_resp = ollama.embed(model="nomic-embed-text", input=query)
query_embedding = q_embed_resp.embeddings[0]
results = collection.query(
query_embeddings=[query_embedding],
n_results=2
)
print(query)
for doc in results.get("documents", [[]])[0]:
print(doc)
大吉
大吉:周囲の協力を得やすい運気です。積極的に声をかけると道が開けます。
吉:計画通りに物事が進みやすい日です。基本を大切にしましょう。
「大吉」が含まれる文章が類似度順に返されましたが。「吉」が含まれてしまっています。
恐らく「大」「吉」と分けて解釈されているためで、実用時はテキスト処理のチューニングが必要です。
Chrom DB付属の例との違い
前回の記事の例は、Chromaが内部で用意したEmbeddingモデルをそのまま利用する構成でした。
Chromaはデフォルトで`all-MiniLM-L6-v2`を使います。
一方、今回のOllama Embeddingを使う構成では、Embedding生成をLLMランタイム側(Ollama)に明示的に切り出し、モデル選択や再利用を制御できる点が違いです。
その結果、RAG全体をローカルLLM基盤として統一しやすく、将来的なモデル差し替えや精度調整が容易になります。
まとめ
この記事では、OllamaのEmbeddingモデルをPythonから利用し、Chroma DBでベクトル検索を行う方法を解説しました。
Chroma DBから外部Embeddingモデルを活用することで、RAGや類似度検索の精度向上が期待でき管理も楽になります。
前回の記事で紹介したRAGの全体構成に、このEmbeddingモデルを組み込むことで、より高度な情報検索と生成を試してみてください。



