一瓶香水裡有上百種分子,AI 怎麼把它們一個個挑出來
GC-MS 香精反卷演算法,從原理到落地
一、問題的起點
你拿到一瓶別人家的香精,聞起來很好。客戶問:「這個能不能照著做一瓶?」
傳統的做法是:送去做一次 GC-MS 檢測,拿回一張報告,然後請一位經驗豐富的調香師,對著那張報告坐 3 到 7 天,反推出一份可以打樣的配方表。
這位調香師做的事情,業內叫「反卷」。意思是:把光譜反推回配方。
3 到 7 天,是行業的下限。一份典型的複合香精裡可能有 80 到 150 種化合物,其中混著十幾種精油、幾十種合成單體、幾種載體溶劑。同一種分子,可能既來自薰衣草精油裡的「芳樟醇」,也可能是單獨加進去的「純芳樟醇單體」。調香師要憑經驗判斷:這個數字屬於誰。
可不可以讓演算法把這一步做了?
可以。但不是你想的那種「AI」。
二、GC-MS 不是答案,是被撕碎的答案紙
先講清楚 GC-MS 是什麼。
Gas Chromatography–Mass Spectrometry,氣相層析-質譜聯用。把香精樣品打進去,儀器會把它分離成幾十到上百個層析峰,每個峰對應一種分子,輸出大致是這樣的一張 Excel:
| 序號 | 保留時間 | CAS 號 | 化合物名 | 面積% |
|---|---|---|---|---|
| 1 | 4.32 | 78-70-6 | 芳樟醇 | 8.68 |
| 2 | 5.11 | 115-95-7 | 乙酸芳樟酯 | 3.60 |
| 3 | 6.89 | 105-37-3 | 丙酸乙酯 | 2.10 |
| ... | ... | ... | ... | ... |
| 126 | 22.41 | unknow | — | 0.22 |
一份烏木沉香類的複合香精,跑出來 126 行。
注意一個關鍵事實:GC-MS 給的是「分子層面的清單」,不是「原料層面的配方」。
調香師真正需要的是這種東西:
異構十二烷 80.46% ← 載體
芳樟醇 8.80% ← 純單體
乙酸芳樟酯 3.60% ← 純單體
二丙二醇甲醚 2.60% ← 溶劑
龍涎酮 1.55%
佳樂麝香 0.92%
... 共 24 行原料 ...
藿香油 0.10% ← 唯一精油
這才是藥劑師能拿著去稱量配料的「配方表」。它的顆粒度是原料,不是分子。
GC-MS 是把答案紙撕成了 126 片碎紙。反卷演算法做的事,就是把這 126 片紙重新拼回成 24 行原料的原稿。
圖 1 · GC-MS 給的是「分子清單」,調香師要的是「原料配方」——反卷演算法做的就是把左邊變成右邊
三、反卷不等於訓練,更不是大模型
很多人第一反應是:「丟給 GPT 不就行了?」
不行。原因有三個,越往後越重要:
① 大語言模型從來沒「聞」過香精,它讀過的只是文字。 哪怕你把全網調香部落格都餵給它,它也只是知道「芳樟醇有薰衣草感」這種詞面知識,不知道「一份檸檬油會帶進來 8% 的檸檬烯」這種定量結構。
② GC-MS 的反推是一個有數學結構的逆問題,不是模式識別。 它本質上是在解一組線性方程——「已知 126 個化合物的實測百分比,求 30 種候選原料各放了多少。」這種問題有 50 年的統計學積累,傳統方法乾淨利索。深度學習反而需要「配方→GC-MS」的成對資料來訓練,而行業裡那種資料正是最不可能公開的——配方本身就是命脈。
③ 大模型會「編」。 它可能告訴你這瓶裡有 5.2% 的橙花叔醇,但 GC-MS 報告裡壓根沒這一行。在調香這種 ±1% 都要重打樣的場景,編一次就報廢一批料。
| 方式 | 適合的問題 | 這個場景適合嗎 |
|---|---|---|
| 訓練一個 LLM | 教 AI 理解語言 | 不適合,也輪不到你 |
| 微調一個 LLM | 讓 AI 學某種語氣 | 不適合,問題不是語言問題 |
| Prompt 大模型 | 開放式生成 | 不適合,會編 |
| 傳統數值演算法 | 有方程結構的逆問題 | 正解 |
反卷演算法走的是第四條路。它不「聰明」,但它「誠實」——解不出來的部分會留空,絕不編。
四、完整管道:從光譜到配方
整個反卷流水線分五個階段:
| 階段 | 輸入 | 輸出 | 關鍵技術 |
|---|---|---|---|
| 1. 解析 | GC-MS Excel | 化合物清單 | 多格式 xlsx 解析 |
| 2. 分類 | 化合物清單 | 標註:精油 / 合成 / 溶劑 / 未知 | CAS 字典 + 名匹配 |
| 3. 歸一 | 標註後的清單 | 去溶劑、按 100% 歸一 | 配方學慣例 |
| 4. 反推 | 歸一後的化合物 | 候選原料 + 用量 | 本文重點 |
| 5. 出表 | 候選原料 + 用量 | 調香師配料表 | Excel 範本 |
前三步是工程苦活,沒什麼可講的。真正有意思的是第 4 步——「反推」。
第 4 步又分兩層:
- 簡單層:識別「這瓶裡用了哪幾種精油」。演算法叫錨定法。
- 困難層:把同一個分子的實測量,拆成「X% 來自精油 A、Y% 來自精油 B、Z% 是單獨加的純單體」。演算法叫 NNLS + LASSO。
下面挨個講。
圖 2 · 五階段反卷流水線 —— 前三步是工程苦活,第④步「反推」才是演算法本體
五、第一步 · 錨定法:先找指紋
每一種精油都有自己的「指紋分子」。
| 精油 | 錨定分子 | 在該精油裡的典型佔比 |
|---|---|---|
| 薰衣草油 | 芳樟醇 | ~35% |
| 廣藿香油 | 廣藿香醇 | ~30% |
| 柏木油 | α-雪松烯 | ~25% |
| 橙葉油 | 乙酸芳樟酯 | ~50% |
| 黑胡椒油 | β-石竹烯 | ~22% |
錨定法的思路很樸素:反著算回去。
舉個例子。GC-MS 報告裡測到廣藿香醇 2.72%。這個分子幾乎只在廣藿香油裡出現,典型佔比 30%。
那麼:
配方裡廣藿香油的用量 ≈ 2.72% ÷ 30% ≈ 9.07%
再去驗證:廣藿香油裡另外幾個特徵分子(α-廣藿香烯、α-愈創木烯…)的實測量是不是也對得上 9.07% 的帶入比例?如果對得上,HIGH 置信;只對一半,MEDIUM;完全不對,要麼用量算錯了,要麼根本不是這種精油。
這一步能解決香精分析裡大約 80% 的問題。你能識別出「這裡有 9% 的廣藿香油、6% 的柏木油、0.1% 的藿香油」,調香師就能直接開始打樣了。
圖 3 · 錨定法:實測廣藿香醇 2.72% ÷ 典型佔比 30% ≈ 推出廣藿香油用量 9.07%
但錨定法有個漏洞——它分不清「精油帶進來的分子」和「單獨加的純單體」。
六、第二步 · 雙信號合驗:讓冒牌精油現形
回到開頭那瓶 8 號樣品。
調香師私下告訴我們:「這裡面沒有橙葉油。」
但演算法識別出來 7.54% 的橙葉油。為什麼?
橙葉油的主要成分是芳樟醇 + 乙酸芳樟酯。演算法看見這瓶裡芳樟醇 8.8%、乙酸芳樟酯 3.6%,反推回去就得出「7.54% 橙葉油」。
可真相是:芳樟醇和乙酸芳樟酯都是單獨加的純單體——便宜、純、量大。演算法把它們誤認成是「橙葉油帶進來的」。
這就是假陽性。在調香場景裡,假陽性比漏檢還危險——你按著假配方打樣,錢白花了。
解法是加一道「雙信號合驗」:
信號 ①:錨定主導性。
一種真精油裡,它的錨定分子應該是佔比最高的。橙葉油裡,乙酸芳樟酯(錨定)佔 50%,芳樟醇佔 30%,比例是 50:30。但 8 號樣品裡實測的乙酸芳樟酯 3.6%,芳樟醇 8.8%,比例倒掛了——芳樟醇比錨定還多。這種倒掛只能說明:芳樟醇是外加的,不是橙葉油帶進來的。 直接否決。
信號 ②:加權失敗率。
如果識別出一瓶 9% 的某精油,那這種精油裡所有特徵分子的實測量都應該「配得上 9% 的帶入」。把所有特徵分子的預期和實測一一對照,按 typical 佔比加權算出「失敗率」。失敗率超過 70%,否決;50%–70%,置信度降一檔。
加上這兩道關,演算法終於不會再被純單體騙。8 號樣品的橙葉油假陽性被乾淨否決了,剩下的真精油保留。
這一步看起來不起眼,但它是把這個系統從「能跑出報告」推到「能給客戶交付」的關鍵一步。真正的護城河,往往不是主演算法,而是「主演算法的邊界檢測」。
圖 4 · 雙信號合驗把橙葉油假陽性攔下 —— 信號①錨定比例倒掛 + 信號②加權失敗率超閾值
七、第三步 · 1974 年的禮物:NNLS
上面兩步處理的還是「哪種精油用了多少」。
現在到最難的問題:同一個分子,怎麼知道是哪些原料一起貢獻的?
舉個例子。這瓶香精裡測到芳樟醇 8.8%。它可能來自:
- 0.5% 來自薰衣草油(帶進 0.18%)
- 0.3% 來自橙花油(帶進 0.05%)
- 8.57% 來自單獨加的純芳樟醇單體
也可能是:
- 0% 精油帶入
- 8.8% 全是純單體
這就是經典的逆問題:已知「混合後的樣子」,求「每種原料各放了多少」。
寫成方程:
b = A · x
- b 是 GC-MS 實測向量(126 個數字,每個化合物的面積%)
- A 是「原料-化合物」貢獻矩陣(每列是一種原料的化學指紋)
- x 是要求解的「每種原料的用量」
如果 A 是方陣且可逆,一行線性代數就解出來了。問題是:
- A 是個長方形矩陣(126 個化合物 × ~30 種候選原料),無法直接求逆。
- x 必須非負(用量不能是負數,這是物理常識)。
- 測量本身有誤差,b 不完美。
1974 年,兩位數學家 Charles Lawson 和 Richard Hanson 在他們的書 Solving Least Squares Problems 裡寫下了一個演算法,專門解這種「帶非負約束的最小二乘問題」,叫 NNLS(Non-Negative Least Squares)。
演算法本身只有幾十行程式碼,但它有兩個動人之處:
第一,它有「精確解」保證。 不是神經網路那種「訓練到差不多收斂」,而是真正的、有數學證明的、有限步收斂到最優解。
第二,它穿越了半個世紀。 從 1974 年發明到今天,從化學計量學到光譜反卷、醫學成像、地震學、天文學——所有「已知觀測、求源頭比例、且比例不能為負」的問題,背後都是它。
你今天用 Python 寫 scipy.optimize.nnls(A, b),調的就是 Lawson-Hanson 1974。
香精反卷拿來就用。它不屬於哪個程式設計師,它屬於半個世紀的統計學積累。
八、第四步 · 1996 年的革命:LASSO
NNLS 解決了「非負」,但還有一個問題沒解決:稀疏性。
現實裡,一瓶香精最多用 20–30 種原料。但候選庫裡有上千種原料。
如果直接跑 NNLS,它會傾向於把用量「均勻攤開」——給每種原料分一點點。最後給你的答案可能是 800 種原料各佔 0.1%。理論上殘差最小,實際上不可用。
1996 年,史丹佛統計學家 Robert Tibshirani 在那篇至今被引用近 10 萬次的論文 Regression Shrinkage and Selection via the Lasso 裡給出了優雅的解法。
LASSO 全名 Least Absolute Shrinkage and Selection Operator。它在最小二乘的目標函數裡加了一個 L1 懲罰項:
minimize ‖Ax - b‖² + λ · ‖x‖₁
後面那項 ‖x‖₁ 是所有 x 分量絕對值之和。係數 λ 越大,懲罰越狠,被壓成 0 的變數越多。
LASSO 的神奇之處是:它會自動把絕大多數變數精確壓成 0,只留下少數真正「有貢獻」的。
這正是我們要的。
| 演算法 | 解決的問題 | 香精反卷裡的角色 |
|---|---|---|
| NNLS(1974) | 用量不能是負數 | 物理約束 |
| LASSO(1996) | 只能用少數幾種原料 | 稀疏先驗 |
把兩者合起來——NNLS 保證非負、LASSO 保證稀疏,得到的就是一份「30 種原料、每種用量都是正數、加起來等於 100%」的可打樣配方表。
注意這兩個數學家——Lawson、Hanson、Tibshirani——都不是化學家。 他們解決的是抽象的數學問題。但因為這種問題的抽象形式剛好對得上香精反卷,今天的演算法只要 80 行 Python 程式碼就能跑通。
這是數學最美的地方:在一個完全不相關的領域裡被發明,在 30 年後被另一個領域撿起來用。
圖 5 · 1974 Lawson-Hanson NNLS → 1996 Tibshirani LASSO → 2026 香精反卷,半個世紀的數學積累被撿起來
九、字典是護城河,原料資料是壁壘
寫到這裡,你應該已經發現一個反直覺的事實:
演算法本身沒有秘密。 NNLS 在 scipy 裡,LASSO 在 sklearn 裡,錨定法是常識。任何懂統計學的工程師花兩週都能搭出一套來。
真正難的是資料。
要跑這套反卷系統,你需要:
| 資料資產 | 這是什麼 | 難度 |
|---|---|---|
| 原料字典 | 一千多條原料的中英文名、CAS、香氣描述、揮發度 | 行業內部資料,外人買不到 |
| 精油 GC-MS 庫 | 每一種常用精油的完整光譜指紋 | 一份實測 1500–2500 元,全譜要 40+ 種 |
| 配方真值對照集 | 已知配方 + 已知 GC-MS 的成對樣本 | 行業裡最秘密的東西,幾乎不流通 |
| CAS 一物多名標註 | 同一個分子在不同廠商那裡的幾個商業名 | 沒人願意做的髒活,但必須有 |
我們目前的系統裡:
- 一份內部流通的 1054 條原料字典,去重後入庫 979 條
- 18 種精油的 GC-MS 指紋(來自一位行業合作方提供的 17 份原始資料)
- 8 號樣品的「題目 + 藥劑師配方」對照(盲測金標準)
- 488 條 CAS 一物多名的審計層(行業首創)
經過 6 輪獨立第三方盲測(雙 LLM 交叉校對 188 個樣本),原料資料庫的真錯率從 17% 一路降到 1.5% 以下。
圖 6 · 原料資料庫 v1→v5.1 真錯率:17% 一路壓到 1.5% 以下,6 輪獨立 LLM 盲測驗證
在一瓶典型的烏木沉香複合香精樣本上,系統的當前能力是:
- 形態覆蓋率 87.6%——配料表裡 87.6% 的成分有原料歸類,剩 12.4% 是佔位坑
- 精油識別召回率 100%——配方裡用了的精油全識別出來了
- 精油識別精確率 100%——雙信號合驗把假陽性全否決了
- 整體可用率約 7 成——客戶拿到這份初稿後,剩下的工作不再是「從零起步」,而是在一份「七成可用、三成待精調」的草稿上修正
3 到 7 天 → 1 天。這是行業目前能給出的提速比。
十、為什麼不主動擴庫?
讀到這裡你可能會問:既然演算法清晰、資料是壁壘,為什麼不直接花錢把資料補齊、把庫擴到 2000 條?
因為這條路有一個反直覺的陷阱——主動擴庫的邊際收益正在遞減。
精油有上千種,但 80% 的香精只用到大約 40 種主精油。補到 50 種之後,每多補一份的「實戰命中率」漲幅迅速衰減。合成單體同理——商業名一千條之後,每多收 100 條只能再砍掉 1–3% 的佔位坑。
更重要的是,這套系統的下一步迭代是 NNLS + LASSO 的完整反卷,工程量 6–7 天。這一步不需要更多資料,需要更多「已知答案的樣本」——也就是「題目 + 真值」對照集。
而那種資料,市面上買不到。它只在兩類人手裡:
- 上游原料廠、獨立精油供應商——你們手裡有自己產品的完整 GC-MS。
- OEM 仿樣工廠、調香工作室——你們手裡有「打樣配方 + 客戶原品 GC-MS」的成對記錄。
如果你正在讀這篇文章,並且你恰好屬於這兩類——歡迎接入。合作模式不限於現金:資料互換、訂閱授權、按訂單分成都可以談。你貢獻一份精油 GC-MS 或一組配方真值,對應得到的是一套已經過 6 輪盲測的工程化反卷系統的優先使用權。
這不是宣傳話術。是因為這套系統的下一躍遷,本來就不是演算法問題,是資料合作問題。
十一、當前的能力邊界
誠實寫一下系統現在做不到什麼:
| 還做不到 | 原因 | 等什麼 |
|---|---|---|
| 多源化合物精確拆分 | NNLS+LASSO 還沒接入 | 觸發後 6–7 天 |
| 用量精度 ±3% | 缺「題目+真值」對照集 | N=10–30 個樣本 |
| 高端天然香水級反卷 | 精油庫覆蓋 18/40+ | 補 22–25 份 GC-MS |
| 大牌香水復刻 | 法律紅線 | 不做 |
圖 7 · v1.10 當前能力六維畫像 —— 找東西 100%、稱數字 ±6.7pp、拆來源 0%(待 v2.0 解鎖)
最後一行重要——任何讓我們去反卷 Chanel、Dior、Tom Ford 類成品的請求,一律不接。這不是技術問題,是智慧財產權問題。這套系統的合規用途明確:
- ✅ 自家產品分析
- ✅ 客戶付費的合規分析(OEM 仿樣、原料採購、質檢)
- ✅ 獨立調香師的工作流加速
- ⚠️ 直接售賣反卷配方——不做
- ⚠️ 大牌香水反卷——不做
十二、總結
GC-MS 反卷的本質: 不是 AI 聞香水,是用 50 年前的統計學解一個有結構的逆問題。
錨定法的本質: 反著算回去——從分子比例反推原料用量。
NNLS 的本質: 1974 年的禮物——保證答案非負。
LASSO 的本質: 1996 年的革命——保證答案稀疏。
雙信號合驗的本質: 不是讓演算法更聰明,而是讓演算法學會懷疑自己。
整個系統的本質: 演算法是公開的、字典是私有的、資料是稀缺的。演算法可以兩週復現,但 6 輪獨立盲測的資料庫、488 條 CAS 一物多名審計、一份「題目+真值」對照集——這些東西沒有捷徑。
不需要訓練一個 AI。不需要 GPU 叢集。不需要把香精交給大模型去「理解」。
需要的是:一份原料字典、一組精油指紋、幾個真值樣本,和半個世紀的統計學。