Ollama: 第1段階総合練習

第1段階総合練習は、最初の5レッスンの学習成果を検証する実践チェックポイント——ゼロセットアップからAPI呼び出しまで、一気に貫く。

💡 ヒント: この実践レッスンは最初の5レッスンと密接に関連している。順番に習得することを推奨:インストールと設定(レッスン2)、CLI基本操作(レッスン3)、モデル管理(レッスン4)、REST API(レッスン5)をマスターしてから総合練習に戻ること。先飛ばしは避ける——見慣れない概念やコマンドに遭遇する可能性がある。

📋 前提条件: まず以下を習得していること

1. 学べること


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呼び出しまで

以下のステップを順に完了し、各ステップを検証してから次に進む:

100%
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スクリプトでシンプルなチャットボットを実装し、会話履歴を手動で管理:

100%
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段階への準備完了。

📖 まとめ


📝 練習問題

  1. 基本(難易度 ⭐):エンドツーエンド検証スクリプトの各ステップを完了し、すべてパスすることを確認し、結果のスクリーンショットを保存する。
  2. 中級(難易度 ⭐⭐):モデル品質一括比較スクリプトを実行し、3つの異なるモデルを選択し、応答時間と品質スコアを記録し、簡単な分析レポートを作成する。
  3. 上級(難易度 ⭐⭐⭐):AliceのSaaS企業向けに完全なPoC検証を実施——ベンチマークスクリプトを作成し、レイテンシとスループットデータを記録し、12ヶ月のコスト比較を計算し、実現性レポートを出力する。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%