# Round 2 — 新手压力测试报告（novice_test.md）

- **测试官**：Round 2 子代理 · 新手压力测试官
- **日期**：2026-09-21（CST）
- **测试机**：Kali Linux VM（kernel 7.1.5+kali-cloud-amd64），8 vCPU / 7.6 GB RAM（+4G swap）/ 79G 磁盘，**无 GPU、无 GUI**（CPU-only）
- **任务**：完全扮演零基础新手，把 Round 1 各文档里"成本最低、当天能跑起来"的步骤逐条实跑。每条记录：**命令 / 预期 / 实际 / 耗时 / 成功与否 + 卡点 + 修正版命令**。失败如实记录，不猜测绕过。
- **安全约束（已遵守）**：未触碰任何已有 systemd 服务与容器（nginx / gpt-load / Hermes 全程未动）；临时容器 `--rm` 并即时清理；未 pull >2GB 镜像；新开端口一律绑定 127.0.0.1；测试用 cron 完成后已还原。
- **覆盖**：6 条测试 —— ①Qdrant 容器 ②Ollama 本地模型 ③promptfoo 评测 ④LightRAG 本地 RAG/知识图谱 ⑤cron 定时 agent ⑥GitHub 项目与版本时效核查。
- **总消耗**：约 1.5 小时（含踩坑重跑）、现金 0 元（全本地/开源）；测试期磁盘峰值 +约 11G，**收尾已全部卸载清理、磁盘回落至基线（29G/39%，见第七节）**。

---

## 一、环境基线（新手拿到手时会看到什么）

| 检查项 | 命令 | 实际结果 |
|---|---|---|
| Docker | `docker --version` | 29.8.1，已在跑（已有容器 gpt-load、kejilion-panel，不动） |
| Ollama | `command -v ollama` | ❌ 未安装 → 从零装 |
| promptfoo | `command -v promptfoo` | ❌ 未安装 → 从零装 |
| Node / npm | `node --version` | v26.8.2 / npm 11.19.1 |
| Python | `python3 --version` | 3.14.7（PEP 668 受管环境，`pip` 直装被系统拒绝） |
| 磁盘 | `df -h /` | 起始已用 29G / 可用 46G |

---

## 二、逐条实测

### 测试 1：Qdrant 单容器部署（personal_memory.md 阶段 3 的依赖组件）

| 项 | 内容 |
|---|---|
| **命令** | `docker pull qdrant/qdrant:latest` → `docker run -d --name novice-qdrant --rm -p 127.0.0.1:16333:6333 qdrant/qdrant` → `curl` 建集合 / 插点 / 搜点 |
| **预期** | 镜像拉取成功；容器启动；REST API 返回版本 JSON；能建 collection、插向量、搜向量 |
| **实际** | 全部通过。v1.19.1；建集合 `{"result":true}`；插入 2 个点成功；搜索返回 `{"id":1,"score":1.0}`；`/collections/test_col` 显示 `status:green, points_count:2` |
| **耗时** | pull 9.4s + 启动 ~3s + API 验证 <1s ≈ **15 秒全链路** |
| **成功** | ✅ 一次通过，零卡点 |
| **卡点** | 无 |
| **清理** | `docker rm -f novice-qdrant` 已执行，`docker ps -a` 确认无残留 |

**修正版命令（防"端口裸奔"）**：
```bash
docker pull qdrant/qdrant:latest
docker run -d --name qdrant --rm -p 127.0.0.1:6333:6333 qdrant/qdrant   # 必须加 127.0.0.1: 前缀
curl -s http://127.0.0.1:6333/                                          # 期望返回版本 JSON
docker rm -f qdrant                                                     # 用完即删
```
> 网上教程常写 `-p 6333:6333`，那会监听 `0.0.0.0` 把向量库暴露到公网——正是 infra_automation.md 说的"死法一"。

---

### 测试 2：Ollama 安装 → 拉模型 → 推理 → 升级（local_model.md 方案 A 步骤 1-2）

| 项 | 内容 |
|---|---|
| **命令** | `curl -fsSL https://ollama.com/install.sh -o /tmp/o.sh && sh /tmp/o.sh`（分别测"固定版本"与"默认最新"两条路径）→ `ollama pull qwen2.5:0.5b` → `ollama run qwen2.5:0.5b "..."` → 重跑脚本升级 |
| **预期** | 安装为常驻服务；能拉模型；能推理出中文回答；升级平滑且模型保留 |
| **实际** | ① **固定版本装**（`OLLAMA_VERSION=0.11.9`）成功：服务 active、API `127.0.0.1:11434` 正常。② `qwen2.5:0.5b`（397MB）拉取 41s；首次推理 6.6s（含冷加载），输出中文段落但**质量很差**（把向量数据库说成"二维坐标点集"）。③ **默认路径重跑脚本 → 平滑升级到 v0.34.2**：服务自动重启、4 个模型全部保留。④ 升级后冒烟：推理正常、嵌入 API 返回 768 维、服务 enabled+active。 |
| **耗时** | 安装 ≈1-2 分钟（含下载）；pull：0.5B 41s、3B 2m59s、nomic-embed 30s、bge-m3（1.2G，未单独计时）；升级数分钟（含重新下载） |
| **成功** | ✅ |
| **卡点** | ① **`OLLAMA_NO_START=1` 只在 macOS 分支生效**——脚本里该变量仅用于 `open -a Ollama`，Linux 下必然创建并启用 systemd 服务（实测输出 "Creating ollama systemd service... Enabling and starting"）；② **固定版本会装旧版**：0.11.9 vs 官方最新 0.34.2（2026-09-15 发布，GitHub API 实测）→ 装完必须核对版本；③ Round 1 方案 A 的验收线"本地 8B 流式对话 ≥30 tok/s"**是 M 系 Mac 的数字**，8G 内存无 GPU 机器不成立；④ 升级过程中短暂出现 `could not connect to a running Ollama instance` / `client version is 0.34.2` 告警，属正常过渡 |

**修正版命令**：
```bash
# 1. 安装（默认装最新版；会自动创建并启用 systemd 服务）
curl -fsSL https://ollama.com/install.sh | sh
ollama --version        # 必做：和 https://github.com/ollama/ollama/releases 对一下
systemctl is-enabled ollama   # 默认 enabled（开机自启）；不想要常驻：systemctl disable --now ollama

# 2. 小内存/无 GPU 机器：先用小模型走通全流程，别一上来就 7B
ollama pull qwen2.5:0.5b            # 397MB，~41s
ollama run qwen2.5:0.5b "你好，用一句话自我介绍"

# 3. 确实需要 7B（≥16G 内存或有 GPU 再上）
# ollama pull qwen2.5:7b && ollama run qwen2.5:7b "你好"

# 4. 升级 = 重跑安装脚本（实测平滑：服务自动重启、模型/配置保留）
curl -fsSL https://ollama.com/install.sh | sh
```

---

### 测试 3：promptfoo 安装 + 最小 eval（evaluation.md 第 1-2 步）

| 项 | 内容 |
|---|---|
| **命令** | `npm i -g promptfoo` → 写 `promptfooconfig.yaml`（2 用例）→ `promptfoo eval` |
| **预期** | 安装成功；eval 输出表格，2 用例 PASS |
| **实际** | 安装成功（v0.123.1，2m33s）。**第一次 eval 失败**：`Error: Could not identify provider: ollama.chat:qwen2.5:0.5b`。改成 `ollama:chat:qwen2.5:0.5b` 后成功：`✓ 2 passed (100%)` |
| **耗时** | npm 安装 2m33s；失败 eval 2.2s；成功 eval 3.1s（内部 Duration 1s） |
| **成功** | ✅（修正 provider 语法后） |
| **卡点** | ① **provider 语法坑**：`ollama.chat:<model>` 报 "Could not identify provider"，**正确写法是 `ollama:chat:<model>`（冒号不是点号）**——已查源码 `providers.js` 确认解析逻辑是 `firstPart === "chat"`；② **安装体积意外大：2.6G**（含 onnxruntime 等依赖），小 VPS 需留意；③ `pip install promptfoo` 不适用（这是 Node 项目） |

**修正版命令**：
```bash
npm i -g promptfoo                      # 约 2.5 分钟
mkdir -p ~/ai-dashboard && cd ~/ai-dashboard
cat > promptfooconfig.yaml <<'EOF'
description: "我的第一个 eval"
prompts:
  - "把下面的词翻译成英文,只输出译文: {{word}}"
providers:
  - ollama:chat:qwen2.5:0.5b            # 注意：冒号写法！ollama:chat:模型名
tests:
  - vars: { word: 猫 }
    assert: [{ type: contains, value: cat }]
  - vars: { word: 狗 }
    assert: [{ type: contains, value: dog }]
EOF
promptfoo eval                          # 预期: 2 passed (100%)
promptfoo view                          # 可选：浏览器面板（无 GUI 环境跳过）
```
> 接 Ollama 时确保服务在跑；换云 API：provider 改 `openai:chat:gpt-4o-mini` + `export OPENAI_API_KEY=...`。

---

### 测试 4：LightRAG 本地知识图谱/RAG（personal_memory.md 阶段 4）

| 项 | 内容 |
|---|---|
| **命令** | `pip3 install lightrag-hku`（失败）→ `python3 -m venv + pip install lightrag-hku` → 脚本用本地 Ollama 索引 2 个小 md → 3 种模式查询 |
| **预期** | 本地零成本建索引，能回答"谁负责凤凰计划、部署在哪台服务器" |
| **实际** | **多次失败后跑通**。最终可用路径：`lightrag.llm.ollama` 官方集成（`ollama_model_complete` + `ollama_embed`），实体抽取用 `qwen2.5:3b`、嵌入用 `bge-m3`。索引 2 个 ~200 字文件 → 抽出 **9 个实体**（张三/凤凰计划/PostgreSQL数据库/服务器/192.168.1.100/公司内网/李四/PostgreSQL/硬盘）、**3 条关系**；查询 3 模式（naive/local/hybrid）均返回正确答案（naive 命中原文；local/hybrid 基于图谱上下文）。 |
| **耗时** | venv+pip 安装 26.9s（lightrag-hku 1.5.7）；**索引 2 个小文件（3B 模型，CPU）≈4-5 分钟**；3 模式查询 1-2 分钟。全程含试错约 15 分钟。 |
| **成功** | ✅（修正 4 个连环坑之后） |
| **卡点** | ① **PEP 668**：`pip install` 直装被拒（externally-managed-environment）→ 必须 venv；② **`openai_embed` 硬编码 1536 维 + 默认模型名 `text-embedding-3-small`**：把 base_url 指向 Ollama 后要么 404、要么维度校验炸（`total elements (768) cannot be evenly divided by expected dimension (1536)`）——**不能直接把 OpenAI 集成改成 Ollama**；③ 传普通 lambda 会崩：`AttributeError: 'function' object has no attribute 'func'`（必须用 `EmbeddingFunc` 实例）；④ 官方 Ollama 路径默认嵌入模型是 **bge-m3（要 `ollama pull bge-m3`，1.2G，1024 维）**；⑤ **小模型不可用**：0.5B 能索引但实体抽取=0（图谱全空，local/global/hybrid 查询全部 `[no-context]`），**3B 才可用**；⑥ **速度瓶颈**：CPU-only 下 3B 抽取 2 个小文件要 4-5 分钟——个人大笔记库（成百上千文件）**用本地 CPU 模型不现实**，必须云 API 或 GPU |

**修正版命令（可直接跑通）**：
```bash
# 0. 前置：Ollama 已在跑（见测试 2）
ollama pull qwen2.5:3b      # 实体抽取模型（≥3B，0.5B 实测不可用）
ollama pull bge-m3          # 嵌入模型（1024 维，官方默认）

# 1. 独立 venv（绕开 PEP 668）
python3 -m venv ~/lightrag-venv
~/lightrag-venv/bin/pip install lightrag-hku        # 实测 1.5.7，约 27s

# 2. 脚本（已归档：round2/agents/artifacts/lightrag_min_v3.py）
```
```python
import asyncio, glob
from lightrag import LightRAG, QueryParam
from lightrag.llm.ollama import ollama_model_complete, ollama_embed

OLLAMA = "http://127.0.0.1:11434"

async def main():
    rag = LightRAG(
        working_dir="/tmp/lightrag-work",
        llm_model_func=ollama_model_complete,
        llm_model_name="qwen2.5:3b",
        llm_model_kwargs={"host": OLLAMA, "options": {"num_ctx": 8192}},
        embedding_func=ollama_embed,        # 关键：官方 Ollama 集成（bge-m3/1024维）
        embedding_batch_num=2,
    )
    await rag.initialize_storages()
    docs = [open(f, encoding="utf-8").read()
            for f in sorted(glob.glob("/tmp/lightrag-docs/*.md"))]
    await rag.ainsert(docs)
    for mode in ["naive", "local", "hybrid"]:
        print(mode, "->", (await rag.aquery(
            "谁负责凤凰计划?它部署在哪台服务器?", param=QueryParam(mode=mode)))[:200])
    await rag.finalize_storages()

asyncio.run(main())
```
> 实测结论：**"本地全免费 RAG"可行但有硬门槛**——模型 ≥3B、索引速度受 CPU 限制。小规模（几十个短文件）可接受；大规模笔记库建议走云 API 或 GPU，或只做增量小块索引。

---

### 测试 5：cron 定时 agent（infra_automation.md「24/7 自运行」最小验证）

| 项 | 内容 |
|---|---|
| **命令** | 写 `daily_brief.py`（调本地 Ollama 生成三句话简报，追加落盘）→ 手动跑通 → 加 crontab `*/2 * * * *`（每 2 分钟，测试用高频） |
| **预期** | 定时自动执行、产出可查、失败可见 |
| **实际** | 手动运行 13.3s 成功（冷启动）。cron 上线后 **19/19 次全部成功**（01:18:07 → 01:54:09，`cron.log` 19 行全 "ok"，非 ok 0 行）；产物 `briefs/2026-09-21.md` 共 20 条 = 19 次自动 + 1 次手动 |
| **耗时** | 单次 2-4s（模型常驻）/ 13s（冷启动）；观察窗口 36 分钟 |
| **成功** | ✅ 19/19（100%） |
| **卡点/要点** | ① **必须绝对路径**（cron 环境 PATH 极简）；② **必须重定向日志 `>> x.log 2>&1`**——否则失败无声（cron 默认只发本地 mail）；③ **先手动跑通再加 cron**（本次即按此顺序）；④ 合并已有 crontab 时先 `crontab -l > 文件` 再追加，别直接覆盖（本次保留了原有 `@reboot` 行）；⑤ **频率即成本**：本例用本地模型=0 元；若指向云 API，每 2 分钟一次会烧钱，真实使用建议 1 天 1 次 |

**修正版命令**：
```bash
#!/usr/bin/env bash
set -e
mkdir -p ~/agents
cat > ~/agents/daily_brief.sh <<'EOF'
#!/usr/bin/env bash
# 绝对路径 + 日志重定向，两个都不能省
OUT=~/agents/briefs/$(date +%F).md
mkdir -p "$(dirname "$OUT")"
curl -s http://127.0.0.1:11434/api/generate \
  -d '{"model":"qwen2.5:3b","prompt":"用三句话总结今天 AI 领域值得关注的事。","stream":false}' \
  | jq -r '.response' >> "$OUT" 2>> ~/agents/error.log
EOF
chmod +x ~/agents/daily_brief.sh
~/agents/daily_brief.sh          # ① 先手动跑通

# ② 再加 cron（每天 9:00；测试用 */2 高频验证后记得改回）
( crontab -l 2>/dev/null; echo "0 9 * * * $HOME/agents/daily_brief.sh >> $HOME/agents/cron.log 2>&1" ) | crontab -
crontab -l                       # 确认
```
> 本次测试后已还原 crontab（仅剩原 `@reboot iptables-restore` 行）。

---

### 测试 6：项目核查命令 + 版本时效（BRIEF「项目核查」环节）

| 项 | 内容 |
|---|---|
| **命令** | `curl -s https://api.github.com/repos/<owner>/<repo> \| jq '{stargazers_count, updated_at, pushed_at}'` |
| **预期** | 无需 token 即可确认项目存在、近期活跃 |
| **实际** | ✅ 4 个全部返回：`ollama/ollama` 181,314★（推送 09-19）、`HKUDS/LightRAG` 39,778★（09-20）、`qdrant/qdrant` 34,711★（09-19）、`promptfoo/promptfoo` 25,307★（09-20）—— 全部活跃 |
| **耗时** | <5 秒 |
| **成功** | ✅ |
| **卡点** | 无（注意：匿名 API 限流 60 次/小时，BRIEF 已知） |

**版本时效核查（本次实测）**：Ollama 最新 v0.34.2（2026-09-15，GitHub API）｜promptfoo 0.123.1（npm）｜lightrag-hku 1.5.7（PyPI）｜Qdrant 1.19.1（容器 API）｜qwen2.5 系列模型正常可拉。

---

## 三、卡点总表（按严重度）

| # | 测试 | 卡点 | 现象 | 修正 |
|---|---|---|---|---|
| 1 | ③ | **promptfoo provider 语法** | `ollama.chat:xxx` → "Could not identify provider" | 用 `ollama:chat:xxx`（冒号） |
| 2 | ④ | **LightRAG OpenAI 集成接本地嵌入必炸** | 404 / `768 cannot be divided by 1536` | 改用 `lightrag.llm.ollama.ollama_embed` |
| 3 | ④ | **embedding_func 必须传 EmbeddingFunc 实例** | `'function' object has no attribute 'func'` | 用官方已包装的 `ollama_embed` |
| 4 | ④ | **小模型做不了知识图谱** | 0.5B → 0 实体，图谱查询全部 `[no-context]` | 实体抽取 ≥3B |
| 5 | ④ | **CPU 图谱索引慢** | 2 个小文件 ≈4-5 分钟 | 大库改云 API/GPU/增量索引 |
| 6 | ③④ | **PEP 668** | `pip install` 被系统拒绝 | venv（或 pipx） |
| 7 | ② | **OLLAMA_NO_START 在 Linux 无效** | 仍创建并启用 systemd 服务 | 想不常驻：`systemctl disable --now ollama` |
| 8 | ② | **固定版本 = 旧版** | 0.11.9 vs 最新 0.34.2 | 装完 `ollama --version` 对照 GitHub |
| 9 | ③ | **npm 全局安装体积 2.6G** | 小 VPS 磁盘压力 | 提前确认磁盘；或本地项目内安装 |
| 10 | ① | **端口裸奔** | 教程式 `-p 6333:6333` 监听 0.0.0.0 | 加 `127.0.0.1:` 前缀 |
| 11 | ⑤ | **cron 静默失败** | 无日志则完全无感知 | 绝对路径 + `>> log 2>&1` |

---

## 四、六条测试总览

| # | 测试 | 结果 | 关键耗时 | 卡点数 |
|---|---|---|---|---|
| 1 | Qdrant 容器 | ✅ 一次通过 | 15s | 0 |
| 2 | Ollama 本地模型 | ✅（含升级验证） | 安装 1-2min | 4 |
| 3 | promptfoo 评测 | ✅（1 次失败后修好） | 2.5min | 3 |
| 4 | LightRAG 本地 RAG | ✅（4 个连环坑后修好） | ~15min 含试错 | 6 |
| 5 | cron 定时 agent | ✅ 19/19 | 13s + 36min 观察 | 0（5 条要点） |
| 6 | 项目/版本核查 | ✅ | <5s | 0 |

---

## 五、对 Round 1 文档的具体修改建议（实测驱动）

1. **local_model.md 方案 A**：验收线"8B ≥30 tok/s"要分硬件档（无 GPU 机器改成"3B 流程跑通"）；补 `OLLAMA_NO_START 在 Linux 无效` 的说明；补"装完必核版本"；"1 小时体验"要计入模型下载时间。
2. **evaluation.md**：明确 `npm i -g promptfoo`（不是 pip）；provider 语法写 `ollama:chat:<model>`；加 2.6G 安装体积提示。
3. **personal_memory.md**：阶段 1 的 Obsidian+Smart Connections 是 **GUI 插件**，本环境无 GUI 未实测（诚实标注）；阶段 4 的 LightRAG 示例命令与 pip 包 1.5.7 API 差异大，建议整段替换为本文档测试 4 的修正版。
4. **infra_automation.md**：cron/心跳部分补"绝对路径 + 日志重定向 + 先手动后自动"三条铁律；补频率成本提醒。
5. **通用**：所有"验收标准"应标注前置硬件条件（内存/GPU/网络），否则新手会照抄不可达的数字。

---

## 六、本次实测的局限与未覆盖

- **无 GPU、无 GUI**：Obsidian 插件、桌面 agent、`promptfoo view` 面板、浏览器类步骤**未实测**（诚实声明）。
- **样本小**：cron 只观察 36 分钟；模型质量结论只基于 0.5B/3B 两个小模型；每项基本只跑 1-2 次。
- **网络环境**：Docker Hub / GitHub / npm / PyPI 直连可用（非中国大陆网络）；国内网络复现可能有差异。
- **未覆盖**：n8n、browser-use/Playwright、MCP 客户端接入（Claude Code 等）、Mem0/Zep、LoRA 微调——超出本轮时间预算或需 GUI/GPU，建议 Round 3 补。

---

## 七、产物与清理记录

**归档产物（保留）**（`/root/agi-research/round2/agents/`）：
- `daily_brief.py`、`cron.log`（19 行全 ok）、`briefs/2026-09-21.md`（20 条）
- `artifacts/lightrag_min_v3.py`（可用版）、`artifacts/lightrag_query_only.py`、`artifacts/promptfooconfig.yaml`、`artifacts/lightrag-docs/`

**收尾清理（2026-09-21 02:10–02:26 CST 已执行完毕）**——按“服务器资源有限、用完收尾”要求逐项卸载，并复核残留：

| 组件 | 处理 | 释放 |
|---|---|---|
| Ollama v0.34.2（服务 + 二进制 + 4 个模型 + systemd unit + 用户/组） | stop/disable + 全量删除 | ≈6.2G |
| promptfoo（npm 全局，825 个包） | `npm rm -g promptfoo` | ≈2.6G |
| LightRAG venv + 临时目录（`/tmp/lightrag-*`） | 删除 | ≈0.4G |
| Qdrant 镜像 | `docker rmi` | ≈0.3G |
| npm / ms-playwright / pip 缓存（测试产生部分） | 清理 | ≈2.2G |
| 测试 crontab 条目 | 还原原样（仅剩 `@reboot` 行） | — |

**清理结果**：磁盘 40G → 29G（回落至测试前基线，79G 盘的 39%）；残留复核全部通过（`command -v ollama` 为空、端口 11434 无监听、ollama 用户/组/systemd unit 已删）；既有容器（gpt-load、kejilion-panel）与 nginx / Hermes 全程未动、运行正常。

**如需复现**：测试 1–5 各节的“修正版命令”即完整重装步骤（Ollama 全套含模型下载约 10 分钟）。

---
*报告定稿于 2026-09-21 02:26 CST；测试安装与缓存已于同日完成收尾清理。所有“实际”均为本机实测输出，未实测项已逐条标注。*
