小道的技术笔记

记录折腾、认知与闭环

折腾了两天、约 8 小时,从规划、编码、部署到调通全链路,最后得出一个结论:此路不通。把踩过的坑都写在这里,给想干同样的事的人省点命。

缘起

家里吃灰的天猫精灵 X1,一直想给它接上大模型,让它从”人工智障”变成真正的智能助手。

参考对象是 GitHub 上很火的 mi-gpt——给小爱音箱接入 ChatGPT,无缝对话,体验丝滑。我就想:同样的思路,能不能在天猫精灵上复刻一份?

手头资源:一台天猫精灵 X1、一个天猫精灵开发者平台账号、一台跑 Termux 的小米 10(当局域网服务器)、一台 Windows 电脑。

先研究 mi-gpt 的原理。它能做到”无缝劫持”,靠的是小米云端暴露了非官方的 MiNA/MiIOT 接口:每秒轮询音箱对话记录 → 检测到新提问 → 暂停小爱原生回答 → 调 LLM → 通过 TTS 指令推送回复。全程零硬件改造,纯云端遥控。

再看天猫精灵这边:X1 跑的是轻量 RTOS(不是 Android),256MB 内存,没有 root 方案,更关键的是——天猫精灵没有开放任何类似 MiNA 的对话轮询接口。mi-gpt 那套”监听+替换”的玩法,从架构上就走不通。

于是退而求其次,选了官方支持的路线:AliGenie 自定义技能 + LLM Webhook

方案架构

1
2
用户语音 → 天猫精灵X1 → AliGenie云端NLU → Webhook回调
→ Flask服务 → LLM API → 回复文本 → 平台TTS播报

听起来不复杂:在开放平台建一个技能,把后端指向自己的 Flask 服务,收到请求转手喂给大模型,把回答塞进回复字段。

理想很丰满。

实战:三个阶段,一路填坑

阶段一:后端搭建

技术选型 Python + Flask + requests,图一个轻。服务代码核心就一个 POST 接口,接收平台 JSON、提取用户话语、调 LLM、按协议返回。

坑 1:千问 Coding Plan 的 endpoint 和模型名。
用的是阿里云百炼 Coding Plan 的 key,base_url 是 coding.dashscope.aliyuncs.com/v1。结果 qwen-turboqwen-plus 全部报”model not supported”。查了一圈才发现这个端点只支持 Coding Plan 套餐内的模型(qwen3-coder-plus、qwen3.5-plus、kimi-k2.5、glm-5 等)。换成 qwen3-coder-plus 才通。

阶段二:部署到 Termux

打算让小米 10 的 Termux 当 24 小时服务器。然后迎来了本文章节最密集的一段坑。

坑 2:Termux 的 pip 是坏的。
Python 升级到 3.14 后,pip 的 shebang 还指向 python3.13,直接报 bad interpreter。解法:用 python -m pip 代替 pip

坑 3:openai SDK 在 Android 上装不上。
新版 openai SDK 依赖 jiter(Rust 写的),Termux 编译需要 maturin 且要 ANDROID_API_LEVEL 环境变量,直接失败。解法:干脆不用 openai SDK,用 requests 直接调 OpenAI 兼容 API,依赖从一堆缩到 flask + requests 两个。

坑 4:Flask 跑在 /sdcard 上,热重载是假的。
改完代码 push 到手机,Flask debug 模式检测不到文件变更(FUSE 文件系统的锅),必须手动重启。更惨的是多次重启残留了 4 个 python 进程抢 5000 端口,新代码死活不生效,一度以为代码写错了。排查到 ps 看见多实例才破案。

阶段三:对接平台

在 AliGenie 技能应用平台创建语音技能、配置意图、下载认证文件、填后端 URL。

坑 5:认证文件机制。
平台保存后端 URL 时,会去访问 你的域名/aligenie/xxx.txt 验证域名所有权。文件放对位置前,保存一直报”未正确获取到认证文件”。

坑 6:Windows 的 curl 发中文 JSON 是 GBK 编码。
这个坑迷惑性极强:明明改了代码,测试却”行为不变”。真相是 git-bash 里的 curl 把中文按 GBK 编码发出去,Flask 按 UTF-8 解析成乱码,字符串匹配全部失效。测中文接口一律用 Python requests,别用 curl。

坑 7:调用词”AI”直接”调用失败”。
第一版调用词设成”AI”,结果对音箱说”天猫精灵,AI”,返回”调用失败”。英文短词在平台 NLU 里有冲突。改中文。

坑 8:调用词”问小杜”被”小度”截胡。
改成”问小杜”后,对音箱说”天猫精灵,问小杜”,它开始一本正经地介绍百度的小度机器人……谐音撞车,内置技能优先级压过自定义技能。

坑 9:意图不支持自由文本。
这是最致命的一个。理想中”天猫精灵,两只小可爱,今天天气怎么样”,平台会剥离调用词”两只小可爱”,拿剩余文案去匹配意图例句。例句没有的内容,一律匹配失败(意图 null),根本不会回调你的服务器。
所谓”动态意图”(官方文档里接收任意输入的机制),实测无效。

坑 10:改完意图必须手动”语音交互模型训练”。
例句、意图标识任何改动,都要点”语音交互模型训练”重新上传训练,还要等几分钟生效。不知道这点的话,会陷入”明明配了例句为什么匹配不上”的死循环。

坑 11:技能审核中无法编辑。
提交审核后想改后端 URL?不行,”期间无法进行编辑”,必须先撤回审核。

最终能跑通的交互形态

绕了这么多弯,这个技能实际能做到的对话形态是这样的:

1
2
3
4
5
6
用户:天猫精灵,两只小可爱
音箱:你好,我是小杜,有什么想问的尽管说
(此时后端返回 ASK_INF 保持会话)
用户:写一首诗
(命中预配置的例句"写一首诗",回调后端 → LLM 生成)
音箱:(播报诗句)

注意两个硬约束:

  1. 用户说的话必须命中预配置例句,否则平台直接兜底”对不起,我暂时还不支持这项功能”,压根不给你服务器机会。想覆盖更多场景,只能一条条加例句、重新训练。
  2. LLM 必须在几秒内返回。 平台回调超时阈值很短。中间试过通用模型 qwen3.5-plus,写诗要 32 秒,音箱直接”歇菜”;换回 qwen3-coder-plus 约 4 秒才勉强达标。

还有一个隐蔽问题:LLM 回复里的换行符会让音箱 TTS 播报中断。写诗、列清单这类结构化输出必踩。解决办法是在返回前做文本清洗:

1
2
3
4
5
def clean_for_tts(text, max_len=200):
text = re.sub(r'[#*`>]', '', text) # 去 Markdown 符号
text = re.sub(r'\n+', '。', text) # 换行 → 句号
text = re.sub(r'\s+', '', text) # 压缩空白
return text[:max_len] # 限长

算一笔账

项目 成本
时间 约 8 小时,含凌晨两点调试
现金 ≈ 0(复用已有 API 套餐,隧道免费,零硬件购置)
连带损失 Termux 环境被折腾坏过一次,额外花时间恢复
产出 一套可用但鸡肋的技能 + 一肚子平台限制知识

为什么说是鸡肋

因为做出来之后发现,它连最基本的”自由对话”都做不到:

  • 想问的问题得先命中例句,等于提前把用户话术枚举一遍;
  • 简单问题(天气、时间)平台内置技能自己就能答,显得我们的 LLM 很多余;
  • 稍微开放一点的问题(写诗、推理、闲聊),要么匹配不上,要么超时;
  • 每改一次话术,要重新训练、等生效、甚至撤回审核。

折腾到最后,音箱能体面回答的,还是那些它本来就会的问题。

复盘:不是实现问题,是架构问题

回头看 mi-gpt 为什么成:小米云端开放了对话记录的读取和 TTS 的写入接口,等于给第三方留了一条”旁路劫持”的通道,所以能做到无缝接管。

天猫精灵这边,开放平台只给了”技能回调”这一条正门,而正门的通行规则(例句匹配、超时阈值、审核流程)决定了它天然做不了自由对话。

平台没打算让第三方这么玩,再精巧的实现也只是在别人的地基上违章搭建。

给后来者的建议

如果你也想给智能音箱接大模型:

  1. 小米音箱 + mi-gpt:生态最开放,方案最成熟,直接抄作业;
  2. 自带 LLM 的新款音箱:比如已接入各家大模型的产品,别折腾二开;
  3. 预算够的话:ESP32/树莓派 + 开源语音助手(wukong-robot 之类),完全自主可控;
  4. 只有天猫精灵的话:趁早放弃这个念头,把它当个普通音箱用就好。

代码我留在本地了(Flask + 协议封装 + TTS 清洗那一套),万一哪天平台政策松动,或者要抄这份避坑指南的人需要,随时能捡起来。

但大概率是不会了。


本文涉及的所有 API Key、账号、设备标识均已脱敏。项目全程未产生硬件费用,API 调用走已有订阅套餐。

一次”看起来很简单”的需求,最终变成了一场网络诊断实战。这篇文章记录了完整的过程、踩过的坑,以及最后搞明白的真相——希望能帮你少走几步弯路。

起因:一个”简单”的需求

需求本身一句话就能说完:装一套带谷歌全家桶的安卓模拟器,用来注册一个谷歌账号。

听起来不难?我也是这么想的。毕竟模拟器安装、谷歌服务、账号注册,每一环单独拿出来都是”烂大街”的教程内容。但把它们串在一起、再加上国内网络环境,事情就开始变得有意思了。

先说结论,让赶时间的朋友直接拿走:

  1. 模拟器安装很顺利,但国行版不带谷歌服务,需要手动补装;
  2. 模拟器里注册谷歌账号,2026 年的今天基本是死路(后面细说为什么);
  3. 注册环境的”风控评分”才是决定成败的核心,跟你操作是否正确关系不大;
  4. 运营商光猫的本地管理页可能被远程配置悄悄关掉,”以前能进现在进不去”不是你的错觉。

下面展开讲。

第一回合:装模拟器,坑在”路径”上

模拟器选了网易 MuMu,原因很实际:我的机器上同时跑着 WSL2(Hyper-V),而 MuMu 是少数官方声明与 Hyper-V 共存的国产模拟器,不用改系统配置。

安装过程踩了第一个坑:在线安装器下载完会自动开始安装,默认路径直接开跑,根本不等你看路径设置。等我发现时,它已经把程序写到了 D 盘、把虚拟机数据写到了 C 盘——而我本来想全部放空间充裕的 E 盘。

只好卸载重来。这里又发现第二个坑:MuMu 的后台服务有守护进程保护,任务管理器里手动杀进程是杀不干净的,必须走官方卸载器才能清彻底。

重装时学乖了:进入安装器第一个界面,先找到角落里的”自定义安装”入口,改好路径再点”立即安装”。最终程序和虚拟机镜像都乖乖落在 E 盘,C 盘零占用。

小技巧:给老机器装模拟器,除了安装路径,还要留意虚拟机镜像(vms 目录)的存放位置——它比程序本体大得多,而且默认跟系统走。

第二回合:谷歌全家桶,装得上,用不了”注册”

国行版 MuMu 出厂不带谷歌服务,这属于预期之内。通过应用中心搜索”谷歌安装器”,按”服务框架 → Play 服务 → Play 商店”的顺序装好三件套,重启,Play 商店正常打开——到这里一切顺利。

真正的墙出现在注册账号这一步。填完邮箱和密码,页面卡在白屏转圈,最后弹出:

“这可能需要一些时间……Google 需要验证您的设备或电话号码。”

点了”重试”之后,验证要求直接升级成:

“您可能需要插入 SIM 卡或设置 eSIM 卡才能继续验证。”

模拟器哪来的 SIM 卡?这条路走不通了。

排查:是网络问题还是风控问题?

这里做了几步诊断,值得展开讲,因为区分”网络不通”和”风控拦截”是解决这类问题的关键

  • 验证页面本身能从谷歌服务器加载出来(页面有内容、有渲染),说明网络层是通的
  • 测试代理出口 IP,发现是 DigitalOcean 新加坡的机房 IP——数据中心 IP 正是谷歌风控的重点关照对象;
  • 路由器开了 TUN 模式,模拟器流量确实走了代理(在代理日志里能看到模拟器虚拟网段的请求)。

结论:不是连不上谷歌,是谷歌不想让我这个环境注册

换 IP 有用吗?——有,但治标不治本

切换到新节点、清空谷歌三件套的应用数据、重启模拟器、重新走注册流程——验证环节换了张脸,但依然要”验证设备”。改从 Play 商店的原生入口注册,同样被拦。

到这里真相浮出水面:安卓端的账号创建流程,对模拟器环境已经普遍锁死为”必须 SIM/eSIM 验证”。这不再是某个 IP 的风控分数问题,而是谷歌对”模拟器指纹”这类环境特征的通用策略。换 IP、清数据都只是延缓判决。

第三回合:换赛道——PC 浏览器注册

既然模拟器内无解,那就换路:在电脑浏览器里注册,成功后回模拟器只做登录。登录流程不触发那套 SIM 拦截——这是整个方案里最关键的一条情报。

浏览器注册的体验确实好很多:姓名、生日、密码一路顺畅,页面加载流畅,没有模拟器里那种处处受限的感觉。

但走到电话验证环节,谷歌要求用手机扫二维码完成设备验证。扫码后,手机上出现了熟悉的一幕:提示”需要插入 SIM 卡”。

这里要替大家总结一个高频问题——**为什么手机明明插着卡,谷歌的验证码短信(G- 开头那类)就是收不到?**按概率排:

  1. 运营商的国际短信过滤:国际通道进来的短信,被运营商关键词/频次策略丢弃或延迟,本身丢失率就不低;
  2. 手机系统的骚扰拦截:国产系统默认开启海外短信拦截,先去”骚扰拦截记录”里翻一翻,大概率有惊喜;
  3. 号段问题:虚拟运营商号段(165/167/170/171)经常根本投递不到国际短信;
  4. 请求次数耗尽:同一号码短期多次请求,谷歌会静默停发几天,界面照样显示”已发送”。

对策:优先选”语音电话”验证(走电话线路,拦截率远低于国际短信);翻拦截记录并加白名单;虚商号段直接放弃短信路线。

至于连续多轮失败之后怎么办——我的经验是:停手,等 24-48 小时。谷歌的风控是评分制不是黑名单制,分数会随时间衰减。连续硬刚只会把手机号、IP、设备指纹的分都刷低,最后连累本来能成功的路径。

注册环境通过率的排序(实测 + 综合社区经验):

真机 + 实体 SIM + 移动数据 > PC 浏览器 > 安卓模拟器

真机注册时注意全程固定同一节点、别中途切换,网络环境跳变也是扣分项。

番外一:模拟器的广告清理

顺手把模拟器里铺天盖地的游戏推广清理了一下,方法对大多数国产模拟器通用:

  • 停用广告源头应用:应用中心、广告组件、广告标识(OAID)服务这三个包,用 pm disable-user 停用即可,不需要卸载;
  • 清空”自动预装”列表:很多模拟器有个隐藏配置项,开机会自动装推广 App,找到对应的系统设置项清空;
  • 重置桌面数据:桌面搜索栏里的游戏广告条来自桌面的”资讯组件”,重置桌面(pm clear 桌面包)即可消失。

清理后谷歌三件套不受影响,后台少一个常驻进程,3 核配置的模拟器流畅度肉眼可见地变好。

番外二:光猫管理页”消失”之谜

因为想研究软路由(把闲置手机改造成旁路由,让全家设备无感科学上网),需要进光猫改桥接。结果发现:光猫管理页打不开了——手机直连光猫 WiFi 也一样,但设备背面标签明确写着管理地址就是它。

排查过程非常典型:

  1. ping 光猫网关:
  2. tracert 第一跳 2ms:直达
  3. 路由表检查:无代理 TUN 劫持、无异常路由;
  4. 绑定源 IP 直连测试:80/443 端口依然超时(不是拒绝,是静默丢包);
  5. 全端口扫描 1-10000:没有任何开放的 TCP 管理端口,只有 DNS(53)活着。

结论:光猫的 Web 管理服务被电信的 TR069 远程网管从运营商侧关掉了。这不是我电脑的问题、不是我路由器的问题、更不是代理的问题——是光猫自己不回应。近年新装/升级固件的运营商定制光猫(我这台是电信友华代工)普遍在做这种”安全加固”。

“以前能进、现在不能进”和时间点上的巧合(比如接了新路由器)没有因果关系,那只是 TR069 自动下发配置的时间恰好撞上了。

破解路径按成功率排:

  1. 看光猫背面标签:确认型号和默认管理地址(有的不是常规端口);
  2. 拔光纤进本地维护模式:断开入户光纤后 TR069 通道失效,部分型号的本地管理页会重新开放,用默认超管账号尝试;
  3. 找装维师傅:直接说”要接自己的路由器改桥接”,师傅能通过工单系统重置超管密码,通常十分钟解决——这也是改桥接最稳的路。

复盘:这趟折腾教会我的三件事

**一、”能打开页面”不等于”网络没问题”,”打不开页面”也不等于”网络有问题”。**定位网络类故障,先分层:连通性(ping/traceroute)→ 端口层(TCP 探测)→ 应用层(HTTP 状态码)。这次两个问题(谷歌注册、光猫管理页)都靠端口层探测一锤定音。

**二、风控是评分制,不是开关。**IP 信誉、设备指纹、行为模式、历史失败记录,每一项都在加权。撞墙之后最理性的动作是停下来让分数冷却,而不是换着姿势继续撞。

**三、需求会自己长出分支。**从”装个模拟器”出发,一路上顺手解决了广告清理、网络拓扑梳理、光猫排查、软路由规划——折腾的意义大概就在这里:每个坑都是下一段路的地图。


本文涉及的网络工具与方法仅作技术记录与学习交流,请遵守当地法律法规。文中涉及个人环境的 IP、账号、设备信息已做脱敏处理。

台子搭好了,我开始上自动化。4个定时任务齐活,然后一个接一个翻车。最后我删掉了新闻播报,原话是”搞不好就算了”。

TL;DR

4个定时任务(早间新闻播报、每日工作总结、H3MS每日反思、HN+arXiv日报),钉钉Stream连接反复断,新闻播报被吐槽”胡说八道”。逐条核实后,发现RSS源+LLM翻译的组合就是会出幻觉。直接删掉新闻播报任务,从4个cron变成3个。砍掉的是执念。

一、起因:台子搭好了,该上自动化了

Hermes在手机上架起来之后,我接了三通道,跑了股票脚本,一切看起来都很美好。

但美好只持续了几天。

我这个人有个毛病——东西一旦跑通了,就想让它自动跑。在阿里做渠道的时候就是这样,SOP跑通了就想自动化,自动化跑通了就想规模化。这是销售出身的人的职业病。

所以我开始搞定时任务。

二、4个定时任务齐活

我给自己设了4个定时任务:

早间新闻播报(06:00)——每天早上6点,自动抓取财经新闻,筛选、分类、翻译,推送到钉钉群。我想的是,以前每天早上一睁眼就看手机新闻,现在让AI帮我筛选,我只看精华。

每日工作总结(20:00)——每天晚上8点,自动回顾一天的工作,生成总结。这个想法来自我在阿里的习惯,每天下班前花10分钟复盘当天的工作。

H3MS每日反思(21:00)——每天晚上9点,基于H3MS记忆系统生成每日反思。H3MS是我自己搞的一个知识管理系统,河马氏三域记忆——全局共享知识、跨域关联、每日反思。

HN+arXiv日报(07:00)——每天早上7点,抓取Hacker News和arXiv上的技术文章,翻译摘要推送。这个是我保持技术敏感度的方式。

4个任务,覆盖了早中晚。我想象中的画面是:每天早上醒来,钉钉群里已经推送了今天的新闻和技术日报;每天下班,工作总结自动发到群里;每天晚上睡前,H3MS反思提醒我这一天做了什么。

自动化不是目的,目的是让自己从”信息过载”中解脱出来。

三、翻车:钉钉Stream连接反复断

第一个翻车的是钉钉推送。

Hermes的定时任务默认通过Hermes会话机制推送消息到钉钉。这个机制叫”Stream模式”——Hermes保持一个长连接到钉钉服务器,实时接收和发送消息。

听起来很美好。但实际跑起来,Stream连接反复断。

日志里反复报错:No valid session_webhook for chat_id=xxx。意思是Hermes找不到有效的会话来推送消息。后台任务没有活跃的用户会话,Stream连接就断了。

我试了各种办法:改deliver目标、换脚本、加重试机制。都不行。Stream模式在后台任务场景下就是不稳定。

那段时间,每天早上一睁眼,钉钉群里要么没推送,要么推送了一半。新闻播报有时候发出来了,有时候没发出来。工作总结有时候推了,有时候没推。

自动化没让我解脱,反而让我更焦虑了——每天第一件事就是检查钉钉群里有没有推送。

四、胡说八道:新闻播报被吐槽

更尴尬的是新闻播报的内容。

有一天,我收到一条消息,是我自己发在钉钉群里的——不对,是Hermes的定时任务推的。我一看内容,愣住了。

早间新闻播报推了9条新闻,我逐条看了一遍:

1、【天气】英伟达5000亿AI融资计划暗藏隐忧,特朗普顾问警示”暗GPU”过剩风险
2、【政策】为什么越南和印度也开始发钱「催生」了?
3、【政策】出路在哪里?多国央行陷入”救火-加杠杆-再救火”的循环困境
4、【社会】韩国总统李在明称房地产泡沫已不容忽视
5、【社会】曾经爆火的洞洞鞋遇冷,Crocs联合瑞幸推出近六百元洞洞鞋
6、【财经】华尔街多头信心大振:标普500盈利增速创30年新高
7、【财经】手术机器人展望:从达芬奇帝国到国产替代
8、【国际】乌克兰出现由日本人组成的战斗分队
9、【国际】伊朗称美军已被驱逐不得进入海峡

我一条条去核实。

英伟达5000亿融资?查了,没有这个新闻,可能是旧闻拼接。

韩国总统李在明?韩国总统不是李在明,这个信息就是错的。

越南印度发钱催生?有相关的政策讨论,但不是”发钱催生”这种简单化的表述。

乌克兰日本人战斗分队?有报道,但不是”近日成立”,是之前就有的。

9条新闻里,至少有3条存在事实错误或严重夸大。分类也乱七八糟——英伟达融资被分到了”天气”类,越南人口法被分到了”政策”类(这个勉强算对),洞洞鞋被分到了”社会”类。

我自己在钉钉群里看到这条推送,第一反应是尴尬。

这不是我想要的新闻播报。我想要的是精华筛选,不是AI幻觉大赏。

五、逐条核实:RSS+LLM翻译的组合陷阱

我花了半天时间,逐条核实了这9条新闻的来源。

问题出在新闻播报的架构上:RSSHub抓取标题和摘要 → LLM翻译+分类 → 推送到钉钉。

RSSHub是个开源RSS聚合服务,我用的实例是rsshub.rssforever.com。它抓取的新闻源质量参差不齐,有些是知乎热榜(”为什么/如何/吗”这种问答格式),有些是公众号文章标题党,有些是旧闻搬运。

LLM翻译+分类这一步,问题更大。LLM看到RSS抓来的碎片化摘要,会”脑补”完整内容。加上翻译过程中的信息丢失,最终输出的新闻就变成了”半真半假”的状态。

我试图修复:加过滤规则、换RSS源、调整LLM的prompt。但修来修去,本质问题没解决——RSS源的标题党+LLM的脑补幻觉,这个组合天生就不适合做新闻播报。

六、搞不好就算了

我盯着那条新闻播报看了很久。

9条新闻,3条有事实错误,2条分类错误,剩下4条虽然事实没错但都是旧闻。我花了一天时间逐条核实、修脚本、调prompt,结果还是不行。

然后我做了一个决定:删掉新闻播报任务。

原话我在会话里说的是:”搞不好就算了,以后需要再说吧。”

删掉一个自己精心设计的定时任务,说实话有点心疼。毕竟花了那么多时间写脚本、调配置、测试推送。但更心疼的是时间——如果我每天花半小时去核实AI生成的新闻,那还不如我自己直接看新闻。

自动化不是银弹。有些东西,机器做不好,不如不做。

从4个cron变成3个。剩下的3个(每日工作总结、H3MS每日反思、HN+arXiv日报)后来也经历了各种翻车和修复,但至少它们的内容是我自己可控的。

七、教训:快速止损的工程哲学

这件事给我上了一课。

在阿里做销售的时候,我学会了一件事:快速止损。一个客户跟了3个月没跟进,不如换个客户跟。一个渠道跑了半年没跑通,不如换个渠道跑。

做技术也一样。一个方案试了3天不行,不如换个方案。一个任务跑了1周不稳定,不如删掉。

“搞不好就算了”不是放弃,是止损。是承认有些东西现在做不好,等条件成熟了再做。

新闻播报后来有没有恢复?恢复了。但不是用RSS+LLM翻译的方式,而是改用Webhook直推模式,脚本自己处理推送,不依赖Hermes会话。这是后话了。

但至少在那一刻,我学会了:自动化不是越多越好,稳定比数量重要。


作者:小道 · 环境:Termux on Android 13 · 2026-08-08
关联阅读:上一篇《一台Android手机,就是我的AI服务器》 · 下一篇《升级只需5分钟,修环境要5小时》

一台 2014 年的 i5 + 16GB 内存的 Win10 老机器,开机后内存就吃掉一半多。花半小时做了次”开机体检 + 微创手术”,分享给同样被老电脑启动拖累的朋友。

一、为什么要折腾

最近这台主力机的体感是:开机进桌面后要”愣”好一会儿才顺手。看一眼任务管理器——16GB 内存,刚开机空闲就只剩 7GB 出头。

老平台的 CPU 本来就弱(i5-4590,四核),开机阶段几十个自启动进程和服务一起抢 CPU、抢磁盘,慢是真有原因的。

于是我决定系统地查一遍:开机启动项、系统服务、计划任务。这里说句公道话,很多”电脑慢”并不是硬件不行,而是十年积攒下来的自启动残留没人管。

二、先摸清家底:三个检查入口

不用装任何第三方工具,Windows 自带的信息就够用:

1. 启动项——看三个地方:

  • 任务管理器 →”启动”标签页(最直观,但看不到全貌)
  • 注册表 Run 键(真正的”账本”):
    • HKCU\Software\Microsoft\Windows\CurrentVersion\Run(当前用户)
    • HKLM\Software\Microsoft\Windows\CurrentVersion\Run(所有用户)
    • HKLM\Software\WOW6432Node\...\Run(32 位程序)
  • 启动文件夹:shell:startupshell:common startup

用命令快速看一眼注册表启动项:

1
2
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run"
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run"

2. 服务——重点看”自启动但不用”的:

1
2
Get-CimInstance Win32_Service | Where-Object { $_.StartMode -eq 'Auto' } |
Select-Object Name, State, PathName

微软官方的 svchost 服务基本别碰,重点筛第三方路径的自启动服务。

3. 计划任务——开机/登录触发的隐藏大户:

1
Get-ScheduledTask | Where-Object { $_.TaskPath -notlike '\Microsoft\*' -and $_.State -ne 'Disabled' }

三、体检报告里最意外的三个发现

发现① 一个”幽灵用户会话”在偷偷吃内存

机器上有两个账户。检查时发现:另一个账户的会话虽然处于”已断开”状态,但人走了、”房间”没退——一整排按用户启动的服务还在后台常驻,白白占几百 MB 内存。

这个坑非常隐蔽:任务管理器的启动项里根本看不到它。断开 ≠ 注销,不用了请选”注销”。

发现② 卸载干净的安全软件,才是对系统好

体检发现一个很典型的”半卸载”样本:某国产安全软件的托盘程序还注册在开机启动里,但进程根本没在跑(服务也是”自动启动、实际停止”)——典型的卸载不干净。而 Windows Defender 其实在正常工作,双杀毒软件共存毫无意义,只会拖慢开机。

处理方式:删掉它的 Run 启动项 + 删除残留服务,最后用官方卸载器/清理工具把残留目录请出去。先备份注册表,再动手。

发现③ “自动启动”的服务,有一大半其实从没运行过

清点名册时发现 6 个服务设成了”自动”,但常年 Stopped——它们不是不需要,就是按需才用。这类服务改成”手动”几乎零风险:Windows 需要时会自动拉起它们,白白开机自启只是徒增负担。

1
2
# 查看某服务当前状态
Get-Service -Name 'MapsBroker'

另外还揪出一个每次登录都静默失败的计划任务(上次结果代码 1)——这种”僵尸任务”既拖慢登录又报错给谁看呢?不需要就直接删。

四、我最终做的减法

操作 数量/效果
移除 IM 软件自启(改为手动开) 少加载约 2GB 内存的常驻大户
清理半卸载安全软件残留 删 1 个启动项 + 1 个服务
自启服务改手动 共 8 个
删除无用计划任务 1 个
清理注册表启动残留记录 18 条
注销幽灵用户会话 释放数百 MB

改完后,真正有实质负担的第三方自启只剩网络代理等少数几个确实在用的。系统服务从 73 个自启动降到 65 个,开机自启进程减少 5 个以上,预计释放内存 0.5~1GB——对老平台来说,登录到可用的等待时间有可感知的缩短。

五、抄作业:安全清单与红线

动手前,务必先备份(注册表一键导出,改坏了能还原):

1
reg export "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" run_backup.reg

这些不要乱动(我保留的白名单):

  • 杀毒/防火墙:Defender 全家桶(WinDefend、wscsvc、mpssvc)
  • 网络相关:无线局域网(WlanSvc)及无线网卡厂商自己的服务——有的电脑用的是 USB 网卡,厂牌服务一停直接断网
  • 开发依赖:WSL 服务
  • 外设依赖:打印后台处理(Spooler)
  • 你自己主动部署的隧道/代理/网关类服务

原则一句话:只删”确定的残留”,只改”自动却从不运行”的,拿不准就设”手动”而不是”禁用”。

六、写在最后

这次体检全程是让桌面上的 AI 助手跑的——采集、分析、备份、提权逐项执行,我只负责在关键决策上拍板(比如”这个要不要留”)。如果你想手动来一遍,上面的命令也足够覆盖 90% 的操作。

老电脑不可怕,可怕的是十年不敢打扫。你的电脑开机后内存还剩多少?欢迎评论区晒一下。


本文为个人维护记录,机型环境为 Win10 22H2 + 16GB 内存的老平台,具体项目请以自己机器的实际情况为准;涉及注册表与服务操作,请务必先备份。

阿里11年,从地推铁军到钉钉渠道,最后两年管11个城市代理商,一个人连轴转,身体和家庭都到了临界点。离开后在杭州进了家小公司,早九晚五,舒服,但发现自己不是那种能安逸的人。直到折腾起了”小龙虾”(OpenClaw),一发不可收。

TL;DR

一台Android手机 + Termux + Hermes Agent = 一个能接钉钉/微信/飞书三通道的AI助手,外加股票盈亏查询、定时新闻播报、每日工作总结。零云服务器成本,全跑在手机上。

这不是教程,是一个阿里老兵在非技术岗位上,第一次把AI落到自己生活里的踩坑记录。

一、起因:发现自己不是那种能安逸的人

我在阿里待了11年。

前5年在中国供应商(中供)做B2B大客户销售运营,那是真刀真枪跑出来的日子,每天睁眼就是KPI、客户、方案,脑子转得停不下来。中间4年转做钉钉渠道管理,开始玩生态、玩SOP、玩渠道赋能。最后两年在本地生活做渠道管理,管11个城市的代理商。

一个人管11个城市,是什么概念?

周一到周五,正常上班,正常加班。周末和节假日,是促销高峰,更是得时刻盯着。业绩压力像一根弦,绷紧了就没松过。长期出差,家里人有意见,闹矛盾。身体开始发出警告——不是累一天两天,是常年连轴转,吃不消了。

离开的时候,没想太多。就是觉得,得停下来。

后来经人介绍,我进了杭州一家做教育赛事运维的小公司。20多年的传统老业务,很稳定。50来人,早九晚五,不加班。

舒服吗?确实舒服。

但舒服了没多久,我就发现一个问题:我没成长了。

以前在阿里,每天面对新挑战、新压力、新打法,脑子是活的。现在呢?业务是稳定的,流程是成熟的,问题是有前人兜底的。时间稀里糊涂就过掉了,像温水煮青蛙。

我不是那种能安逸的人。骨子里,我还是那个在中供跑客户、在钉钉管渠道、一个人扛11个城市业绩的人。安静下来,反而慌。

得找点事做。

二、一发不可收:从OpenClaw到Hermes

找什么事?

一开始是瞎折腾。后来刷到了OpenClaw(大家叫它”小龙虾”),一个让AI能”动手”的开源项目。我本来只是想看看AI现在能干什么,结果一入坑深似海。

从OpenClaw开始,我接触到了各种AI工具、Agent框架,发现这东西不仅能”聊天”,还能真的干活——能接钉钉、能抓数据、能自动化跑流程。

然后我刷到了Hermes Agent。

Hermes是个开源AI助手框架,能接钉钉、微信、飞书,能在Termux(Android上的Linux终端)里跑。最打动我的是它的”全栈自管”理念——不依赖云端,数据在自己手里,跑在本地。

我在手机上试了一下。

三、搭台子:从”玩玩”到”跑起来”

Termux在Android上跑Linux,这个概念我知道。但真正动手才发现,坑比想象的多。

第一个坑:Python环境

Termux的Python是3.13,和市面上大多数教程的3.11不一样。venv路径变了,旧依赖全废。cryptography这个库,50.0.0版本在Android上编译直接崩溃——日志里写着Failed to load plugin 'wecom-platform': No module named 'cryptography.hazmat.backends',微信插件因为缺这个库根本加载不了。

锁死48.0.1才跑通。设了ANDROID_API_LEVEL=33,折腾了大半天。

第二个坑:三通道接入

Hermes支持多个通道(钉钉、微信、飞书),但每个通道的配置都不一样。钉钉需要Webhook Token,微信需要Session管理(而且Session会过期,日志里反复报Session expired; pausing for 10 minutes),飞书相对简单。

我把三个通道全接上了。从此,不管是在钉钉群里、微信里还是飞书上,都能跟我手机上的AI助手对话。

第三个坑:股票播报脚本

这个是我的刚需。我有港股和美股持仓——俄铝、海天味业、小米、商汤、美图、易方达、万科,加上美股的DJT、CHA、BABA。以前查行情要打开三四个APP,港股一个、美股一个、汇率换算再一个。

写了一个stock_pnl.py脚本,问一句”今天港股情况咋样”,AI直接拉API算盈亏。港股7只+美股3只,港币美元自动换算人民币,成本价浮盈浮亏一目了然。

第一次跑通的时候,屏幕上一行行跳出来:

俄铝(00486) +3.43%,今日赚362元
海天味业(03288) +2.96%,今日赚81元
小米集团(01810) +2.07%,今日赚96元

那一刻,我觉得这玩意儿比打开APP查快多了。更重要的是,我在折腾这个东西的过程中,久违地感觉到了”成长”——不是业绩压力逼出来的成长,是自己主动想要搞明白某个东西的那种兴奋。

四、台子搭好了,然后呢?

到这一步,Hermes已经跑在手机上了。三通道接入,股票查询脚本跑通。同事不知道,这个平时开会不说话的中年人,已经在手机上搭了一套AI基础设施。

手机屏幕不大,Termux的终端界面黑底白字,看起来就像个极客玩具。但它确实在跑——后台进程常驻,通道实时在线,我随时可以通过钉钉、微信、飞书跟它对话。

零云服务器成本。没有AWS,没有阿里云,没有Docker集群。一台Android手机,11GB内存,226GB存储(后来被吃掉了22GB,那是后话)。

但说实话,这时候的Hermes只是个”能用的玩具”。它能回答问题、查股票、接通道,但还没有真正融入我的日常工作生活。

真正的折腾,是从把它变成”工具”开始的。


作者:小道 · 环境:Termux on Android 13 · 2026-07-15
关联阅读:下一篇《搞了4个定时任务,删掉了一个》

0%