在手机上跑 AI Agent + 本地大模型,听起来很酷? 我试了,然后我醒了。
起因
事情是这样的。
我手机上一直跑着 Termux——Android 上的 Linux 终端模拟器。在这上面我部署过各种东西:llama.cpp 跑过本地模型、sing-box 搭过代理、甚至折腾过 Navidrome 流媒体服务器。
之前看到 Hermes Agent 觉得挺有意思,官方安装脚本甚至还写了 Termux 专有路径,于是决定试试。
结果官方的一键安装脚本 curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash 因为网络原因老是卡在半路,装了多次都没装全。
越装不上我就越来劲。
Flag 就此立下。
Hermes 是什么?
Hermes Agent 是 Nous Research 出品的开源 AI Agent,支持 Telegram、Discord、WhatsApp 等多平台接入,能写代码、搜网页、看图说话,还能派生子 agent 并行干活。
功能很强,官方安装脚本甚至还写了 Termux 专有路径——这让我信心大增。
开局:之前一键安装的残留
今天再次通过 ADB 连上手机一看,好家伙,~/.hermes/ 目录都在,llama-server 进程还跑着——原来之前装了好几次,早就留下痕迹了。
只不过环境有点乱:
- 两个 hermes-agent 代码目录,一个在
~/.hermes/hermes-agent/(安装脚本放的),一个在~/hermes-agent/(手动克隆的) - venv 虚拟环境里的 Python 包基本没装全
hermes命令的启动脚本路径写死了系统路径,Android 上根本跑不起来
好,修复工作开始。
第一关:修好 hermes 命令
手动验证发现:
$ hermes --version
/system/bin/sh: /usr/bin/env: bad interpreter: No such file or directory
Android 上哪来的 /usr/bin/env?
打开启动脚本一看:
#!/usr/bin/env bash
exec /path/to/venv/bin/hermes "$@"
Termux 的 bash 在 /data/data/com.termux/files/usr/bin/bash。顺手把 HOME 环境变量也写死进去,免得还要猜用户目录。
改完再试:
$ hermes --version
Hermes Agent v0.18.1 (2026.7.7) · upstream c30c9753
Project: /data/data/com.termux/files/home/.hermes/hermes-agent
Python: 3.13.13
亮了。
第二关:Python 依赖地狱
版本号能看了,但执行任何命令都报 ModuleNotFoundError——缺 pyyaml、缺 dotenv、缺这缺那。
最理想的方案是 pip install -e .[termux-all] -c constraints-termux.txt,一行命令全搞定。
然而现实是——手机编译 Rust 扩展慢到令人发指。
pydantic-core 和 jiter 这两个 Rust 写的 Python 包,用 pip 装一次就要 10-15 分钟。ADB 命令超时断连,后台进程也各种幺蛾子。
试了几个路子:
路数一:从系统 Python 复制包
系统里装了 pyyaml,但 venv 没有。直接 cp -r 过去——嗯,能用了。但 openai、pydantic 这些包系统里也没有,复制大法不灵。
路数二:下载 ARM64 预编译 wheel
PyPI 上有 manylinux2014_aarch64 的 wheel,下载下来推到手机上。pip 一装就报错:
pydantic_core-2.47.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
is not a supported wheel on this platform.
Termux 用的是 Android 的 bionic libc,Linux 的 glibc wheel 不兼容。强行解压改名后尝试导入:
ImportError: dlopen failed: library "libgcc_s.so.1" not found
死心。
路数三:在手机上硬编译 手机有 Rust、有 clang,但 pip install 一次 10 分钟起。折腾了不知道多少轮,终于把包都装上了。
第三关:64K 上下文的诅咒
依赖装完,模型配好,llama-server 重启上线。信心满满地输入:
$ hermes chat -q "1+1=?" -Q
等待回复……
等……
然后:
Model has a context window of 2,048 tokens,
which is below the minimum 64,000 required by Hermes Agent.
一盆冷水。
llama-server 之前用 -c 2048 启动的,而 Hermes 硬性要求 至少 64K 上下文。
理论上 Qwen3.5-2B 的原生上下文支持 262K,完全够。问题在于物理内存:
| 上下文 | KV cache 估算 | 能否运行 |
|---|---|---|
| 2K | ~200MB | ✅ 飞快 |
| 8K | ~1.9GB | ✅ 可以 |
| 32K | ~7.5GB | ⚠️ 勉强 |
| 64K | ~15GB | ❌ 手机只有 8GB 内存 |
15GB 的 KV cache + 1.2GB 的模型权重,8GB 的手机直接原地去世。
最后的妥协方案是:服务端用 -c 8192 实际运行,配置里写 context_length: 65536 骗过 Hermes 的校验检查。
嗯,能骗过检查,但骗不了物理定律。
第四关:跑起来了,但 4 分钟才出第一个字
改完上下文,再次启动 Hermes:
session_id: 20260708_133605_0e228f
然后……没动静了。
查看 llama-server 的日志:
prompt processing, n_tokens = 2048, progress = 0.15, t = 65.77 s
prompt processing, n_tokens = 4096, progress = 0.30, t = 152.90 s
prompt processing, n_tokens = 6144, progress = 0.45, t = 241.19 s
Hermes 的系统提示词有 6000 多个 token。 每次启动要先处理这 6000 个 token,在手机 CPU 上需要整整 4 分钟。
4 分钟啊。
而且这还是每轮对话都要发生的事情。真用起来,问一句话等 4 分钟才响第一个字,这体验基本告别实用。
推理速度方面:
prompt processing: ~25 tokens/s
generation: ~18 tokens/s
纯 CPU,无 GPU 加速(POCO F2 Pro 的 Adreno GPU 没被 llama.cpp 支持),这个速度在手机上其实算不错了——只是 Hermes 的提示词实在太大了。
总结:梦醒了
验证的结论
❌ Hermes Agent + 本地模型不适合纯手机部署,原因有三:
- 内存天花板:64K 上下文最低要求 + 模型权重 ≈ 16GB,手机只有 8GB,差了整整一倍
- 无 GPU 加速:25 tokens/s 的推理速度,配合 6000+ token 的系统提示词,首响应 4 分钟
- Agent 本身就是重量级选手:Hermes 功能强大但提示词巨大,天然为桌面/服务器设计
反过来,什么方案可行?
- 远程 API:手机跑 Hermes 客户端,调用云端模型 —— 恢复之前的配置就行了,又快又省电
- 手机做推理服务器:如果未来手机有 16GB+ RAM + GPU/NPU 加速,加上更轻量的 Agent,或许可行
- 纯推理(不用 Agent):只跑
llama-server做 API 服务,用其他轻量客户端调用,体验会好很多
不后悔
这次折腾虽然没成功,但收获不少:
- 学会了 Android NDK 下交叉编译 Rust 扩展的门道
- 知道了 manylinux wheel 和 Android bionic libc 不兼容
- 对 KV cache 的内存占用有了直观认识
- Hermes 配置结构也摸了一遍
而且你看,折腾这些事儿的过程,本身不就是玩手机的乐趣所在吗?
本文首发于我的个人公众号,记录在 Termux 上折腾 AI 的故事。 设备:POCO F2 Pro (LineageOS) · 8GB RAM · 骁龙 865