險(xiǎn)動(dòng)作確認(rèn):為什么不能識(shí)別到意圖就執(zhí)行)
HarmonyOS 7.0 / API 26 小藝智能體高風(fēng)險(xiǎn)動(dòng)作確認(rèn)為什么不能識(shí)別到意圖就執(zhí)行這篇只講一個(gè)問題小藝智能體識(shí)別出用戶意圖以后哪些動(dòng)作可以直接執(zhí)行哪些動(dòng)作必須再確認(rèn)一次。版本邊界先寫清楚下面的思路面向 HarmonyOS 7.0 / API 26。這里不寫泛泛的“智能化體驗(yàn)”而是站在應(yīng)用開發(fā)者的角度看一個(gè)更實(shí)際的問題智能體可以幫用戶省步驟但不能替用戶做高風(fēng)險(xiǎn)決定。尤其是刪除、支付、提交、公開發(fā)布、修改賬號(hào)資料這類動(dòng)作一旦做錯(cuò)用戶不會(huì)覺得應(yīng)用智能只會(huì)覺得應(yīng)用不可靠。為什么這個(gè)問題容易被忽略很多頁面一開始都是按鈕觸發(fā)的用戶點(diǎn)按鈕頁面彈確認(rèn)框確認(rèn)后再調(diào)用接口。接入智能體以后入口變了用戶可能說一句“幫我清掉這些記錄”系統(tǒng)就識(shí)別成一個(gè) action。如果代碼里直接把這個(gè) action 交給業(yè)務(wù)層執(zhí)行就會(huì)繞過原來的確認(rèn)鏈路。這類問題通常不是編譯報(bào)錯(cuò)而是流程設(shè)計(jì)錯(cuò)誤。代碼能跑測(cè)試也可能只測(cè)到正常路徑但一到真實(shí)用戶場(chǎng)景就容易出事。我自己的判斷方式比較簡(jiǎn)單只要這個(gè)動(dòng)作執(zhí)行后很難撤回或者會(huì)影響用戶資產(chǎn)、隱私、數(shù)據(jù)完整性就不能只靠意圖識(shí)別結(jié)果直接執(zhí)行必須進(jìn)入二次確認(rèn)。先把動(dòng)作分級(jí)不要把所有智能體動(dòng)作都寫成同一種處理方式。建議先做一層動(dòng)作分級(jí)讓頁面只處理結(jié)果不直接猜風(fēng)險(xiǎn)。動(dòng)作類型例子是否需要確認(rèn)原因查詢類查天氣、查訂單狀態(tài)、查頁面內(nèi)容一般不需要不改數(shù)據(jù)出錯(cuò)也容易糾正頁面跳轉(zhuǎn)類打開設(shè)置頁、打開收藏列表通常不需要只是換頁面沒有直接副作用輕量修改類切換主題、調(diào)整排序視情況確認(rèn)可以撤回時(shí)風(fēng)險(xiǎn)較低高風(fēng)險(xiǎn)修改類刪除記錄、提交表單、公開發(fā)布必須確認(rèn)執(zhí)行后可能造成數(shù)據(jù)或隱私風(fēng)險(xiǎn)資產(chǎn)相關(guān)類支付、兌換、訂閱、扣積分必須確認(rèn)需要用戶明確授權(quán)這個(gè)表不要只寫在文檔里最好落到代碼里。否則后面每加一個(gè)動(dòng)作開發(fā)者都會(huì)按自己的理解寫風(fēng)險(xiǎn)邊界會(huì)越來越亂。例子一刪除歷史記錄不能只靠一句話復(fù)現(xiàn)場(chǎng)景用戶在應(yīng)用里打開歷史記錄頁。用戶對(duì)小藝說“把最近瀏覽記錄清掉”。智能體識(shí)別出clearHistory意圖。如果代碼直接執(zhí)行刪除用戶可能來不及發(fā)現(xiàn)刪的是全部記錄還是篩選后的記錄。這個(gè)問題的核心不在智能體識(shí)別準(zhǔn)不準(zhǔn)而在執(zhí)行前有沒有把影響范圍說清楚。建議做法是先構(gòu)造待確認(rèn)動(dòng)作把動(dòng)作名稱、影響范圍、數(shù)量、是否可撤回都列出來再交給確認(rèn)層處理。typeRiskLevellow|middle|high;interfaceAgentAction{actionId:string;name:string;riskLevel:RiskLevel;targetCount:number;reversible:boolean;reason:string;}interfaceConfirmResult{canRun:boolean;message:string;}classAgentActionGuard{check(action:AgentAction):ConfirmResult{if(action.riskLevelhigh){return{canRun:false,message:${action.name}會(huì)影響${action.targetCount}條數(shù)據(jù)需要用戶確認(rèn)后再執(zhí)行};}if(!action.reversibleaction.targetCount0){return{canRun:false,message:${action.name}不支持撤回先彈確認(rèn)框};}return{canRun:true,message:低風(fēng)險(xiǎn)動(dòng)作可以直接執(zhí)行};}}頁面里不要直接調(diào)用刪除接口而是先走 guard。EntryComponentstruct AgentActionPage{privateguard:AgentActionGuardnewAgentActionGuard();StateconfirmText:string等待智能體動(dòng)作;StatependingActionId:string;handleClearHistoryIntent(){constaction:AgentAction{actionId:clear_history_recent,name:清理最近瀏覽記錄,riskLevel:high,targetCount:28,reversible:false,reason:用戶通過智能體觸發(fā)清理動(dòng)作};constresultthis.guard.check(action);if(!result.canRun){this.pendingActionIdaction.actionId;this.confirmTextresult.message;return;}this.runAction(action.actionId);}runAction(actionId:string){console.info([agent-action] run actionId${actionId});}build(){Column({space:12}){Text(小藝智能體動(dòng)作確認(rèn)).fontSize(20).fontWeight(FontWeight.Bold)Text(this.confirmText).fontSize(14)Button(確認(rèn)執(zhí)行).enabled(this.pendingActionId.length0).onClick((){this.runAction(this.pendingActionId);this.pendingActionId;this.confirmText動(dòng)作已確認(rèn)執(zhí)行;})}.padding(16)}}這樣做的好處是智能體只負(fù)責(zé)識(shí)別意圖真正執(zhí)行前仍然由應(yīng)用自己的安全鏈路兜住。后面如果要加“刪除收藏”“清空緩存”“批量取消訂閱”也能復(fù)用同一套判斷邏輯。例子二公開提交類動(dòng)作要先讓用戶看結(jié)果第二個(gè)常見場(chǎng)景是提交內(nèi)容。比如用戶說“幫我把這段反饋發(fā)出去”。智能體可能已經(jīng)幫用戶整理好了文本但公開發(fā)布、提交工單、反饋到社區(qū)這類動(dòng)作最好不要直接執(zhí)行。這里的風(fēng)險(xiǎn)不是技術(shù)接口復(fù)雜而是內(nèi)容可能不符合用戶真實(shí)想法。用戶說的是一句模糊指令系統(tǒng)生成的是一段具體內(nèi)容中間必須給用戶一次確認(rèn)機(jī)會(huì)。可以把提交動(dòng)作拆成三個(gè)階段prepare生成待提交內(nèi)容。preview展示內(nèi)容、目標(biāo)位置和影響范圍。submit用戶確認(rèn)后再提交。typeSubmitStepprepare|preview|submit;interfaceAgentSubmitDraft{step:SubmitStep;title:string;content:string;target:string;confirmed:boolean;}classAgentSubmitFlow{next(draft:AgentSubmitDraft):AgentSubmitDraft{if(draft.stepprepare){return{...draft,step:preview};}if(draft.steppreviewdraft.confirmed){return{...draft,step:submit};}returndraft;}}頁面層只根據(jù)階段渲染不要把提交按鈕一直放開。Componentstruct SubmitPreviewPanel{Statedraft:AgentSubmitDraft{step:prepare,title:應(yīng)用反饋,content:頁面在弱網(wǎng)恢復(fù)后提示不夠明確希望增加重試說明。,target:反饋中心,confirmed:false};privateflow:AgentSubmitFlownewAgentSubmitFlow();build(){Column({space:10}){Text(this.draft.title).fontSize(18).fontWeight(FontWeight.Medium)Text(提交位置${this.draft.target}).fontSize(13)Text(this.draft.content).fontSize(14)if(this.draft.steppreview){Checkbox().select(this.draft.confirmed).onChange((checked:boolean){this.draft.confirmedchecked;})Text(我已確認(rèn)提交內(nèi)容和提交位置)}Button(this.draft.stepprepare?生成預(yù)覽:提交).enabled(this.draft.stepprepare||this.draft.confirmed).onClick((){this.draftthis.flow.next(this.draft);if(this.draft.stepsubmit){console.info([agent-submit] user confirmed, submit now);}})}.padding(16)}}這個(gè)拆法看起來多了一步但能避免兩個(gè)問題一是誤提交二是用戶不知道系統(tǒng)到底替自己提交了什么。對(duì)智能體入口來說這一步很關(guān)鍵。我會(huì)怎么選方案方案適合場(chǎng)景問題識(shí)別到意圖就執(zhí)行查詢、跳轉(zhuǎn)、無副作用動(dòng)作不適合刪除、提交、支付等高風(fēng)險(xiǎn)動(dòng)作每個(gè)頁面自己寫確認(rèn)小項(xiàng)目、動(dòng)作很少后面動(dòng)作多了容易漏統(tǒng)一動(dòng)作分級(jí)和確認(rèn)流多入口、多頁面、多設(shè)備前期要把動(dòng)作模型設(shè)計(jì)好我更建議第三種。不是因?yàn)樗雌饋韽?fù)雜而是因?yàn)橹悄荏w入口會(huì)越來越多語音、卡片、桌面入口、跨設(shè)備入口都可能觸發(fā)同一個(gè)動(dòng)作。確認(rèn)邏輯如果散在各個(gè)頁面里后面很難排查到底哪個(gè)入口繞過了安全判斷。怎么驗(yàn)證不是紙上談兵我會(huì)至少測(cè)這幾條測(cè)試項(xiàng)輸入預(yù)期查詢類動(dòng)作打開某個(gè)頁面直接執(zhí)行刪除類動(dòng)作清理 28 條歷史記錄進(jìn)入確認(rèn)態(tài)不直接刪除提交類動(dòng)作生成反饋并提交先預(yù)覽勾選確認(rèn)后才能提交異常動(dòng)作actionId 為空攔截并打印原因恢復(fù)場(chǎng)景應(yīng)用切后臺(tái)再回來pendingActionId 不丟用戶仍能看見待確認(rèn)動(dòng)作日志也要留清楚不然問題很難查[agent-action] intentclearHistory riskhigh targetCount28 resultneed_confirm [agent-submit] steppreview confirmedfalse resultblocked [agent-submit] stepsubmit confirmedtrue resultrun總結(jié)小藝智能體接入應(yīng)用以后真正要守住的不是“能不能識(shí)別出意圖”而是“識(shí)別出來以后能不能安全執(zhí)行”。查詢和跳轉(zhuǎn)可以快高風(fēng)險(xiǎn)動(dòng)作必須穩(wěn)。我的建議是把動(dòng)作分級(jí)、二次確認(rèn)、影響范圍、可撤回性這些規(guī)則抽成統(tǒng)一模塊。頁面只接收結(jié)果不自己臨時(shí)判斷。這樣后面接更多 HarmonyOS 7.0 / API 26 新能力時(shí)應(yīng)用不會(huì)因?yàn)槿肟谧兌喽寻踩吔鐚憗y。