今天,我們在 Hugging Face 上發布了兩款新的編碼器模型:LFM2.5-Encoder-230M 和 LFM2.5-Encoder-350M。它們在輸入變長時仍能保持快速,同時達到大型模型的品質。

這意味著您可以在現有的硬體上,甚至在 CPU 上執行文件級別的任務。這些模型體積雖小但效能強大,在 GLUE、SuperGLUE 和多語言任務上能與更大的編碼器模型匹敵甚至超越。

它們支援 8,192 個 token 的上下文,且延遲隨輸入長度增加而緩慢增長。在 CPU 上,處理長上下文的速度比 ModernBERT-base 快約 3.7 倍。

有了這些模型,您可以建構意圖路由、政策檢查器、個人資訊偵測器和文字分類器,這些應用程式可以全天候低成本運行。請參閱下方的即時示範。

**我們為何建構通用型編碼器**

上個月,我們發布了專為多語言搜尋而設計的 LFM2.5-Retrievers。LFM2.5-Encoders 來自同一系列,但用途更廣泛。它們透過遮蔽語言目標進行預訓練,因此您可以將其微調用於分類、詞元級任務和搜尋。

搜尋只是編碼器所能實現的其中一項功能。這就是為什麼我們建構了一個通用型模型,而不是重複使用 retrievers。

編碼器為許多現代生產級 NLP 應用程式提供支援,例如分類器、意圖路由和安全過濾器。這些任務通常全天候在 CPU 上運行,處理的輸入也越來越長。

BERT 確立了這類模型,而最近的 ModernBERT 進一步提升了其準確性、速度和上下文處理能力。LFM2.5-Encoders 則在 LFM2 架構上邁出了下一步,其成本隨輸入增長而緩慢增加。

**編碼器如何建構**

我們從各自的 LFM2 解碼器骨幹(LFM2.5-230M 和 LFM2.5-350M)初始化這些編碼器。然後,我們透過一些修改將每個因果解碼器轉換為雙向編碼器。

這些修改包括雙向注意力遮罩,讓每個詞元都能看到其兩側的詞元;非因果短卷積,我們對其進行對稱填充,使每個詞元的卷積都能混合其兩側的鄰居;以及在訓練期間遮蔽 30% 詞元的遮蔽語言模型。

我們分兩個階段訓練這兩個模型:首先是通用語言能力,在大型網路語料庫上以 1,024 個 token 的短上下文進行遮蔽語言目標訓練;接著是長上下文適應,將上下文擴展到 8,192 個 token,並在完整的資料混合上強化事實、法律和多語言能力。

**基準測試結果**

我們在每個任務上對每個模型進行了完整微調,並報告了最終分數。這涵蓋了來自 GLUE、SuperGLUE 和多語言分類的 17 個任務上的 14 個模型。

我們報告了五個保留種子的平均值,因此這些數字在不同運行之間是穩定的。完整的框架和原始結果均已開源。

LFM2.5-Encoder-350M 在 14 個模型中排名第四。排在其前面的三個模型都更大,其中一個 3.5B 模型幾乎是其尺寸的 10 倍。LFM2.5-Encoder-230M 擊敗了 ModernBERT-base 和所有 EuroBERT 模型,儘管它比其中大多數模型都小。兩者在這裡的得分也遠高於我們自己的 LFM2.5-Retrievers。

**CPU 和 GPU 上的推理速度**

我們的編碼器繼承了 LFM2 骨幹的快速推理能力。由於我們的編碼器和 ModernBERT 都支援 8,192 個 token 的上下文,我們測量了整個範圍內的速度。

我們的編碼器在 CPU 上展現出最大的優勢。在這裡,LFM2.5-Encoder-230M 在所有序列長度下都是最快的(即使對於短輸入,也比更小的 ModernBERT-base 快)。隨著輸入長度的增加,ModernBERT 的吞吐量急劇下降,而我們的 LFM2.5-Encoders 則在中等範圍內上升,然後逐漸趨緩。

在 8,192 個 token 時,ModernBERT-base 每次前向傳播需要超過一分半鐘,而 LFM2.5-Encoder-230M 約為 28 秒,速度快約 3.7 倍。對於開發人員來說,這意味著您可以在筆記型電腦的 CPU 上,在 30 秒內掃描或分類一份完整的合約、文字記錄或冗長的支援對話。

在 GPU 上,類似的模式也存在,但差距較小:在 Apple GPU 上,ModernBERT-base 在約 1K token 以下領先。我們的編碼器從約 2K token 開始領先。這表明對於長輸入,LFM2.5-Encoders 是更快的選擇,如果您在 CPU 上運行,其優勢將更為顯著。

**LFM2.5-Encoder 示範**

我們使用微調後的 LFM2.5-Encoders 建構了以下示範。每個示範都在僅限 CPU 的 Hugging Face Space 中運行。

這些示範包括零樣本提示詞路由,您可以將自己的路由通道定義為自由文本,模型會一次性評分整個提示詞與每個通道;零樣本政策檢查,檢查文本是否符合您公司以自由文本編寫的規則,模型會一次性評分每個詞元與每條規則;拼字檢查,逐詞元糾正拼寫錯誤;個人資訊偵測,偵測並移除 16 種語言中 40 種個人資訊;以及遮蔽擴散文字生成(額外功能),將編碼器作為聊天機器人運行,透過迭代解除遮蔽而不是從左到右生成文本。

**如何使用和微調 LFM2.5-Encoders**

當您有高頻率的理解任務,例如分類、路由、提取或評分,且需要持續運行並保持低成本和快速時,請選擇 LFM2.5-Encoder。對於這類任務,微調後的編碼器比生成式大型語言模型更小、更快、運行成本更低,並且適用於您現有的 CPU。

在兩種編碼器尺寸之間:LFM2.5-Encoder-350M 適用於準確性最重要時;LFM2.5-Encoder-230M 適用於硬體限制較嚴格或需要更高吞吐量時。

您可以透過幾行程式碼開始使用。使用 transformers 函式庫載入模型,然後直接運行它進行遮蔽詞元預測,或者連接您自己的頭部並針對您的任務進行微調。

**載入並運行模型**

安裝最新版本的 transformers:

pip install -U transformers

運行遮蔽詞元預測:

from transformers import AutoModelForMaskedLM, AutoTokenizer

import torch

model_id = "LiquidAI/LFM2.5-Encoder-230M" # or "LiquidAI/LFM2.5-Encoder-350M"

tok = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)

mlm = AutoModelForMaskedLM.from_pretrained(model_id, trust_remote_code=True)

text = f"The capital of France is {tok.mask_token}."

enc = tok(text, return_tensors="pt")

with torch.no_grad():

logits = mlm(**enc).logits

pos = (enc["input_ids"][0] == tok.mask_token_id).nonzero()[0].item()

print([tok.decode([t]).strip() for t in logits[0, pos].topk(5).indices.tolist()])

# -> ['Paris', 'Strasbourg', 'Paris', 'Lyon', 'Versailles']

對於下游任務,載入編碼器主體並連接您自己的頭部(分類、詞元分類、迴歸、檢索):

from transformers import AutoModel

body = AutoModel.from_pretrained(model_id, trust_remote_code=True)

如果您的 GPU 支援,請使用 Flash Attention 2 以獲得最高效率:

pip install flash-attn

**針對您的任務進行微調**

基礎編碼器提供通用表示,而非任務輸出。因此,您需要針對每個任務進行微調。我們的微調教學將引導您如何在具有 8k 上下文的長篇法律文件上進行微調。

**開始使用 LFM2.5-Encoders**

這兩款編碼器均已開源,並可在 Hugging Face 上取得。您可以下載 LFM2.5-Encoder-230M 和 LFM2.5-Encoder-350M,在瀏覽器中試用上述示範,無需設定,或透過我們的微調教學將編碼器應用於您的任務。

我們期待看到您將建構出什麼樣的應用。