IoT-For-Beginners 智能计时器扩展实战:为 LUIS 应用添加「取消计时器」意图并接入 Serverless 处理

📅 发布时间:2026/9/15 22:10:11
IoT-For-Beginners 智能计时器扩展实战:为 LUIS 应用添加「取消计时器」意图并接入 Serverless 处理
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 章第 2 课《Understand language》的课后作业英文原版、保加利亚语翻译版为核心线索讲解如何基于 LUIS 语言理解服务为智能计时器 IoT 场景新增「取消计时器cancel timer」意图从理解意图Intent与实体Entity的关系、在 LUIS 门户中录入示例语句并训练模型到在 Azure Functions 无服务器代码中以顶层意图top intent分支处理并返回响应最终让你的 IoT 设备能够用自然语言直接取消一个正在运行的计时器。作业背景为什么需要「取消计时器」意图在本课之前的任务中你已经用 LUIS 训练了一个能够理解「设置计时器set timer」的模型并在无服务器函数中把用户说出的文本转换为秒数。然而现实中的智能计时器场景不止「设置」一种动作例如面包已经烤好、需要在计时器到点前把它从烤箱里取出此时用户需要的是「取消」当前计时器。作业要求你为 LUIS 应用新增一个cancel timer意图它具备两个特征不需要任何实体entities——取消动作本身不携带时长单位等信息需要若干示例语句example utterances——让模型学会识别各种表达取消意图的说法。随后需要在无服务器代码中判断该意图是否为顶层意图若是则记录log意图已被识别并返回合适的响应。作业的评分标准Rubric也围绕这两点展开标准优秀达标待改进在 LUIS 应用中添加取消计时器意图成功添加意图并训练模型成功添加意图但未训练模型未能添加意图并训练模型在无服务器应用中处理该意图能将该意图识别为顶层意图并记录日志能将意图识别为顶层意图无法将意图识别为顶层意图这意味着完整实现需要LUIS 模型侧与无服务器代码侧两处改动同时完成缺一不可。前置知识LUIS 语言理解模型与意图/实体体系在动手扩展之前先回顾本课核心概念。LUISLanguage Understanding是微软 Cognitive Services 中负责自然语言理解Natural Language UnderstandingNLP 的一个分支的服务。它的工作方式是把用户话语转换为结构化信息——意图Intent表示用户想做什么实体Entity表示意图所针对的具体对象。本课 README 给出了典型示例语句意图实体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 的意图是cancel a timer而实体为 None——这正是本次作业的理论依据取消计时器不需要解析任何时长实体只需识别意图本身。模型的训练流程分为三步定义实体可以是固定词表List 类型也可以从文本中学习LUIS 还提供预置实体如数字number。本课为set timer定义了预置实体number和列表实体time unitnormalized value 为minute/second同义词覆盖单复数形式。创建意图并录入示例语句模型从你提供的 utterances 中学习。例如set timer意图可以录入set a 1 second timer、set a timer for 3 minutes等覆盖数字/文字、分钟/秒组合的多种说法并标注实体边界见 sentence-as-intent-entities.png。训练、测试并发布在门户点击Train用Test面板验证顶层意图与实体识别最后Publish到 Staging 或 Production 槽位供代码通过 REST API 调用。实现步骤一在 LUIS 门户中添加cancel timer意图1. 复用已有的 LUIS 应用本课前面部分已经完成以下前置工作用 CLI 创建了 LUIS authoring 资源az cognitiveservices account create --name smart-timer-luis-authoring \ --resource-group smart-timer \ --kind LUIS.Authoring \ --sku F0 \ --yes \ --location location⚠️ LUIS 并非在所有区域可用若报错InvalidApiSetId: The account type LUIS.Authoring is either invalid or unavailable in given region.需更换区域。免费层 authoring 资源每月允许 1,000 次预测足以支撑开发期使用。在 luis.ai 门户创建了名为smart-timer的对话应用并已配置number预置实体、time unit列表实体以及set timer意图示例语句见 README 的 Intents 小节。2. 新建cancel timer意图打开 LUIS 门户进入smart-timer应用选择Intents意图标签页点击Create创建将新意图命名为cancel timer在示例语句utterances区域录入若干表达取消计时器的说法。作业指出它不需要实体但需要多条示例句子。可参考的示例包括cancel my timercancel the timerstop the timerturn off the timercancel my 3 minute timer录入示例后LUIS 会实时为语句中的数字等部分自动标注已识别的实体本课set timer意图的标注效果见 luis-intent-examples.png。对cancel timer而言实体检测结果通常为空或仅含无关的数字预置实体不影响意图判定。 训练提示与任何 AI 模型一样示例语句越多、覆盖的口语化表达越多样模型对新说法的泛化能力越强。建议同时混入数字与文字写法、不同语序的说法。3. 训练并发布模型点击顶部Train训练按钮模型会在数秒内完成训练训练期间按钮置灰点击Test测试输入cancel my timer检查top intent顶层意图是否显示为cancel timer及对应概率点击Publish发布选择Staging slot本次作业使用暂存槽位即可完成发布。发布后可以先用 curl 验证预测接口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其中endpoint url、app id、primary key分别取自 LUIS 门户MANAGE标签页的Azure ResourcesAuthoring Resource 的 Primary Key 与 Endpoint URL和SettingsApp ID。响应 JSON 中的prediction.topIntent应返回cancel timer。实现步骤二在 Serverless 代码中处理顶层意图1. 仓库中的参考实现仓库在 6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger 提供了完整的 Azure Functions HTTP 触发器参考实现目录结构如下text-to-timer/__init__.py函数主逻辑Pythontext-to-timer/function.jsonHTTP 触发器绑定定义local.settings.json本地运行配置含 LUIS 三项密钥占位host.jsonFunctions 运行时与扩展包版本配置requirements.txtPython 依赖清单。核心逻辑在init.pydef main(req: func.HttpRequest) - func.HttpResponse: luis_key os.environ[LUIS_KEY] endpoint_url os.environ[LUIS_ENDPOINT_URL] app_id os.environ[LUIS_APP_ID] credentials CognitiveServicesCredentials(luis_key) client LUISRuntimeClient(endpointendpoint_url, credentialscredentials) req_body req.get_json() text req_body[text] logging.info(fRequest - {text}) prediction_request { query : text } prediction_response client.prediction.get_slot_prediction(app_id, Staging, prediction_request) if prediction_response.prediction.top_intent set timer: numbers prediction_response.prediction.entities[number] time_units prediction_response.prediction.entities[time unit] total_seconds 0 for i in range(0, len(numbers)): number numbers[i] time_unit time_units[i][0] if time_unit minute: total_seconds number * 60 else: total_seconds number logging.info(fTimer required for {total_seconds} seconds) payload { seconds: total_seconds } return func.HttpResponse(json.dumps(payload), status_code200) return func.HttpResponse(status_code404)关键机制说明配置注入LUIS_KEY、LUIS_ENDPOINT_URL、LUIS_APP_ID从环境变量读取对应 local.settings.json 中的占位项部署到云端后需在应用设置中配置真实值。调用 LUISclient.prediction.get_slot_prediction(app_id, Staging, prediction_request)请求 Staging 槽位预测prediction_request { query : text }把用户文本作为查询传入。顶层意图分支prediction_response.prediction.top_intent即预测得分最高的意图。当前实现只有set timer分支读取number与time unit两个实体数组按下标一一对应实体按说话顺序排列例如Set a four minute 17 second timer会得到number[4, 17]、time unit[[minute],[second]]将分钟数 ×60 累加为total_seconds最终以{seconds: 147}形式返回 HTTP 200。未识别兜底top_intent既不是set timer也不是其他已处理意图时返回 HTTP 404Not Found。2. 为作业新增cancel timer分支作业要求的代码改动本质上就是在上述if分支结构中追加一个cancel timer的顶层意图分支。可参照如下模式扩展示意需结合你的实际代码调整if prediction_response.prediction.top_intent set timer: # ... 原有的设置计时器逻辑解析 number / time unit 并计算 total_seconds... elif prediction_response.prediction.top_intent cancel timer: logging.info(Cancel timer intent recognized) payload { status: timer cancelled } return func.HttpResponse(json.dumps(payload), status_code200) return func.HttpResponse(status_code404)注意作业的三个硬性要求识别为顶层意图必须使用prediction_response.prediction.top_intent判断与set timer分支同级而非在意图列表里做模糊匹配记录日志用logging.info(...)输出意图已识别的日志例如Cancel timer intent recognized返回合适响应返回 HTTP 200 与一个 JSON payload供 IoT 设备端解析告诉设备执行取消计时器的动作。3. 依赖与绑定配置核对新增分支不需要修改依赖因为取消意图与设置意图共用同一套 LUIS 运行时客户端。仓库中的 requirements.txt 已声明所需依赖azure-functions azure-cognitiveservices-language-luisfunction.json 定义了 HTTP 触发器绑定authLevel为function表示调用需要函数键同时允许get与post方法。若希望放宽/收紧访问权限可通过修改authLevel实现。实现步骤三本地运行、验证与设备接入1. 本地运行并用 curl 验证先按 README 的指引安装依赖确保虚拟环境已激活pip install -r requirements.txt若安装报错可先执行pip install --upgrade pip。然后在 VS Code 中运行 Functions 应用终端会输出Functions: text-to-timer: [GET,POST] 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}期望看到函数日志中出现意图识别记录如Cancel timer intent recognized并返回 HTTP 200 与 JSON 响应。对照 README 中set timer的示例输出{seconds: 147}这类 payload 结构同样适用于你为cancel timer设计的响应。2. 让 IoT 设备可访问该 REST 端点智能计时器设备需要直接调用该 HTTP 端点而非经 IoT Hub 异步通信以获得即时响应。有两种接入方式部署到云端将 Functions 应用发布到 AzureURL 形如https://APP_NAME.azurewebsites.net/api/text-to-timer?codeFUNCTION_KEY。其中函数键用以下命令获取az functionapp keys list --resource-group smart-timer \ --name APP_NAME从输出functionKeys段的default字段复制函数键作为 URL 的code查询参数。注意发布云端时也要把local.settings.json中的 LUIS 配置发布为应用设置。本地运行 局域网 IP获取本机局域网 IP 后端点地址为http://IP_ADDRESS:7071/api/text-to-timer端口必须保留:7071。此方式要求 IoT 设备与电脑处于同一网络若使用 Wio Terminal官方建议采用此方式因为其依赖库与云端部署方式存在冲突。评估标准与验收清单对照作业的 Rubric 做最终自检LUIS 侧smart-timer应用中已存在cancel timer意图且已录入多条示例语句并完成训练只添加不训练只能算达标代码侧无服务器函数在top_intent cancel timer时进入独立分支既记录日志又返回响应只识别不记录只能算达标端到端验证用curl或真实设备说一句cancel my timer确认模型识别、日志输出、HTTP 200 响应三条链路全部打通。延伸思考让模型泛化得更好本课 README 的课后挑战Challenge鼓励思考同一件事的不同说法并录入为示例测试模型的泛化能力。对cancel timer意图同样适用尝试录入cancel the 3 minute timer、stop counting down、turn the timer off等多样表达观察 Top Intent 的概率变化。这类扩展可以直接沿用本作业建立的意图 顶层分支模式无需改动代码结构。小结本文围绕《IoT-For-Beginners》第 22 课的课后作业完整梳理了在 LUIS 应用中新增cancel timer意图并接入 Serverless 处理的实现路径从意图/实体概念出发在门户中添加意图、录入示例语句、训练与发布再到基于仓库参考实现 text-to-timer/init.py 追加顶层意图分支、记录日志并返回响应。掌握这套模式后你可以继续为智能计时器扩展暂停延长等更多自然语言指令验证 LUIS 模型的泛化边界。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考