Writing
用 Semantic Entropy 降低長文翻譯中的名詞飄移
AI,LLM,Translation · 2025-11-25 · Updated 2026-04-26
長文翻譯裡,有一個很常見但很煩的問題:名詞會飄。
同一個專有名詞,在第一章被翻成一種說法,到了後面又變成另一種。技術文件、小說、產品文檔都會遇到。文本越長,這件事越明顯。
這不一定是模型「不懂」。更多時候,是上下文太長、採樣有隨機性、前後語境又在變。模型每次都能給出看似合理的翻譯,但合理不等於一致。
我想整理的是一個比較白盒的解法:用 Semantic Entropy(語義熵)先找出容易飄的名詞,再把它們變成一份局部名詞表,最後交給翻譯模型強制套用。
問題不只是翻得好不好
傳統翻譯流程常常把重點放在「哪個譯法更好」。但在長文翻譯裡,另一個問題同樣重要:
哪些名詞本身是不穩定的?
如果一個名詞每次都被模型翻成差不多的語義,它就不需要太多干預。反過來,如果同一段文本跑多次翻譯後,某些名詞出現多種譯法,那些名詞才是真正需要被固定下來的地方。
Semantic Entropy 的價值就在這裡。它不是直接替你選最佳翻譯,而是幫你看到模型的不確定性輪廓。
語義熵在這裡怎麼用
直覺上,可以這樣理解:
- 多次輸出語義接近,熵低,代表穩定。
- 多次輸出分散,熵高,代表不穩定。
- 在翻譯任務裡,高熵名詞通常就是名詞飄移的來源。
所以流程的第一步不是建立一份巨大 glossary,也不是一次就要求模型翻到最好。
第一步是重複採樣。
對同一段原文,讓模型產生多個翻譯版本。數量不需要很誇張,通常 5 份可以看到問題,7 到 10 份性價比比較好,14 份會更穩但成本也更高。
輸出可以保持成簡單的 JSON:
[
{ "version": 1, "translation": "..." },
{ "version": 2, "translation": "..." },
{ "version": 3, "translation": "..." }
]抽取名詞,而不是處理整段翻譯
接著,從每個版本裡抽取名詞。
這一步可以用傳統 NLP,也可以用比較小的 LLM。重點不是要讓它理解整篇文章,而是把可能需要穩定的項目抓出來。
常見類別包括:
- 專有名詞
- 技術術語
- 人名、地名
- 產品名
- 品牌名
- 小說或世界觀裡的特定物件
抽取結果可以長這樣:
{
"proper_nouns": ["EUV Lithography", "ASML"],
"terms": ["光阻劑", "曝光"],
"characters": ["John"]
}這一步完成後,我們得到的不是最終譯文,而是一批名詞候選。
聚類,找出真正會飄的名詞
有了多個翻譯版本和名詞候選後,就可以做聚類。
做法不複雜:
- 把名詞或名詞短語轉成 embedding。
- 用 cosine similarity 計算距離。
- 用一個 threshold 把語義接近的譯法合成同一群。
如果同一個原始名詞在多次翻譯裡只形成一個 cluster,代表它很穩。反過來,如果它分裂成多個 cluster,就代表模型對它的處理不一致。
這時候就可以計算一個工程上可用的語義熵分數。
熵 = cluster 數量 × cluster 內部詞彙差異度 × 出現頻率差異也可以先用更簡化的版本:
H(term) = (#clusters - 1) + variance(embedding) + frequency_divergence公式不需要一開始就非常學術化。真正重要的是,它要能把「穩定名詞」和「不穩定名詞」分開。
名詞穩定表
高熵名詞會進入一份名詞穩定表。
{
"EUV Lithography": "EUV 曝光機",
"ASML": "ASML",
"光阻": "光阻劑",
"mask": "光罩"
}這份表不是普通的人工 glossary。它的來源是模型多次翻譯後暴露出來的不穩定點。
最後翻譯時,只需要把這份表放進 prompt 裡,要求模型固定使用:
請強制使用以下名詞對照表中的翻譯,不得依情境變更。這樣一來,模型仍然負責翻譯句子,但名詞的一致性由外部表約束。
真正關鍵的是局部名詞表
這個方案裡,我覺得最重要的部分不是「名詞表」本身,而是名詞表的使用方式。
大型名詞庫不應該每次都完整塞進 prompt。
如果一份全域名詞庫有幾千、幾萬個詞,直接放進上下文,只會增加 prompt 壓力。模型需要在大量無關詞裡找真正相關的幾個詞,反而更容易稀釋注意力。
更合理的方式是:
- 先掃描當前段落。
- 找出這一段可能出現的名詞。
- 從全域名詞庫裡取出局部子集。
- 只把這個小名詞表注入當前翻譯 prompt。
也就是說,名詞記憶不應該是全域灌入,而應該是段落局部動態注入。
這會讓 prompt 更短,也讓模型更容易遵守約束。
和傳統 glossary 的差別
傳統 glossary 的問題是,它通常依賴人工維護。你需要先知道哪些詞重要,再提前寫進表裡。
這套方法多了一層偵測:它先用多次採樣找出模型自己不穩定的地方,再決定哪些詞需要進表。
所以它更像是一個翻譯前的風險掃描流程。
它不保證譯文一定更優美。但它可以讓名詞一致性變得可觀察、可調試、可約束。
本地模型也能跑
這套流程不一定需要非常大的雲端模型。
一個比較現實的配置是:
- 名詞抽取:7B 級模型或傳統 NLP。
- 多次採樣與熵偵測:14B 級模型。
- 最終翻譯:14B 或 32B 模型。
因為這不是訓練任務,而是 pipeline orchestration。成本主要來自多次推理,而不是模型訓練。
對本地翻譯工具來說,這個方向挺有吸引力。它不要求模型一次性記住整個語域,而是把名詞記憶拆出來,變成外部可控的結構。
小結
Semantic Entropy 在這裡的作用,不是替代翻譯模型。
它更像是一個檢測器:先找出哪些名詞容易飄,再把這些高風險名詞轉成穩定表,最後用局部名詞表約束翻譯模型。
整個流程可以概括成:
- 同段落多次翻譯。
- 抽取名詞。
- 聚類譯法。
- 計算語義熵。
- 生成名詞穩定表。
- 翻譯時動態注入局部名詞表。
它解決的不是「讓模型變聰明」的問題,而是把長文翻譯裡最容易失控的一部分,拆出來做成可觀察、可控制的工程流程。