Fine-tuning vs RAG vs Prompt Engineering: How to Choose in 2026【比較ガイド】
LLMをカスタマイズする方法は大きく3つ。でも「どれを使えばいい?」で迷う人が後を絶ちません。本記事では実務視点で完全に整理します。
3つの手法の根本的な違い
Prompt Engineering → モデルを変えず、指示で動作を制御
RAG → 外部知識を検索して文脈に注入
Fine-tuning → モデルの重みそのものを再学習
一目でわかる比較表
| 比較軸 | Prompt Engineering | RAG | Fine-tuning |
|---|---|---|---|
| コスト | 最安(API料金のみ) | 中(ベクトルDB + 検索) | 最高(GPU + データ準備) |
| 実装期間 | 数時間〜1日 | 1〜2週間 | 2〜8週間 |
| 最新情報への対応 | ❌ 不可 | ✅ リアルタイム更新可 | ❌ 再学習が必要 |
| プライベートデータ | △ プロンプトに入れる | ✅ 大規模ドキュメント対応 | ✅ モデルに学習させる |
| 文体・口調の変更 | △ 限定的 | ❌ 効果薄 | ✅ 最も効果的 |
| 幻覚(ハルシネーション) | 多い | 少ない(ソース参照) | 中程度 |
| スケーラビリティ | 高い | 高い | 低い(再学習コスト) |
Prompt Engineering
いつ使うか
✅ これに向いている:
- プロトタイプ・PoC段階
- 既存モデルで十分な品質が出る場合
- タスクが明確で、例示で指示できる
- コストを最小化したい
❌ これには向いていない:
- 独自用語・社内ナレッジが大量にある
- 文体や性格を根本的に変えたい
- コンテキスト長に収まらないデータ
実装例:Few-shot + Chain-of-Thought
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", """あなたはテクニカルサポートの専門家です。
以下のルールを厳守してください:
1. 必ず原因→解決策の順で回答する
2. 専門用語には括弧で説明を加える
3. 確信がない場合は「確認が必要です」と明示する"""),
# Few-shot examples
("human", "APIが500エラーを返します"),
("assistant", """原因:サーバー内部エラー(サーバー側の問題)が発生しています。
解決策:
1. リトライロジック(自動再試行)を3回まで実装してください
2. エラーログでスタックトレース(エラーの発生箇所)を確認
3. 15分後に再試行して問題が継続する場合はサポートにご連絡ください
確認が必要な場合:エラーが1時間以上継続する場合"""),
("human", "{question}")
])
chain = prompt | ChatOpenAI(model="gpt-4o-mini", temperature=0)
response = chain.invoke({"question": "レートリミットエラーが頻発します"})
Advanced Prompting Techniques(2026年版)
# 1. Chain-of-Thought(思考の連鎖)
cot_prompt = "ステップバイステップで考えて答えてください。"
# 2. ReAct パターン(Reasoning + Acting)
react_prompt = """
Thought: [考え]
Action: [実行すること]
Observation: [結果の観察]
... (必要な回数繰り返す)
Answer: [最終回答]
"""
# 3. Self-consistency(複数回生成して多数決)
from collections import Counter
def self_consistent_answer(question: str, n: int = 5) -> str:
llm = ChatOpenAI(model="gpt-4o", temperature=0.7)
answers = [llm.invoke(question).content for _ in range(n)]
return Counter(answers).most_common(1)[0][0]
RAG(Retrieval-Augmented Generation)
いつ使うか
✅ これに向いている:
- 社内ドキュメント・FAQ・マニュアルへの問い合わせ
- 最新ニュースや更新頻度の高い情報
- 回答の根拠(ソース)を示す必要がある
- 数百〜数万ページのドキュメントを扱う
❌ これには向いていない:
- 特定の口調・ペルソナを身につけさせたい
- 推論パターン自体を変えたい
- インターネット接続なしの完全オフライン環境
実装例:シンプルRAG
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import DirectoryLoader
# 社内ドキュメントを読み込み
loader = DirectoryLoader("./company_docs", glob="**/*.md")
docs = loader.load()
# チャンキング
splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=150)
chunks = splitter.split_documents(docs)
# ベクトルDB構築
vectorstore = Chroma.from_documents(
chunks, OpenAIEmbeddings(), persist_directory="./db"
)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
# RAGチェーン
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
template = """社内規定のみを参照して回答してください。
規定に記載がない場合は「規定に記載がありません」と答えてください。
参考文書:
{context}
質問: {question}"""
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| ChatPromptTemplate.from_template(template)
| ChatOpenAI(model="gpt-4o", temperature=0)
)
print(chain.invoke("育児休業の申請手続きを教えてください"))
Fine-tuning
いつ使うか
✅ これに向いている:
- 特定ドメインの専門用語・文体を習得させる
- 医療・法律・金融など高精度が求められる分野
- 一貫したペルソナ(キャラクター)を持たせる
- 同じタスクを大量に処理してコストを下げる(小モデルで代替)
❌ これには向いていない:
- 訓練データが少ない(最低でも数百〜数千サンプル必要)
- 情報が頻繁に更新される(再訓練コストが高い)
- 予算が限られている
実装例:OpenAI Fine-tuning
from openai import OpenAI
import json
client = OpenAI()
# 訓練データの準備(JSONL形式)
training_data = [
{
"messages": [
{"role": "system", "content": "あなたは当社の丁寧なカスタマーサポートです。"},
{"role": "user", "content": "返品したいのですが"},
{"role": "assistant", "content": "ご不便をおかけして誠に申し訳ございません。返品には購入から30日以内であることと、商品が未使用状態であることが条件となります。ご注文番号をお知らせいただけますでしょうか?"}
]
},
# ... 最低500サンプル推奨
]
# JSONL書き出し
with open("training.jsonl", "w", encoding="utf-8") as f:
for item in training_data:
f.write(json.dumps(item, ensure_ascii=False) + "\n")
# アップロード
file = client.files.create(
file=open("training.jsonl", "rb"),
purpose="fine-tune"
)
# ジョブ開始
job = client.fine_tuning.jobs.create(
training_file=file.id,
model="gpt-4o-mini", # 小モデルをFT → コスト削減
hyperparameters={"n_epochs": 3}
)
print(f"Fine-tuning job: {job.id}")
# 完了後: ft:gpt-4o-mini:org:name:xxxxx
組み合わせ戦略(実務では混在が最強)
入力
│
├─ シンプルな質問? → Prompt Engineering のみ(安い・速い)
│
├─ 社内ドキュメント参照が必要? → RAG
│
├─ 特定の口調・専門性が必要? → Fine-tuned Model
│
└─ 複雑なタスク → Fine-tuned Model + RAG + CoT Prompt
(三者を組み合わせた最高精度)
実践的な選択フローチャート
def choose_strategy(task: dict) -> str:
if task["data_size"] == "small" and not task["needs_latest_info"]:
return "prompt_engineering"
if task["needs_latest_info"] or task["large_document_base"]:
if task["needs_custom_style"]:
return "rag + fine_tuned_model"
return "rag"
if task["needs_custom_style"] and task["training_data_available"]:
return "fine_tuning"
return "prompt_engineering" # デフォルト:まずここから
コスト試算(実務ベース)
月間10万クエリを処理する場合:
| 手法 | 初期コスト | 月額ランニング | 合計(6ヶ月) |
|---|---|---|---|
| Prompt Engineering | ¥0 | ¥15,000 | ¥90,000 |
| RAG | ¥50,000 | ¥25,000 | ¥200,000 |
| Fine-tuning | ¥200,000 | ¥8,000 | ¥248,000 |
| RAG + Fine-tuning | ¥250,000 | ¥20,000 | ¥370,000 |
Fine-tuningは長期運用でコストが逆転する:初期投資が高くても、推論コストが安い小モデルに置き換えれば1年後には最安になりうる。
まとめ:2026年の選択基準
- まずPrompt Engineeringを試す(最速・最安)
- 最新情報や大量ドキュメントが必要 → RAGを追加
- 文体・専門性・コスト削減が目的 → Fine-tuningを検討
- 本番環境では組み合わせが最強
460以上のAIエージェントツール・LLMインフラを網羅したAgDex.aiもぜひチェック!
🔍 AIエージェントツールをもっと探す
この記事で紹介したツール以外にも、2026年注目のAIエージェント関連ツールを探したい方は、ぜひ AgDex.ai をご活用ください。
AgDex.ai は、550以上のAIエージェントツール・フレームワーク・LLMプロバイダーをカテゴリ別に整理したキュレーションディレクトリです。
- 🗂️ カテゴリ別検索:コアフレームワーク / エコシステム / LLM / クラウド / ツール
- 🌐 4言語対応:日本語・英語・ドイツ語・スペイン語
- 🔍 フィルター機能:オープンソース/クローズドソース・無料/有料・初心者/上級者
- 🔗 直接リンク:https://agdex.ai
毎週更新中。お気に入りのツールが見つかったらブックマーク & シェアをお願いします!
