LLaMA.cpp HTTP 服務參數: --pooling 嵌入模型 池化類型詳解
--pooling {none,mean,cls,last,rank}
在 llama.cpp 的 embedding server 中,--pooling {none,mean,cls,last,rank}
參數用于指定 如何將輸入文本的 token 級嵌入向量聚合為句向量。以下是各選項的詳細解釋和適用場景:
1. none
(無池化)
- 行為:返回所有 token 的原始嵌入向量(形狀為
[num_tokens, dim]
)。 - 適用場景:
- 需要逐 token 分析(如命名實體識別、詞義消歧)。
- 自定義池化邏輯(例如對特定 token 做特殊處理)。
- 示例:
# 輸入: "The capital of China is Beijing." # 輸出: [token0_emb(1024), token1_emb(1024), ..., tokenN_emb(1024)]
2. mean
(平均池化)
- 行為:對所有 token 的嵌入向量取平均,生成一個固定長度的句向量(形狀為
[dim]
)。 - 優點:簡單且對句子長度不敏感。
- 缺點:可能丟失局部語義信息(如關鍵 token 的貢獻被稀釋)。
- 適用場景:
- 通用句子表示(如文本分類、聚類)。
- 對計算資源敏感的場景(因計算量小)。
- 公式:
sentence_emb=1N∑i=1Ntoken_embi \text{sentence\_emb} = \frac{1}{N} \sum_{i=1}^{N} \text{token\_emb}_i sentence_emb=N1?i=1∑N?token_embi?
3. cls
([CLS] 標記池化)
- 行為:使用分類 token(
[CLS]
)的嵌入作為句子表示(形狀為[dim]
)。 - 前提:模型必須經過
[CLS]
相關的訓練(如 BERT 系列模型)。 - 優點:適合分類任務(如情感分析、意圖識別)。
- 缺點:依賴
[CLS]
token 的訓練質量,可能不適用于非 BERT 類模型。 - 適用場景:
- 基于 BERT 的下游任務(如 GLUE 基準任務)。
- 需要與 BERT 的原始設計保持一致。
4. last
(最后一個 token 池化)
- 行為:使用最后一個 token 的嵌入作為句子表示(形狀為
[dim]
)。 - 原理:假設最后一個 token 包含了前面所有 token 的累積信息(適用于因果語言模型,如 GPT 系列)。
- 優點:簡單且符合因果語言模型的設計邏輯。
- 缺點:可能忽略前面 token 的語義(尤其是長文本)。
- 適用場景:
- 因果語言模型(如 LLaMA)的默認池化方式。
- 生成任務(如摘要、問答)。
5. rank
(排序池化)
- 行為:根據某種排序規則選擇 token(如注意力權重、重要性評分),然后聚合(如加權平均)。
- 實現:具體邏輯依賴模型和代碼實現(可能涉及注意力頭、重要性評分等)。
- 優點:保留關鍵 token 的語義信息。
- 缺點:計算復雜度高,且依賴排序策略的設計。
- 適用場景:
- 需要強調關鍵 token 的任務(如關鍵詞提取、長文本摘要)。
- 對精度要求較高且資源充足的場景。
如何選擇池化方式?
池化方式 | 適用模型 | 典型任務 | 推薦場景 |
---|---|---|---|
none | 所有模型 | 詞級分析 | 需要 token 級輸出 |
mean | 所有模型 | 分類、聚類 | 通用句向量 |
cls | BERT 類模型 | 分類、問答 | 基于 [CLS] 的任務 |
last | 因果語言模型(如 LLaMA) | 生成、檢索 | 簡單句向量 |
rank | 特定模型(如 DPR) | 關鍵詞提取 | 復雜語義聚合 |
示例對比(以 Qwen3-Embedding 為例)
-
none
:# 輸出形狀: [7, 1024](假設輸入有7個token) [[token0_emb], [token1_emb], ..., [token6_emb]]
-
mean
:# 輸出形狀: [1024] mean([token0_emb, ..., token6_emb])
-
last
:# 輸出形狀: [1024] token6_emb # 最后一個token的向量
注意事項
-
模型適配性:
[CLS]
池化僅適用于明確訓練過[CLS]
的模型(如 BERT)。- 因果語言模型(如 LLaMA)更適合
last
或mean
。
-
性能與精度:
none
會占用更多內存和帶寬,但保留完整信息。mean
和last
是輕量級方案,適合資源受限場景。
-
實驗驗證:
- 如果不確定選擇哪種池化方式,可以通過以下方法驗證:
- 在驗證集上測試不同池化方式的效果。
- 使用 t-SNE 可視化不同池化后的向量分布。
- 如果不確定選擇哪種池化方式,可以通過以下方法驗證:
總結
- 通用推薦:若無特殊需求,
mean
或last
是安全的選擇。 - 分類任務:優先嘗試
cls
(需模型支持)。 - 自定義需求:選擇
none
后自行設計池化邏輯。