簡介#
Gmail 的 Smart Compose 功能 [1] 能在使用者撰寫郵件時,即時建議接下來可能輸入的幾個單詞。本章將探討此功能的運作方式,並深入介紹驅動大多數生成式系統的 Transformer 架構。
需求釐清#
以下是面試中候選人與面試官之間的典型對話:
候選人: 不同使用者可能有不同的寫作風格。系統是否需要提供個人化建議? 面試官: 為了簡化,先不考慮個人化。
候選人: 系統是否只在對預測有足夠信心時才顯示建議? 面試官: 是的。
候選人: 訓練模型需要足夠大的郵件資料集。我們知道資料的大致規模嗎? 面試官: 假設我們的資料集包含約十億封郵件。
候選人: 在產生建議時,有不同的資料可以利用——例如使用者過去的郵件或當前郵件的主旨。為了簡化,我可以只使用郵件正文作為上下文嗎? 面試官: 好問題。實務上,我們會使用比使用者當前輸入更多的資訊。先從郵件正文開始吧,如果有時間再擴展上下文範圍。
候選人: 系統應該支援哪些語言? 面試官: 先從英文開始。
候選人: 我們是否需要確保系統沒有偏見(Bias)? 面試官: 這對本系統而言是很重要的需求。系統不應在建議中做出帶有偏見的假設。
候選人: Gmail 有多少活躍使用者?運算成本是否是考量因素? 面試官: Gmail 約有 18 億使用者,單一使用者一天最多可發送 500 封郵件。我們確實關心運算成本,但先專注於開發系統,後續再進行效率優化。
候選人: 系統是否需要即時提供建議? 面試官: 是的。預期延遲應該讓使用者感覺不到,大約 100 毫秒即可。
將問題框架化為機器學習任務#
本節將 Smart Compose 功能定義為機器學習(ML)任務,包含系統的輸入與輸出,以及適當的 ML 方法選擇。
定義系統的輸入與輸出#
- 輸入: 使用者已輸入的文字序列。
- 輸出: 該序列的延續——使用者可能接下來要輸入的文字。
選擇適合的機器學習方法#
Smart Compose 產生文字內容,屬於文字生成(Text Generation)任務。兩種常見的序列資料處理架構為遞迴神經網路(Recurrent Neural Network, RNN) [2] 和 Transformer [3]。
Transformer 相較於 RNN 具有以下優勢:
- 平行處理能力: RNN 中,每個時間步的計算結果需傳遞至下一步,形成時間相依的運算鏈。Transformer 則透過自注意力機制(Self-Attention)同時處理所有輸入 token。
- 更佳的長序列處理能力: Transformer 使用自注意力機制關注序列中任意位置的內容,不受距離限制。相較之下,RNN 因其循序結構及梯度消失問題(Vanishing Gradient Problem),在長距離依賴上表現不佳。
| 特性 | RNN(GRU [4]、LSTM [5]) | Transformer |
|---|---|---|
| 架構 | 簡單 | 複雜 |
| 訓練效率 | 因循序處理而效率低 | 因平行處理而效率高 |
| 效果 | 處理長序列時表現較差 | 處理長序列時表現優異 |
| 可擴展性 | 擴展性有限 | 高度可擴展 |
| 應用場景 | 簡單任務,如時間序列建模 | 複雜任務,如語言補全或翻譯 |
表 1:RNN 與 Transformer 架構比較
基於上述優勢,Transformer 在文字生成任務中展現卓越效能,並廣泛應用於當今大多數生成式系統。因此,我們選擇 Transformer 來建構 Smart Compose 功能。
雖然 Transformer 因無嚴格的循序依賴而更易於平行化,但其自注意力機制的計算複雜度為 $O(n^2)$,其中 $n$ 為序列長度。這是因為每對 token 之間都需計算注意力分數。已有多種技術如 Group Attention [6] 和 Flash Attention [7] 被提出以降低此複雜度。
資料準備#
資料準備階段將原始資料轉換為 ML 模型所需的格式。
可用資料#
訓練可使用兩種資料來源:
- 通用資料(General Data): 來自書籍、網站、社群媒體等公開文字。此資料對訓練語言模型至關重要,因為它包含多樣化的詞彙、語法和上下文。
- 郵件資料(Email Data): 如需求所述,約十億封郵件。此資料對模型學習郵件寫作風格及常用語句至關重要。

| Email ID | Sender | Recipient | Subject | Body |
|---|---|---|---|---|
| 4953 | john@gmail.com | mike@yahoo.com | Catchup? | Hey Mike, let’s catch up this Sat. … |
| 9356 | kkart@gmail.com | cs382@stanford.edu | Project Deadline | Hi TA, I hope you are well. I am writing to you to … |
表 2:郵件資料範例
資料處理流程#
原始文字通常含有雜訊且格式不一致,可能降低模型效能。此外,ML 模型需要數值格式的資料。因此需要兩個關鍵步驟:
- 文字清理與正規化(Text Cleaning and Normalization)
- 文字分詞與 Token 索引化(Text Tokenization and Token Indexing)
文字清理與正規化#
文字清理#
文字清理用於移除不必要或無關的資訊。常見方法包括:
- 移除非英文文字: 使用語言辨識(Language Identification)[8] 方法,如 [9],來辨識並移除非英文文字。
- 移除機密資訊: 郵件可能包含電話號碼、信用卡號等機密資訊。將個人姓名、URL、電子郵件地址和電話號碼替換為佔位符。例如,將 “john@gmail.com” 替換為 “##@gmail.com”。
- 移除無關字元或符號: 移除不具語意的字元與符號,如 “©"、"™” 或表情符號。
- 移除重複資料: 移除來自不同來源但內容完全相同的文字,以防止模型學習時產生偏差。
文字正規化#
文字正規化(Text Normalization)將文字轉換為一致的格式。例如,將不同的電話號碼格式——"(123) 456-7890"、“123.456.7890” 和 “123-456-7890”——統一為標準格式如 “1234567890”。這確保了資料的一致性並降低複雜度。
文字分詞與 Token 索引化#
文字分詞(Tokenization)加上 Token 索引化,將原始文字轉換為一串數字序列——即 Transformer 模型所需的格式。
文字分詞#
文字分詞將文字切分為稱為 token 的更小單位。圖 5 展示了 OpenAI 的 GPT-4 如何對句子 “Let’s go to NYC” 進行分詞。1
分詞可在不同層級進行。一般而言,分詞演算法分為三類:
- 字元層級分詞(Character-level Tokenization)
- 詞語層級分詞(Word-level Tokenization)
- 子詞層級分詞(Subword-level Tokenization)
字元層級分詞#
字元層級分詞將文字拆分為單一字元。實作簡單,但模型難以學到有意義的表示。例如,學習字母 “g” 的有意義表示比學習單詞 “go” 困難得多,因為 “go” 有明確語意而 “g” 沒有。這通常導致效能下降。
詞語層級分詞#
詞語層級分詞將文字拆分為單一詞語。一種簡單的演算法是使用空白字元進行切分。
其優點是模型較容易為每個 token 學習有意義的表示。然而,這通常會導致極大的詞彙表規模。例如,Transformer-XL [10] 使用詞語層級分詞器,詞彙表達到 267,735 個 token。過大的詞彙表會增加模型需學習的表示數量,使訓練耗時且昂貴。
子詞層級分詞#
子詞層級分詞將文字切分為稱為**子詞(Subword)**的更小單位。其核心原則是:常用詞不應被拆分,但罕見詞應被分解為有意義的子詞。例如,“unhappily” 可能被拆分為 “unhappy” 和 “ly”——兩者都更常見,使模型更容易學習有意義的表示。
雖然實作較為複雜,子詞層級分詞提供了以下優勢:
- 產生可控的詞彙表規模,降低學習表示的成本。
- 允許模型透過將未知詞分解為已知子詞來表示它們。
| 特性 | 字元層級 | 詞語層級 | 子詞層級 |
|---|---|---|---|
| 粒度 | 單一字元 | 單一詞語 | 子詞 |
| 詞彙表規模 | 小(約 100) | 大(約 300,000+) | 中等(約 50,000–150,000) |
| 演算法複雜度 | 簡單 | 簡單 | 複雜 |
| 處理未見詞 | 分解為字元 | 難以處理 | 分解為已知子詞 |
| 效能 | 差 | 高但不實用 | 高且實用 |
表 3:不同分詞層級的比較
哪種分詞方式適合 Smart Compose?#
大多數先進語言模型使用子詞層級分詞演算法,如 Byte-Pair Encoding(BPE) [11] 和 SentencePiece [12]。例如,OpenAI 的 GPT-4 使用 BPE 的變體 [13],Google 的 Gemini 使用 SentencePiece [14]。
鑑於其有效性,我們為 Smart Compose 選擇子詞層級分詞,並使用 OpenAI 的 Tiktoken [13] 或 Google 的 SentencePiece [15] 等常見函式庫。
第 3 章將深入探討 BPE 及其演算法。更多子詞層級分詞演算法的資訊,請參閱 [16]。
Token 索引化#
Token 索引化(Token Indexing)將文字 token 轉換為整數數值。
分詞演算法首先從訓練文字資料中建立詞彙表(Vocabulary)——所有唯一 token 的集合——然後儲存於表格中。圖 9 展示了不同分詞層級的詞彙表範例。
詞彙表建立後,任何 token 都可以轉換為數字,反之亦然。圖 10 展示了使用 GPT-4 詞彙表 [17] 進行 Token 索引化的範例。
資料準備總結#
總結如下:
- 清理與正規化文字資料,確保訓練資料品質一致。
- 使用 BPE 等演算法將文字分詞為子詞。
- 將每個 token 替換為其數值索引,完成索引化。
這些步驟確保訓練資料轉換為 ML 模型可使用的數值格式。
模型開發#
Smart Compose 是一個文字生成任務,由 Transformer 模型預測郵件句子的可能補全方式。本節涵蓋 Transformer 架構、訓練策略及取樣方法。
架構#
Transformer 架構由論文 “Attention Is All You Need” [3] 提出,專為處理序列資料而設計,非常適合需要理解文字及詞語間關係的任務。
Transformer 有三種主要變體:
- 僅編碼器(Encoder-only)
- 僅解碼器(Decoder-only)
- 編碼器-解碼器(Encoder-Decoder)
每種變體的架構差異使其適合不同的任務類型。
僅編碼器#
僅編碼器的 Transformer 用於需要理解文本整體語意的任務。它將輸入序列作為整體處理,並對其進行預測(例如情感分析)。
僅編碼器的 Transformer 常用於**句子分類(Sentence Classification)和命名實體識別(Named Entity Recognition)**等任務。Google 的 BERT [18] 是著名的範例。然而,此類模型通常不用於生成新序列。
僅解碼器#
僅解碼器的 Transformer 處理輸入序列並逐步生成新序列。

僅解碼器的 Transformer 廣泛用於生成式任務,模型根據先前產生的 token 逐一生成序列。大多數大型語言模型(LLM)——如 OpenAI 的 GPT-4 [19]、Meta 的 LLaMA [20] 和 Google 的 Gemini [14]——都基於僅解碼器的 Transformer。
編碼器-解碼器#
編碼器-解碼器架構同時使用編碼器和解碼器元件。編碼器處理輸入序列,解碼器利用處理後的資訊產生輸出序列。
此架構特別適合輸出是輸入**轉換(Transformation)**的任務(例如語言翻譯)。第 3 章將深入探討此架構。
哪種 Transformer 變體適合 Smart Compose?#
Smart Compose 是一個文字生成任務,目標是補全部分已撰寫的文字。僅解碼器的 Transformer 因其能根據給定序列生成文字而最為適合。
ML 系統設計面試通常聚焦於高層概念與元件互動,而非架構細節。若需深入了解 Transformer 架構,請參閱 [21] 和 [22]。
僅解碼器的 Transformer 由以下元件組成:
- 文字嵌入(Text Embedding)
- 位置編碼(Positional Encoding)
- Transformer 本體
- 預測頭(Prediction Head)
文字嵌入#
文字嵌入元件將每個 token ID 轉換為一個固定長度的向量,稱為嵌入向量(Embedding)。嵌入向量儲存在表格中(圖 15),並在訓練過程中學習。
文字嵌入至關重要,因為 token ID 有兩個顯著限制:
- 稀疏性(Sparsity): 詞彙表通常包含數萬個 token ID。使用獨熱編碼(One-hot Encoding)表示這些 ID 會產生稀疏的高維資料,效率低下。
- 缺乏語意資訊: Token ID 是任意指定的,無法捕捉詞語間的關係。例如,“happy” 和 “joyful” 語意相近,但它們的 token ID 可能完全不相關。
文字嵌入透過將 token ID 轉換為低維空間中經學習的密集向量來解決上述兩個限制。由於嵌入向量在訓練中學習,它們能捕捉語意——“happy” 和 “joyful” 的嵌入向量會比 “happy” 和 “sad” 更接近。
位置編碼#
Transformer 本身不考慮輸入 token 的順序。注意力公式
am, n=exp(qmknd)j=1Nexp(qmknd),
具有排列不變性(Permutation-Invariant)——注意力機制不考慮 token 的位置。例如,Transformer 無法區分 “initialize the variable, then use it” 和 “use the variable, then initialize it”。
為解決此問題,**位置編碼(Positional Encoding)**為每個 token 提供位置資訊:
pi=f(i),
其中 $f(⋅)$ 為位置編碼函式,$i$ 為 token 的位置。
兩種常見的位置編碼方法:
- 固定位置編碼(Fixed Positional Encoding)
- 可學習位置編碼(Learned Positional Encoding)
固定位置編碼#
此方法使用固定函式將位置(整數)映射為固定大小的向量。原始 Transformer 論文使用不同頻率的正弦-餘弦函式(Sine-Cosine Function)。
優點:
- 高效率: 無額外可訓練參數,計算上更為高效。
- 支援長序列: 能將任意位置映射為表示向量,使模型能處理超出訓練資料範圍的序列。
缺點:
- 預定義限制: 某些固定編碼方法需預定義最大位置,限制了適用性。
- 次優效能: 在某些任務中,可能無法像可學習方法那樣有效地捕捉位置關係。
可學習位置編碼#
此方法的位置表示在訓練過程中學習。初始化一個權重矩陣 $P \in \mathbb{R}^{N \times d}$,其中 $N$ 為最大序列長度,$d$ 為嵌入維度。此矩陣與模型的其他參數一同優化。
優點:
- 最佳效能: 基於訓練資料學習,能為特定任務產生最佳的位置表示。
缺點:
- 效率較低: 額外參數增加了訓練時間和計算成本。
- 泛化能力不足: 可能對訓練中見過的特定序列長度過擬合(Overfitting),影響泛化表現。
選擇可學習或固定位置編碼取決於任務的限制條件,包括序列長度的預期變異性。原始 Transformer 論文因其高效率和更好的泛化能力而採用固定位置編碼。據此,我們為 Smart Compose 採用固定位置編碼(正弦-餘弦編碼)。
Transformer 本體#
Transformer 元件接收一組嵌入向量序列作為輸入,並將其轉換為更新後的嵌入向量序列。
其架構由**堆疊的區塊(Stack of Blocks)**組成,每個區塊包含:
- 多頭注意力(Multi-Head Attention / Self-Attention): 使用注意力機制更新每個嵌入向量,捕捉序列中的關係,使每個嵌入向量能關注其前方的嵌入向量。
- 前饋網路(Feed Forward): 對序列中的每個嵌入向量獨立地套用兩次線性轉換,中間加上 ReLU 激活函數。
Transformer 架構還包含殘差連接(Residual Connection)、層正規化(Layer Normalization)和 Dropout 層。若需深入了解這些元件,請參閱論文 “Attention Is All You Need” [3] 和 [21]。
預測頭#
預測頭(Prediction Head)是僅解碼器 Transformer 的最後一個元件,將 Transformer 的輸出轉換為詞彙表中每個 token 的機率(圖 22)。這些機率用於選擇最可能的下一個 token。
訓練#
訓練過程使用郵件資料調整僅解碼器 Transformer 的參數。然而,直接在特定任務資料集上訓練並非好策略,原因如下:
- 缺乏大規模訓練資料: 特定任務資料集通常規模有限,不利於有效學習。
- 過擬合風險: 模型可能記住訓練資料,無法泛化到未見過的資料。
- 訓練昂貴且耗時: 從零開始訓練大型模型需要大量計算資源和時間。
為解決這些問題,通常採用兩階段訓練策略:先預訓練(Pretraining)再微調(Finetuning)。
- 預訓練: 在大量通用資料上訓練模型,學習語言結構。
- 微調: 將預訓練模型在特定任務資料(如郵件補全)上進行調整。
此策略利用了遷移學習(Transfer Learning)——預訓練中獲得的通用知識轉移至微調階段,使模型不必從零開始。
預訓練#
預訓練資料#
預訓練資料由來自各種網路來源的大量通用文字組成——網頁、書籍和社群媒體。例如,Common Crawl [23] 是一個公開可用的資料集,包含自 2008 年以來爬取網頁所收集的 PB 級資料。
機器學習目標與損失函數#
文字生成最常用的 ML 目標是下一個 Token 預測(Next-Token Prediction):模型根據先前的 token 序列預測下一個 token。例如,在 “I hope you are __” 中,模型應為 “well” 預測出高機率。
下一個 Token 預測非常適合文字生成,因為訓練後模型可以**逐步(Incrementally)**建構句子。給定輸入 “I ordered food because I”,模型可能預測 “was”,然後 “hungry”,持續直到預測出特殊的 “$\langle$EOS$\rangle$” token 表示序列結束。
為了優化正確預測,我們使用交叉熵損失(Cross-Entropy Loss) [24] 作為損失函數(Loss Function)。它衡量預測機率與正確 token 之間的差異,讓優化器能更新模型參數以進行更準確的預測。
實務上,模型會平行處理序列中所有 token 位置的損失計算,以加速訓練。
微調#
微調將預訓練的基礎模型適配至特定任務,如郵件補全。模型保留預訓練中獲得的語言理解能力,但適應任務的細微差異。
微調資料#
約十億封郵件對話的資料集,涵蓋各種郵件格式、正式和非正式語氣,以及郵件特有的詞彙。
機器學習目標與損失函數#
ML 目標(下一個 Token 預測)和損失函數(交叉熵)與預訓練階段相同,唯一差別是損失基於郵件資料計算。
然而,僅以郵件正文作為輸入並不總是有效。例如,當使用者輸入 “Dear” 時,模型理應建議收件人的姓名——但若缺乏該資訊作為輸入,模型無法做出正確預測。
為解決此問題,我們加入額外的上下文:
- 郵件主旨
- 收件人資訊
- 先前的郵件(若有)
組合多種輸入#
在傳統 ML 中,模型架構通常依賴於所處理的資料類型,需要針對不同資料類型進行客製化的前處理和特徵工程。
在 GenAI 時代,模型架構通常與輸入結構解耦,提高了靈活性,使相同架構能透過提示工程(Prompt Engineering) [25] 等技術處理多樣化的輸入。第 6 章將詳細探討提示工程。
對於 Smart Compose,我們使用帶有標籤的**提示模板(Prompt Template)**將多個文字輸入組合為一個序列(圖 31)。模型能處理各種輸入組合——無論完整或部分——因為訓練集包含了這類範例。這種靈活性確保即使輸入不完整,也能產生符合上下文的輸出。

兩階段訓練的優勢#
兩階段訓練策略提供以下優勢:
- 適應性: 相同的基礎模型可適配至不同任務。
- 更好的泛化能力: 在大量多樣化資料上預訓練,使模型獲得廣泛的語言理解能力。
- 快速微調: 預訓練的通用知識加速後續的微調過程。
- 應對資料稀缺: 預訓練知識彌補了特定任務資料的不足。
- 緩解過擬合: 預訓練起到正則化(Regularization)的作用,防止模型在較小資料集上過擬合。
- 資源優化: 計算密集的預訓練僅需執行一次,可跨多個任務重複使用。
取樣#
**取樣(Sampling)**是使用訓練好的生成模型產生新資料的過程。在 Smart Compose 的情境中,取樣指根據使用者的部分輸入,生成可能的郵件補全內容。Token 逐一生成(圖 32)——例如,給定 “Hi Alex, does today”,模型選擇 “work” 作為下一個 token,然後 “for”,持續直到預測出 $\langle$EOS$\rangle$ token。
文字生成有兩種主要策略:
- 確定性方法(Deterministic)
- 隨機性方法(Stochastic)
確定性方法#
確定性方法在生成文字時不引入隨機性。每一步中,模型選擇機率最高的 token。這確保對相同輸入總是產生相同的輸出。
優點:
- 一致性: 相同輸入始終產生相同輸出——適合需要可預測結果的系統。
- 可預測的輸出: 因總是選擇最高機率的 token,產生意外輸出的機率較低。
缺點:
- 缺乏多樣性: 模型可能錯過機率較低但更有趣的 token,降低創造力。
- 重複文字: 總是選擇相同的高機率 token,導致重複的模式(見圖 34)。
隨機取樣#
隨機取樣方法在生成過程中引入隨機性。每一步中,模型根據 token 的機率分佈進行取樣。即使初始輸入相同,生成的文字也可能不同。
優點:
- 多樣性: 隨機性帶來更多樣化的輸出,適用於對話生成等應用。
- 新穎性: 模型可以探索機率較低但可能更有趣的 token。
缺點:
- 不一致性: 每次輸出不同,不適合需要可重複結果的應用。
- 意外輸出: 隨機性可能導致不適當的變異。
哪種生成方法適合 Smart Compose?#
對於 Smart Compose,確定性方法更為合適:
- 一致性: 使用者期望可預測且可靠的郵件建議。
- 更好地處理常用語句: 優先考慮更可能的補全,而非新穎性。
- 降低不當建議的風險: 無隨機性意味著不會產生意外或不當的輸出。
兩種主要的確定性演算法:
- 貪心搜尋(Greedy Search)
- 束搜尋(Beam Search)
貪心搜尋#
貪心搜尋總是選擇機率最高的 token。如圖 34 所示,這可能導致重複模式,因為它沿著狹窄的路徑前進,未考慮可能產生更連貫句子的替代路徑。由於此限制,貪心搜尋在實務中很少使用。
束搜尋#
束搜尋(Beam Search) [26] 同時追蹤多個潛在序列。每一步中,模型為每個序列計算下一個可能 token 的機率,並選擇前 k 個最可能的序列。k 的值稱為束寬(Beam Width)。
逐步流程(假設束寬為 3):
- 初始化: 從使用者的部分郵件開始。模型預測下一個 token 的機率分佈,束搜尋選擇前三個 token。
- 擴展: 對每個前三名序列,傳入模型並取得下一個 token 的機率。
- 剪枝: 根據累積機率選擇前三個序列。
擴展和剪枝重複進行,直到所有序列達到 $\langle$EOS$\rangle$ token 或最大長度。累積機率最高的序列被選為最終輸出。
束搜尋有兩個主要缺點:多樣性有限(輸出傾向相似)和長序列處理困難(追蹤多個序列在計算上代價高昂)。然而,Smart Compose 的建議通常較短,因此長距離依賴不是主要問題。多樣性對於郵件補全也不是必要的。基於這些原因,我們選擇束搜尋作為取樣演算法。
評估#
評估在 ML 系統設計面試中至關重要。理想的回答應涵蓋**線上(Online)和離線(Offline)**評估,並討論常用的評估指標。
離線評估指標#
離線評估使用預先收集的歷史資料,在部署至正式環境前評估模型效能。兩個常用指標為:
- 困惑度(Perplexity)
- ExactMatch@N
困惑度#
困惑度(Perplexity) [27] 是語言模型離線評估的標準指標。它衡量模型預測文字資料中確切 token 序列的準確度。數學上,困惑度是平均負對數似然(Negative Log-Likelihood)的指數:

其中:
- $X$ 是用於評估的分詞序列 $\left(x_1, x_2, \cdots, x_N\right)$。
- $N$ 是序列中的 token 數量。
- $P\left(x_i \mid x_{1: i-1}\right)$ 是在給定前面 token 的條件下,第 $i$ 個 token 的條件機率——即模型根據前面的 token 預測第 $i$ 個 token 的可能性。
越低的困惑度表示模型對正確 token 指派了越高的平均機率,代表模型在預測下一個 token 方面表現越好。
ExactMatch@N#
ExactMatch@N 衡量生成的片語中,恰好為 N 個字且與真實文字(Ground Truth)的前 N 個字完全相符的百分比。
計算不同 N 值的 ExactMatch@N,可以衡量不同建議長度下的效能。若要評估整體效能,可計算到特定值的所有長度的 ExactMatch 並取平均值。
雖然 Perplexity 和 ExactMatch@N 傳統上用於評估 Gmail Smart Compose,但其他指標如 BLEU score 和 ROUGE-N 也被認為有幫助。這些將在第 3 章中更詳細地探討。
線上評估指標#
線上評估衡量模型在使用者即時互動中的表現。除了 Perplexity 和 ExactMatch@N 之外,線上指標還衡量使用者參與度、延遲和整體使用者體驗。
使用者參與度指標#
- 接受率(Acceptance Rate): 使用者接受建議的百分比。較高的接受率表示建議具有相關性和實用性。
- 使用率(Usage Rate): 使用 Smart Compose 撰寫的郵件百分比。高使用率代表使用者信任。
效果指標#
- 平均撰寫時間: 使用和未使用 Smart Compose 時的平均郵件撰寫時間。時間減少表示此功能加速了郵件撰寫。
延遲指標#
- 系統回應時間: 使用者開始輸入後建議出現的時間。必須低於閾值,使建議在使用者輸入前即出現。
品質指標#
- 回饋率(Feedback Rate): 使用者對建議提供回饋的比率,有助於持續改進。
- 人工評估(Human Evaluation): 透過使用者研究進行的定性評估,衡量實用性和使用者滿意度。
這些線上指標提供了 Smart Compose 在正式環境中效能的全面視角。
整體 ML 系統設計#
設計 Smart Compose 功能時,不僅需考慮底層模型,系統的有效性取決於各元件的協同運作。關鍵元件包括:
- 觸發服務(Triggering Service)
- 片語產生器(Phrase Generator)
- 後處理服務(Post-processing Service)
觸發服務#
觸發服務透過監控使用者活動(如按鍵)來啟動 Smart Compose。它根據已輸入的字元數或特定關鍵字等條件決定何時啟動。例如:
- 若使用者輸入 “I”,服務可能不會啟動——因為太早而無法預測意圖。
- 若使用者輸入 “I hope”,服務會啟動,因為額外的上下文足以產生有用的建議。
觸發服務確保建議不會過於頻繁。一旦判定啟動有意義,便會觸發片語產生器。
片語產生器#
片語產生器是 Smart Compose 的核心。它根據使用者已輸入的部分文字,產生最可能的補全內容。
片語產生器使用**束搜尋(Beam Search)**生成前 k 個最可能的補全。每個補全以 $\langle$EOS$\rangle$ token 結尾,並附帶一個信心分數。

接下來套用兩個關鍵的篩選步驟:
移除過長的建議#
較短的建議更容易讓使用者在輸入時閱讀。過長的建議往往過於具體,且不太可能符合使用者的意圖。
移除低信心分數的建議#
信心分數低於特定閾值的建議會被移除,以確保只呈現高信心的建議。
若最終清單不為空,片語產生器會將信心分數最高的建議傳遞至後處理服務。
後處理服務#
後處理服務在建議呈現給使用者之前,處理潛在偏見。它遵循預定義的規則來偵測和修正偏見:
- 代名詞替換: 在未指定性別的上下文中,將特定性別的代名詞替換為中性替代詞(例如 “he”/“she” 改為 “they”)。
- 性別中立詞彙替換: 將帶有性別色彩的詞彙替換為中性替代詞(例如 “chairman” 改為 “chairperson”、“policeman” 改為 “police officer”)。
- 敏感詞彙詞法分析: 使用預定義的標記詞彙清單——包含暗示年齡、種族或殘疾偏見的詞彙——並替換為中性替代詞。
- NSFW 內容過濾: 自動化過濾器使用預定義的 NSFW 關鍵字、片語和模式來掃描和標記不當語言。
透過實施這些規則,後處理服務確保建議具有相關性、尊重性和包容性。
系統工作流程#
Smart Compose 功能的端到端工作流程:
- 監控: 觸發服務在使用者輸入時監控其活動。
- 觸發: 服務在識別到特定模式後觸發片語產生器。
- 束搜尋: 片語產生器使用束搜尋從訓練好的模型中取得前 k 個潛在補全。
- 篩選: 片語產生器移除過長的建議和低信心分數的建議。
- 後處理: 將最高分的補全傳遞至後處理服務,替換特定性別的代名詞並調整敏感詞彙。
- 顯示建議: 將建議顯示給使用者。
其他討論主題#
若面試尾聲仍有時間,可能會面臨進階主題的追問。資深職位應準備以下議題:
- 支援 Smart Compose 的多語言功能 [28]。
- 個人化建議 [28]。
- 加入額外上下文以提升預測效果 [28]。
- 了解不同分詞演算法的運作方式:BPE [11]、SentencePiece [12] 和 WordPiece [29]。
- 了解不同的 ML 目標,如**遮罩語言模型(Masked Language Modeling, MLM)**及其變體 [18]。
- **多 Token 預測(Multi-Token Prediction)**目標及其優缺點 [30]。
- 平衡品質與推論延遲 [28]。
總結#
