# 第30课学生操作单：本机运行，需要哪些证据

本课有两条操作路径。页面实验在浏览器中真实计算存储与取整；终端练习才可能取得模型回答。两条路径分别记录，页面出现数字不表示电脑已经装好模型。

## 课前准备，不占课堂60分钟

在自己电脑新建 `classroom30` 文件夹。按系统打开 [Windows 官方安装说明](https://docs.ollama.com/windows) 或 [macOS 官方安装说明](https://docs.ollama.com/macos)，核对当前系统要求，从官方页面下载对应安装包。Windows 安装后打开 Ollama 并重新打开 PowerShell；macOS 按安装界面放入应用程序并打开，再重新打开终端。Linux 用户由教师按[官方 Linux 说明](https://docs.ollama.com/linux)准备。

在终端逐行执行，记录真实输出，不把命令文本当成功记录：

```text
ollama --version
ollama ls
```

教师确认软件与设备适合练习后，若列表里没有这个模型，课前执行：

```text
ollama pull qwen2.5:0.5b
ollama ls
```

`pull` 会联网下载文件；本课编写过程没有替你执行它。名称来自[对应模型页](https://ollama.com/library/qwen2.5:0.5b)，上课前再核对。不把这个小模型当作推荐质量榜，也不依据文件大小保证电脑能运行。不要用带 `:cloud` 的名称替代本地练习。

安装不兼容、下载未完成或不能使用终端时，填写具体阶段，课堂直接完成后备任务，不在课堂临时下载大模型或修改共享服务。

## Q0　0—6分钟：先写自己的判断

写下“文件／服务／调用程序”三个框，把 `qwen2.5:0.5b`、Ollama、`local_chat.py` 分别放入合适位置。哪个东西负责保存参数，哪个接收请求，哪个把问题发过去？

预测：假想模型标为4B，是否就是4GB？电脑显示有3GB可用内存，是否一定能运行4位版本？暂时不看答案，写一句依据。

## Q1　6—13分钟：先手算，再运行

假设共有4×10⁹个参数，每参数理想保存4位；8位组成1字节。用纸笔计算字节数、十进制GB。页面默认可用内存3GB，额外占用 `unknown`，独立数轴材料为 `[-0.26, 0.14, 0.49]`，格距0.1。

点击“计算存储与取整过程”，记录理想大小、扣除权重后的差额、程序如何处理未知项。只把位宽改成16，其他字段保持不变，再运行。比较两次大小；取整结果有没有随位宽变化？解释这两个小计算的关系。

## Q2　13—26分钟：量化的误差与资源假设

恢复4位。对三个原数先找最近0.1格点，写“原数、取整后、绝对误差”。只把格距改成0.25，再记录一次。这里等距离时选择离0更远的格点；它是教学数轴规则，不是某种真实Q4格式。

恢复默认格距0.1，将额外占用从 `unknown` 改为 `1.2`，其余保持默认。合计多少GB，与3GB可用内存比较如何？这1.2来自测量还是人为输入？列出至少两种不在理想权重公式里的占用。

## Q3　26—34分钟：检查模型与运行软件

已准备好模型的同学，先运行 `ollama ls` 确认精确名称，再进入对话：

```text
ollama run qwen2.5:0.5b
```

出现对话提示符后输入完整材料：

```text
原创材料：资料比较用了12分钟，核对引用用了18分钟。只复述两项活动和各自时间，不推测学习能力，不补充建议。
```

保存本次实际文字。输入 `/bye` 退出对话，然后立刻执行：

```text
ollama ps
```

记录有无这个运行中的模型、显示的处理器或资源信息。`ls` 与 `ps` 有什么不同？没有运行信息时写“当前未观察到”，不编造CPU/GPU比例。

## Q4　34—48分钟：从本地接口取得可保存的结果

把 [local_chat.py](../../materials/local_chat.py) 保存到 `classroom30` 文件夹，在该文件夹打开终端。需要Python3.9+；Windows可以使用教师已核对可用的 `py -3` 代替 `python3`。

```text
python3 --version
python3 local_chat.py --model qwen2.5:0.5b
```

记录 `mode`、地址和待发送消息。这个命令没有 `--live`，只展示请求，不会调用模型。

已确认本地服务和模型就绪时，在同一文件夹新建 `record_local.py`，原样粘贴以下代码并保存：

```python
import json
import time
from pathlib import Path
import local_chat

question = "原创材料：资料比较用了12分钟，核对引用用了18分钟。只复述两项活动和各自时间，不推测学习能力，不补充建议。"
started = time.perf_counter()
try:
    record = local_chat.chat("qwen2.5:0.5b", question, live=True)
except Exception as error:
    record = {"mode": "not_completed", "error_type": type(error).__name__, "message": str(error)}
record["elapsed_seconds"] = round(time.perf_counter() - started, 3)
record["requested_model"] = "qwen2.5:0.5b"
record["question"] = question
text = json.dumps(record, ensure_ascii=False, indent=2)
Path("local-result.json").write_text(text, encoding="utf-8")
print(text)
```

运行一次，等待结束：

```text
python3 record_local.py
```

打开 `local-result.json`。检查 `mode` 是否取得本地服务响应、返回模型名是否一致、`done` 是否为true、`answer` 是否非空。随后逐项核对活动、12和18、有没有无依据的能力标签。接口回应和文字正确分开判定。耗时只属于这台设备、这次输入和当时状态，不能据此给模型排名。

如果出错，保留类型及完整阶段，不循环重试。没有准备条件的同学完成以下后备：画出脚本→本地服务→已下载权重的路径，读代码找 `live=True` 与默认模式的区别，再用Q1、Q2的真实计算完成资源判断，交“本地后备已完成；模型实际调用未完成”。

## Q5　48—55分钟：独立完成，不看答案

1. 新的假想模型为2B、8位，可用内存2.5GB，额外占用未知。算理想大小，并写能否保证运行及原因。
2. 新数值为 `[0.12, 0.39, -0.62]`，格距0.25。先手算各取整值和绝对误差，再用页面核对。
3. 同学交来只有 `dry_run_no_network` 的记录，却说“模型已经正确复述”。写出缺少哪两类证据。
4. 一个应用的聊天模型在本机，但检索先把文字交给外部嵌入服务。画出外发步骤，说明能否将整个应用称为离线。

## Q6　55—60分钟：提交与离堂

提交Q1和Q2的前后记录、Q5解答，以及Q4的真实结果或准确的未完成记录。写一句“本课我能独立做的检查”，再写一句“我还没有验证的事”。预测猜错不扣分；观察与证据必须对应你实际完成的操作。
