888 KB与一颗ESP32:zclaw如何在最小的芯片上跑通AI助手
文章摘要
zclaw 的核心约束只有一条:整个固件,包括Wi-Fi驱动、TLS加密、FreeRTOS操作系统调度器、所有应用逻辑,必须在888 KiB以内运行。
这不是随意选的数字,是ESP32标准分区方案下单个OTA分区的最大可用空间。zclaw的开发者 (@tnm) 把这个约束当成设计哲学而非硬性限制:所有功能决策都经过「这真的有必要吗」的过滤,然后尽可能地省。
最终结果是:应用逻辑本身只占34.9 KiB(约4.1%)。Wi-Fi栈占45.7%,TLS/密码学占13%,证书包占11.5%。那个888 KB里,有约840 KB都用在了「让设备安全地接入互联网」这件事上,「AI助手」的实际代码不到35 KB。
Hacker News 的讨论展开了一场有趣的多维争论:这不是本地LLM,只是API调用;ESP32作为「永不宕机」的可靠部署平台;从个人AI助手延伸到家庭协作claw生态;以及关于curl | bash安装方式安全性的经典争议。
背景与问题
微控制器(MCU)上能跑AI助手意味着什么
当我们说「在ESP32上跑AI」,需要先厘清一件事:这和把LLM塞进手机里或者本地推理是完全不同的事情。
ESP32是一款基于Xtensa LX6(或RISC-V,取决于型号)的低功耗微控制器,典型配置是4-16MB闪存和520KB SRAM。它完全不可能在本地运行任何现代语言模型——Llama 最小的可用版本也需要几百MB。
zclaw 的「AI」是通过API调用实现的:设备连接Wi-Fi,加密传输用户的问题到Anthropic/OpenAI/Ollama的服务器,服务器上的LLM处理后返回结果,设备解析并展示响应。设备本身只是一个极小的状态机和网络客户端。
这不是一个局限,而是一种选择——这个选择让整个系统的复杂度、成本和功耗保持在最低水平,同时仍然能提供完整的AI对话能力。
为什么选ESP32而不是树莓派
对于「要接入LLM API的IoT设备」,一个显而易见的问题是:为什么不用树莓派Zero(约$15,跑Linux)?
zclaw README里没有直接回答这个问题,但HN讨论里给出了很好的答案:
资源使用哲学的差异:树莓派跑完整Linux,你获得了灵活性,但也获得了Linux的所有运维问题——包更新、内存泄漏、OOM killer随机终止进程、SD卡老化导致的文件系统损坏。一个「AI助手」项目在几个月后因为随机的Linux进程异常而悄悄死掉,是非常常见的结局。
ESP32跑FreeRTOS,系统只做它被编程要做的事,没有后台守护进程干扰,没有包管理器更新破坏稳定性。一旦固件烧好,除非硬件损坏,它会一直跑下去。HN评论里有人说自己的ESP32设备已经稳定运行了好几年没有重启过。
功耗:ESP32在Wi-Fi活跃状态下约80-200mA,可以用USB供电或电池长时间运行。树莓派Zero在负载下约400-700mA。对于电池供电的场景,这个差距很重要。
成本:ESP32开发板约$5-15,树莓派Zero(当前价格)约$15,但树莓派需要MicroSD卡(又一个故障点)和额外外设。
核心内容解析
3.1 888 KiB的内存分布
zclaw 的一个独特亮点是它在README里公开了详细的内存占用分解:
| 组件 | 大小 | 占比 |
|---|---|---|
| Wi-Fi协议栈 | ~396 KB | 45.7% |
| TLS/密码学 | ~113 KB | 13.0% |
| X.509证书包 | ~100 KB | 11.5% |
| FreeRTOS内核 | ~45 KB | 5.2% |
| HTTP/JSON解析 | ~38 KB | 4.4% |
| 应用逻辑(AI助手) | ~35 KB | 4.1% |
| 其余(NVS、分区表等) | ~141 KB | 16.3% |
这个分布说明了嵌入式网络应用的本质:「让设备安全上网」这件事,在二进制大小上需要的资源远超业务逻辑本身。如果你去掉TLS(不安全,不推荐),可以省出约100KB;如果你用HTTP而非HTTPS(同样不推荐),再省出HTTP/TLS握手的开销。但代价是安全性。
888 KiB的约束逼迫开发者做出清晰的权衡:没有任何「可以加但不是必须加」的功能能进入固件。这个原则本身就是一种很有价值的工程训练。
3.2 功能集:刚好够用
zclaw 支持的功能列表:
通信
- Telegram Bot:通过Telegram的Bot API发送和接收消息
- Web Relay:一个独立的托管中继服务(zclaw提供hosted版本,也可自建),将HTTP请求路由到ESP32设备,实现无需固定IP的远程访问
AI集成
- Anthropic(Claude系列)
- OpenAI(GPT系列)
- OpenRouter(聚合多个LLM的路由服务)
- Ollama(本地LLM服务器,支持局域网调用)
这意味着如果你在家里有一台跑Ollama的电脑,ESP32可以通过局域网调用本地LLM,实现真正的纯本地AI助手(ESP32→本地Ollama→本地LLM),不依赖任何外部API。
定时任务(Cron)
- daily:每天固定时间执行(如每天早上8点发一条天气播报)
- periodic:按固定间隔执行(如每30分钟检查一次)
- once:设备启动后执行一次
GPIO控制
- 读取数字/模拟传感器
- 控制继电器、LED、电机驱动等数字输出
- 这使得zclaw可以作为物理世界的控制节点,不只是对话界面
持久化内存(NVS)
- 使用ESP-IDF的NVS(Non-Volatile Storage)直接写入flash
- 可以跨重启保存对话状态、配置参数、自定义数据
Persona选项
- 内置多种角色预设(工具助手、宽松聊天模式等)
- 用户可自定义system prompt的细节
3.3 "claw"生态:从个人设备到家庭协作
HN评论里一个意想不到的方向是关于「claw生态系统」的讨论,这是围绕zclaw出现的一个微型开源生态:
- zclaw:本文主角,完整功能版本,ESP32
- openclaw:更通用的版本,接口更开放,可以集成自定义工具
- picosclaw:针对树莓派Pico W或RP2040平台的移植版
- nanoClaw:针对Arduino Nano BLE Sense的极小版本
- openclaw Gateway Protocol:一个让多个claw实例互相发现和通信的协议提案
有用户提到他们家里有多个zclaw设备,家庭成员各自通过不同的Telegram账号与同一个"家庭AI助手"对话,设备缓存共同的上下文,形成一个低成本的家庭协作AI接入点。一个ESP32的硬件成本不到20美元,每个家庭成员1个设备,整套系统费用约等于一个月的API费用。
3.4 HN讨论的核心争论
"这不是本地AI"的争议
评论区有相当多的声音指出:zclaw 只是一个API包装器(wrapper),真正的「AI」运行在远端服务器上。ESP32本身不做任何机器学习推理。
这个批评有道理,但也有些偏题。zclaw的定位不是"本地LLM替代品",而是"用极低成本的硬件构建一个始终在线的AI接入点"。区别类似于:一台没有本地AI的智能音箱(Alexa/Google Home)也是"只是API包装器",但如果你需要一个不依赖大公司生态系统的版本,zclaw是一个选项。
如果你确实需要本地LLM,你用Ollama接入,ESP32变成局域网Ollama的前端——这时候它就是真正的本地AI方案了(虽然速度取决于跑Ollama的那台机器)。
ESP32作为可靠部署平台
HN上资深嵌入式工程师对ESP32的稳定性给予了相当高的评价,尤其是相对于同价位的Linux单板机。
一条高赞评论说:"我的ESP32设备在户外运行了3年,从来没有过OOM重启或者包更新把系统搞坏。树莓派做同样的事情活不过6个月不需要人工干预。"
这个稳定性来源于ESP32运行环境的简单性:FreeRTOS没有内存交换(swap),没有动态库加载,没有后台守护进程,没有文件系统老化问题(NVS使用wear-leveling)。它在功能上远不如Linux灵活,但在「不更新我也能稳定跑5年」这件事上,远超Linux单板机。
NixOS作为Linux替代
讨论里也有用户提出:如果真的需要Linux的灵活性,NixOS是一个相对能保证稳定性的选项,因为它的声明式配置让系统状态可完全重现,不会出现"某次更新悄悄改了某个包,然后应用崩了"的情况。但NixOS的学习曲线显著高于ESP32的烧固件+配置。
curl | bash 的安全问题
zclaw的安装方式是:
bash <(curl -fsSL https://raw.githubusercontent.com/tnm/zclaw/main/install.sh)
这个安装模式在HN每次出现都会引发讨论,通常是"不应该直接执行远程脚本"的反驳。zclaw这条讨论也不例外。
反对者的核心论点:
- 任何人控制了这个GitHub仓库(通过账号泄露、Social Engineering或Supply Chain Attack)就可以在安装者的机器上执行任意代码
- 你在安装时无法轻易验证脚本内容(即便它是开放的,大多数人不会逐行读完再执行)
支持者的论点:
- 这是开发工具的常见分发方式(Homebrew、Rust安装器都这样做)
- 对于消费此工具的目标用户(有能力管理ESP32开发环境的工程师),这个风险是已知的
- 真正的安全问题是API Key的管理,不是安装脚本
现实是:如果你不信任这个项目的安全性,正确的做法不是使用更安全的安装方式,而是不使用这个项目或者自己审计并本地构建。
ADC质量的吐槽
一条有技术深度的评论指出:ESP32的ADC(模拟数字转换器)质量相当差,内置ADC存在明显的非线性和噪声问题,尤其是Wi-Fi活跃时ADC精度会进一步下降(射频干扰)。如果zclaw需要读取模拟传感器(温湿度、光敏电阻等),建议接外部SPI/I2C ADC芯片而非使用ESP32内置ADC。
这是一个真实的硬件局限,但对于zclaw的主要用例(数字IO控制、消息收发)影响不大。
3.5 Tamagotchi AI:用ESP32实现随时间进化的AI伙伴
一个特别有创意的评论是关于「Tamagotchi AI」的想法:用zclaw的持久化内存和定时任务功能,构建一个不只是响应问题、而是主动随时间演化的AI伙伴。
想象中的功能:
- AI有一个随时间变化的「情绪状态」,影响它的回复风格
- 它记住你上次聊天的内容,并在新的对话中自然地引用
- 它有定期的「主动发声」行为,比如在特定时刻发送一条早安、或者询问某个未完成的计划进展
- 它的「个性」是从对话数据中逐渐累积的,而不是静态的system prompt
这个想法在技术上是可行的:ESP32的NVS可以存储状态,定时任务可以触发主动消息,API调用可以把状态上下文传入system prompt。问题在于存储量——NVS只有几百KB,长期的「记忆」需要外接更大的存储设备或者借助云端状态存储。
深度分析与思考
4.1 zclaw的真实定位:一个可以永不宕机的AI接入端
读完所有讨论,zclaw 最独特的价值不是代码量小,不是88KiB固件,而是:一个可以真正可靠地全天候在线的AI交互节点。
大部分人将AI助手跑在手机上(需要充电、需要唤醒、有时候网络不稳定)、跑在电脑上(需要开机)、跑在服务器上(需要付钱、需要运维)。ESP32消耗的功率可以忽略不计,可以永远插在USB充电头上,不依赖任何复杂的软件栈,配置好之后什么都不需要做。
这对于某些具体场景是很有价值的:
- 家里有老人或小孩,需要一个他们能用的简单AI交互设备(Telegram界面对长辈也算友好)
- 需要在某个固定位置(厨房、实验室)长期部署一个小助手
- 需要一个硬件GPIO控制+对话AI的混合节点(比如:问它「把灯调亮一点」,它通过GPIO控制继电器)
4.2 小而可靠,还是大而灵活
zclaw的存在引发了一个更大的问题:在AI集成里,我们是否过度地倾向于「尽量多」?
主流AI工具的趋势是:越来越大的上下文窗口、越来越多的工具集成、越来越复杂的Agent框架。zclaw走向了完全相反的方向:888 KiB,只做必要的事,剩下的省掉。
两种路径都有价值。复杂Agent框架适合需要在多个系统间做复杂协调的任务;zclaw适合「我只需要一个能随时问问题的东西,它不需要控制我的整个生产力系统」。
问题在于:我们很少明确地做这个选择,而是默认跟着工具走向更复杂的方向。zclaw是一个好的提醒:有些问题不需要复杂的解法。
4.3 个人观点:这个项目的最大价值是教学
zclaw 的 GitHub README 是我见过的嵌入式+AI集成项目里,把内存占用分解写得最清楚的。它把「大部分代码用在了什么地方」这件事变得透明——435KB是Wi-Fi,113KB是TLS,应用逻辑35KB。
这对于任何刚开始接触嵌入式开发或IoT安全的人来说,是一个极好的视角:我们习以为常地认为「连接互联网」很简单,但在资源受约束的硬件上,安全地联网本身就是一个重量级工程。
花35KB写AI助手,花840KB保证通信安全——这个比例是相当有教育意义的数字。
技术栈/工具清单
核心技术
- ESP32 / ESP32-C3 / ESP32-S3 / ESP32-C6:目标微控制器平台
- FreeRTOS:实时操作系统(内核调度、任务管理)
- ESP-IDF:乐鑫官方开发框架
- NVS(Non-Volatile Storage):ESP-IDF的键值持久化存储
- MbedTLS:TLS/密码学库(ESP-IDF内置)
AI集成
- Anthropic API(Claude 3系列)
- OpenAI API(GPT-4/GPT-4o等)
- OpenRouter(多LLM路由)
- Ollama(本地LLM服务器,局域网调用)
通信
- Telegram Bot API
- Web Relay(zclaw托管中继服务,实现无固定IP的远程访问)
工具链
bash <(curl install.sh):一键安装脚本- provision.sh:凭证配置脚本(API Key、Wi-Fi密码等)
- web-relay.sh:自建web relay的辅助脚本
相关生态
- openclaw:通用版本,工具接口更开放
- picosclaw:树莓派Pico W版本移植
- nanoClaw:Arduino Nano BLE Sense版本(极限资源约束)
- openclaw Gateway Protocol:多设备发现与协作协议(提案阶段)
相关资源与延伸阅读
- zclaw GitHub 仓库 - 完整源码,v2.6.1,MIT许可,1.2k stars
- HN 讨论:zclaw - Personal AI assistant in under 888 KB running on an ESP32 - 145 条讨论
- ESP32-C6 数据手册(乐鑫) - ESP32-C6规格与外设说明
- ESP-IDF 开发文档 - 乐鑫官方开发框架完整文档
- FreeRTOS 官方文档 - 实时操作系统基础
- NVS(Non-Volatile Storage)编程指南 - ESP-IDF持久化存储(键值 flash存储)
- Valetudo(对比参考) - 同样是"从厂商云端解放IoT设备"的思路,但针对扫地机器人
- ESPHome:ESP32的另一种使用路线 - 通过YAML声明式配置构建Home Assistant集成的固件方案
- Telegram Bot API 文档 - zclaw默认通信渠道的API参考
- Ollama: 本地LLM运行工具 - 与zclaw集成可实现完全本地化AI助手
- Awesome ESP32(GitHub精选列表) - ESP32开发项目精选集合,了解整体生态
- MbedTLS 源码(GitHub) - zclaw使用的TLS加密库,占固件~113KB