0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ollama × RAG 実装編

Last updated at Posted at 2025-11-13

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 インストール

https://ollama.ai/download

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 と併用することで本番稼働もスムーズになる
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?