在本地使用 Ollama 运行 Hermes — 零 API 成本
问题所在
云端大语言模型(LLM)API 按 Token 收费。一次高强度的编码会话可能花费 5–20 美元。对于个人项目、学习或涉及隐私的工作来说,这笔费用会不断累积——而且你还将每一次对话都发送给了第三方。
本指南解决的问题
你将设置完全在自有硬件上运行的 Hermes Agent,并使用 Ollama 作为模型后端。无需 API 密钥,无需订阅,数据不会离开你的机器。配置完成后,Hermes 的工作方式与使用 OpenRouter 或 Anthropic 时完全相同——终端命令、文件编辑、网页浏览、任务委托——但模型是在本地运行的。
读完本指南后,你将拥有:
- 由 Ollama 提供服务的一个或多个开源权重模型
- 连接到 Ollama 自定义端点的 Hermes
- 一个能够编辑文件、运行命令和浏览网页的可用本地代理
- 可选:一个完全由自有硬件驱动的 Telegram/Discord 机器人
所需条件
| 组件 | 最低配置 | 推荐配置 |
|---|---|---|
| 内存 (RAM) | 8 GB(适用于 3B 模型) | 32+ GB(适用于 27B+ 模型) |
| 存储 | 5 GB 可用空间 | 30+ GB(适用于多个模型) |
| CPU | 4 核 | 8+ 核(AMD EPYC, Ryzen, Intel Xeon) |
| GPU | 非必需 | 配备 8+ GB 显存的 NVIDIA GPU 可显著加速 |
Ollama 可以在仅配备 CPU 的服务器上运行。在现代 8 核 CPU 上运行 9B 模型的速度约为 ~10 tokens/秒。在 CPU 上运行 31B 模型速度较慢(~2–5 tokens/秒)——每次响应需要 30–120 秒,但可以正常工作。GPU 可以大幅改善这一情况。对于仅使用 CPU 的环境,请通过环境变量增加 API 超时时间(这不是 config.yaml 中的配置键):
# ~/.hermes/.env
HERMES_API_TIMEOUT=1800 # 30 minutes — generous for slow local models
步骤 1:安装 Ollama
curl -fsSL https://ollama.com/install.sh | sh
验证其是否正在运行:
ollama --version
curl http://localhost:11434/api/tags # Should return {"models":[]}
步骤 2:拉取模型
根据你的硬件选择模型:
| 模型 | 磁盘占用大小 | 所需内存 | 工具调用支持 | 最佳用途 |
|---|---|---|---|---|
gemma4:31b | ~20 GB | 24+ GB | 是 | 最佳质量——强大的工具使用和推理能力 |
gemma2:27b | ~16 GB | 20+ GB | 否 | 对话任务,无工具使用 |
gemma2:9b | ~5 GB | 8+ GB | 否 | 快速聊天、问答——无法调用工具 |
llama3.2:3b | ~2 GB | 4+ GB | 否 | 仅用于轻量级快速回答 |
Hermes 是一个代理型助手——它通过工具调用来编辑文件、运行命令和浏览网页。不支持工具调用的模型只能进行聊天;它们无法执行操作。为了获得完整的 Hermes 体验,请使用支持工具的模型(如 gemma4:31b)。
拉取你选择的模型:
ollama pull gemma4:31b
你可以拉取多个模型,并在 Hermes 中使用 /model 命令在它们之间切换。Ollama 会根据需求将活动模型加载到内存中,并自动卸载空闲模型。
验证模型是否正常工作:
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gemma4:31b",
"messages": [{"role": "user", "content": "Say hello"}],
"max_tokens": 50
}'
你应该看到包含模型回复的 JSON 响应。
步骤 3:配置 Hermes
运行 Hermes 设置向导:
hermes setup
当提示选择提供商时,选择 Custom Endpoint(自定义端点) 并输入:
- Base URL(基础 URL):
http://localhost:11434/v1 - API Key(API 密钥): 留空或输入
no-key(Ollama 不需要密钥) - Model(模型):
gemma4:31b(或你拉取的任何模型)
或者,直接编辑 ~/.hermes/config.yaml:
model:
default: "gemma4:31b"
provider: "custom"
base_url: "http://localhost:11434/v1"
步骤 4:开始使用 Hermes
hermes
就是这样。你现在正在运行一个完全本地的代理。试一试:
You: List all Python files in this directory and count the lines of code in each
You: Read the README.md and summarize what this project does
You: Create a Python script that fetches the weather for Ho Chi Minh City
Hermes 将使用终端工具、文件操作和你的本地模型——无需调用云端服务。
步骤 5:为任务选择合适的模型
并非每个任务都需要最大的模型。以下是一份实用指南:
| 任务 | 推荐模型 | 原因 |
|---|---|---|
| 文件编辑、代码、终端命令 | gemma4:31b | 唯一具有可靠工具调用支持的模型 |
| 快速问答(无需工具使用) | gemma2:9b | 对话任务的响应速度快 |
| 轻量级聊天 | llama3.2:3b | 速度最快,但功能非常有限 |
对于完整的代理工作(编辑文件、运行命令、浏览网页),gemma4:31b 目前是具有工具调用支持的最佳本地选项。查看 Ollama 的模型库 以获取更新模型——工具调用支持正在迅速扩展。
在会话期间随时切换模型:
/model gemma2:9b
步骤 6:优化速度
增加 Ollama 的上下文窗口
默认情况下,Ollama 使用 2048 个 Token 的上下文。Hermes 在进行带有工具的代理工作时至少需要 64,000 个 Token:
# Create a Modelfile that extends context
cat > /tmp/Modelfile << 'EOF'
FROM gemma4:31b
PARAMETER num_ctx 64000
EOF
ollama create gemma4-64k -f /tmp/Modelfile
然后更新你的 Hermes 配置,将模型名称设置为 gemma4-64k。
保持模型加载状态
默认情况下,Ollama 会在闲置 5 分钟后卸载模型。对于持久的网关机器人,请保持其加载状态:
# Set keep-alive to 24 hours
curl http://localhost:11434/api/generate \
-d '{"model": "gemma4:31b", "keep_alive": "24h"}'
或者在 Ollama 的环境变量中进行全局设置:
# /etc/systemd/system/ollama.service.d/override.conf
[Service]
Environment="OLLAMA_KEEP_ALIVE=24h"
使用 GPU 卸载(如果可用)
如果你拥有 NVIDIA GPU,Ollama 会自动将层卸载到 GPU 上。可以通过以下命令检查:
ollama ps # Shows which model is loaded and how many GPU layers
对于在 12 GB GPU 上运行的 31B 模型,你将实现部分卸载(约 40 层在 GPU 上,其余在 CPU 上),这仍然能带来显著的速度提升。
第 7 步:作为网关机器人运行(可选)
一旦 Hermes 在 CLI 中本地正常工作,你可以将其暴露为 Telegram 或 Discord 机器人——仍然完全在你的硬件上运行。
Telegram
- 通过 @BotFather 创建机器人并获取 token
- 添加到你的
~/.hermes/config.yaml:
model:
default: "gemma4:31b"
provider: "custom"
base_url: "http://localhost:11434/v1"
platforms:
telegram:
enabled: true
token: "YOUR_TELEGRAM_BOT_TOKEN"
- 启动网关:
hermes gateway
现在在 Telegram 上给你的机器人发送消息——它将使用你的本地模型进行回复。
Discord
- 在 discord.com/developers 创建 Discord 应用
- 添加到配置中:
platforms:
discord:
enabled: true
token: "YOUR_DISCORD_BOT_TOKEN"
- 启动:
hermes gateway
第 8 步:设置回退机制(可选)
本地模型在处理复杂任务时可能会遇到困难。设置一个云回退机制,仅当本地模型失败时才激活:
model:
default: "gemma4:31b"
provider: "custom"
base_url: "http://localhost:11434/v1"
fallback_providers:
- provider: openrouter
model: anthropic/claude-sonnet-4
这样,你 90% 的使用量是免费的(本地),只有困难的任务才会调用付费 API。
故障排除
启动时出现 "Connection refused"
Ollama 未运行。启动它:
sudo systemctl start ollama
# or
ollama serve
响应缓慢
- 检查模型大小与内存: 如果你的模型需要的内存超过可用内存,它会交换到磁盘。使用更小的模型或增加内存。
- 检查
ollama ps: 如果没有 GPU 层被卸载,响应将受限于 CPU。这对于仅 CPU 的服务器来说是正常的。 - 减少上下文: 大型对话会减慢推理速度。定期使用
/compress,或在配置中设置较低的压缩阈值。
模型不遵循工具调用
较小的模型(3B、7B)有时会忽略工具调用指令,生成纯文本而不是结构化的函数调用。解决方案:
- 使用更大的模型 —
gemma4:31b或gemma2:27b处理工具调用的效果远好于 3B/7B 模型。 - Hermes 具有自动修复功能 — 它能检测格式错误的工具调用并尝试自动修复。
- 设置回退机制 — 如果本地模型失败 3 次,Hermes 将回退到云提供商。
上下文窗口错误
默认的 Ollama 上下文(2048 个 token)对于代理工作来说太小。请参阅 第 6 步 以增加它。
成本对比
以下是基于典型编码会话(约 100K token 输入,约 20K token 输出)本地运行相比云 API 所节省的费用:
| 提供商 | 每次会话成本 | 每月(每日使用) |
|---|---|---|
| Anthropic Claude Sonnet | ~$0.80 | ~$24 |
| OpenRouter (GPT-4o) | ~$0.60 | ~$18 |
| Ollama(本地) | $0.00 | $0.00 |
你唯一的成本是电费——根据硬件不同,每次会话大约 $0.01–0.05。
本地运行效果良好的场景
- 文件编辑和代码生成 — 9B+ 模型能很好地处理此任务
- 终端命令 — Hermes 封装命令,运行它,无论模型如何都能读取输出
- 网页浏览 — 浏览器工具负责获取内容;模型仅解释结果
- Cron 作业和计划任务 — 与云设置的工作方式相同
- 多平台网关 — Telegram、Discord、Slack 均可与本地模型配合使用
云模型更优的场景
- 非常复杂的多步推理 — 70B+ 或像 Claude Opus 这样的云模型明显更好
- 长上下文窗口 — 云模型提供 100K–1M token;除非你进行配置,否则本地运行时通常默认低于 Hermes 的 64K 最低要求
- 大响应的速度 — 对于长生成,云推理比仅 CPU 的本地推理更快
最佳策略:日常任务使用本地模型,为困难任务设置云回退机制。