Day 6 · 安装 Ollama + 拉取 Hermes-3 跑通
| 属性 | 值 |
|---|---|
| 日期 | 2026-08-20(实际完成) |
| 周次 | 第2周:动手体验+场景深挖 |
| 轨 | 轨1 · Hermes 技术认知 |
| 时间 | 1 小时 |
| 状态 | ✅ 已完成 |
📋 Checklist
- 下载安装 Ollama(Windows 版)
- 终端运行
ollama pull hermes3:8b(约 4.7GB) - 运行
ollama run hermes3:8b测试基础对话 - 用中文提问,感受中文能力
- 用英文提问 2 个问题,对比质量差异
- 记录延迟数据(首次响应时间 ~1s)
- 测试 system prompt 覆盖行为
- 迁移模型存储到 D 盘(目录链接方案)
📖 阅读材料
| 材料 | 链接 |
|---|---|
| Ollama 下载 | https://ollama.ai/download |
| Hermes3 on Ollama | https://ollama.ai/library/hermes3 |
| Ollama 文档 | https://github.com/ollama/ollama |
| Hermes 3 8B Model Card | https://huggingface.co/NousResearch/Hermes-3-Llama-3.1-8B |
✍️ 学习笔记
新增概念:Ollama 的定位
Ollama 不是 Harness 框架,是模型服务层(接口层)。
Agent Harness(框架层)
│ HTTP (OpenAI 兼容格式)
▼
Ollama(模型服务层) ← 我们在这里
│ 内部调用
▼
llama.cpp(推理引擎)
│
▼
Hermes-3-8B(模型权重)
Ollama 只做一件事:收请求、管理推理、返回结果。不参与 Agent 决策循环。
类比:Ollama 是"外卖平台"(接单、派单、通知),推理引擎是"厨房"(真正做菜),模型权重是"厨师技艺"。
新增概念:Claude Messages API vs Hermes ChatML 的本质区别
| Claude | Hermes | |
|---|---|---|
| 顶层结构 | 3 个独立字段(system / tools / messages) | 全塞进 messages 数组,拼成一个大字符串 |
| Harness 操作 | 操作 JSON 对象 | 拼字符串 + 解析字符串 |
| 通用性 | 只适用 Claude | 适用所有开源模型(Llama/Qwen/DeepSeek) |
详见 Day03 补充文档。
安装过程
| 步骤 | 耗时 | 备注 |
|---|---|---|
| 下载 Ollama 安装包 | ~5min | 约 400MB |
| 安装 Ollama | ~2min | 默认安装到 C 盘 |
| 拉取模型 | ~30min | 4.7GB,1.4 MB/s |
| 迁移到 D 盘 | ~5min | 用目录链接(Junction),Ollama 无感知 |
迁移方案
环境变量 OLLAMA_MODELS 在 Windows 上不生效,改用目录链接:
C:\Users\xielei\.ollama\models → D:\ollama-models(Junction)
Ollama 以为自己写 C 盘,Windows 实际写到了 D 盘。
英文测试
| 问题 | 回复质量 (1-5) | 延迟 | 备注 |
|---|---|---|---|
| What is a camera cage used for? | 4 | ~1s | 5 点全覆盖,结构清晰,专业术语准确 |
| Explain the difference between 15mm and 19mm rod systems | 4 | ~1s | 覆盖尺寸/重量/兼容性/流行度/适配器,技术准确 |
中文测试
| 问题 | 回复质量 (1-5) | 延迟 | 备注 |
|---|---|---|---|
| 推荐一款适合Sony A7III的兔笼 | 2 | ~1s | 拒绝推荐 + 中文生硬("兔笼拍照"、"购置建议") |
System Prompt 测试
- 通过
ollama run hermes3:8b "prompt"传入 system prompt - 有效:模型不再拒绝推荐,行为被覆盖
- 但推荐质量差:推荐了相机而非兔笼——训练数据无 SmallRig 产品知识
- 这验证了 Agent 核心逻辑:System Prompt 控制行为,Tool 提供实时数据
💡 关键认知
1. Hermes 8B 实测结论
✅ 英文能力:专业术语准确,结构化输出好
✅ 延迟:~1s 首字,Agent 场景可接受
✅ System prompt 可控行为
❌ 中文能力:生硬,英文翻译腔
❌ 领域知识:不知道 SmallRig 产品
❌ 知识截止:无法推荐具体产品(需 Tool 填补)
2. Agent 架构的核心逻辑(再次验证)
System Prompt → 控制"怎么回答"(不拒绝、角色定位)
Tool 调用 → 提供"回答什么"(实时商品数据、订单信息)
模型本身知识 → 只是"兜底",不是主力
3. Agent 核心四要素
┌─────────────────────────────────────────────┐
│ │
│ ① 模型(大脑) —— 推理、决策 │
│ ② System Prompt —— 角色、行为边界 │
│ ③ Tool 工具 —— 外部能力(搜索、查库) │
│ ④ Agent Loop —— 循环调度(核心引擎) │
│ │
└─────────────────────────────────────────────┘
"输入"不算核心要素——输入是燃料,不是引擎零件。
4. Agent Loop 的实现原理
Loop 的代码结构由 Harness 实现,但每轮「继续还是结束」由模型通过输出内容来决定。
模型只做一件事:收输入 → 吐输出。它不知道自己在循环里,但它的输出决定了循环的走向。
Harness 的 Loop 伪代码:
while True:
response = 调模型(messages, tools)
if response == 文本回复: ← 模型选择:直接回答
展示给用户,break
if response == tool_use: ← 模型选择:调工具
结果 = 执行工具(tool_use.name, tool_use.input)
messages.append(tool_result)
continue ← 回到 while,再调模型
Harness 铺好了两条路,模型每次选择走哪条——输出文本走结束分支,输出 tool_use 走继续分支。
类比:Harness = 十字路口的路,模型 = 开车的司机。路是 Harness 修的,但每次左转还是右转是司机决定的。
Claude vs Hermes 的 Loop 判断差异:
| Claude | Hermes | |
|---|---|---|
| 判断要调工具 | stop_reason == "tool_use" |
正则匹配 <tool_call> |
| 判断结束 | stop_reason == "end_turn" |
没匹配到 <tool_call> |
| 可靠程度 | API 保证,100% 准确 | 靠正则,可能格式错误 |
ChatML 四角色完整对话示例
ChatML 有四个角色,比 Claude 多两个:
<|im_start|>system
你是一个助手,可以查天气。
<tools>{"type": "function", "function": {"name": "get_weather", ...}}</tools>
<|im_end|>
<|im_start|>user
巴黎天气怎么样?
<|im_end|>
<|im_start|>assistant
<tool_call>{"name": "get_weather", "arguments": {"city": "Paris"}}</tool_call>
<|im_end|>
<|im_start|>tool ← Harness 执行工具后回传
<tool_result>{"temperature": 22, "condition": "晴"}</tool_result>
<|im_end|>
<|im_start|>assistant
巴黎今天天气晴朗,22°C,适合出行。
<|im_end|>
| 角色 | 谁写 | 内容 |
|---|---|---|
system |
Harness 拼 | 系统指令 + <tools> 工具定义 |
user |
用户 | 用户输入的问题 |
assistant |
模型 | 文本回复 或 <tool_call> 工具调用 |
tool |
Harness | <tool_result> 工具执行结果 |
tool 角色是 Harness 写的,不是模型写的。 对比 Claude:Claude 只有 user/assistant 两个角色,tool_result 塞进 user 角色。Hermes 专门给了一个 tool 角色,逻辑一样,角色体系不同。
5. 中文场景的制约
Hermes 8B 中文能力明显弱于英文。对 SmallRig 中文站 Agent 场景,可能出现:
- 用户输入中文 → 模型理解偏差 → 调错 Tool
- 中文回复质量差 → 用户体验下降
Day 7 要验证:FC 准确率在中文场景下是否也受影响?
❓ 疑问
- Hermes 的 FC 准确率实际表现?(Day 7 实测验证)
- 中文场景下 FC 调用是否也会出现偏差?
- 如果 Hermes 8B 中文不够,是否考虑 Qwen 或 DeepSeek 作为替代?
📤 产出
- 安装成功,模型可运行
- 延迟数据记录(~1s TTFT)
- 中英文对比测试结果
- System prompt 覆盖验证
- 补充文档:Day03_补充_Claude与Hermes接口格式对比.md
🧪 Day 6 自测题
第 1 题:架构分层
在以下三层架构中,Ollama 属于哪一层?
A. Agent Harness —— 管理 agent 循环(用户输入→调模型→执行工具→循环)
B. 模型服务层 —— 收 HTTP 请求、管理模型加载、返回结果
C. 推理引擎 —— 真正的矩阵运算、逐 token 生成
点击看答案
B。 Ollama 是模型服务层,对上提供 OpenAI 兼容 API,对下调用 llama.cpp 推理引擎。它不参与 Agent 决策循环(那是 Harness 的事),也不做推理计算(那是 llama.cpp 的事)。
第 2 题:判断对错
「Ollama 是 Agent 框架,它负责管理工具调用和对话循环。」
点击看答案
错。 Ollama 是模型服务层(接口层),只负责收请求、管理推理、返回结果。Agent 循环(调工具、回传结果、再调模型)是 Harness 框架的职责。
第 3 题:Claude vs Hermes 协议
Claude Messages API 和 Hermes ChatML 最本质的区别是什么?
A. Claude 支持并行调用,Hermes 不支持
B. Claude 用 3 个独立顶层字段,Hermes 全塞进一个文本字符串
C. Claude 的回复更快
D. Claude 支持中文,Hermes 不支持
点击看答案
B。 Claude Messages API 用 system、tools、messages 三个独立顶层字段,API 层帮你做结构化处理。Hermes ChatML 把所有东西(系统指令、工具定义、对话历史)全拼成一个巨大的 prompt 字符串,靠 <|im_start|> 等特殊 token 分隔。
第 4 题:实测结论
今天测试 Hermes-3-8B 得出的关键结论是什么?选出错误的一项:
A. 英文能力约 4/5,专业术语准确,结构化输出好
B. 中文能力约 2/5,生硬如机翻
C. 本地推理首字延迟约 1 秒
D. 模型自带 SmallRig 产品知识,能直接推荐兔笼型号
点击看答案
D 是错的。 Hermes 8B 不知道 SmallRig 产品,推荐了相机而非兔笼。这正是 Agent 存在的意义——模型本身的知识只是"兜底",实时产品数据需要靠 Tool 调用获取。
第 5 题:场景应用题
今天测试中发现 Hermes 拒绝推荐产品。通过 system prompt 覆盖后,它不再拒绝,但推荐了错误的品类(相机而非兔笼)。这个问题在 Agent 架构中应该怎么解决?
A. 换一个更大的模型(如 70B)
B. 在 system prompt 里写更详细的 SmallRig 产品信息
C. 给 Agent 配置一个 search_product Tool,让模型调用商品搜索 API 获取实时数据
D. 放弃 Hermes,只用 Claude
点击看答案
C。 System prompt 只能控制行为,填不了知识缺口。即使你把产品信息写进 prompt,token 也是有限的。正确做法是给 Agent 配置 Tool——模型判断用户意图后调用 search_product 获取实时商品数据,再用数据生成推荐。
这验证了 Agent 架构的核心逻辑:System Prompt 控制行为,Tool 提供数据。
⏭️ 完成后:更新 当前进度