如果你張嘴就是「全丟給大模型就好」——這場面試基本上就結束了。
這題真正在考的不是你會不會呼叫 API,而是工程取捨能力。
「意圖識別在生產環境不是一個模型問題,是一個路由問題。
我會做成三層漏斗:規則層攔截高頻固定句式(毫秒級、零成本,約 30–40%)、上下文層承接日常請求(微調小模型或語意向量 + 對話狀態,數十毫秒,約 50–60%)、工具層兜底(LLM + function calling,只吃 5–10% 的模糊、多意圖、隱含意圖)。
核心原則是——讓大多數請求在成本最低的那一層被解決。」
面試官心裡有一張表,你只要漏掉其中一格,就會被歸到「只會呼叫 API」那一檔。
LLM 單次推論普遍 500ms – 3s(首 token 延遲 + 生成時間)。使用者打一句「查物流」等兩秒才有反應,體驗直接崩。而規則比對只要 < 5ms,差了 兩到三個數量級。
每一次呼叫都在燒錢,而且是隨流量線性成長的。日請求 100 萬的客服系統,全走 LLM 與走三層漏斗,帳單可以差到一個數量級(下面模擬器可以自己拉)。
幻覺、介面逾時、供應商限流(429)、模型版本汰換造成的行為漂移——只要有一個發生,你的核心業務就跟著癱瘓。把 100% 流量壓在單一外部依賴上,是架構上的單點故障。
拉動滑桿改變每一層吃掉的流量,即時看平均延遲、P95 延遲與每日成本怎麼變。漏斗的寬度就是還沒被解決、要往下流的請求量。
預設值取自影片:規則層 35% / 上下文層 55% / 工具層 10%。所有數字都可調,右側指標即時重算。
成本假設:規則層 NT$0.01/千次(純 CPU)、上下文層 NT$0.6/千次(自建小模型 GPU 攤提)、工具層=上方滑桿值。 LLM 單價換算範例:約 800 input + 150 output token,中階模型約 NT$45/千次、輕量模型約 NT$7/千次。實際請代入你自己的模型報價。
能用規則解決的,不走模型;
能用小模型解決的,不走大模型。
< 5ms零邊際成本確定性流量 30–40%
Aho–Corasick 自動機或 Trie 一次掃完上千個詞,複雜度 O(文字長度),不隨規則數成長。這是規則層能撐住上萬條詞表還不變慢的關鍵。[A-Z]\d{10,}、手機、日期。注意災難性回溯(ReDoS),巢狀量詞的 pattern 要禁掉。intent_id,根本不需要「識別」,直接路由。很多團隊忘了算這一塊,它常常就佔了 15–20% 流量。只留高頻、明確、不變的意圖:
query_logisticsreturn_requestto_human(這條務必放最前面,是安全閥)幾十條規則就能蓋住高頻流量——這是長尾分布的必然結果:前 20 個意圖通常佔 70–80% 的請求。
priority 欄位 + 命中多條時的仲裁策略(最長匹配 / 最高優先級)。# 規則設定長這樣,而不是散在 if-else 裡 - id: rule_logistics_001 intent: query_logistics priority: 100 patterns: - kw: ["查物流", "物流", "快遞", "包裹到哪", "貨到哪"] - re: "^(我的)?(訂單|包裹|貨).{0,4}(到哪|寄出|出貨)" exclude_kw: ["物流費", "運費"] # 負向詞,擋掉「物流費怎麼算」 owner: cs-team reason: "日均 12k 次,最高頻意圖" review_by: 2026-10-01
20–60ms流量主力 50–60%速度與彈性的平衡點
| 路線 | 做法 | 優勢 | 代價 |
|---|---|---|---|
| 微調小模型 (分類器路線) |
DistilBERT / MiniLM / ERNIE-tiny 等,接一個 softmax 分類頭,用自家標註資料微調 | 準確率高、輸出直接是意圖標籤與機率、單次推論 CPU 上 10–30ms | 加一個新意圖就要重新訓練 + 重新評測 + 重新部署;冷啟動需要標註資料 |
| 語意向量檢索 (embedding 路線) |
把每個意圖的數十條範例句編碼進向量庫,查詢時算相似度取 top-k 投票 | 加新意圖只要加幾條範例句,零訓練、即時生效;天然支援 few-shot | 語意相近的意圖容易混(「改地址」vs「改收件人」);需要維護向量庫與 ANN 索引 |
使用者說「那個呢?」「然後呢?」「那我要退了」——句子裡沒有任何意圖詞,單句分類器一定崩。你需要 DST(Dialogue State Tracking,對話狀態追蹤):維護一個結構化的對話狀態,記住
(當前句, 對話狀態)。我會把上一輪意圖、已填槽位、最近 N 輪摘要一起拼進特徵,省略句才接得住。」——這一句話就把你和只會做單句分類的人分開了。500ms – 3s只吃 5–10%最強理解力最貴
技術上是 LLM + Function Calling:不只判斷意圖,而是直接把意圖識別與工具執行打通——模型輸出的就是「呼叫哪個函式、參數是什麼」,省掉「先分類、再對照到 API」這一層轉譯。
「怎麼會這樣啊」「這個好像怪怪的」——沒有可比對的詞,只能靠語境推。
「幫我把上個月三筆訂單退掉,然後開發票給我公司」——一句話要拆成多個任務並排序。
「我上次買的那個不太行,你幫我看看怎麼弄」——隱含售後意圖,要先查訂單,可能導向退換貨。
只要你在面試裡說「兜底交給 LLM」而沒接下面這幾句,追問一定跟著來。
confidence 與 reason;低於門檻就轉人工// 工具層的輸出契約:不是自由文字,是可驗證的結構 { "intents": [ { "name": "after_sales_consult", "confidence": 0.86, "slots": { "order_ref": "上次購買", "issue": "品質不佳" } }, { "name": "return_request", "confidence": 0.52, "slots": {} } ], "next_action": { "tool": "query_recent_orders", "args": { "limit": 3 } }, "needs_human": false, "reason": "使用者描述商品問題但未指名訂單,需先取回訂單清單澄清" } // 校驗:intents[].name ∈ 白名單、confidence ≥ τ、tool ∈ 已註冊工具、args 符合 schema // 任一項失敗 → 降級,不進入執行
點一句使用者的話,看它被哪一層接住、為什麼,以及花了多少時間。
同一套架構,六種輸入,落點完全不同——這就是分層路由在做的事。
「那個呢?」為什麼接得住?因為狀態不在句子裡,在狀態機裡。按「下一輪」逐步看狀態怎麼變。
左邊是對話,右邊是系統內部維護的結構化狀態。注意第 5 輪的省略句與第 7 輪的意圖切換。
「你怎麼決定什麼時候該往下一層送?」是這題最常見的追問。答案不是拍腦袋,是拉這條曲線。
在 2000 筆模擬驗證集上,調整上下文層的接受閾值 τ,看覆蓋率、準確率與下沉到 LLM 的比例怎麼互相拉扯。
資料為固定亂數種子產生的模擬驗證集(正確樣本分數偏高、錯誤樣本分數偏低),僅示意權衡形狀;真實系統請用自家標註集跑同一張圖。
τ_high 以上直接執行、τ_low 以下下沉 LLM、中間帶則反問澄清(「您是想查物流還是要退貨呢?」)。反問比猜錯便宜太多。影片沒講但面試一定追問的——「那你意圖是怎麼定的?」定壞了,後面三層都白搭。
chitchat 閒聊——「你是機器人嗎」「哈囉」out_of_scope 超出範圍——明確說「這我幫不上」比亂答好to_human 轉人工——永遠可用的逃生門unknown 拒識——不是失敗,是正確的行為。沒有拒識類的系統,準確率報表都是假的。| ❌ 錯誤設計 | ✅ 正確設計 |
|---|---|
意圖:查A商品物流、查B商品物流、查上月訂單物流……(意圖爆炸) |
意圖:query_logistics槽位: order_id、product、time_range |
意圖:退貨、退款、換貨 混成一個 售後 |
拆成三個——因為它們的審核流程與 API 不同,粒度該對齊動作 |
「一開始沒有資料,你的第二層拿什麼訓練?」——這題答不好,前面講的架構會被當成紙上談兵。
unknown 與低信心請求做群聚分析,跑出來的新群集就是你該新增的意圖。這是意圖體系持續演進的來源。「你怎麼知道它做得好不好?」只講 accuracy 是不夠的。
unknown 比例突然翻倍、第三層流量佔比從 10% 爬到 25%。這些幾分鐘內就能發現,而且通常代表上游改版或有人在打爆你的系統。正規化後的原話(去空白、繁簡、全半形、表情符號)當 key,直接查結果。客服場景的請求重複率高得驚人,命中率 20–35% 很常見。做在最前面,連規則層都省了。
用 embedding 找相似度 > 0.95 的歷史請求,複用其意圖判定。務必把對話狀態一起納入 key——同一句「那個呢」在不同上下文意思完全不同,只比對句子會直接答錯。
rules_version + model_version 是最省事的做法。沒有這個,你會遇到「規則明明改了但行為沒變」的鬼故事。同一套架構,兩種長度。先給 30 秒版本讓面試官決定要不要深挖,他一追問你就展開。
「我不會把意圖識別當成單一模型問題,會設計成三層漏斗的路由。
第一層規則層,關鍵詞、正則、狀態機,處理高頻固定句式,毫秒級、零成本;
第二層上下文層,微調的小模型或語意向量,結合對話狀態,這層是流量主力;
第三層才是 LLM + function calling,只兜底模糊、多意圖、隱含意圖的長尾,配逾時降級和置信度校驗。
設計目標是讓大多數請求在成本最低的那一層被解決,同時保留最終防線,讓使用者不會覺得系統很笨。」
| 追問 | 要點 |
|---|---|
| 怎麼決定一句話該往下沉? | 置信度閾值 + top1-top2 margin + 各意圖獨立閾值;中間帶反問澄清而不是硬猜。閾值由業務可接受錯誤率回推。 |
| 一開始沒資料怎麼辦? | 規則層+LLM 先上線,LLM 判斷全落盤當標註,抽檢成金標準,2–4 週後微調第二層。 |
| 多意圖怎麼處理? | 第二層做多標籤(sigmoid 而非 softmax)+ 分數門檻;真正複雜的組合交給第三層拆解成有序任務清單,逐一確認執行。 |
| LLM 掛了怎麼辦? | 逾時上限 → 備援模型/供應商 → 降回第二層 top1 → 通用話術+轉人工;配熔斷器與每日成本上限。 |
| 怎麼加一個新意圖? | 先在向量層加幾條範例句當天生效,累積真實樣本後再納入下一次微調,最高頻的再下放成規則。三層是有流動路徑的。 |
| 怎麼評估這套架構值不值得? | 算兩個數:每會話成本與 P95 延遲,跟全 LLM 基線比。順便講「前兩層必須 ≥ 95% 才能把 P95 壓下來」這個非線性效果。 |
| 為什麼不直接用 LLM 做 router? | 那只是把問題往上推一層——router 本身就有延遲與成本。可以用「小模型 router + LLM 執行」,但判定入口一定要便宜。 |
| ① 規則層 | ② 上下文層 | ③ 工具層 | |
|---|---|---|---|
| 定位 | 攔截 | 承接 | 兜底 |
| 技術 | 關鍵詞 / 正則 / FSM / Aho-Corasick | 微調小模型(DistilBERT 等)/語意向量檢索 + DST | LLM + Function Calling + 結構化輸出 |
| 延遲 | < 5ms | 20–60ms | 500ms – 3s |
| 流量 | 30–40% | 50–60% | 5–10% |
| 邊際成本 | ≈ 0 | 極低(自建攤提) | 高,隨流量線性成長 |
| 比的是 | 速度 | 平衡 | 理解力 |
| 主要風險 | 規則地獄、維護成本 | 語意相近意圖混淆、需要重訓 | 幻覺、逾時、成本失控 |
| 必配機制 | 優先級仲裁、命中率監控、回歸測試 | 閾值+margin 拒識、機率校準、影子模式 | 逾時降級、熔斷、白名單校驗、二次確認 |
原影片是自動字幕,幾個關鍵術語被聽錯了。照著錯字背去面試會很尷尬,這裡一併校正。
| 字幕寫的 | 正確術語 | 說明 |
|---|---|---|
| DSG 攔截 | 快速攔截(規則層 fast path) | 字幕誤植;同段後文出現的 DST 才是真術語 |
| DST | DST = Dialogue State Tracking | 對話狀態追蹤,這個是對的 |
| Disturbed | DistilBERT | BERT 的蒸餾版,參數約 40% 少、推論快約 60% |
| 複雜常位請求 | 複雜長尾請求 | long-tail |
| 逗底響應 | 兜底回應 | fallback response |
| 質性度較艷 | 置信度校驗 | confidence validation |
| 語意向量做相似度 | 語意向量(embedding)相似度匹配 | 正確,補上英文 |
| 退還貨 | 退換貨 | — |