Ollama: Phase1综合练习

Phase 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 仍存疑虑:"真的能跑吗?效果够用吗?"她需要用一个端到端的 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 调用

按顺序完成以下步骤,验证每步成功再进入下一步:

100%
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 脚本实现一个简易聊天机器人,手动维护对话历史:

100%
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。

📖 小节


📝 作业

  1. 基础题(难度⭐):完成端到端验证脚本的每一步,确保全部 PASS,截图保存结果。
  2. 进阶题(难度⭐⭐):运行批量模型质量对比脚本,选择 3 个不同模型,记录响应时间与质量评分,写一份简要分析报告。
  3. 挑战题(难度⭐⭐⭐):为 Alice 的 SaaS 公司完成完整 PoC 验证——编写基准测试脚本、记录延迟与吞吐数据、计算 12 个月成本对比,输出一份可行性报告文档。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏