恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

智能定时器与语言理解:基于 LUIS 构建意图与实体解析的完整实战(IoT-For-Beginners)

  • 首页
  • 资讯中心
  • /
  • 智能定时器与语言理解:基于 LUIS 构建意图与实体解析的完整实战(IoT-For-Beginners)

相关资讯

深度Q学习在股票交易策略中的应用:从环境搭建到回测实战 2026/9/15 18:21:17
OpenCV相机标定实战:从标定板制作到高精度测量的完整指南 2026/9/15 18:16:17
HTML一键打包EXE全攻略:绿色免安装、兼容多系统的实践指南 2026/9/15 18:16:17

最新资讯

Semantica代码结构深度剖析:core编排器与生命周期设计通俗解读
Plate 如何实现 Suggestion 修改建议与接受拒绝操作?
Kimi CLI 终端闪烁缓解方案解读:Approval 面板的 Pager 展开与统一行预算设计(KLIP-9)
LCMV自适应波束形成Matlab仿真:从原理到代码实现
Vue3移动端PDF手势缩放预览方案
如何彻底突破 Anki 同步大小限制:解决 collection exceeds size limit 报错的完整指南

今日推荐

GDPR下大数据架构重构与隐私保护实践
多组学数据平台架构设计与优化实践
企业主数据管理系统架构设计与实施全解析

本周热门

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化
Flutter应用改名全指南:从Android到iOS的配置与工具实践

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

智能定时器与语言理解:基于 LUIS 构建意图与实体解析的完整实战(IoT-For-Beginners)

发布时间:2026/9/15 18:21:17
智能定时器与语言理解:基于 LUIS 构建意图与实体解析的完整实战(IoT-For-Beginners) 智能定时器与语言理解基于 LUIS 构建意图与实体解析的完整实战IoT-For-Beginners【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本指南基于 IoT-For-Beginners 开源课程消费者Consumer路径第 2 课对应整体课程第 22 课完整讲解如何为上一课已实现的语音转文字智能定时器注入理解能力借助微软 LUIS 语言理解服务让设备不仅能听到set a 3 minute timer还能听懂set a timer for 3 minutes这类千变万化的自然表达。读完本文你将掌握语言理解模型的核心概念意图与实体、在 LUIS 门户中创建与训练模型的全流程、通过 HTTP 触发的 Azure Functions 服务端代码调用模型以及如何把解析结果秒数开放给 IoT 设备调用的完整链路。图片来源本课官方 sketchnote作者 Nitya Narasimhan点击可查看大图。为什么要理解语言而不是匹配句子在上一课 1-speech-recognition 中我们完成了从语音到文本的转换。但听懂文字是另一回事如果代码只期待固定句式set a 3 minute timer那么用户说set a timer for 3 minutes时程序就会茫然无措——尽管人类一眼就能看出两者表达的是同一个意思。语言理解language understanding也称自然语言理解natural-language understanding正是自然语言处理NLP这一人工智能领域中的阅读理解分支它负责从文字中抽取关键细节而不是逐字匹配模板。当你对 Alexa 或 Siri 说播放 Taylor Swift 的最新专辑时背后就是语言理解服务在起作用它需要从这句话中推导出动作是播放音乐歌手是 Taylor Swift播放对象是包含多首曲目、按顺序播放的整张专辑Taylor Swift 有多张专辑需要按时间排序取最新发布的那张。 需要强调的是计算机的理解远未达到人类沟通的水平。这里说的语言理解本质是取一些词抽取关键信息而不是真正意义上的语义领悟。语言理解模型属于 AI 模型通常先用海量语言数据训练再通过**迁移学习transfer learning**针对具体任务微调——这与你在本课程制造篇中用少量图片训练 Custom Vision 模型的思路如出一辙拿一个预训练模型再用你希望它理解的文本去训练它。创建 LUIS 语言理解模型LUISLanguage Understanding是微软 Cognitive Services 中的语言理解服务本课用它来构建定时器领域的语言模型。第一步创建 Authoring 资源使用 Azure CLI 在smart-timer资源组中创建编写authoring资源az cognitiveservices account create --name smart-timer-luis-authoring \ --resource-group smart-timer \ --kind LUIS.Authoring \ --sku F0 \ --yes \ --location locationlocation替换为你创建资源组时使用的区域--sku F0表示免费层足够开发使用。⚠️ LUIS 并非在所有区域都可用。如果出现以下错误请换一个区域重试InvalidApiSetId: The account type LUIS.Authoring is either invalid or unavailable in given region.第二步在 LUIS 门户创建应用打开 luis.ai用与 Azure 相同的账号登录按对话框指引选择订阅然后选中刚创建的smart-timer-luis-authoring资源在Conversation apps列表中点击New app命名应用为smart-timerCulture文化/语言区域按你的语言设置门户会显示预测资源prediction resource字段。虽然可以单独建一个预测资源但免费编写资源每月已含 1,000 次预测足以支撑开发调试此处留空即可阅读创建应用后弹出的新手引导了解训练语言理解模型的步骤后关闭它。意图Intents与实体Entities语言理解的基石语言理解围绕两个核心概念意图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 timer无Order 3 large pineapple pizzas and a caesar saladorder food3 large pineapple pizzas,caesar salad训练 LUIS 时先定义实体再定义意图。实体可以是固定的词条列表也可以从文本中学习。例如菜单场景可以给出食物清单及每个词的各种变体同义词如把egg plant和aubergine都归为aubergine的变体。LUIS 还内置了一批可直接使用的预置实体pre-built entities如数字 number、位置 location 等。对于定时器场景可以用预置的number实体表示时长数值再自建一个表示单位分钟/秒的实体每个单位需要覆盖单复数变体如 minute 与 minutes。意图由模型根据你提供的**示例语句utterances**学习。比如set timer意图可以给出set a 1 second timerset a timer for 1 minute and 12 secondsset a timer for 3 minutesset a 9 minute 30 second timer然后告诉 LUIS 这些句子中哪些片段对应哪些实体。例如set a timer for 1 minute and 12 seconds的意图是set timer它包含 2 个实体、每个实体各有 2 个值片段数值 time单位 unit1 minute1minute12 seconds12second 与任何 AI 模型一样训练数据越多、越准确模型效果越好。因此需要提供覆盖同一件事的不同问法的多样化示例句子。实操为模型添加实体定时器需要 2 个实体一个是时间单位分钟或秒一个是分钟/秒的数值。在 LUIS 门户的Entities标签页点击Add prebuilt entity从列表中选择number预置实体点击Create新建时间单位实体命名为time unit类型选择List列表在Normalized values中添加minute和second并在synonyms中补充单复数形式每输入一个同义词按return确认Normalized valueSynonymsminuteminute, minutessecondsecond, seconds实操为模型添加意图在Intents标签页点击Create创建名为set timer的意图输入多种设置定时器的写法混合使用分钟、秒以及分钟秒的组合示例可以是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注意将数字的单词写法与数字写法混合如four与4让模型同时学会处理两种形式每输入一个示例LUIS 就会开始识别实体并把识别到的实体加下划线标注。实操训练与测试模型实体和意图配置完成后点击顶部菜单的Train按钮模型会在几秒内完成训练训练期间按钮置灰训练完成后恢复点击Test按钮测试输入如set a timer for 5 minutes and 4 seconds并回车文本下方会显示检测到的top intent概率最高的意图应为set timer后面跟着该意图的概率点击Inspect查看结果明细可以看到得分最高的意图及其百分比概率以及识别出的实体列表测试完成后关闭Test面板。实操发布模型要从代码中调用模型必须先发布。LUIS 支持发布到Staging暂存环境用于测试或Production生产环境用于正式发布本课使用 Staging 即可。点击 LUIS 门户顶部Publish按钮确认选择Staging slot点击Done应用发布后会收到通知用 curl 验证发布结果。构建 curl 命令需要三个值——endpoint终结点、App ID应用 ID和 API key密钥三者都可在顶部MANAGE标签页获取从Settings部分复制 App ID从Azure Resources部分选择Authoring Resource复制Primary Key和Endpoint URL在命令行执行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 querysentenceendpoint url替换为Azure Resources部分的 Endpoint URLapp id替换为Settings部分的 App IDprimary key替换为Azure Resources部分的 Primary Keysentence替换为要测试的句子返回的 JSON 文档包含查询语句、top intent 以及按类型分类的实体列表。以查询set a timer for 45 minutes and 12 seconds为例{ query: set a timer for 45 minutes and 12 seconds, prediction: { topIntent: set timer, intents: { set timer: { score: 0.97031575 }, None: { score: 0.02205793 } }, entities: { number: [ 45, 12 ], time-unit: [ [ minute ], [ second ] ] } } }这份响应的解读set timer是 top intent概率高达 97%检测到两个number实体45和12检测到两个time-unit实体minute和second。在代码中使用语言理解模型为什么选择 HTTP 触发器 服务端无服务器代码之前几课中我们通过 IoT Hub 与云服务通信发送遥测、监听命令。这种方式非常异步——遥测发出后代码不等待响应如果云服务宕机也无法感知。而智能定时器需要即时反馈告诉用户定时器已设置或提示云服务不可用因此设备应直接调用 Web 终结点而不是依赖 IoT Hub 的异步通道。直接在 IoT 设备上调用 LUIS 可行但更好的做法是封装一层带 HTTP 触发器的无服务器函数Azure Functions函数应用监听 REST 请求并响应设备只需调用这个 REST 终结点。这样当你想更换 LUIS 应用例如训练出更好的模型或增加多语言模型时只需更新云端代码而无需向成千上万台 IoT 设备重新部署代码。创建无服务器函数应用新建名为smart-timer-trigger的 Azure Functions 应用并在 VS Code 中打开在 VS Code 终端执行以下命令添加 HTTP 触发器func new --name text-to-timer --template HTTP trigger这会创建名为text-to-timer的 HTTP 触发器运行函数应用输出中会列出终结点Functions: text-to-timer: [GET,POST] http://localhost:7071/api/text-to-timer在浏览器加载http://localhost:7071/api/text-to-timer验证This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.接入 LUIS Python SDKLUIS 的 SDK 以 Pip 包形式提供在requirements.txt中加入依赖azure-cognitiveservices-language-luis仓库中该应用的完整依赖见 code/functions/smart-timer-trigger/requirements.txt其中还包含azure-functions注意不要引入azure-functions-worker以免与 Functions 平台冲突# Do not include azure-functions-worker as it may conflict with the Azure Functions platform azure-functions azure-cognitiveservices-language-luis确保 VS Code 终端已激活虚拟环境执行安装pip install -r requirements.txt 若安装报错可先升级 pippip install --upgrade pip。在local.settings.json中为 LUIS API Key、Endpoint URL 和 App ID 添加配置项值从 LUIS 门户MANAGE标签页获取LUIS_KEY: primary key, LUIS_ENDPOINT_URL: endpoint url, LUIS_APP_ID: app id完整文件结构参考 code/functions/smart-timer-trigger/local.settings.json{ IsEncrypted: false, Values: { FUNCTIONS_WORKER_RUNTIME: python, AzureWebJobsStorage: , LUIS_KEY: primary key, LUIS_ENDPOINT_URL: endpoint url, LUIS_APP_ID: app id } }endpoint urlMANAGE标签页Azure Resources部分获取的 Endpoint URL形如https://location.api.cognitive.microsoft.com/app idMANAGE标签页Settings部分获取的 App IDprimary keyMANAGE标签页Azure Resources部分获取的 Primary Key。在__init__.py中加入导入语句import json import os from azure.cognitiveservices.language.luis.runtime import LUISRuntimeClient from msrest.authentication import CognitiveServicesCredentials仓库中的完整实现见 code/functions/smart-timer-trigger/text-to-timer/init.py下文将逐段讲解其逻辑。编写预测与解析逻辑清空main方法原有内容加入客户端初始化代码。它从环境变量即local.settings.json中的值加载配置用 API key 创建 credentials 对象再创建与 LUIS 应用交互的客户端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)本 HTTP 触发器接收的请求体为 JSON待理解的文本放在text属性中。从请求体取值并打印日志req_body req.get_json() text req_body[text] logging.info(fRequest - {text})构造预测请求一个包含待预测文本的 JSON 文档并发送到应用发布所在的 Staging 槽prediction_request { query : text } prediction_response client.prediction.get_slot_prediction(app_id, Staging, prediction_request)预测响应包含 top intent 和实体。如果 top intent 是set timer则从实体中读取定时所需时长if prediction_response.prediction.top_intent set timer: numbers prediction_response.prediction.entities[number] time_units prediction_response.prediction.entities[time unit] total_seconds 0number实体是数字数组。例如Set a four minute 17 second timer.会得到[4, 17]time unit实体是字符串数组的数组每个时间单位是一个内层数组。同上示例会得到[[minute], [second]]。这两类实体组合后的 JSON 形态{ number: [4, 17], time unit: [ [minute], [second] ] }实体之间没有显式关联但可以合理假设它们按说话顺序排列因此用数组下标即可确定哪个数字对应哪个时间单位。例如Set a 30 second timer1 个数字30、1 个单位second一一对应Set a 2 minute and 30 second timer2 个数字2、302 个单位minute、second第一个数字对第一个单位2 分钟第二个数字对第二个单位30 秒。用如下循环按序提取值放在if块内for i in range(0, len(numbers)): number numbers[i] time_unit time_units[i][0]对Set a four minute 17 second timer.会循环两次循环次数numbertime_unit04minute117second在循环内按单位换算总秒数每分钟加 60 秒秒则直接累加if time_unit minute: total_seconds number * 60 else: total_seconds number循环结束后打印定时器总时长logging.info(fTimer required for {total_seconds} seconds)在if块末尾把秒数包装成 payload转为 JSON 字符串并以 200 状态码返回200 表示调用成功payload { seconds: total_seconds } return func.HttpResponse(json.dumps(payload), status_code200)在if块之外处理意图未被识别的情况——返回 404not found状态码return func.HttpResponse(status_code404)触发器配置说明仓库中 code/functions/smart-timer-trigger/text-to-timer/function.json 定义了触发器绑定{ scriptFile: __init__.py, bindings: [ { authLevel: function, type: httpTrigger, direction: in, name: req, methods: [ get, post ] }, { type: http, direction: out, name: $return } ] }其中authLevel为function函数级密钥鉴权methods支持 GET 与 POST。宿主配置见 host.json其extensionBundle声明使用 Azure Functions 扩展包版本[2.*, 3.0.0)。用 curl 验证整个链路运行函数应用然后用 curl 发起 POST 请求curl --request POST http://localhost:7071/api/text-to-timer \ --header Content-Type: application/json \ --include \ --data {text:text}将text替换为请求文本例如set a 2 minutes 27 second timer。函数应用侧会输出类似日志Functions: text-to-timer: [GET,POST] http://localhost:7071/api/text-to-timer For detailed output, run func with --verbose flag. [2021-06-26T19:45:14.502Z] Worker process started and initialized. [2021-06-26T19:45:19.338Z] Host lock lease acquired by instance ID 000000000000000000000000951CAE4E. [2021-06-26T19:45:52.059Z] Executing Functions.text-to-timer (ReasonThis function was programmatically called via the host APIs., Idf68bfb90-30e4-47a5-99da-126b66218e81) [2021-06-26T19:45:53.577Z] Timer required for 147 seconds [2021-06-26T19:45:53.746Z] Executed Functions.text-to-timer (Succeeded, Idf68bfb90-30e4-47a5-99da-126b66218e81, Duration1750ms)curl 返回的响应中seconds字段即定时器秒数HTTP/1.1 200 OK Date: Tue, 29 Jun 2021 01:14:11 GMT Content-Type: text/plain; charsetutf-8 Server: Kestrel Transfer-Encoding: chunked {seconds: 147}把 REST 终结点开放给 IoT 设备IoT 设备要调用 REST 终结点必须知道 URL。此前访问用的localhost只是本机快捷方式要开放给设备有两种方式发布到云端或获取本机 IP 供局域网访问。⚠️ 若使用 Wio Terminal建议在本机运行函数应用部分库依赖会导致无法按此前方式部署函数应用。此时请本地运行函数应用并通过电脑 IP 访问若确实要部署到云端后续课程会给出方法。方式一发布到云端按前序课程的指引把函数应用发布到云端。发布后 URL 为https://APP_NAME.azurewebsites.net/api/text-to-timerAPP_NAME为函数应用名同时记得发布本地设置。HTTP 触发器默认受函数应用密钥function app key保护。获取该密钥az functionapp keys list --resource-group smart-timer \ --name APP_NAME复制functionKeys部分default条目的值{ functionKeys: { default: sQO1LQaeK9N1qYD6SXeb/TctCmwQEkToLJU6Dw8TthNeUH8VA45hlA }, masterKey: RSKOAIlyvvQEQt9dfpabJT018scaLpQu9p1poHIMCxx5LYrIQZyQ/g, systemKeys: {} }该密钥需作为查询参数拼入 URL最终为https://APP_NAME.azurewebsites.net/api/text-to-timer?codeFUNCTION_KEY。 可通过 function.json 中的authLevel设置调整 HTTP 触发器的鉴权级别。方式二本机运行 局域网 IP 访问获取电脑在本地网络的 IP 地址Windows 10查看查找 IP 地址相关指南macOS查看如何在 Mac 上查找 IP 地址Linux查看私网 IP 地址的获取方法。得到 IP 后即可通过http://IP_ADDRESS:7071/api/text-to-timer访问例如http://192.168.1.10:7071/api/text-to-timer。 注意使用端口 7071IP 地址后必须加:7071。 该方式仅当 IoT 设备与电脑处于同一网络时才可用。最后用 curl 验证终结点可访问。动手挑战扩充训练语料设置定时器有无数种等价说法例如不同语序、不同数字写法、夹杂语气词等。请思考更多表达方式把它们作为示例加入你的 LUIS 应用并重新训练测试模型面对多种请求方式时的泛化能力。课程作业实现取消定时器阅读 6-consumer/lessons/2-language-understanding/assignment.md为 LUIS 应用新增一个cancel timer意图无需实体但需要若干示例语句在无服务器代码中检测该意图是否为 top intent若命中则记录日志并返回合适响应。参考评分标准能添加意图并训练模型、能检测 top intent 并记录日志即为满分表现。回顾与延伸本课完整示例代码位于 code/functions/smart-timer-trigger其中__init__.py是解析核心、function.json定义触发器、local.settings.json存放 LUIS 连接配置想深入理解语言理解自然语言理解的理论背景可查阅自然语言理解相关公开资料想进一步了解 HTTP 触发器的更多配置项可查阅 Azure Functions HTTP 触发器文档中关于authLevel、绑定方向的配置说明下一课 3-spoken-feedback 将把本课解析出的定时器秒数转换为语音反馈形成完整的听懂—执行—回话闭环。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号