十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

为 LUIS 智能定时器添加“取消定时器“意图:从训练模型到 Serverless 处理完整实战指南

为 LUIS 智能定时器添加“取消定时器“意图:从训练模型到 Serverless 处理完整实战指南 为 LUIS 智能定时器添加取消定时器意图从训练模型到 Serverless 处理完整实战指南【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners导读本篇文章围绕 IoT-For-Beginners 课程体系第 6 章消费者 IoT第 2 课《Understand language》的课后作业展开核心任务是在微软 LUISLanguage Understanding应用中新增一个cancel timer取消定时器意图并在基于 Azure Functions 的 Serverless 代码中处理该意图。你将学到如何把我的面包烤好了想把定时器提前关掉这类真实场景转换为可训练的 LUIS 意图、如何准备示例语句utterances、如何判断最高分意图top intent并据此返回恰当的 HTTP 响应以及如何用仓库源码验证实现效果。说明任务原文出自 translations/en/6-consumer/lessons/2-language-understanding/assignment.md本课完整教学文档位于 6-consumer/lessons/2-language-understanding/README.md配套源码位于 6-consumer/lessons/2-language-understanding/code/functions/smart-timer-trigger。任务背景为什么需要取消定时器意图在上一课中我们已经用 LUIS 训练了一个能识别设置定时器的模型并通过 HTTP 触发器类型的 Serverless 函数把语音转文字的结果映射成定时器时长秒。但智能助手不应是单向通信设备用户会设置定时器同样也会取消定时器。作业给出了一个非常生活化的场景也许你的面包已经烤好了可以在定时器走完之前把它从烤箱里取出来。因此本课作业要求在 LUIS 应用中为取消定时器新增一个意图intent该意图不需要任何实体entities但需要若干示例语句在 Serverless 代码中处理该意图如果它被识别为top intent最高分意图则记录意图已被识别的日志并返回合适的响应。先复习本课 LUIS 模型的核心机制在动手之前先回顾本课 README 中已经建立的语言理解模型基础因为取消意图的构建方式与set timer意图完全同构。Intents 与 Entities 的区分LUIS 的语言理解围绕两类核心对象展开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 timer无Order 3 large pineapple pizzas and a caesar saladorder food3 large pineapple pizzas,caesar salad注意表格第三行Cancel my timer 的实体列为 None——这正是本作业取消定时器意图不需要实体的直接依据。取消动作针对的是当前正在运行的定时器这一隐含对象而不是一个新的时长值因此无需从句子中抽取分钟/秒数。训练数据质量决定模型效果README 反复强调训练的示例语句越多、越准确模型越好。对 set timer 意图课程提供了 11 条示例刻意混合了数字的单词形式与阿拉伯数字形式set a 1 second timerset a 4 minute timerset a four minute six second timerset a 9 minute 30 second timerset a timer for 1 minute and 12 secondsset a timer for 3 minutesset a timer for 3 minutes and 1 secondset a timer for three minutes and one secondset a timer for 1 minute and 1 secondset a timer for 30 secondsset a timer for 1 second这给我们一个重要启发构建 cancel timer 意图时同样要覆盖多种口语表达方式。步骤一在 LUIS 门户中新增 cancel timer 意图登录 luis.ai进入你在本课创建的smart-timer应用使用smart-timer-luis-authoring创作资源然后按以下步骤操作从顶部菜单进入Intents标签页点击Create按钮将新意图命名为cancel timer与set timer的命名风格保持一致在示例语句输入框中录入多种取消定时器的说法。推荐的示例语句集结合 README 中 set timer 的写法同时覆盖单词与数字、长短句、不同语序可以为cancel timer准备类似这样的示例cancel my timercancel the timerstop the timerturn off the timerend my timerI want to cancel the timerplease cancel the timercancel the timer please由于该意图不依赖实体输入这些句子时 LUIS 不会为其标注数字或时间单位实体模型会纯粹通过学习这些语句的词汇与句式特征来区分cancel timer与set timer。这正是作业评分标准中该意图不需要任何实体的落地体现。训练与测试录入完示例后点击顶部菜单的Train按钮模型会在几秒内完成训练训练期间按钮置灰完成后恢复可用。随后点击Test按钮进行验证输入类似cancel my timer的文本下方会出现识别结果检查top intent是否显示为cancel timer并附带识别概率点击Inspect可查看细粒度结果最高分意图及其百分比概率以及检测到的实体列表此处应为空。步骤二理解 Serverless 端如何处理 top intent本课的 Serverless 函数是一个 HTTP 触发器IoT 设备通过 REST 直接调用它而非通过 IoT Hub 异步通信——因为智能定时器需要即时响应好告诉用户定时器已设置或提示云服务不可用。核心实现位于仓库源码init.py。先看现有的set timer处理逻辑这是我们要扩展的模板import logging import azure.functions as func import json import os from azure.cognitiveservices.language.luis.runtime import LUISRuntimeClient from msrest.authentication import CognitiveServicesCredentials def 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 中新增的三个配置项用CognitiveServicesCredentials封装 API Key创建LUISRuntimeClient客户端从 HTTP 请求体中取出text字段构造{query: text}预测请求调用client.prediction.get_slot_prediction(app_id, Staging, prediction_request)向Staging暂存槽位发起预测读取prediction_response.prediction.top_intent判断最高分意图命中set timer时解析number与time unit实体、计算总秒数并返回 JSON未命中则返回 HTTP 404。函数触发器的声明位于 function.json它把authLevel设为function需要函数级密钥并同时允许GET与POST方法{ scriptFile: __init__.py, bindings: [ { authLevel: function, type: httpTrigger, direction: in, name: req, methods: [get, post] }, { type: http, direction: out, name: $return } ] }Python 依赖在 requirements.txt 中声明其中 LUIS 的 Python SDK 包为azure-cognitiveservices-language-luis。步骤三在 Serverless 代码中处理 cancel timer 意图理解了上述模板扩展就非常直接了。作业要求在你的 Serverless 代码中处理该意图如果它被识别为最高分意图记录意图已被识别并返回合适的响应。在main函数的set timer判断之前或之后新增一个分支检查prediction_response.prediction.top_intent cancel timer。参考代码结构实现如下if prediction_response.prediction.top_intent cancel timer: logging.info(Cancel timer intent recognized) payload { cancel: True } return func.HttpResponse(json.dumps(payload), status_code200)对照评分标准逐条自检标准达标要求本实现如何满足在 LUIS 应用中添加取消定时器意图成功添加意图并训练模型在 Intents 页新增cancel timer录入多条示例后点击 Train在 Serverless 应用中处理该意图意图被识别为最高分意图并记录日志通过top_intent判断 logging.info记录识别结果关键点说明top intent 判定prediction_response.prediction.top_intent是 LUIS 预测返回中得分最高的意图。README 给出的真实预测 JSON 显示set timer得分 0.97031575、None意图得分 0.02205793因此判定阈值就是最高分。作业中如果它是最高分意图这一表述对应到代码即判断top_intent字段的值。日志记录logging.info(...)会在 Azure Functions 控制台输出可用于验证意图确实被识别。这与现有代码中logging.info(fTimer required for {total_seconds} seconds)的调试模式一致。合适的响应由于取消操作不需要返回秒数返回一个标记性 JSON如{cancel: true}加 HTTP 200 即可也可返回空 200。关键在于与现有set timer分支返回{seconds: N}以及 404 兜底分支保持一致的响应契约。关于 404 兜底的语义现有代码末尾的return func.HttpResponse(status_code404)是所有未识别意图的兜底——README 明确说明404 是 not found未找到状态码。新增cancel timer分支后这个兜底仍然负责处理模型识别出的意图既不是 set timer 也不是 cancel timer的情况例如None意图得分最高时保证函数对外部请求始终有确定性的响应。步骤四验证完整调用链本地运行与 curl 测试按照本课 README 的方式在 VS Code 中运行函数应用然后用 curl 模拟 IoT 设备发来的请求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之类的记录即logging.info的输出证明意图被识别并记录curl 返回HTTP/1.1 200 OK以及你定义的响应体如{cancel: true}。作为对照set a 2 minutes 27 second timer会命中现有set timer分支返回{seconds: 147}并输出Timer required for 147 seconds——这正是本课 README 中记录的运行输出也是后续 6-consumer/lessons/3-spoken-feedback 课程中物联网设备端真正启动定时器所依赖的返回值。设备端视角从仓库中第三课的设备端代码 code-timer/virtual-iot-device/smart-timer/app.py 可以看出设备如何消费该 REST 端点def get_timer_time(text): url URL body {text: text} response requests.post(url, jsonbody) if response.status_code ! 200: return 0 payload response.json() return payload[seconds]也就是说当前设备端逻辑只认 HTTP 200 与seconds字段。这提示我们在实现 cancel timer 时需要考虑契约衔接返回 200 表示已识别并处理设备端可以据此走取消分支若返回 404设备端get_timer_time会得到 0 秒而不做任何动作。这也是作业要求返回合适的响应的工程含义——响应契约需要与调用方IoT 设备保持兼容。部署时的注意点若将函数发布到云端HTTP 触发器默认受函数密钥保护需要获取密钥并拼接到 URLhttps://APP_NAME.azurewebsites.net/api/text-to-timer?codeFUNCTION_KEY密钥可通过az functionapp keys list --resource-group smart-timer --name APP_NAME获取取functionKeys下default项的值若使用 Wio Terminal 做本地调试函数应用本地运行时请通过电脑局域网 IP 访问http://IP_ADDRESS:7071/api/text-to-timer注意保留端口:7071并要求 IoT 设备与电脑处于同一网络函数密钥的授权级别由 function.json 中的authLevel配置项控制。评分标准对照表作业原文 Rubric本作业附带的两条评分维度直接决定实现是否达标完成上述步骤后应逐项核对标准优秀Exemplary合格Adequate需改进Needs Improvement在 LUIS 应用中添加 cancel timer 意图成功添加意图并训练模型成功添加意图但未训练模型既未添加意图也未训练模型在 Serverless 应用中处理该意图意图被识别为最高分意图并记录日志意图被识别为最高分意图但未记录日志意图未被识别为最高分意图两个最容易失分的细节一是忘记点击 Train只添加意图不训练模型不会学习新意图二是只判断 top intent 却漏掉logging.info日志作业明确要求记录意图已被识别。延伸思考让模型覆盖更多取消说法README 的课后挑战 Challenge指出请求同一件事有多种说法。对 cancel timer 同理除了cancel一族动词还可以考虑口语化的kill the timer、get rid of the timer以结果为导向的I dont need the timer anymore带礼貌用语的长句can you please cancel my timer。将这些句子作为示例加入cancel timer意图并重新训练再用 Test 面板逐一验证可以直观感受模型在多种表达下是否都能正确识别为 top intent。这也是 LUIS 模型持续迭代的通用工作流补充示例 → 重新训练 → 测试验证。总结本作业是在第 2 课语言理解模型之上的一次完整闭环实践涉及 LUIS 建模与 Serverless 逻辑两个层面建模层面新增不依赖实体的cancel timer意图通过多条多样化示例语句训练模型让取消定时器成为可被识别的 top intent代码层面复用本课现有的LUISRuntimeClient预测调用链在main函数中通过prediction_response.prediction.top_intent判断并处理该意图记录日志并返回合适的 HTTP 响应同时保持与set timer分支和 404 兜底分支的响应契约一致。完成本作业后你的智能定时器不仅听得懂设置指令也能听得懂取消指令距离一个完整的语音交互闭环设置 → 运行 → 取消 → 语音反馈又近了一步。后续可继续学习 6-consumer/lessons/3-spoken-feedback 课程把定时器真正跑在设备端并加上语音播报反馈。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表