RAG(Retrieval-Augmented Generation)は、
GPT-4o / Azure OpenAI でも、Llama / Qwen / Mistral でも共通して使われる手法 です。
Ollama を使う最大の理由は、
- APIコストゼロで高速反復
- モデル比較が自由(Llama/Qwen/Mistral/BGEなど)
- 完全ローカルで動く
- 大量のテストが可能
という点で、
RAGのプロトタイプ開発において圧倒的に強い からです。
🧱 1. RAG 全体アーキテクチャ(Ollama版)
[ローカルのドキュメント群]
|
(Embedding)
|
[Chroma / Milvus / Qdrant]
|
(Retriever)
|
(LLM: Ollama)
|
[生成された回答]
クラウド運用でも同じ構成ですが、
全ステップがローカルで完結 するのがOllamaの強み。
🧪 2. 使用する技術スタック
- Ollama(ローカルLLM)
- ChromaDB(ローカルで使えるベクターDB)
- LlamaIndex(RAGの実装が最も簡単)
- LangChain(チェーン制御のため)
- Embeddingモデル:bge-small / bge-large をOllamaで動かす
🛠 3. 実装(1):環境構築
1. Ollama インストール
2. 必要パッケージ
pip install llama-index chromadb langchain python-dotenv
3. Embedding & LLM の準備
まず Qwen2 や Llama3 を落とす。
ollama pull qwen2
ollama pull llama3
ollama pull bge-m3
Embedding も LLM も全部ローカル。
🧩 4. 実装(2):Embedding → ベクターDB への格納
ここから 実務に耐えるレベルのコード を書きます。
▼ データ取り込み & Chroma格納
from llama_index import SimpleDirectoryReader
from llama_index.embeddings.ollama import OllamaEmbedding
from llama_index.vector_stores import ChromaVectorStore
from llama_index import StorageContext, VectorStoreIndex
import chromadb
# 1. ドキュメント読み込み
documents = SimpleDirectoryReader("data").load_data()
# 2. Embedding モデルを Ollama で実行
embed_model = OllamaEmbedding(
model_name="bge-m3",
base_url="http://localhost:11434"
)
# 3. Chroma の作成
chroma_client = chromadb.Client()
chroma_collection = chroma_client.create_collection(name="local_rag")
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# 4. ベクター索引作成
index = VectorStoreIndex.from_documents(
documents,
storage_context=storage_context,
embed_model=embed_model
)
index.storage_context.persist()
🔍 5. 実装(3):Retriever を使った RAG 実行
Llama3 や Qwen2 を使う。
from llama_index.llms.ollama import Ollama
llm = Ollama(
model="qwen2",
request_timeout=120,
)
query_engine = index.as_query_engine(
llm=llm,
similarity_top_k=5,
)
response = query_engine.query("DatabricksのDelta LakeのMERGEの内部動作を説明して")
print(response)
🧠 6. LangChain を使った RAG チェーン(LLM評価向け)
LangChain を使うと、
- Retriever
- ChatPromptTemplate
- ReRanker
- Output Parser
などを組み合わせられる。
ここでは最小構成の RAG チェーン。
from langchain_community.chat_models import ChatOllama
from langchain.chains import RetrievalQA
from langchain_community.vectorstores import Chroma
from langchain.prompts import PromptTemplate
llm = ChatOllama(model="llama3")
vectorstore = Chroma(
collection_name="local_rag",
persist_directory="./chroma"
)
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
prompt = PromptTemplate(
input_variables=["context", "question"],
template="""
あなたは優秀なAIアシスタントです。
以下のコンテキストに基づいて、質問に正確に答えてください。
# コンテキスト
{context}
# 質問
{question}
"""
)
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
chain_type_kwargs={"prompt": prompt}
)
ans = qa.run("Delta LakeのMERGE処理の特徴は?")
print(ans)
🔥 7. 実務向けチューニングポイント(上級者だけに必要な話)
RAG では、
Retriever → ReRanker → Generation の三層が最重要。
① Retriever(検索)の改善
- chunk size(300〜1000で調整)
- chunk overlap(50〜200)
- embedding model の選択
- k値(3〜8の比較)
② ReRanker(bge-reranker)を挟む
Ollama で動作可能。
ollama pull bge-reranker
実行例:
reranker = OllamaEmbedding(model_name="bge-reranker")
検索精度が劇的に上がる。
③ LLM の比較
RAG の性能はモデル差で大きく変わるので、
Ollamaは比較実験に最適。
おすすめモデル:
| タスク | モデル |
|---|---|
| RAG | Llama3 8B / Qwen2 7B |
| 数学・推論 | Qwen2 7B / Mistral-Nemo |
| 要約 | Mistral 7B |
| コード | Qwen2 Coder |
📊 8. ベンチマーク(評価ループ)
Ollama は 大量テストが無料でできるので、
RAG の品質検証ループも簡単に作れる。
queries = [
"Delta Lakeとは何か?",
"MERGEの内部動作は?",
"Databricksのストレージレイヤーを説明して"
]
models = ["llama3", "qwen2", "mistral"]
for q in queries:
print("### Query:", q)
for m in models:
llm = ChatOllama(model=m)
ans = qa.run(q)
print(f"[{m}] {ans}")
APIコストがかからないので、
こうした評価ループを1万回実行しても無料。
🖥 9. 実務レベルの構成図:Ollama × RAG × Azure
クラウドとローカルを組み合わせる構成例。
┌──────────────────────────────┐
│ Azure OpenAI(本番・高精度)│
└─────────▲────────────────────┘
│fallback
┌───────────┴───────────┐
│ │
│(高速検証・プロンプト探索) │
┌────────▼────────┐ ┌───────▼─────────┐
│ Ollama LLM │ │ Vector DB (Chroma)│
└────────┬────────┘ └───────┬──────────┘
│ │
└───────────────┬────────────┘
│
┌────────▼─────────┐
│ RAG Orchestrator│
│ (LlamaIndex/LangChain) │
└─────────┬──────────┘
│
┌─────▼─────┐
│ Frontend │
└───────────┘
📌 10. パート3まとめ
🔻 実装編で分かったこと
- Ollama × RAG は 本番前の検証環境として最強
- Embedding も LLM もローカルなので低コスト
- モデル比較が圧倒的にやりやすい
- RAGの精度改善に必要な部分(Retriever/ReRanker/Chunking)が自在
- Azure と併用することで本番稼働もスムーズになる