1. 项目概述:让智能家居真正“听懂”人话
如果你玩过Home Assistant,肯定对它的自动化能力印象深刻。但不知道你有没有过这样的体验:对着语音助手说“我有点冷”,它只会机械地回复“当前室内温度23摄氏度”,而不是去把空调打开或者调高暖气。这就是传统智能家居的痛点——它执行命令,但不理解意图。最近我在GitHub上发现了一个叫ej52/hass-ollama-conversation的项目,它就像给Home Assistant装上了一颗本地运行的“大脑”,让语音助手不再是简单的命令复读机,而是能真正进行上下文对话、理解你潜台词的智能管家。
这个项目的核心,是把一个叫Ollama的工具和Home Assistant的“对话(Conversation)”集成桥接了起来。Ollama是什么?简单说,它是一个让你能在自己的电脑、NAS甚至树莓派上,轻松运行各种开源大语言模型(比如Llama 3、Mistral、Qwen)的工具。而hass-ollama-conversation这个集成,就是把Ollama本地运行的模型能力,直接注入到Home Assistant的语音交互系统中。从此,你的“Hey Siri”或者“OK Google”在Home Assistant里,就拥有了媲美甚至超越云端大模型的对话理解和逻辑推理能力,而且所有数据都在本地处理,隐私和安全完全自己掌控。
这个项目适合谁?首先是所有对隐私有要求的智能家居玩家,你肯定不想自己在家说的每一句话都被传到某个公司的服务器上。其次是喜欢折腾、追求极致个性化的极客,你可以根据不同的场景选择不同大小的模型,甚至可以微调一个专属于你家庭习惯的模型。最后,它也非常适合想深入理解大模型如何与实体世界(IoT设备)交互的开发者。接下来,我就带你彻底拆解这个项目,从原理到部署,再到实战调优,分享我这段时间踩过的所有坑和总结出来的最佳实践。
2. 核心架构与工作原理深度解析
2.1 三方组件如何协同工作
要理解hass-ollama-conversation,必须把它放在一个更大的系统图景里看。它不是孤立存在的,而是Home Assistant、Ollama和你选择的LLM(大语言模型)三者之间的“粘合剂”和“翻译官”。
Home Assistant在这里扮演“场景中枢”和“执行器”的角色。它掌握着你家里所有设备的状态(灯是开是关、空调设定多少度)、用户的输入(通过语音或文本框发送的指令)、以及庞大的自动化规则库。它的对话集成(Conversation Integration)原本只能处理一些简单的、预设的语句匹配,但接入我们这个项目后,它就把理解自然语言这个“烧脑”的活儿,外包给了更专业的“大脑”。
Ollama则是一个杰出的“模型服务化”工具。它的伟大之处在于,把下载、运行、管理各种复杂的大语言模型变得像docker run一样简单。你不用去关心模型文件怎么配置、需要多少显存、用什么推理框架,Ollama都帮你封装好了。它提供了一个标准的API接口(通常是http://localhost:11434),我们的集成就是通过这个API,把Home Assistant传来的用户问题“喂”给模型,再把模型生成的文本“回答”拿回来。
hass-ollama-conversation集成的核心工作就是“协议转换”和“上下文构建”。它监听Home Assistant对话服务的调用,然后将当前对话的上下文(可能包括之前的几轮问答)、用户当前的问题、以及一份至关重要的“设备状态清单”,打包成一个精心设计的提示词(Prompt),通过HTTP请求发送给Ollama API。模型基于这个包含了“世界知识”(你的家)的上下文进行推理,生成一个包含意图和操作的自然语言回复或指令集。集成再解析这个回复,将其转换成Home Assistant能够执行的“服务调用”(Service Call),比如light.turn_on。
注意:这里的关键在于“设备状态清单”。集成会动态地将你家中所有实体的名称、状态、类型等信息,以结构化文本的形式插入到给模型的提示词中。这就相当于在每次对话前,先给模型发了一份“家庭设备最新简报”,让它知道现在能操作什么、这些东西当前是什么情况。
2.2 本地化与隐私安全的实现逻辑
为什么强调“本地”?这不仅仅是技术选择,更是产品哲学。市面上主流的语音助手,其智能核心(语音识别后的自然语言理解)几乎无一例外都在云端。这意味着你的每一条语音指令,都会被录音、上传、在远程服务器被分析和处理。
hass-ollama-conversation的本地化架构彻底改变了这个数据流向。整个数据闭环发生在你的家庭网络内部:
- 语音识别:可以在本地完成(如使用Home Assistant的Whisper集成或Vosk)。
- 文本理解与推理:由你本地硬件上的Ollama和LLM完成。
- 指令执行:由Home Assistant在本地网络内发送控制信号。
你的对话内容、家庭设备布局、生活习惯数据,从未离开过你的路由器。这对于智能家居而言,是安全性和隐私性的巨大提升。从技术实现上看,Ollama服务通常通过Docker容器运行,它与Home Assistant之间的通信是局域网HTTP,你可以轻松地通过防火墙规则阻止其任何出站连接,确保物理隔离。
2.3 与云端方案的性能取舍分析
选择本地方案,就必然要面对与云端方案的性能对比。这中间存在一个清晰的权衡:
| 对比维度 | 云端方案 (如Google Assistant, Alexa) | 本地方案 (hass-ollama-conversation) |
|---|---|---|
| 响应速度 | 快(毫秒级,依托全球数据中心和优化模型) | 取决于硬件(从几百毫秒到数秒,受模型大小、CPU/GPU算力影响) |
| 理解能力 | 极强(千亿参数模型,海量数据训练,多轮对话、模糊意图理解优秀) | 可调(从70亿到700亿参数模型可选,能力中等偏上,对特定家庭场景可通过提示词优化) |
| 隐私安全 | 差(数据出域,隐私政策复杂) | 极佳(数据完全本地,自主可控) |
| 网络依赖 | 必须(断网即瘫痪) | 可选(纯本地运行,断网不影响核心功能) |
| 定制化成本 | 高/不可能(黑盒系统,无法定制核心逻辑) | 高但可能(可更换模型、深度定制提示词、理论上可微调) |
| 长期成本 | 潜在订阅费/数据价值 | 一次性硬件投入(电费、硬件折旧) |
实操心得:对于绝大多数家庭场景,响应速度的轻微延迟(1-3秒)在体验上是完全可以接受的,毕竟我们和真人对话也会有思考间隙。真正的瓶颈往往不在于此,而在于提示词工程和模型选择。一个设计拙劣的提示词,即使配上最强的模型,也可能给出“打开客厅的空调”这种错误回答(如果设备名叫“客厅空调”的话)。因此,部署后的核心调优工作,几乎都集中在如何构建一个能让模型更好理解家庭语境和操作指令的提示词上。
3. 从零开始的完整部署与配置指南
3.1 硬件准备与Ollama部署
硬件是本地AI的基石。你的选择直接决定了能跑什么模型以及体验是否流畅。
1. 硬件选型建议:
- 入门级 (体验尝鲜):树莓派4B/5、旧款英特尔NUC。仅能运行参数量极小(如3B以下)的模型,响应慢,理解能力有限,适合验证流程。
- 主流级 (流畅使用):搭载英特尔i5/i7(10代以上)或AMD Ryzen 5/7的迷你主机/旧台式机,内存16GB以上。可流畅运行7B-14B参数量的量化模型(如Llama 3 8B, Qwen 7B),这是性价比最高的选择。
- 性能级 (最佳体验):配备消费级GPU(NVIDIA GTX 1660 6G以上,RTX 3060 12G更佳)的台式机或工作站。GPU显存大小直接决定能加载的模型大小。12G显存可尝试运行13B-20B量化模型,理解能力和响应速度大幅提升。
- 豪华级 (无所顾忌):配备RTX 4090等高端显卡,或使用Apple Silicon Mac(M2/M3系列,统一内存优势巨大)。可运行34B甚至70B参数的量化模型,对话能力接近初级云端助手。
2. Ollama安装(以Linux/macOS为例):Ollama的安装极其简单,一行命令搞定。
# 官方一键安装脚本 curl -fsSL https://ollama.com/install.sh | sh安装完成后,后台服务会自动启动。你可以通过ollama serve来启动服务,并通过ollama pull <模型名>来下载模型。对于Home Assistant场景,我强烈推荐从qwen2.5:7b-instruct-q4_K_M或llama3.2:3b-instruct-q4_K_M开始尝试。qwen2.5在中文理解和指令跟随上表现非常出色,而llama3.2:3b则对硬件要求极低。
3. 验证Ollama服务:打开浏览器或使用curl,访问http://localhost:11434/api/generate。如果Ollama运行正常,这个地址是可访问的。更直接的测试是运行:
ollama run llama3.2:3b然后在出现的提示符里问它一个问题,比如“你好”,看是否能正常回复。这能同时验证模型是否已成功下载。
3.2 Home Assistant集成安装与基础配置
假设你的Home Assistant已经运行(无论是Core、Supervised还是Container方式),接下来的步骤是在其中安装hass-ollama-conversation集成。
1. 安装集成(HACS方式,推荐):
- 确保你的Home Assistant已安装HACS(Home Assistant Community Store)。
- 在HACS的“集成”页面,点击右上角三个点,选择“自定义仓库”。
- 在仓库地址中输入
https://github.com/ej52/hass-ollama-conversation,类别选择“集成”。 - 点击“添加”,然后在集成列表中找到“Ollama Conversation”,点击“下载”。
- 下载完成后,重启Home Assistant。
2. 通过UI界面配置:
- 重启后,进入Home Assistant的“设置” -> “设备与服务” -> “添加集成”。
- 搜索“Ollama Conversation”并点击。
- 在配置界面,你需要填写几个关键参数:
- Name: 给你的这个对话代理起个名字,比如“本地AI管家”。
- Host: Ollama服务运行的地址。如果Ollama和HA在同一台机器,就是
http://localhost:11434。如果在同一网络的不同机器,则是http://[Ollama机器的IP]:11434。 - Model: 你想要使用的模型名称,必须和你在Ollama中拉取的名称完全一致,例如
qwen2.5:7b-instruct-q4_K_M。 - Timeout: 请求超时时间,建议设为30-60秒,大模型思考需要时间。
- 点击“提交”,如果配置正确,集成会测试连接并添加成功。
3. 验证基础功能:添加成功后,你会在“设备与服务”的“集成”页面看到它。现在,你可以去Home Assistant的侧边栏,找到“开发者工具” -> “服务”。选择conversation.process服务,在“数据”字段中输入:
text: “打开客厅的灯” agent_id: “你的Ollama Conversation实体ID,通常是 conversation.xxx”点击“调用服务”。如果一切正常,你应该能看到日志中模型在思考,并且最终客厅的灯会被打开。这是历史性的一刻——你的本地AI发出了第一条家庭控制指令。
4. 提示词工程与场景化调优实战
集成跑通只是第一步,要让AI管家变得“聪明”、“贴心”,关键就在于提示词(Prompt)的打磨。项目集成为我们提供了一个强大的提示词模板系统,我们可以深度定制它。
4.1 理解默认提示词结构
集成会使用一个内置的提示词模板。理解它的结构是优化的基础。其核心通常包含以下几个部分:
- 系统指令 (System Prompt):定义AI的角色、能力和行为规范。例如:“你是一个家庭智能助手,控制着以下设备...”
- 设备上下文 (Context):这是动态插入的部分,列出了所有实体(设备)的当前状态。格式如:“
light.living_room: on, brightness: 255”。 - 对话历史 (History):最近几轮的问答记录,让模型具备短期记忆。
- 用户当前查询 (Query):用户刚刚说出的或输入的话。
- 响应格式要求 (Format):要求模型以特定格式(如JSON或特定文本结构)回复,以便集成能解析出要执行的动作。
4.2 高级提示词定制实战
我们可以在集成的配置选项中,使用Jinja2模板语言来编写更强大的提示词。以下是一个我经过多次迭代优化的示例:
# 在集成配置YAML中(或通过UI的选项配置) prompt_template: | <|im_start|>system 你是一个专业、高效且谨慎的家庭智能管家,名字叫“小智”。你的核心职责是理解用户的自然语言指令,并安全、准确地控制家中的物联网设备。 请严格遵守以下规则: 1. 你**只能**操作下面“当前设备状态”中列出的设备。如果用户请求操作不存在的设备,请直接回复:“抱歉,我找不到名为‘[设备名]’的设备。”并建议一个类似的现有设备。 2. 在操作任何设备前,务必先检查其当前状态。如果用户要求“打开客厅的灯”,而灯已经是打开状态,你应该回复:“客厅的灯已经打开了哦。” 3. 对于模糊指令,必须主动询问澄清。例如,用户说“太亮了”,你应该问:“你是想调暗一些灯光,还是关闭部分灯呢?” 4. 你的回复必须简洁、友好、口语化,直接针对用户的问题给出结论或下一步行动。不要解释你的思考过程。 5. 如果用户指令不涉及设备控制(如聊天、问天气、问时间),你可以基于你的知识进行友好回复,并在结尾加上“(此回答来自我的通用知识库)”。 当前设备状态如下: {% for state in states -%} {%- if not state.entity_id.startswith(‘persistent_notification.’) and not state.entity_id.startswith(‘update.’) and not state.entity_id.startswith(‘sun.’) -%} - {{ state.entity_id }} ({{ state.name | default(state.entity_id) }}) 当前状态:{{ state.state }}{% if state.attributes.unit_of_measurement %} {{ state.attributes.unit_of_measurement }}{% endif %} {%- endif -%} {%- endfor %} 当前时间:{{ now().strftime(‘%Y年%m月%d日 %H:%M’) }}。 对话历史: {{ history }} <|im_end|> <|im_start|>user {{ prompt }}<|im_end|> <|im_start|>assistant这个提示词的优化点解析:
- 强化角色和规则:明确了“谨慎”、“安全”、“检查状态”、“询问澄清”等原则,这能极大减少模型的幻觉和误操作。
- 优化设备列表:使用Jinja2循环
states时,通过if条件过滤掉了像通知、更新、太阳等无关实体,让列表更干净,减少模型的干扰信息。 - 添加实体友好名:
{{ state.name | default(state.entity_id) }}将light.living_room显示为“客厅灯”,更符合人类的表达习惯,让模型更容易匹配。 - 注入时间上下文:添加当前时间,让模型能处理“半小时后打开空调”这类与时间相关的指令(需要配合Home Assistant的延时服务调用逻辑)。
- 使用模型原生格式:示例采用了Qwen等模型推荐的
<|im_start|>对话格式,能更好地激发模型的指令跟随能力。
4.3 场景化指令优化案例
不同的家庭场景需要不同的交互逻辑。你可以通过微调提示词或创建多个不同配置的集成实例来应对。
场景一:节能模式在提示词的系统指令部分增加:“在用户没有明确要求时,优先选择功耗更低的设备或方案。例如,当用户感到热时,优先建议开风扇而非空调,如果用户同意再执行。”
场景二:儿童交互模式创建一个名为“宝宝助手”的集成,使用更小的、响应快的模型(如TinyLlama),并调整提示词:“你是一个充满童趣的家庭助手,说话要像小朋友的朋友一样可爱、简单。将设备名称拟人化,比如‘客厅的大灯叔叔’,‘空调爷爷’。每次执行操作后,唱一小段简单的庆祝歌(用文字表示)。”
场景三:安防警戒模式在夜间或离家模式下,提示词应强调:“你处于安防模式。任何关于打开门窗、关闭摄像头的指令,都必须进行二次安全确认,例如要求用户说出预设的安全口令‘芝麻开门’。”
踩坑实录:我曾将家中所有实体(超过200个)不加过滤地丢给模型,结果发现模型响应速度变慢,且经常混淆设备。后来我严格过滤,只暴露
light.,switch.,climate.,cover.(窗帘)等核心控制类实体,并将传感器实体以只读方式简要告知(如“室内温度传感器显示25°C”),模型的理解准确率提升了至少50%。核心原则:给模型的信息,在精不在多。
5. 性能优化、问题排查与模型选型
5.1 加速推理与降低延迟的技巧
本地部署,性能是关键体验。除了升级硬件,软件层面的优化空间巨大。
1. 模型量化是首选方案:量化是将模型参数从高精度(如FP32)转换为低精度(如INT4, INT8)的过程,能大幅减少模型体积和内存占用,提升推理速度,而对质量损失影响很小。在Ollama中,模型标签里的q4_K_M,q8_0,q5_K_M等就是量化版本。q4_K_M通常是精度和速度的最佳平衡点。对于7B模型,FP16版本约14GB,而q4_K_M版本仅约4GB,在消费级GPU上就能流畅运行。
2. 调整Ollama运行参数:通过设置环境变量或修改Ollama配置,可以提升性能。
- GPU层数 (num_gpu):对于混合GPU/CPU运行,这个参数决定有多少层模型放在GPU上。将其设置为一个很大的数(如99),可以强制所有模型层使用GPU。
OLLAMA_NUM_GPU=99 ollama run qwen2.5:7b-instruct-q4_K_M - 批处理大小:在Ollama的高级配置中(
~/.ollama/config.json),可以设置num_batch和num_ctx。适当增加num_batch可以提高GPU利用率,但会占用更多显存。
3. 优化Home Assistant侧配置:
- 超时时间:在集成配置中,为复杂的指令设置更长的超时时间(如60秒)。
- 对话历史长度:限制提示词中
{{ history }}的长度,只保留最近3-5轮对话,避免上下文过长拖慢速度。
5.2 常见问题与解决方案速查表
在部署和使用过程中,你一定会遇到各种问题。下表是我和社区常见问题的汇总:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 集成添加失败,报连接错误 | 1. Ollama服务未运行 2. 网络地址/端口错误 3. 防火墙阻止 | 1. 在Ollama主机执行ollama serve并查看日志。2. 从HA主机用 curl http://[OLLAMA_IP]:11434/api/tags测试连通性。3. 检查11434端口是否开放。 |
| 调用服务后长时间无响应 | 1. 模型首次加载慢 2. 提示词过长或复杂 3. 硬件资源不足 | 1. 首次使用耐心等待,或预加载模型 (ollama pull)。2. 简化提示词,减少无关实体。 3. 查看系统资源(CPU/内存/GPU)使用率,考虑换更小的模型。 |
| AI回复内容正确,但不执行操作 | 1. 模型回复格式不符合解析要求 2. 实体名称匹配失败 | 1. 检查模型回复是否为纯文本,集成可能无法解析。在提示词中明确要求输出JSON或特定动作短语。 2. 在提示词的设备列表中,确保实体名称(或友好名)与用户指令中的称呼匹配。使用“别名(Alias)”功能优化匹配。 |
| 模型经常“幻觉”,操作不存在的设备 | 1. 提示词中设备列表信息过载或不足 2. 系统指令约束力不够 | 1. 精简设备列表,只保留可操作实体。 2. 在系统指令中强烈强调“只能操作下列设备”,并给出拒绝的示例。 |
| 响应速度越来越慢 | 1. 对话历史累积过长 2. 系统内存/显存泄漏(罕见) | 1. 在提示词模板中限制历史对话的轮次。 2. 重启Ollama服务和Home Assistant。 |
5.3 模型选型指南:从3B到70B的权衡
模型是智能的源泉,选对模型事半功倍。
轻量级 (3B-7B参数, 如
llama3.2:3b,qwen2.5:1.5b):- 硬件:CPU即可运行,内存4-8GB。
- 表现:能理解简单直接指令(“开灯”、“关空调”)。对复杂指令、多轮对话、模糊意图理解能力较弱。
- 适用场景:树莓派、老旧硬件;仅用于执行简单、明确的开关命令。
均衡级 (7B-14B参数, 如
qwen2.5:7b,llama3.1:8b,gemma2:9b):- 硬件:16GB内存的CPU,或6GB以上显存的GPU。
- 表现:智能家居场景的甜点区。能很好理解上下文、处理模糊指令(“有点热”->调低空调或开风扇)、进行简单推理(“我要睡觉了”->关闭客厅灯、打开卧室夜灯、设置空调睡眠模式)。Qwen系列在中文场景下表现尤其突出。
- 适用场景:绝大多数家庭用户的首选,在理解力、响应速度和资源占用上取得最佳平衡。
性能级 (20B-34B参数, 如
qwen2.5:32b,llama3.1:70b的量化版):- 硬件:需要强大的GPU(如RTX 3090/4090 24G)或大内存Apple Silicon Mac。
- 表现:理解能力接近初级云端助手。能处理非常复杂的多步骤指令(“营造一个浪漫的晚餐氛围”),并进行更深入的常识推理。
- 适用场景:追求极致体验的极客,或家庭设备数量极多、场景极复杂的用户。
个人经验:我从llama3.2:3b起步,很快升级到qwen2.5:7b-instruct-q4_K_M,体验有了质的飞跃。对于中文用户,qwen2.5:7b在指令跟随和中文理解上,目前是开源7B级别中的佼佼者,强烈推荐作为起步和主力模型。除非你的硬件非常强大,否则不建议盲目追求参数量,70B模型带来的体验提升,在智能家居这个相对垂直和简单的领域,可能并不如优化提示词来得明显。
6. 进阶玩法与生态整合思路
当基础功能稳定后,你可以探索更多可能性,让这个本地大脑发挥更大价值。
6.1 与自动化深度结合
这才是Home Assistant的精髓。你可以创建一些自动化,将AI的对话能力作为触发器或条件。
示例:基于情绪的自动化你可以让AI分析用户语句的情绪(通过提示词要求它输出情绪标签),然后触发不同的场景。
# 伪代码思路 自动化: 触发器: conversation.process 服务被调用,且文本包含任意内容。 动作: - 调用服务: conversation.process (使用另一个专门分析情绪的AI集成) - 等待回复,从中提取情绪标签(如“高兴”、“疲惫”、“烦躁”)。 - 条件:如果标签是“疲惫”,则执行场景“放松模式”(调暗灯光,播放舒缓音乐)。这需要你配置两个Ollama Conversation集成:一个用于常规对话控制,另一个专用于情绪分析,使用不同的提示词。
示例:AI决策型自动化传统的自动化是“如果…就…”。现在可以变成“如果…就让AI决定怎么做…”。
# 伪代码:夜间传感器触发后,由AI决定如何应对 自动化: 触发器: 人体传感器在夜间检测到移动。 动作: - 服务: conversation.process 数据: text: “检测到有人在[房间名]移动,当前时间是{{ now() }}。根据家庭习惯,你认为应该打开什么灯?只回复设备实体ID。” agent_id: conversation.night_ai - 等待回复,提取实体ID。 - 服务: light.turn_on 目标: entity_id: “{{ 提取的实体ID }}”
6.2 构建多模态交互入口
语音是核心,但不是全部。你可以利用这个集成的文本接口,构建更多交互方式。
- 短信/邮件网关:通过Home Assistant的短信或邮件集成,将收到的信息内容转发给Ollama Conversation处理,实现用短信控制家电或查询状态。
- 即时通讯机器人:将Home Assistant与Telegram、Discord等机器人连接,把这些聊天群组里的@消息发送给AI处理,实现群内控制。
- 物理按钮+AI:将一个智能按钮(如Aqara无线开关)的“长按”动作,设置为向AI发送一个预设问题,如“当前家里有哪些窗户没关?”,然后在手机通知或TTS语音播报回复。
6.3 模型微调与专属管家训练
这是终极玩法。如果你对家庭设备的命名、习惯用语非常独特,通用模型可能总是理解偏差。你可以尝试使用自己的对话日志,对一个小模型(如1.5B或3B)进行轻量化微调(LoRA)。
- 数据收集:开启对话日志记录,积累几百条“用户指令-正确操作”的配对数据。
- 数据清洗:去除敏感信息,格式化训练数据。
- 使用微调工具:利用Ollama(新版本支持)或Axolotl等工具,在消费级GPU上进行几小时的微调。
- 加载自定义模型:将微调后的模型权重与基础模型合并,创建一个新的Ollama模型(如
my-home-llama:latest)。 - 切换集成:在
hass-ollama-conversation配置中,将模型指向你的自定义模型。
经过微调的模型,会对“把那个大圆灯关了”(你家里对某个特定灯的昵称)这种指令有近乎100%的准确率,真正成为你的专属管家。这个过程技术门槛较高,但代表了本地化AI智能家居的最终形态:一个完全根据你个人数据和习惯塑造的数字助手。
部署ej52/hass-ollama-conversation的这几个月,我家里的智能家居交互方式发生了根本改变。从“命令式”到“对话式”,从“机械执行”到“意图理解”,这种体验的提升是颠覆性的。最大的感触是,隐私和可控性不是以牺牲智能为代价的。通过合理的硬件选择、精心的提示词设计和持续的调优,本地大模型完全能提供令人满意的服务。它偶尔还是会犯傻,但每一次优化提示词后看到的进步,都让你感觉是在亲手培育一个真正属于自己、理解自己家庭的智能生命,这种成就感和安全感,是任何云端服务都无法给予的。如果你已经厌倦了对着智能音箱大喊大叫却得不到想要的回应,不妨试试这个方案,亲手搭建一个既聪明又忠诚的本地AI管家。