Ollama: 第1段階総合練習
第1段階総合練習は、最初の5レッスンの学習成果を検証する実践チェックポイント——ゼロセットアップからAPI呼び出しまで、一気に貫く。
💡 ヒント: この実践レッスンは最初の5レッスンと密接に関連している。順番に習得することを推奨:インストールと設定(レッスン2)、CLI基本操作(レッスン3)、モデル管理(レッスン4)、REST API(レッスン5)をマスターしてから総合練習に戻ること。先飛ばしは避ける——見慣れない概念やコマンドに遭遇する可能性がある。
📋 前提条件: まず以下を習得していること
- レッスン1: ローカルAIの概念と環境概要
- レッスン2: Ollamaのインストールと環境設定
- レッスン3: CLI基本操作
- レッスン4: モデル管理
- レッスン5: REST APIの基礎
1. 学べること
- エンドツーエンドのデプロイフルワークフローの実践
- Shellスクリプトによるモデル応答品質の一括テスト
- curlを使ったシンプルなチャットボット構築
- AliceのローカルPoC実現性検証手法
- 自己評価と第2段階への準備方向
2. スタートアップCTOのリアルな事例
ℹ️ 情報: PoC(Proof of Concept)の目的は「実現可能性の検証」であり、「完璧な実行」ではない。最速でコアパイプラインが動くことを証明すれば、チームの信頼と予算を得られる。PoC段階でモデル精度やコード品質にこだわらないこと。
⚠️ 警告: エンドツーエンドのPoC検証時、APIレイテンシへの「コールドスタート」効果に必ず注意——最初のリクエストはモデルのロードが必要(5〜30秒)、その後のリクエストが真の推論レイテンシを反映する。まずウォームアップリクエストを送信し、そこから計測を開始すること。
(1) ペインポイント:理論だけではチームを納得させられない
Aliceは最初の5レッスンを完了したが、チームはまだローカルAIに疑問を持っていた:「本当に動くの?品質は十分?」予算を得てGPUサーバーを導入するには、エンドツーエンドのPoCでローカルAIの実現可能性を証明する必要がある。
(2) ソリューション:30分のエンドツーエンドPoC
インストールからインタラクティブなカスタマーサービスプロトタイプまで、Aliceは30分でフルパイプライン検証を完了:
BASH
# Step 1: Install
curl -fsSL https://ollama.com/install.sh | sh
# Step 2: Pull model
ollama pull qwen2.5
# Step 3: API test
curl http://localhost:11434/api/chat -d '{
"model": "qwen2.5",
"messages": [{"role": "user", "content": "Hello"}],
"stream": false
}'
3. 練習1:エンドツーエンドフルワークフロー
ℹ️ 注: エンドツーエンド検証の核心目標は「パイプラインが動くことを証明する」こと——インストールからAPI呼び出しまで、すべてのステップが成功する。この段階でモデル出力品質を追求しないこと;それは後の最適化の課題。まず最小モデル(3B)で迅速検証——大規模モデルでデバッグするよりはるかに効率的。
💡 ヒント: エンドツーエンドPoCの鍵は「迅速に実現可能性を検証する」ことであり、完璧ではない。まず最小モデル(3B)でパイプラインの動作を検証し、その後ターゲットモデルに切り替えて品質テストを行う。いきなり大規模モデルをプルするよりはるかに効率的。
(1) ゼロからAPI呼び出しまで
以下のステップを順に完了し、各ステップを検証してから次に進む:
flowchart LR
A[Ollamaインストール] --> B[サービス確認]
B --> C[モデルプル]
C --> D[CLIテスト]
D --> E[REST APIテスト]
E --> F[スクリプト統合]
| ステップ | アクション | 検証コマンド |
|---|---|---|
| 1 | Ollamaのインストール | ollama --version |
| 2 | サービス起動確認 | curl http://localhost:11434/api/tags |
| 3 | qwen2.5のプル | ollama pull qwen2.5 |
| 4 | CLIインタラクションテスト | ollama run qwen2.5 "Hello" |
| 5 | REST APIテスト | curlで/api/chatを呼び出し |
| 6 | スクリプト統合テスト | Shellスクリプトで一括呼び出し |
(2) ▶ サンプル:エンドツーエンド検証スクリプト
BASH
#!/bin/bash
# End-to-end verification script
set -e
echo "=== Step 1: Verify Installation ==="
ollama --version
echo "=== Step 2: Verify Service ==="
curl -s http://localhost:11434/api/tags | python3 -m json.tool > /dev/null
echo "Service is running."
echo "=== Step 3: Pull Model ==="
ollama pull qwen2.5
echo "=== Step 4: CLI Test ==="
ollama run qwen2.5 "Say hello in one sentence"
echo "=== Step 5: REST API Test ==="
curl -s http://localhost:11434/api/chat -d '{
"model": "qwen2.5",
"messages": [{"role": "user", "content": "Hello"}],
"stream": false
}' | python3 -c "import sys,json; print('API works:', json.load(sys.stdin)['message']['content'][:50])"
echo "=== All Steps Passed ==="
出力:
TEXT
I'm a helpful AI assistant running locally on your machine...
4. 練習2:モデル応答品質の一括テスト
(1) 異なるパラメータ数モデル間の出力比較
同じ質問セットで異なるモデルをテストし、速度と品質を評価:
| テスト項目 | 3Bモデル | 8Bモデル | 埋め込みモデル |
|---|---|---|---|
| 応答速度 | 高速(30+ tok/s) | 中程度(15-20 tok/s) | 高速(ベクトルのみ) |
| 中国語品質 | 基本的に使用可能 | 流暢で自然 | 該当なし |
| 推論能力 | 単純タスク | 中程度の複雑さ | 該当なし |
| リソース使用量 | 4GB RAM | 8GB RAM | 300MB RAM |
(2) ▶ サンプル:モデル品質一括比較
BASH
#!/bin/bash
# Batch test different models with the same questions
QUESTIONS=(
"What is the return policy for electronics?"
"Translate to French: Free shipping on orders over $50"
"Write a SQL query to find top 10 customers by revenue"
)
MODELS=("llama3.2:3b" "llama3.1:8b" "qwen2.5:7b")
for model in "${MODELS[@]}"; do
echo "=== Model: $model ==="
for q in "${QUESTIONS[@]}"; do
echo "Q: $q"
start=$(date +%s%N)
response=$(curl -s http://localhost:11434/api/chat -d "{
\"model\": \"$model\",
\"messages\": [{\"role\": \"user\", \"content\": \"$q\"}],
\"stream\": false,
\"options\": {\"temperature\": 0.3}
}" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['message']['content'][:100])")
end=$(date +%s%N)
elapsed=$(( (end - start) / 1000000 ))
echo "A: ${response}..."
echo "Time: ${elapsed}ms"
echo ""
done
done
出力:
TEXT
{"status":"ok","data":{}}
5. 練習3:curlチャットボットスクリプト
(1) インタラクティブチャットスクリプト設計
Shellスクリプトでシンプルなチャットボットを実装し、会話履歴を手動で管理:
flowchart TD
A[セッション開始] --> B[ユーザー入力読み取り]
B --> C{入力 == /quit?}
C -->|はい| D[終了]
C -->|いいえ| E[Messages配列に追加]
E --> F[/api/chatを呼び出し]
F --> G[レスポンス出力]
G --> H[レスポンスをMessagesに追加]
H --> B
(2) ▶ サンプル:インタラクティブチャットボット
BASH
#!/bin/bash
# Simple interactive chatbot using curl
API="http://localhost:11434/api/chat"
MODEL="qwen2.5"
MESSAGES='[{"role":"system","content":"You are a helpful assistant. Be concise."}]'
echo "ChatBot (type /quit to exit)"
echo "--------------------------------"
while true; do
read -p "You: " input
if [ "$input" = "/quit" ]; then
echo "Goodbye!"
break
fi
# Append user message
MESSAGES=$(echo "$MESSAGES" | python3 -c "
import sys, json
msgs = json.load(sys.stdin)
msgs.append({'role': 'user', 'content': '$input'})
print(json.dumps(msgs))
")
# Call API
response=$(curl -s "$API" -d "{
\"model\": \"$MODEL\",
\"messages\": $MESSAGES,
\"stream\": false,
\"options\": {\"temperature\": 0.5}
}")
# Extract and print response
content=$(echo "$response" | python3 -c "import sys,json; print(json.load(sys.stdin)['message']['content'])")
echo "Bot: $content"
# Append assistant response
MESSAGES=$(echo "$MESSAGES" | python3 -c "
import sys, json
msgs = json.load(sys.stdin)
msgs.append({'role': 'assistant', 'content': '''$content'''})
print(json.dumps(msgs))
")
echo ""
done
出力:
TEXT
{"status":"ok","data":{}}
6. AliceのローカルPoC実現性検証
(1) PoC評価項目
| 項目 | チェック内容 | 目標 |
|---|---|---|
| 機能性 | 一般的な質問に正しく回答できる | 精度 > 80% |
| レイテンシ | 初回トークン応答時間 | < 500ms |
| スループット | 1分あたりの処理リクエスト数 | > 10 req/min |
| コスト | ハードウェア投資とクラウド削減額の比較 | 6ヶ月以内に損益分岐 |
| プライバシー | データがローカルを離れるか | 0漏洩 |
(2) ▶ サンプル:PoCパフォーマンスベンチマークスクリプト
BASH
#!/bin/bash
# Quick PoC benchmark for local AI
API="http://localhost:11434/api/chat"
MODEL="qwen2.5"
REQUESTS=10
echo "=== Local AI PoC Benchmark ==="
echo "Model: $MODEL"
echo "Requests: $REQUESTS"
echo ""
total_time=0
total_tokens=0
for i in $(seq 1 $REQUESTS); do
start=$(date +%s%N)
response=$(curl -s "$API" -d "{
\"model\": \"$MODEL\",
\"messages\": [{\"role\": \"user\", \"content\": \"Explain the return policy briefly\"}],
\"stream\": false,
\"options\": {\"temperature\": 0.3}
}")
end=$(date +%s%N)
elapsed_ms=$(( (end - start) / 1000000 ))
tokens=$(echo "$response" | python3 -c "import sys,json; print(json.load(sys.stdin).get('eval_count', 0))")
total_time=$((total_time + elapsed_ms))
total_tokens=$((total_tokens + tokens))
echo "Request $i: ${elapsed_ms}ms, ${tokens} tokens"
done
avg_time=$((total_time / REQUESTS))
avg_tokens=$((total_tokens / REQUESTS))
tput=$((total_tokens * 1000 / total_time))
echo ""
echo "=== Results ==="
echo "Avg latency: ${avg_time}ms"
echo "Avg tokens: ${avg_tokens}"
echo "Throughput: ${tput} tokens/s"
echo "Target met: $([ $avg_time -lt 5000 ] && echo 'YES' || echo 'NO')"
出力:
TEXT
{"status":"ok","data":{}}
(3) ▶ サンプル:自己評価チェックリスト検証
BASH
#!/bin/bash
# Phase 1 self-assessment checklist
echo "=== Phase 1 Self-Assessment ==="
echo ""
checks=0
total=6
# Check 1: Ollama installed
if command -v ollama &> /dev/null; then
echo "[PASS] Ollama is installed"
((checks++))
else
echo "[FAIL] Ollama is not installed"
fi
# Check 2: Service running
if curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then
echo "[PASS] Ollama service is running"
((checks++))
else
echo "[FAIL] Ollama service is not running"
fi
# Check 3: At least one model available
model_count=$(ollama list 2>/dev/null | tail -n +2 | wc -l)
if [ "$model_count" -gt 0 ]; then
echo "[PASS] $model_count model(s) available"
((checks++))
else
echo "[FAIL] No models pulled"
fi
# Check 4: CLI interaction works
if ollama run llama3.2 "test" > /dev/null 2>&1; then
echo "[PASS] CLI interaction works"
((checks++))
else
echo "[FAIL] CLI interaction failed"
fi
# Check 5: REST API responds
if curl -s http://localhost:11434/api/generate -d '{"model":"llama3.2","prompt":"hi","stream":false}' > /dev/null 2>&1; then
echo "[PASS] REST API responds"
((checks++))
else
echo "[FAIL] REST API not responding"
fi
# Check 6: Streaming works
if curl -s http://localhost:11434/api/chat -d '{"model":"llama3.2","messages":[{"role":"user","content":"hi"}]}' | grep -q '"done":true'; then
echo "[PASS] Streaming API works"
((checks++))
else
echo "[FAIL] Streaming API failed"
fi
echo ""
echo "Score: $checks / $total"
if [ "$checks" -eq "$total" ]; then
echo "✅ Ready for Phase 2!"
else
echo "⚠️ Review failed items before proceeding."
fi
出力:
TEXT
I'm a helpful AI assistant running locally on your machine...
7. 総合サンプル:完全なエンドツーエンド検証ワークフロー
BASH
#!/bin/bash
# ============================================
# Comprehensive: Full Phase 1 E2E workflow
# Install → Configure → Pull → Test → Report
# ============================================
set -e
REPORT="phase1_report_$(date +%Y%m%d_%H%M%S).txt"
echo "Phase 1 E2E Workflow" | tee "$REPORT"
echo "====================" | tee -a "$REPORT"
echo "" | tee -a "$REPORT"
# Step 1: Install verification
echo "## Installation" | tee -a "$REPORT"
echo "Ollama: $(ollama --version 2>&1)" | tee -a "$REPORT"
echo "OS: $(uname -s) $(uname -m)" | tee -a "$REPORT"
echo "RAM: $(free -g | awk '/^Mem:/{print $2}')GB" | tee -a "$REPORT"
if command -v nvidia-smi &> /dev/null; then
echo "GPU: $(nvidia-smi --query-gpu=name --format=csv,noheader)" | tee -a "$REPORT"
else
echo "GPU: CPU-only mode" | tee -a "$REPORT"
fi
echo "" | tee -a "$REPORT"
# Step 2: Pull SupportBot model stack
echo "## Model Stack" | tee -a "$REPORT"
ollama pull qwen2.5 2>&1 | tail -1 | tee -a "$REPORT"
ollama pull llama3.2:3b 2>&1 | tail -1 | tee -a "$REPORT"
ollama pull nomic-embed-text 2>&1 | tail -1 | tee -a "$REPORT"
echo "" | tee -a "$REPORT"
# Step 3: Quality test with 3 questions
echo "## Quality Test" | tee -a "$REPORT"
questions=(
"What is your return policy?"
"How do I track my order?"
"Do you ship internationally?"
)
for q in "${questions[@]}"; do
echo "Q: $q" | tee -a "$REPORT"
answer=$(curl -s http://localhost:11434/api/chat -d "{
\"model\": \"qwen2.5\",
\"messages\": [{\"role\": \"system\", \"content\": \"You are an e-commerce support agent. Be concise.\"},
{\"role\": \"user\", \"content\": \"$q\"}],
\"stream\": false,
\"options\": {\"temperature\": 0.3}
}" | python3 -c "import sys,json; print(json.load(sys.stdin)['message']['content'][:120])")
echo "A: $answer" | tee -a "$REPORT"
echo "" | tee -a "$REPORT"
done
# Step 4: Performance benchmark
echo "## Benchmark" | tee -a "$REPORT"
start=$(date +%s%N)
curl -s http://localhost:11434/api/chat -d '{
"model": "qwen2.5",
"messages": [{"role": "user", "content": "Hello"}],
"stream": false
}' > /dev/null
end=$(date +%s%N)
latency=$(( (end - start) / 1000000 ))
echo "Single request latency: ${latency}ms" | tee -a "$REPORT"
echo "Target < 5000ms: $([ $latency -lt 5000 ] && echo PASS || echo FAIL)" | tee -a "$REPORT"
echo "" | tee -a "$REPORT"
echo "Report saved: $REPORT"
❓ よくある質問
Q エンドツーエンドスクリプトが途中で失敗したらどうする?
A 各ステップを個別に検証する。まず
ollama --version、次にcurl localhost:11434/api/tagsで段階的にトラブルシュート。問題の90%はサービス未起動かモデル未プル。Q 一括テストでモデルのロードが遅い場合、どうすればいい?
A 最初の呼び出しはモデルのメモリロード(コールドスタート)が必要。
OLLAMA_KEEP_ALIVE=30mを設定してモデルをメモリに保持すると、その後のリクエストは数秒で応答する。Q チャットボットスクリプトの会話履歴が長くなりすぎたらどうする?
A messages配列が増大するとコンテキストウィンドウを消費する。スライディングウィンドウの実装を推奨——直近10ターンのみ保持し、古いものを破棄。または定期的に要約・圧縮。
Q PoCベンチマーク結果がばらつく場合、どうすればいい?
A 最初のリクエストにはモデルロード時間(コールドスタートバイアス)が含まれる。最初の2リクエストを破棄し、その後の10リクエストの平均を取ることを推奨。テスト中は他の負荷がないことを確認。
Q 第2段階に進むためにどの前提知識が必要?
A Pythonの基礎(関数、クラス、async/await)、HTTP API呼び出しの経験、Dockerの基本概念。レッスン7からPython SDKが始まる;事前にPythonに慣れておくことを推奨。
Q 第2段階に進む準備ができているかどうする?
A 自己評価チェックリスト6/6項目を完了し、curlでマルチターン対話スクリプトを独力で構築できれば、第2段階への準備完了。
📖 まとめ
- エンドツーエンドワークフロー:インストール → サービス確認 → モデルプル → CLIテスト → API呼び出し → スクリプト統合
- 一括テストで異なるモデルの応答品質と速度を比較可能
- curlチャットボットはREST APIを理解する最良の実践方法
- PoC検証は5つの項目に注目:機能性、レイテンシ、スループット、コスト、プライバシー
- 自己評価チェックリストで各スキルを確実に習得
- 第2段階ではPython SDK、Modelfile、GPU高速化などのコア機能をカバー
📝 練習問題
- 基本(難易度 ⭐):エンドツーエンド検証スクリプトの各ステップを完了し、すべてパスすることを確認し、結果のスクリーンショットを保存する。
- 中級(難易度 ⭐⭐):モデル品質一括比較スクリプトを実行し、3つの異なるモデルを選択し、応答時間と品質スコアを記録し、簡単な分析レポートを作成する。
- 上級(難易度 ⭐⭐⭐):AliceのSaaS企業向けに完全なPoC検証を実施——ベンチマークスクリプトを作成し、レイテンシとスループットデータを記録し、12ヶ月のコスト比較を計算し、実現性レポートを出力する。