
IoT-For-Beginners 实战为 LUIS 智能定时器应用扩展取消定时器意图并接入 Serverless 代码【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners在 IoT-For-Beginners 课程的语音与语言理解6-consumer / 2-language-understanding单元中你已经训练了一个能够理解设置定时器set timer的语言理解模型并编写了基于 HTTP 触发器的 Azure Functions 无服务器代码将自然语言句子翻译成定时器秒数。本篇文章以该单元的课后作业assignment为核心手把手讲解如何为 LUIS 应用新增一个cancel timer取消定时器意图它不需要任何实体只需若干示例句子同时指导你在 serverless 代码中检测该意图是否为最高分意图top intent、记录日志并返回恰当的响应。学完本篇你将掌握在既有语言理解应用中低成本扩展新意图的完整套路并能将 cancel timer 与已有的 set timer 逻辑在同一个函数中协调工作。1. 任务背景从设置定时器到取消定时器在正式动手前先回顾一下你在本单元前序课程中已经完成的成果完整流程见 README.md创建 LUIS 创作资源Authoring Resource在smart-timer资源组中使用az cognitiveservices account create创建免费层F0 SKU的smart-timer-luis-authoring资源kind为LUIS.Authoring。若提示InvalidApiSetId说明所选区域不支持 LUIS需要更换区域。创建语言理解应用在 luis.ai 门户中新建名为smart-timer的应用并设置对应的 Culture语言区域。定义实体Entities添加number预构建实体用于识别数值以及一个列表类型List实体time unit其归一化值为minute/second同义词覆盖单复数形式如minutes、seconds。定义意图Intents创建set timer意图并录入多条不同表达方式的示例句子utterances混合使用数字单词与阿拉伯数字让模型学会泛化。训练、测试并发布点击Train训练模型使用Test面板验证set a timer for 5 minutes and 4 seconds能返回最高分意图set timer最后发布到Staging槽位。编写 Serverless 函数在 Azure Functions 应用smart-timer-trigger中创建 HTTP 触发器text-to-timer通过init.py 调用 LUIS 运行时把set timer意图的实体解析为总秒数并以 JSON{seconds: 147}返回。作业文档 assignment.md 提出的新需求非常贴合真实场景面包烤好了希望在定时器结束前就把它从烤箱取出。因此取消定时器和设置定时器一样都是智能厨房助手的核心交互。2. 回顾核心概念意图Intent与实体Entity的分工要正确设计 cancel timer需要理解 LUIS 的两大抽象。语言理解模型围绕意图与实体构建意图Intent指这句话想做什么例如播放音乐、设置定时器、订餐。每个句子至少应映射到一个意图。实体Entity指意图作用的对象例如专辑名、定时器时长、餐品种类。原课程给出了一个直观的对照表句子意图实体Play the latest album by Taylor Swiftplay musicthe latest album by Taylor SwiftSet a 3 minute timerset a timer3 minutesCancel my timercancel a timerNoneOrder 3 large pineapple pizzas and a caesar saladorder food3 large pineapple pizzas,caesar salad注意表中第三行Cancel my timer 的实体为 None。这正是本作业的关键设计决策——取消定时器不需要任何时间数值或单位实体LUIS 只需判断用户意图即可。这也意味着无需再定义新的实体省去了实体标注与同义词维护的成本示例句子的质量成为模型准确率的决定性因素你需要覆盖用户可能的各种表达方式。3. 在 LUIS 应用中新增 cancel timer 意图3.1 创建意图并录入示例句子登录 LUIS 门户打开上一课创建的smart-timer应用。切换到Intents标签页点击Create新建意图命名为cancel timer。在示例Examples区域录入多种表达取消定时器的句子。由于本意图不需要实体LUIS 只会对句子整体学习意图归属。参考示例可包括cancel my timercancel the timerstop the timerturn off the timerremove the timercancel my 3 minute timer注意即使句子中出现了数字也无须为其标注实体cancel timer 意图本身不依赖实体完成动作与训练 set timer 时混合数字单词与数值同理这里应覆盖助词、时态、冠词等不同写法让模型学会从大量近义表达中泛化出取消定时器这一意图。录入完成后点击顶部菜单的Train按钮训练模型。训练通常只需几秒训练期间按钮呈灰色完成后自动恢复可点击。3.2 测试新意图点击顶部Test按钮输入诸如cancel my timer、stop the timer等句子并回车。在结果框中检查top intent最高分意图是否为cancel timer其后会跟随该意图的置信概率。点击Inspect可以查看更详细的结果拆解Top 得分意图及其百分比、检测到的实体列表。提示为达到本作业评价标准中的Exemplary优秀级别你不仅要能添加意图还要能完成训练并让模型稳定地把取消类句子识别为最高分意图。如果测试中cancel timer未排第一应继续补充示例句子并重新训练直到测试句稳定命中。3.3 重新发布模型LUIS 代码调用默认指向Staging槽位下文 serverless 代码使用get_slot_prediction(app_id, Staging, ...)因此添加新意图并训练后需要点击顶部Publish按钮、确认选择Staging slot并点击Done重新发布云端才会包含 cancel timer 意图的预测能力。发布后可使用 curl 快速验证各值从MANAGE标签页获取App ID 在Settings中Primary Key 与 Endpoint URL 在Azure Resources→Authoring Resource中curl endpoint url/luis/prediction/v3.0/apps/app id/slots/staging/predict \ --request GET \ --get \ --data subscription-keyprimary key \ --data verbosefalse \ --data show-all-intentstrue \ --data-urlencode querycancel my timer响应 JSON 中prediction.topIntent应为cancel timer且entities为空对象——这与取消定时器无需实体的设计完全吻合。4. 在 Serverless 代码中处理 cancel timer4.1 理解现有函数结构仓库中已经提供了完整可运行的函数代码骨架位于 code/functions/smart-timer-trigger/text-to-timer由以下几部分组成init.py函数主体负责读取环境变量、创建 LUIS 客户端、发起预测、解析实体、返回 HTTP 响应function.jsonHTTP 触发器绑定配置authLevel为function支持GET/POST两种方法local.settings.json本地运行配置包含LUIS_KEY、LUIS_ENDPOINT_URL、LUIS_APP_ID三个占位值requirements.txt依赖声明包含azure-functions与azure-cognitiveservices-language-luishost.json函数宿主配置2.0 版本、Extension Bundle、Application Insights 采样等。现有__init__.py的核心逻辑是prediction_response client.prediction.get_slot_prediction(app_id, Staging, prediction_request) if prediction_response.prediction.top_intent set timer: # 读取 number 与 time unit 实体累加 total_seconds # 返回 {seconds: total_seconds}, status_code200 return func.HttpResponse(status_code404) # 意图无法识别时的兜底从这段源码结构可以清晰地看出当前函数只对set timer一个意图给出成功响应其余一切意图包括尚未支持的cancel timer都会落入 404 分支。因此接入取消定时器本质上就是在if判定链上增加一个新的意图分支。4.2 扩展意图判定与响应作业要求如果 cancel timer 是 top intent则记录该意图已被识别并返回一个适当的响应。参考现有代码风格可以在set timer分支之后、404 兜底之前追加如下处理if prediction_response.prediction.top_intent cancel timer: logging.info(Cancel timer intent recognized) return func.HttpResponse(json.dumps({cancel: True}), status_code200)实现要点日志记录logging.info(...)会输出到函数控制台便于在本地运行func start或云端 Application Insights 中观测模型识别结果这与现有代码中logging.info(fRequest - {text})、logging.info(fTimer required for {total_seconds} seconds)的观测风格保持一致。返回适当的响应这里返回 JSON{cancel: true}与 HTTP 200。实际项目中此响应会回到 IoT 设备Wio Terminal / Raspberry Pi / 虚拟设备由设备端真正清除当前计时器并可结合下一课 6-consumer/lessons/3-spoken-feedback通过语音向用户确认定时器已取消。响应体的具体字段可按你的设备端协议自行定义关键是用一个明确的成功状态码区分于 404。保持兜底分支如果 top intent 既不是set timer也不是cancel timer函数仍应返回func.HttpResponse(status_code404)HTTP 404表示无法识别请求。修改后main函数的意图处理链路为set timer计算秒数→cancel timer确认取消→ 其余情况 404。4.3 本地验证与联调确认虚拟环境已激活执行pip install -r requirements.txt安装依赖若提示 pip 版本过旧可先pip install --upgrade pip。在 local.settings.json 中填入真实的LUIS_KEY、LUIS_ENDPOINT_URL与LUIS_APP_ID值来源同前文 MANAGE 标签页。运行函数应用终端会输出 HTTP 触发器地址例如http://localhost:7071/api/text-to-timer。使用 curl 发起 POST 请求进行验证curl --request POST http://localhost:7071/api/text-to-timer \ --header Content-Type: application/json \ --include \ --data {text:cancel my timer}期望看到类似如下的响应HTTP/1.1 200 OK ... {cancel: true}同时在函数控制台应出现Cancel timer intent recognized的日志输出——这正是作业评价标准中能够检测到 top intent 并记录它的落地证据。若你是使用 Wio Terminal 的 Arduino 开发者由于库依赖原因建议将函数应用在本地运行、并通过本机局域网 IP 访问如http://192.168.1.10:7071/api/text-to-timer而不是部署到云端使用 Raspberry Pi 或虚拟设备则可以选择部署到 Azure Functions并通过az functionapp keys list获取默认函数密钥拼接到 URL 的?code参数中。5. 作业评估标准对照原作业文档给出了明确的评价维度可作为自查清单对应英文原版 assignment.md评价标准优秀Exemplary合格Adequate需改进Needs Improvement在 LUIS 应用中添加 cancel timer 意图能够添加意图并训练模型能添加意图但未训练模型无法添加意图也无法训练模型在 serverless 应用中处理该意图能将意图识别为 top intent 并记录日志能识别为 top intent 但未记录无法识别为 top intent对照自查LUIS 侧意图是否已创建示例句子是否覆盖多种表达是否完成训练并通过 Test 面板验证 top intentServerless 侧代码是否检测prediction_response.prediction.top_intent cancel timer是否调用logging.info记录识别结果是否返回了与 404 不同的成功响应6. 延伸思考挑战与下一步课程还提供了两个可选的拓展方向 Challenge像设置定时器一样取消定时器也存在大量等价表达。可以尝试把更多说法如 stop my kitchen timer、I dont need the timer anymore加入示例句子观察模型在不同说法下的识别鲁棒性体验数据多样性对语言理解模型效果的影响。下一课衔接cancel timer 的响应最终要驱动设备端动作并给出语音反馈这正是 6-consumer/lessons/3-spoken-feedback文本转语音要解决的问题——届时取消操作可被播报给用户形成听懂-执行-反馈的完整闭环。总结通过本作业的实践你在既有 LUIS Azure Functions 架构上完成了一次低成本的意图扩展cancel timer 不引入任何新实体仅靠高质量示例句子与重新训练即可被模型识别serverless 端则在现有set timer分支旁新增一个意图分支用日志记录识别结果并以明确的状态码返回响应。这一模式可以复用到暂停定时器延长定时器等更多意图上是语言理解应用持续迭代的标准做法。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考