
如果你最近关注 Hugging Face 的硬件动态可能已经看到了 MicroDuck 这个名字。这是一款起售价约 399 美元的可编程本地 AI 开发套件目标并不是替代 GPU 服务器而是让 AI 真正“跑进”小设备、传感器、互动装置和课堂实验里。换句话说MicroDuck 想解决的问题是当 AI 不再依赖云端接口而是一块能拿在手里的开发板时我们能做出什么这篇文章采用中英双语关键点的方式帮你梳理 MicroDuck 的核心概念、环境准备、快速上手流程、可编程实战思路以及训练和部署一个本地小模型的通用路径。内容不会只是抛概念而是会给出可直接参考的代码框架和排查方案。无论你是嵌入式开发者、AI 初学者还是正在做创客教育、课程设计的学生都可以从中找到自己能用的部分。1. MicroDuck 是什么给本地 AI 一个“小身体”1.1 从 Hugging Face 到 MicroDuckHugging Face 这个名字很多开发者首先想到的是 Transformers、Diffusers、datasets 这些大模型工具库。过去几年它更多是以“AI 开源社区”的身份出现在大众视野中人们在这里下载模型、微调模型、分享模型。而 MicroDuck 的出现则是 Hugging Face 在硬件方向的一次重要试探。从名字上就能看出它的定位Micro 代表微控制器、微小设备和嵌入式场景Duck 则呼应 Hugging Face 社区中非常出名的“Quack”口号和吉祥物形象。你可以把它理解为一只“能跑 AI 的小鸭子”。需要先说明的是目前 MicroDuck 的具体硬件规格、支持 SDK 版本和预置模型仍然处于快速迭代状态不同批次的产品可能会有差异。编造一份“完美文档”没有意义本文会侧重于原理、开发流程和通用工程思路。具体到板载芯片型号、引脚定义、SDK 安装命令请以 Hugging Face 官方仓库和产品 README 为最新准绳。1.2 MicroDuck 到底是一台什么设备通俗地说MicroDuck 是一个可编程的本地 AI 设备。它具备三个关键属性本地推理设备上直接运行神经网络模型不需要把数据上传到云端也不需要每次都调用 API。可编程用户可以通过代码控制它的输入输出行为。比如读取传感器、控制 LED、驱动扬声器、响应按钮事件等。小体型它的尺寸和功耗都面向嵌入式场景适合放进原型机、桌面装置或教学实验箱里。从产品定位看它不是树莓派的替代品也不是英伟达 Jetson 的替代品。树莓派更接近一台“迷你电脑”适合跑完整的 Linux 系统和稍大的模型Jetson 面向高性能边缘计算价格和功耗都更高。而 MicroDuck 的特点是用更精简的硬件去承载那些“刚刚好够用”的小模型把 AI 应用做得更轻、更快、更有趣。1.3 可编程 AI 设备与普通开发板的区别如果你以前玩过 Arduino、ESP32 或者 STM32再看 MicroDuck 时可能会觉得整体流程很熟悉同样是烧录固件、操作 GPIO、读写传感器。但最大的区别在于MicroDuck 把AI 推理能力作为核心卖点而这不是一个简单的“传感器读数 if-else 判断”能达到的效果。举个例子普通开发板可以读取一个光线传感器的数值然后判断“值 500 就开灯”。这是传统编程逻辑。而 MicroDuck 的典型场景是识别一段语音是不是唤醒词判断一个手势是左右滑动还是上下滑动根据震动波形判断电机是否异常对低分辨率图像做简单分类。这些场景的共同点是没有清晰的规则可以手写需要用模型从数据中学习规律。MicroDuck 做的事情就是让这种“模型推理”在本地单片机上也能完成。Key Points本章要点MicroDuck is a programmable on-device AI kit priced around $399.It focuses on local inference, programmability, and embedded scenarios.It is not a replacement for Raspberry Pi or Jetson, but a lightweight AI experiment platform.Compared with traditional MCU boards, it adds a complete AI inference layer.2. 为什么值得关注边缘 AI 的价值与应用场景2.1 本地推理到底解决了什么痛点我们平时使用 AI 服务最常见的方式是调用云端 API把数据上传上去等服务器算完再把结果拿回来。这种方式成熟、稳定而且模型可以很大。但它有几个天然短板隐私问题音频、图像、传感器数据一旦上传就离开了本地设备的控制边界。很多企业和教育机构对数据出境或上传非常敏感。网络延迟即使网络状况良好一次完整的请求仍然需要几十到几百毫秒。对于交互性很强的应用这个延迟会明显影响体验。离线不可用一旦断网所有依赖云端的 AI 能力都会瘫痪。长期成本高频调用云端接口会产生持续的 API 费用。MicroDuck 这类本地 AI 设备把推理放到设备端之后数据不需要离开硬件响应时间可以压缩到毫秒级断网也能继续工作。虽然它只能跑小型模型但很多实际场景根本不需要一个千亿参数的大模型一个小而专的模型反而更快、更省。2.2 典型应用场景拆解结合 MicroDuck 的可编程属性和硬件形态以下几类场景很值得关注语音关键词识别这是最经典的嵌入式 AI 场景。设备在本地持续监听麦克风音频只对“Hi Duck”或“开灯”这样的关键词做出响应。唤醒成功后再进行后续指令处理整个过程不需要录音上传到服务器。手势识别与人机交互配合加速度计或摄像头模块MicroDuck 可以识别用户的手势动作比如挥手切换页面、倾斜控制小车方向。这是一种非常自然的交互方式适合做智能家居中控或辅助输入设备。异常检测在工业设备上安装振动传感器MicroDuck 持续采集振动数据并判断设备是否运行在正常状态。当推理结果出现异常偏离时再触发报警。这类检测恰恰不需要复杂的大模型而是需要低功耗、实时响应和长期稳定运行。互动装置与 AI 教育在高校课程设计和创客教育中可编程硬件一直是热门题目。比如“可编程电子音乐自动演奏电路”这类项目本质就是用代码控制硬件发声、演奏。而 MicroDuck 可以把这类实验升级成“会根据环境噪声或手势自动改变演奏风格的互动音乐装置”。这比单纯用定时器触发音符复杂得多也更接近真实产品的原型。2.3 MicroDuck 在 AI 教育中的特殊位置过去我们学习 AI往往是从 Python 和 Notebook 开始的训练好的模型都存在于电脑里。到了部署环节才第一次接触 Docker、ONNX Runtime、TensorRT 这些工程工具中间跨度很大。MicroDuck 这类设备提供了一个更平滑的路径模型训练依然可以在电脑上完成但部署目标是一个可以触摸、可以拿着走的硬件。学生能亲眼看到“模型是如何影响真实世界的”这对理解输入特征、模型容量、量化精度、推理时延等抽象概念非常有帮助。如果你正在做“可编程电子音乐”类似的项目MicroDuck 可以演变为一个带 AI 感知能力的音乐控制器拾取环境声音、识别节拍、根据传感器数据调整音乐输出的音量和节奏。这类作品既有工程深度也有展示效果很适合作课程设计或竞赛作品。Key Points本章要点On-device AI solves privacy, latency, offline availability, and long-term cost problems.Typical use cases include keyword spotting, gesture recognition, anomaly detection, and interactive education projects.MicroDuck lowers the barrier between model training and physical hardware deployment.3. 环境准备与基础概念3.1 硬件清单在开始之前你需要确认手头有哪些硬件。这里以通用嵌入式 AI 开发套件为例列出基本物品项目说明MicroDuck 开发板建议从官方渠道购买注意版本编号USB-C 数据线用于供电和串口通信注意不要只用只能充电的线传感器/外设模块按项目需求准备比如麦克风、OLED 屏、LED、舵机面包板与杜邦线做原型验证时非常方便电池模块如果要做便携项目可以考虑 LiPo 电池和升压模块MicroDuck 的具体引脚定义、供电电压和扩展接口需要查阅你手上这块板的原理图或官方引脚图。不同批次之间如果存在调整官方仓库里通常会给出更新说明这是优先信任的资料。3.2 开发环境选择MicroDuck 的开发方式并不唯一具体取决于官方 SDK 支持程度。以下是几种常见路线建议按你的经验水平选择方式一官方 Web IDE 或预编译固件如果你只想快速体验不需要安装本地工具链。把设备用 USB 连接到电脑打开官方提供的浏览器编程页面直接写代码并烧录。这个方式最适合第一次接触嵌入式开发的新手。方式二Arduino IDE如果 MicroDuck 当前固件兼容 Arduino 框架那么你可以使用 Arduino IDE 编写代码。好处是资料多、库丰富、上手快。缺点是大型工程组织得比较随意多人协作不太方便。方式三PlatformIOPlatformIO 是更工程化的嵌入式开发环境基于 VS Code 插件使用。它支持依赖管理、多环境配置、单元测试适合正式项目或团队协作。对于想长期维护一套 MicroDuck 代码库的开发者比较推荐。方式四MicroPython / CircuitPython这类 Python 固件可以把开发门槛降到最低用 Python 语法控制硬件不需要处理编译链接细节。适合快速原型开发也适合给学生做教学。缺点是运行效率和实时性不如 C/C。在接受任何一套工具链之前请先确认官方对它的支持状态。版本选择以官方文档为准不要只看网上的零散教程就确定环境。3.3 中英双语术语对照为了配合中英双语的阅读体验这里把后续文章会高频出现的术语整理成一个对照表方便你查阅中文English微控制器Microcontroller本地推理On-device Inference固件Firmware烧录Flash模型量化Model Quantization外设Peripheral训练Training部署Deployment串口监视器Serial Monitor推理时延Inference LatencyKey Points本章要点Choose the development path that fits your skill level: Web IDE, Arduino IDE, PlatformIO, or MicroPython.Always check official documentation for pin mapping and SDK versions.Understanding terms like firmware, flashing, quantization, and deployment is essential before coding.4. 快速上手跑通第一个 MicroDuck 程序4.1 连接硬件与安装驱动先把 MicroDuck 用 USB-C 数据线连接到电脑。如果设备指示灯没有亮优先检查线材是否为数据线而不是纯充电线。接着打开设备管理器Windows或系统报告macOS确认是否出现新的串口设备。如果你的电脑无法识别设备通常需要安装串口驱动。常见的 USB 转串口芯片包括 CP210x、CH340、FTDI 等去对应芯片厂商官网下载驱动即可。安装完成后拔掉 USB 重新插入再次查看端口号。这里要特别提醒部分开发板的 USB 接口同时承担供电和通信如果电脑 USB 口供电能力不足可能会导致烧录过程反复失败。可以尝试换一个 USB 口或者使用带外部供电的 USB Hub。4.2 编写第一个 Blink 程序我们先从一个最简单的例子开始控制板载 LED 闪烁。这个例子的目的不是展示 AI而是确认你的工具链、烧录链路和开发板本身都能正常工作。如果 MicroDuck 当前固件支持 Arduino 框架代码结构大致如下// 文件路径src/main.cpp // Blink 示例通过板载 LED 闪烁验证开发环境 void setup() { // 将 LED_BUILTIN 引脚设置为输出模式 pinMode(LED_BUILTIN, OUTPUT); } void loop() { // 点亮 LED digitalWrite(LED_BUILTIN, HIGH); // 持续 500 毫秒 delay(500); // 熄灭 LED digitalWrite(LED_BUILTIN, LOW); // 持续 500 毫秒 delay(500); }这段代码非常简单但它在嵌入式开发中的地位相当于“Hello World”。只要 LED 开始以 500ms 间隔闪烁就说明编译工具链、驱动、烧录流程全部正常。有同学可能会问为什么第一步不直接跑 AI 示例因为 AI 示例涉及模型文件、外部依赖和资源较长的编译如果环境有问题很难判断到底是哪里出错。先跑一个最小的程序可以把系统问题隔离开。4.3 烧录与验证在 PlatformIO 中你只需要在项目目录下运行pio run -t upload如果是 Arduino IDE则通过菜单选择开发板型号和串口端口然后点击“上传”。烧录过程中不要断开 USB也不要去打开串口监视器否则可能因为端口占用导致上传失败。烧录完成后打开串口监视器波特率一般设置为 115200。不过 Blink 程序本身不会输出日志你只需要观察 LED 是否按预期闪烁即可。4.4 尝试一个带日志输出的程序为了验证串口通信可以把代码改成每次闪烁时输出当前计数// 文件路径src/main.cpp // Blink 示例带串口日志验证开发板和电脑之间的通信链路 int count 0; void setup() { pinMode(LED_BUILTIN, OUTPUT); // 初始化串口波特率 115200 Serial.begin(115200); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(200); digitalWrite(LED_BUILTIN, LOW); delay(200); count; // 输出当前闪烁次数 Serial.print(Blink count: ); Serial.println(count); }烧录后打开串口监视器如果能看到不断递增的Blink count输出就说明 USB 串口通信也没问题。有了这个基础后面跑真正的 AI 示例时你才能通过日志确认模型推理流程是否正常。Key Points本章要点Start with a basic Blink program to verify the toolchain, driver, board, and serial link.Use a reliable USB data cable and avoid flaky power supplies.Always confirm the serial port number before uploading.Serial logging is your most important debugging tool in embedded development.5. 可编程实战构建一个本地 AI 小应用5.1 实战目标设计在这一节里我们设计一个比较有代表性的微型 AI 应用拍手控制 LED 开关或者更准确地说通过识别声音事件来切换 LED 状态。为什么要选这个案例因为它的数据采集、特征提取、模型训练、推理部署链路是完整的而且效果直观。你一拍手设备立刻做出反应观众能立刻感受到“AI 在本地运行”的含义。整个流程可以拆成以下几个阶段采集音频或传感器数据形成数据集在电脑上训练一个二分类模型拍手声 vs 环境噪声模型转换并量化成设备可运行的格式编写设备端推理逻辑部署到 MicroDuck反复验证。5.2 训练一个声音分类模型电脑端设备端推理只是最后一步。真正的模型训练通常还是在电脑上完成的。这里我们用一个非常简化的 Python 示例示意训练思路。# 文件路径train_model.py # 以下代码用于在电脑端训练一个简单的音频事件分类模型 # 这里只是结构示意实际需要根据你的数据集和框架版本调整 import numpy as np from tensorflow import keras from tensorflow.keras import layers # 假设 features 是已经提取好的音频特征shape 为 (样本数, 特征维度) # 假设 labels 是 0/1 标签0 表示环境噪声1 表示拍手声 # features, labels load_your_dataset() model keras.Sequential([ layers.Input(shape(16,)), layers.Dense(32, activationrelu), layers.Dense(32, activationrelu), layers.Dense(2, activationsoftmax) ]) model.compile( optimizeradam, losssparse_categorical_crossentropy, metrics[accuracy] ) # model.fit(features, labels, epochs20, batch_size16, validation_split0.2)这段代码不是直接给 MicroDuck 用的而是在电脑端完成“找到一个合适的模型参数”的过程。实际训练时你可能需要用到 MFCC 特征也就是音频的梅尔频率倒谱系数而不是直接把原始波形丢给模型。5.3 模型转换与量化电脑上训练出的模型通常体积偏大、精度偏高直接用浮点数在单片机上运行内存和算力往往扛不住。因此需要做模型转换和量化把权重从 float32 压缩到 int8体积可以减小到原来的四分之一推理速度也会明显提升。转换思路如下# 文件路径convert_model.py # 将训练好的 Keras 模型转换为 TFLite并尝试量化 # 这只是示意代码具体 API 请参考 TensorFlow 对应版本文档 import tensorflow as tf # 加载训练好的模型 # model keras.models.load_model(snap_model.h5) converter tf.lite.TFLiteConverter.from_keras_model(model) # 配置量化减少模型体积 converter.optimizations [tf.lite.Optimize.DEFAULT] tflite_model converter.convert() with open(model_int8.tflite, wb) as f: f.write(tflite_model)转换完成后你需要把.tflite文件放进 MicroDuck 的固件项目中并按照官方 SDK 的方式加载和运行。MicroDuck 具体支持 TFLite Micro、ONNX Runtime 还是自定义推理引擎请以官方仓库为准。这里更重要的思路是无论哪种引擎训练 → 转换 → 量化的路径是相通的。5.4 编写设备端推理逻辑设备端代码的核心逻辑是从麦克风或传感器读取数据提取特征传给推理引擎根据推理结果执行动作。以下是一个概念性代码结构需要放到 MicroDuck 的主程序中// 文件路径src/main.cpp // 本地 AI 应用根据音频事件控制 LED 开关 #include MicroDuckAI.h // 概念头文件实际以官方 SDK 为准 void setup() { Serial.begin(115200); // 初始化模型 bool ok AI.begin(model_int8.tflite); if (!ok) { Serial.println(Failed to load model); while (1) {} } // 初始化麦克风和 LED Microphone.begin(); pinMode(LED_BUILTIN, OUTPUT); } void loop() { // 1. 读取音频数据 int16_t* audio Microphone.read(16000, 500); // 读取 500ms 音频 // 2. 提取特征 float* feature FeatureExtractor.run(audio); // 3. 执行推理得到分类结果 int result AI.predict(feature); // 4. 根据结果执行动作 if (result 1) { digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); delay(1000); // 防止连续触发 } }上面的代码是伪代码不保证在任何版本 MicroDuck 上都能直接编译通过。它想表达的是设备端程序的职责分层输入层采集数据和预处理推理层调用模型拿到分类结果业务层根据结果控制外设。实际开发时你只需要把每一层里的函数替换成官方 SDK 的对应接口即可。这种分层设计也能让你以后更换模型或硬件时只改其中一层。5.5 验证与调优部署完成之后不要急着把所有代码都写完。先测试一个最简单的模型比如“只区分静音和大声”。确认推理链路没问题后再换更复杂的数据集。验证时关注三个指标识别准确率拍手 10 次能正确触发几次响应时延从拍手到 LED 切换大概过了多少毫秒误触发率不拍手时设备会不会乱亮。如果误触发很多可以调整特征提取参数、增加数据多样性或者提高阈值判断比如要求连续多次推理结果都为拍手才认为是有效事件。Key Points本章要点A complete local AI application includes data collection, training, model conversion, and device-side logic.Model quantization is critical for small devices with limited memory.Separate your code into input, inference, and business layers.Validate with simple models before moving to complex tasks.6. 常见问题与排查思路即使参考资料再全实际操作中也难免遇到问题。这里把 MicroDuck 开发中可能遇到的几类典型问题整理成表格方便你按图索骥。问题现象常见原因解决思路电脑识别不到设备线材只是充电线或驱动未安装换一条确认能传数据的数据线安装芯片厂商驱动烧录一直失败串口被其他软件占用或没有进入烧录模式关闭串口监视器按官方说明进入下载模式后重试LED 不闪烁引脚定义不对或程序没有烧录成功核对官方引脚图重新烧录并观察串口日志模型推理结果总是同一类输入特征处理错误或模型未正确加载打印原始特征和推理输出分步排查输入链路设备发热明显连续高负载推理散热不足降低推理频率开启休眠必要时加散热片电池续航很短外设常开没有使用低功耗模式使用事件唤醒方式在不推理时关闭外设电源官方示例编译报错依赖库版本不一致根据仓库 release 版本锁定依赖版本还有一个非常常见的问题官方仓库更新后烧录进旧设备的固件失效。这主要是因为模型格式或推理引擎 API 发生了变化。解决办法是不要盲目升级而是先阅读更新说明必要时重新烧录完整固件。如果遇到报错信息第一反应不要是搜索完整长句而是把报错中的关键代码、文件路径和版本号提取出来去官方 issue 区搜索。多数问题都已经有人踩过坑了。Key Points本章要点Most connection issues come from cables and drivers, not the board itself.Lock your dependency versions to avoid breaking builds after SDK updates.When debugging, isolate the problem into hardware, toolchain, model, or business logic layers.7. 从设备到项目工程实践与最佳实践7.1 代码结构分层很多初学者拿到 MicroDuck 后习惯把全部代码写在一个main.cpp里。这在一两个示例中没问题但一旦项目变大比如同时接入麦克风、屏幕、按钮和网络模块代码就会变得很难维护。推荐把代码分为三层驱动层封装对麦克风、LED、屏幕、按键等外设的操作推理层封装模型加载、推理执行、结果解析业务层实现完整的交互逻辑比如“检测到拍手后先播报音量再切换 LED”。这样分层之后如果你要换一个模型只需要改推理层换一块屏幕只需要改驱动层。业务逻辑不用动。7.2 版本管理与可复现性嵌入式 AI 项目有一个容易被忽略的问题模型文件、训练脚本、设备端固件、第三方依赖库之间往往存在隐式关联。模型用 0.2 版本的数据训练设备端烧录的却是三天前的固件这类错位排查起来非常痛苦。最佳实践是把以下内容纳入 Git 仓库训练脚本和数据预处理代码训练好的模型文件以及对应的精度、量化参数设备端完整工程requirements.txt 或 platformio.ini 等依赖锁定文件README记录“如何复现训练结果”和“如何部署到设备”。每次发布固件时记录对应的模型版本号和数据集版本号。这个习惯在项目进入长期维护阶段后会帮你节省大量时间。7.3 数据隐私与合规边界本地 AI 的最大优势是数据不出设备但这也带来了新的责任如果设备采集了语音、图像或人体动作数据你需要明确告知用户这些数据存在哪里、用于什么目的。即使在校园项目或课程设计中也不要随便采集他人的语音和面部数据。建议遵循最小化原则只采集完成任务所需的最少数据数据尽量在本地处理和存储如果涉及云端同步先获得明确授权退出功能要方便用户可以一键清空本地数据。7.4 低功耗与硬件供电建议MicroDuck 如果要进入真实产品原型功耗设计是必须考虑的问题。AI 推理虽然比云端请求省电但对电池供电的小设备来说仍然是主要耗电来源。常见做法包括降低推理频率比如从每 100ms 推理一次降到每 1s 一次事件唤醒平时让 CPU 进入休眠只有传感器检测到异常信号后才唤醒并推理外设按需供电LED、屏幕、蜂鸣器不用时直接断电合理选择电池容量并在代码中监控电压低电量时自动关闭非必要功能。7.5 安全边界最后强调一点不要把 MicroDuck 直接连接到高压或大功率设备除非你有完整的光电隔离和功率驱动方案。在课程设计和原型验证阶段外设直接使用额定电压内的 LED、舵机、蜂鸣器就够了。如果确实要控制继电器等设备务必使用独立电源和隔离模块。同时所有设备端代码在控制真实外设前都应该加一层边界判断。比如推理结果连续 3 次都是“危险”才允许触发报警避免单次误判造成意外动作。Key Points本章要点Layered code structure makes your project maintainable.Version control should include models, training scripts, firmware, and dependency locks.Follow the principle of minimum data collection, especially for audio and image data.Power optimization and safety boundaries are essential when moving from demo to prototype.8. 总结与下一步学习路线到这里我们围绕 MicroDuck 做了一个比较完整的梳理从它是什么、为什么值得关注到环境准备、跑通第一个程序再到动手训练和部署一个本地 AI 应用。也讨论了开发过程中常见的坑以及从“能跑”到“工程可用”之间需要补充的实践。这里把核心结论用中英双语放在一起方便你快速回顾中文要点MicroDuck 是一个面向本地 AI 场景的可编程开发套件核心特点是在设备端完成推理学习路线建议从 Blink 程序开始先验证开发环境再尝试 AI 示例训练模型的通用路径是数据采集 → 电脑端训练 → 模型转换与量化 → 部署到设备设备端代码建议分为驱动层、推理层、业务层方便维护和升级做真实项目时要关注数据隐私、低功耗设计、版本管理和安全边界。English Key Points:MicroDuck is a programmable on-device AI kit, built for local inference and embedded prototyping.Start with a basic Blink example to verify your toolchain before exploring AI models.A standard model deployment path is: collect data, train on a PC, convert and quantize the model, then run it on the device.Keep your code separated into driver, inference, and business logic layers.For real projects, pay attention to data privacy, power optimization, version control, and hardware safety.如果你完全没接触过嵌入式开发不用着急可以从下面这条路线循序渐进嵌入式基础学习 GPIO、串口、I2C、SPI 的基本用法试着控制 LED、读取按键和传感器机器学习基础理解分类任务、特征是什么、训练集和测试集为什么重要模型优化尝试量化、剪枝、知识蒸馏观察它们对模型体积和精度的影响部署工具链熟悉 TFLite Micro、ONNX Runtime Micro 或厂商自己的推理 SDK综合项目把上面几个环节串起来从“拍手控制 LED”这样的 demo 开始逐步做一个完整的互动装置或智能设备原型。如果你想进一步提升还可以关注 Hugging Face 官方仓库的更新看看社区里其他人是怎么训练和部署 MicroDuck 模型的。真正的进步往往是从跟着官方示例跑通一次然后试着改一个参数、加一个外设、换一个场景开始的。希望这篇文章能帮你迈出这一步。