基于Alexa与AWS Lambda的港铁实时查询语音技能开发实战

news2026/5/10 11:28:50
1. 项目概述一个为香港地铁通勤者打造的智能助手如果你在香港生活或工作每天依赖港铁MTR通勤那么“下一班车几点到”这个问题恐怕是你每天都要问上好几遍的灵魂拷问。站台上人潮涌动你伸长脖子盯着那块小小的电子显示屏心里盘算着是这班挤上去还是等下一班更空的。或者你刚出家门想知道走到地铁站的时间刚好能赶上哪一班车避免在站台傻等。这些看似微小的不确定性累积起来就是通勤路上实实在在的焦虑和时间损耗。tomfong/hk-mtr-next-train-skill这个项目就是为了解决这个痛点而生的。它本质上是一个为智能语音助手比如 Amazon Alexa开发的“技能”Skill。你可以把它想象成一个精通港铁时刻表的虚拟助理。你只需要对着你的智能音箱说“Alexa问港铁助手下一班去中环的车什么时候到”或者“Alexa问港铁助手从九龙塘到尖沙咀要多久”它就能立刻从港铁的官方数据源获取实时信息并用语音清晰、准确地回答你。这个项目的核心价值在于“将公共服务数据转化为个性化的、触手可及的便利”。它没有创造新的数据而是通过技术手段让本就存在的、公开的港铁实时到站信息以一种更自然、更无缝的方式融入用户的日常生活场景中。对于开发者而言这是一个非常典型的“物联网IoT应用层”或“语音交互应用”案例涉及API集成、自然语言处理NLU、服务器less架构等多个现代Web开发的核心技术点。对于用户它就是一个能省心、省力的“懒人神器”。2. 项目核心架构与技术栈解析要理解这个技能是如何工作的我们需要把它拆解成几个关键的技术模块。整个系统遵循了典型的“语音技能”后端服务架构。2.1 前端交互层Alexa Skills Kit (ASK) 与 Voice UI技能与用户的直接交互发生在Alexa平台。开发者需要利用Alexa Skills Kit (ASK)来定义技能的“交互模型”。这包括调用名称 (Invocation Name)用户用来唤醒技能的词组这里是“港铁助手”。Alexa通过语音识别将用户的“Alexa打开港铁助手”映射到这个技能。意图 (Intents)定义了用户可能提出的各种请求。对于这个项目核心意图至少包括NextTrainIntent查询下一班列车。用户可能会说“下一班去金钟的车”、“什么时候有车去旺角”。TravelTimeIntent查询行程时间。用户可能会说“从铜锣湾到上环要多久”、“到尖东多长时间”。话语样本 (Sample Utterances)为每个意图提供大量、多样的口语化例句用于训练Alexa的自然语言理解NLU模型。例如为NextTrainIntent提供“下一班去{目的地}的车”、“什么时候有车到{车站}”、“{车站}方向的车还有多久”。槽位 (Slots)意图中的变量参数。最重要的槽位就是车站名。我们需要定义一个Station槽位并将其与一个包含所有港铁车站名称的“自定义槽位类型”或“内置类型”关联。Alexa在识别用户语句时会自动将“中环”、“九龙塘”这样的词提取并填充到槽位中传递给后端。注意处理中文粤语/普通话车站名是一大挑战。港铁车站名包含中英文、特殊字符如“㓥房”的“㓥”字且用户发音可能不标准。在定义槽位值时除了标准名称最好加入常见的口语化称呼或拼音以提高识别率。2.2 后端逻辑层AWS Lambda 与业务处理当Alexa识别了用户的意图和槽位后它会将这些信息打包成一个结构化的JSON请求发送到技能配置的后端服务端点。这个项目通常采用AWS Lambda——一种无服务器Serverless计算服务。选择Lambda的原因非常充分成本效益技能的使用频率是波动的早晚高峰高夜间低。Lambda按实际请求次数和计算时间收费在请求量不大时成本极低甚至可能长期处于免费额度内。免运维无需关心服务器配置、扩缩容、系统补丁开发者可以专注于业务逻辑代码。天然集成ASK与Lambda同属AWS生态配置和调试非常方便。Lambda函数比如用Node.js或Python编写收到请求后其核心逻辑流程如下请求解析从JSON请求中提取intentName意图名称和slotValues槽位值如station。参数验证与标准化检查必要的槽位如车站名是否存在、是否有效。将用户说出的车站名可能不完整或有歧义映射到港铁官方API所使用的标准车站代码Station Code。这一步通常需要一个本地的车站名称-代码映射表。数据获取根据意图向港铁的实时到站数据API发起HTTP请求。港铁官方或第三方提供了这些实时数据接口。数据处理与过滤API返回的通常是该站所有线路、所有方向的列车到站信息。后端需要根据用户查询的“目的地”隐含了方向和线路从数据中筛选出匹配的下一班车信息并计算剩余时间。响应构建将处理后的信息如“下一班开往中环的列车将在3分钟后到达”组织成Alexa可以理解的SSML语音合成标记语言或纯文本响应格式。SSML可以控制语音的停顿、语调使播报更自然。返回响应将响应JSON返回给Alexa平台由Alexa设备播报给用户。2.3 数据源层港铁实时数据API这是整个技能的“数据心脏”。项目的可靠性和实时性完全取决于数据源的质量。通常有几种选择官方/半官方API港铁是否有公开的实时数据接口如GTFS-Realtime格式。这是最权威的来源。第三方聚合API一些公共交通数据聚合平台可能提供港铁数据。网页爬虫 (Web Scraping)作为备选方案从港铁官方网站或手机App的实时到站页面抓取数据。但这种方式稳定性差受网页结构变更影响大且可能违反网站服务条款不推荐作为主要方案。在Lambda函数中调用这些API时必须注意错误处理API可能暂时不可用、返回错误或超时。代码必须有健壮的错误处理机制并给用户返回友好的提示如“暂时无法获取港铁信息请稍后再试”。缓存策略对于同一车站的查询短时间内数据变化不大。可以在Lambda层或使用AWS ElastiCacheRedis添加一个短期缓存如30秒以减少对上游API的调用提升响应速度并降低对方服务器压力。频率限制遵守数据源方的调用频率限制。2.4 辅助服务与配置AWS API Gateway虽然Lambda可以直接被ASK调用但通过API Gateway进行管理更为规范便于设置权限、监控和API版本管理。环境变量将API密钥、车站映射表等配置信息存储在Lambda的环境变量中避免硬编码在代码里。日志与监控使用AWS CloudWatch来记录Lambda函数的日志监控其运行状态、执行时间和错误这对于后期调试和优化至关重要。3. 核心功能实现与代码要点拆解让我们深入到代码层面看看几个关键功能是如何实现的。这里以Node.js运行环境为例。3.1 意图派发与路由Lambda的入口函数需要处理ASK发送的各种请求类型包括技能启动、意图请求、会话结束等。通常会使用官方或社区的SDK如ask-sdk-corefor Node.js来简化处理。const Alexa require(ask-sdk-core); const LaunchRequestHandler { canHandle(handlerInput) { return handlerInput.requestEnvelope.request.type LaunchRequest; }, handle(handlerInput) { const speechText 欢迎使用港铁助手您可以问我下一班车的时间或者查询车站间的行程时间。; return handlerInput.responseBuilder .speak(speechText) .reprompt(您想查询什么) .getResponse(); } }; const NextTrainIntentHandler { canHandle(handlerInput) { return handlerInput.requestEnvelope.request.type IntentRequest handlerInput.requestEnvelope.request.intent.name NextTrainIntent; }, async handle(handlerInput) { // 1. 提取槽位值 const slots handlerInput.requestEnvelope.request.intent.slots; const stationSlot slots.station; if (!stationSlot || !stationSlot.value) { return handlerInput.responseBuilder .speak(抱歉我没听清楚您要查询哪个车站。请再说一次车站名。) .reprompt(请问您要查询哪个车站的下一班车) .getResponse(); } const userStationName stationSlot.value; // 例如“中环” // 2. 标准化车站名核心 const standardStationInfo standardizeStationName(userStationName); if (!standardStationInfo) { return handlerInput.responseBuilder .speak(抱歉我没有找到名为 ${userStationName} 的车站。请确认车站名称是否正确。) .getResponse(); } // 3. 调用港铁API获取实时数据 try { const realtimeData await fetchMTRRealtimeData(standardStationInfo.code); // 4. 处理数据找到下一班车 const nextTrainInfo processDataForNextTrain(realtimeData, standardStationInfo); // 5. 构建语音响应 const speechText 下一班开往 ${nextTrainInfo.destination} 方向的列车将在 ${nextTrainInfo.arrivalInMinutes} 分钟后到达。; return handlerInput.responseBuilder .speak(speechText) .withSimpleCard(港铁下一班车, speechText) // 在Alexa App中显示卡片 .getResponse(); } catch (error) { console.error(获取港铁数据失败:, error); return handlerInput.responseBuilder .speak(暂时无法连接到港铁实时信息请稍后再试。) .getResponse(); } } }; // 技能构建 exports.handler Alexa.SkillBuilders.custom() .addRequestHandlers( LaunchRequestHandler, NextTrainIntentHandler, // ... 其他Intent Handler ) .lambda();3.2 车站名标准化从口语到标准代码这是确保技能可用的最关键环节。我们需要一个本地映射表。// station_mapping.js const stationMap [ { keywords: [中环, central, 鐘環], code: CEN, line: Island, chineseName: 中環 }, { keywords: [金钟, admiralty, 金鐘], code: ADM, line: [Island, South Island], chineseName: 金鐘 }, { keywords: [九龙塘, kowloon tong, 九龍塘], code: KOT, line: East Rail, chineseName: 九龍塘 }, { keywords: [尖沙咀, tsim sha tsui, 尖沙嘴], code: TST, line: Tsuen Wan, chineseName: 尖沙咀 }, { keywords: [尖东, east tsim sha tsui, 尖東], code: ETS, line: West Rail, chineseName: 尖東 }, // ... 列出所有港铁车站 ]; function standardizeStationName(userInput) { const lowerInput userInput.toLowerCase().trim(); // 1. 精确匹配中文名或英文名 let match stationMap.find(s s.chineseName userInput || s.keywords.some(kw kw.toLowerCase() lowerInput) ); if (match) return match; // 2. 模糊匹配处理用户发音不准或只说部分名称 // 例如“沙田围”可能被识别为“沙田” // 这里可以使用字符串相似度算法如Levenshtein Distance // 为简化示例使用 includes match stationMap.find(s s.keywords.some(kw lowerInput.includes(kw.toLowerCase()) || kw.toLowerCase().includes(lowerInput)) ); // 3. 如果找到多个可能匹配如“九龙”可能指“九龙塘”、“九龙湾”需要上下文或进一步询问用户 // 这里简单返回第一个匹配实际项目需更复杂的歧义处理 return match || null; }实操心得车站名映射表的维护是一个长期工作。用户可能会使用你意想不到的简称或俗称比如“红磡”叫“红火车”“大学站”叫“中大站”。上线后通过分析CloudWatch中识别失败或用户更正“不是这个站”的日志来不断补充和优化这个映射表是提升技能体验的持续过程。3.3 集成港铁实时数据API假设我们找到了一个返回JSON格式的第三方API。// mtr_api_client.js const axios require(axios); // 需要安装axios库 async function fetchMTRRealtimeData(stationCode) { const apiUrl https://api.example-mtr-realtime.com/v1/station/${stationCode}/arrivals; // 注意真实API可能需要API Key应从环境变量读取 const apiKey process.env.MTR_API_KEY; const config { headers: { Authorization: Bearer ${apiKey} }, timeout: 3000 // 设置超时避免用户长时间等待 }; try { const response await axios.get(apiUrl, config); // 假设API返回格式{ data: [ { line: TWL, direction: down, destination: CEN, eta: 2023-10-27T08:15:00Z, platform: 1 }, ... ] } return response.data.data; } catch (error) { // 详细记录错误信息方便排查 console.error(调用港铁API失败车站码: ${stationCode}, error.message); if (error.response) { console.error(API响应状态:, error.response.status); console.error(API响应数据:, error.response.data); } throw new Error(MTR_API_FAILURE); // 抛出特定错误供上层处理 } }3.4 数据处理与逻辑筛选API返回的数据可能包含多条线路、多个方向的列车。我们需要根据用户查询的“目的地”来筛选。用户的意图NextTrainIntent中可能只说了“去中环的车”这隐含了“方向”和“终点站”。function processDataForNextTrain(allTrains, stationInfo) { // stationInfo 包含标准化后的车站代码、线路等信息 // 1. 过滤出即将到达的列车排除已离站或很久以后的 const now new Date(); const upcomingTrains allTrains.filter(train { const arrivalTime new Date(train.eta); const minutesDiff (arrivalTime - now) / (1000 * 60); return minutesDiff 0 minutesDiff 60; // 只考虑未来60分钟内的车 }); if (upcomingTrains.length 0) { return null; // 或返回一个“暂无列车信息”的对象 } // 2. 排序按到达时间从早到晚 upcomingTrains.sort((a, b) new Date(a.eta) - new Date(b.eta)); // 3. 这里有一个关键点用户查询时我们只知道“目的地”车站名。 // 我们需要一个“线路-方向-目的地”的映射知识。 // 例如在“九龙塘”站用户说“去罗湖”我们知道这是东铁线北行方向。 // 这部分逻辑较为复杂需要内置一个简单的路线图逻辑或依赖API返回的direction和destination字段。 // 假设API返回的train.destination就是终点站代码我们可以直接匹配。 // 但用户可能说“去尖沙咀”而在九龙塘站这可能对应两个方向荃湾线/观塘线需要进一步澄清。 // 简化处理返回最早一班车实际项目需根据目的地筛选 const nextTrain upcomingTrains[0]; const arrivalTime new Date(nextTrain.eta); const minutesToArrival Math.round((arrivalTime - now) / (1000 * 60)); // 根据车站代码反向查找目的地车站的中文名 const destStation stationMap.find(s s.code nextTrain.destination); const destinationName destStation ? destStation.chineseName : 代码${nextTrain.destination}; return { destination: destinationName, arrivalInMinutes: minutesToArrival, line: nextTrain.line, platform: nextTrain.platform }; }4. 开发、测试与部署全流程指南4.1 本地开发环境搭建安装工具Node.js (建议LTS版本)AWS CLI配置你的AWS访问密钥和区域如ap-east-1香港。ASK CLIAlexa技能命令行工具用于创建、部署和管理技能。npm install -g ask-cli初始化项目ask new选择“自定义技能”模板选择“Hello World”一个简单的Node.js示例输入技能名称如hk-mtr-next-train。这会生成一个包含交互模型定义skill.jsonmodels/*.json和Lambda代码lambda/*的文件夹结构。本地模拟与测试修改生成的Lambda代码替换成我们的港铁逻辑。可以使用ask simulate命令配合文本或语音文件进行模拟测试。更高效的是使用Alexa Developer Console 的测试面板在线可以直接输入文本或语音进行交互测试无需真实设备。4.2 交互模型Interaction Model的精细打磨这是决定技能是否“聪明”的关键。在models/zh-CN.json简体中文或models/zh-HK.json繁体中文如果支持中定义。{ interactionModel: { languageModel: { invocationName: 港铁助手, intents: [ { name: NextTrainIntent, slots: [ { name: station, type: STATION_LIST // 引用自定义的槽位类型 }, { name: destination, type: STATION_LIST // 查询下一班车时目的地也是车站 } ], samples: [ 下一班去{destination}的车, 什么时候有车到{station}, {station}的下一班车, 去{destination}的车还有多久, 从{station}到{destination}的下一班车 // 样本越多覆盖越广识别越准 ] } ], types: [ { name: STATION_LIST, values: [ {id: CEN, name: {value: 中环, synonyms: [Central, 中環]}}, {id: ADM, name: {value: 金钟, synonyms: [Admiralty, 金鐘]}}, // ... 为所有车站添加同义词 ] } ] } } }注意事项交互模型的修改需要重新部署才能生效。每次更新models文件夹下的文件后都需要运行ask deploy或通过Developer Console上传。4.3 Lambda函数部署与配置代码准备在lambda文件夹内完成所有业务逻辑代码并确保package.json中包含了所有依赖如axios。环境变量在lambda文件夹下创建或修改.env文件ASK CLI会使用或在AWS Lambda控制台直接设置环境变量如MTR_API_KEY、CACHE_TTL等。权限配置确保Lambda函数的执行角色Execution Role拥有写入CloudWatch Logs的权限以便输出日志。部署cd /path/to/skill ask deploy这个命令会同时部署交互模型到Alexa技能和代码到Lambda函数。4.4 真机测试与认证前检查在提交技能进行亚马逊认证之前必须进行全面的真机测试。设备测试在真实的Echo设备或安装了Alexa App的手机上启用“测试”模式在Developer Console中该技能处于“开发”状态时可用进行端到端测试。覆盖所有意图测试NextTrainIntent、TravelTimeIntent以及帮助、取消、停止等内置意图。边界和错误测试说一个不存在的车站名。查询一个没有列车运行的车站如深夜的非换乘站。网络超时或API返回错误时技能的反馈是否友好。说话含糊不清或中途取消。多轮对话测试如果技能支持多轮对话如用户没说清楚车站技能会追问测试对话流程是否顺畅。语音质量听一下SSML合成的语音是否自然数字、站名播报是否清晰。5. 进阶优化与扩展思路一个基础技能上线后可以从以下几个方面进行优化和扩展提升其竞争力和用户体验。5.1 性能与成本优化实施缓存在Lambda函数内使用内存缓存对于短期数据或连接外部RedisElastiCache。查询时先检查缓存中是否有该车站最近的数据有则直接使用无则调用API并更新缓存。设置合理的TTL如30秒。const NodeCache require(node-cache); const myCache new NodeCache({ stdTTL: 30 }); // 默认30秒过期 async function getCachedOrFetch(stationCode) { const cacheKey station:${stationCode}; let data myCache.get(cacheKey); if (data) { console.log(缓存命中: ${stationCode}); return data; } console.log(缓存未命中调用API: ${stationCode}); data await fetchMTRRealtimeData(stationCode); myCache.set(cacheKey, data); return data; }Lambda配置调优根据函数的内存消耗和执行时间调整Lambda的内存分配如从128MB调到256MB。更高的内存通常意味着更强的CPU性能可能反而降低总体执行时间和成本。异步处理如果数据处理逻辑复杂可以考虑将耗时的操作如复杂的路线计算放入队列如AWS SQS由另一个Lambda异步处理主函数快速响应用户“信息正在查询请稍等”再通过Alexa的“Progressive Response”或技能内购买推送通知告知结果此方案较复杂。5.2 功能扩展多语言支持香港用户可能使用粤语、普通话或英语。可以在ASK中为技能添加多个语言模型en-US,zh-CN, 甚至自定义zh-HK并在Lambda中根据request.locale判断用户语言返回对应的语音和文字响应。个性化与上下文记忆利用Alexa的“属性持久化”功能记住用户常用的出发车站如家庭住址附近的车站。下次用户直接问“下一班车”技能可以默认查询这个车站无需每次都说出站名。行程规划结合实时到站数据和静态的站间运行时间表实现更精准的“从A到B需要多久”查询并可以考虑换乘时间。异常通知集成港铁的服务中断或延误公告API。当用户查询受影响的线路时技能可以在播报下一班车时间前先提示“请注意东铁线目前有延误”。多平台扩展将核心的数据获取与处理逻辑封装成独立的服务不仅可以服务于Alexa技能还可以轻松扩展出Google Assistant Action、微信小程序、Telegram Bot等前端。5.3 数据分析与持续改进利用CloudWatch Insights分析Lambda日志了解技能的调用频率、高峰时段、最常查询的车站、识别失败率最高的车站名等。这些数据是优化交互模型和车站名映射表的重要依据。用户反馈关注Alexa技能商店的用户评分和评论积极回应用户的问题和建议。A/B测试对于不确定的改进如新的对话流程、不同的响应话术可以利用AWS Lambda的版本和别名功能进行小流量的A/B测试用数据驱动决策。6. 常见问题与故障排查实录在开发和运营这类技能的过程中我踩过不少坑这里总结一些典型问题和解决方法。6.1 语音识别不准特别是车站名现象用户说“九龙塘”技能识别成了“九龍城”或完全无关的词。排查在Developer Console的“测试”面板中输入文本“九龙塘的下一班车”看意图和槽位是否正确填充。如果文本输入都错说明交互模型有问题。如果文本输入正确但语音识别错误查看请求JSON中的request.intent.slots.station.value字段确认Alexa识别出的原始文本是什么。解决扩充同义词在STATION_LIST槽位类型中为“九龙塘”添加尽可能多的同义词和常见误识别词如“九龍塘”、“Kowloon Tong”、“九龙”、“KT”。使用短语槽位 (Phrase Slot)对于固定集合但识别困难的值可以尝试使用AMAZON.SearchQuery或AMAZON.Phrase槽位类型捕获更原始的语音转文本结果然后在自己的代码中进行更灵活的匹配如前文提到的模糊匹配函数。多轮对话澄清如果置信度不高可以设计对话让Alexa反问用户“您说的是九龙塘站吗”。6.2 Lambda函数超时或冷启动慢现象用户查询后Alexa长时间不响应或者说“技能没有响应”。排查查看CloudWatch Logs中该次请求的日志。关注Lambda的REPORT行看Duration执行时间和Billed Duration是否接近或超过超时限制默认3秒。同时看是否有Init Duration冷启动时间。解决优化代码检查fetchMTRRealtimeData函数确保API调用设置了合理的超时如2秒。优化数据处理逻辑避免复杂的同步循环。增加内存适当增加Lambda内存配置CPU性能会成比例提升可能显著缩短执行时间。保持Lambda温热对于有稳定流量的技能冷启动不是大问题。如果流量极低可以考虑设置一个CloudWatch Events定时器每隔几分钟ping一下自己的Lambda函数使其保持在一个“温热”状态。但需权衡成本。缩短超时时间如果API不稳定在代码中设置比Lambda函数超时更短的API调用超时以便在API失败时快速回退到备用响应或错误提示。6.3 港铁API不稳定或返回数据格式变化现象技能间歇性报错“无法获取信息”或之前正常的功能突然解析失败。排查查看CloudWatch日志中API调用的响应记录。对比正常和异常时的响应体结构。解决实现降级策略当实时API失败时可以回退到查询静态的时刻表如果存在并告知用户“目前无法获取实时信息以下是基于时刻表的预估时间”。添加监控告警在CloudWatch中设置警报当Lambda函数错误率Errors指标或API调用延迟在代码中自定义指标超过阈值时发送通知到邮箱或SNS以便及时人工干预。代码健壮性在解析API响应数据时不要做太多“这个字段一定存在”的假设。使用try...catch和空值判断防止因个别字段缺失导致整个函数崩溃。6.4 技能认证被拒绝亚马逊对提交到技能商店的技能有严格的质量指南。常见被拒原因隐私政策不合规如果技能会收集个人信息如记住常用车站必须在技能描述中提供隐私政策链接。即使不收集也最好提供一个说明“本技能不收集任何用户数据”的隐私页面。响应速度慢超过8秒无响应的技能会被拒。确保Lambda函数和API调用整体耗时在3-5秒内。技能描述或示例语句不准确描述和示例必须真实反映技能功能。不能夸大其词。品牌侵权技能名称、图标、描述中不能未经授权使用“MTR”商标。通常需要使用“非官方”、“查询”等字眼并明确说明与港铁公司无关。功能过于单一或低价值审核员可能认为“查询下一班车”功能过于简单不足以作为一个独立的技能。可以考虑集成“行程时间”、“服务状态”等功能提升技能价值。开发一个像hk-mtr-next-train-skill这样的语音技能是一个将想法、数据和技术结合最终创造出真实用户价值的完整过程。从理解港铁通勤者的痛点到设计自然的对话交互再到集成实时API并处理各种边界情况每一步都需要细致的思考和扎实的工程实践。当听到自己的技能通过音箱流畅地回答出下一班车的时间那种连接虚拟与现实的成就感正是驱动开发者不断前行的乐趣所在。这个项目麻雀虽小五脏俱全是学习现代云服务、无服务器架构和语音交互开发的绝佳练手项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2600370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…