Ollama: Phase1综合练习
Phase 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 可行性验证方法
- 自我检测与 Phase 2 预习方向
2. 一个初创 CTO 的真实故事
ℹ️ 信息: PoC(Proof of Concept,概念验证)的目标是"验证可行"而非"完美运行"。用最快速度证明核心链路通畅,才能获得团队信任和后续预算。PoC 阶段不要纠结于模型精度或代码质量。
⚠️ 警告: 端到端 PoC 验证时务必检查 API 延迟的"冷启动"效应——首次请求需加载模型(5-30 秒),后续请求才是真实推理延迟。测试时先发一次预热请求,再计时。
(1) 痛点:纸上谈兵难说服团队
Alice 学完了前 5 课,但团队对本地 AI 仍存疑虑:"真的能跑吗?效果够用吗?"她需要用一个端到端的 PoC 证明本地 AI 可行,才有预算采购 GPU 服务器。
(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[Install Ollama] --> B[Verify Service]
B --> C[Pull Model]
C --> D[CLI Test]
D --> E[REST API Test]
E --> F[Script Integration]
| 步骤 | 操作 | 验证命令 |
|---|---|---|
| 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 脚本批量调用 |
▶ 示例 1: 端到端验证脚本
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[Start Session] --> B[Read User Input]
B --> C{Input == /quit?}
C -->|Yes| D[Exit]
C -->|No| E[Append to Messages Array]
E --> F[Call /api/chat]
F --> G[Print Response]
G --> H[Append Response to Messages]
H --> B
▶ 示例 3: 交互式聊天机器人
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% |
| 延迟 | 首 token 响应时间 | < 500ms |
| 吞吐 | 每分钟处理请求数 | > 10 req/min |
| 成本 | 硬件投入 vs 云端节省 | 6 月内回本 |
| 隐私 | 数据是否离开本地 | 0 外泄 |
▶ 示例 4: 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":{}}
▶ 示例 5: 自我检测清单验证
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 每步单独验证。先 ,再 ,逐层排查。90% 的问题是服务未启动或模型未拉取。
Q 批量测试时模型加载很慢怎么办?
A 首次调用需加载模型到内存(冷启动)。设置 让模型驻留内存,后续请求秒级响应。
Q 聊天机器人脚本的对话历史太长怎么办?
A messages 数组增长会消耗上下文窗口。建议实现滑动窗口——保留最近 10 轮对话,更早的丢弃。或定期摘要压缩。
Q PoC 基准测试结果不稳定怎么办?
A 首次请求包含模型加载时间(冷启动偏差)。建议丢弃前 2 次请求,取后续 10 次平均值。确保测试期间无其他负载。
Q Phase 2 需要什么预备知识?
A Python 基础(函数、类、async/await)、HTTP API 调用经验、Docker 基本概念。Lesson 7 开始进入 Python SDK,建议提前熟悉 Python。
Q 如何判断自己是否达到 Phase 2 入门标准?
A 完成自我检测清单 6/6 项,且能独立用 curl 构建一个多轮对话脚本,即可进入 Phase 2。
📖 小节
- 端到端流程:安装 → 服务验证 → 拉模型 → CLI 测试 → API 调用 → 脚本集成
- 批量测试可对比不同模型的响应质量和速度
- curl 聊天机器人是理解 REST API 的最佳实践方式
- PoC 验证关注五个维度:功能、延迟、吞吐、成本、隐私
- 自我检测清单确保每项技能真正掌握
- Phase 2 将进入 Python SDK、Modelfile、GPU 加速等核心功能
📝 作业
- 基础题(难度⭐):完成端到端验证脚本的每一步,确保全部 PASS,截图保存结果。
- 进阶题(难度⭐⭐):运行批量模型质量对比脚本,选择 3 个不同模型,记录响应时间与质量评分,写一份简要分析报告。
- 挑战题(难度⭐⭐⭐):为 Alice 的 SaaS 公司完成完整 PoC 验证——编写基准测试脚本、记录延迟与吞吐数据、计算 12 个月成本对比,输出一份可行性报告文档。