[TOOLS] 13 分鐘閱讀OraCore 編輯部

Spark 4.2 把 AI 搜尋收進 SQL

我拆 Spark 4.2 怎麼把向量搜尋、串流和 Python 收進同一個 SQL 引擎,順手給你一份可直接抄的 AI serving 模板。

分享 LinkedIn
Spark 4.2 把 AI 搜尋收進 SQL

以前 AI 搜尋要三套系統接線,現在 Spark 4.2 想把查詢、向量、串流收回同一個引擎。

我用 Spark 很久了,老實說,平常升級說明我都只掃一眼:快一點、穩一點、Python 再順一點。看久了真的會麻木。但這次我停下來,因為我在公司和客戶那邊看到的 AI 架構,幾乎都長得一樣醜:一套管事件,一套管特徵,一套向量庫管檢索,外面再包一層 glue code,像把漏水管子用膠帶纏到看不見就算數。

那種架構不是不能跑,是很會偷你的時間。延遲忽快忽慢,資料治理分散在不同工具,團隊一直吵 embedding 到底放哪裡、freshness 誰負責、為什麼一個「簡單」AI 功能最後要三個服務、兩份監控、還有一個沒人信的 dashboard。這篇我主要拆 The New Stack 對 Spark 4.2 的整理,再對照 Apache Spark 官方文件和專案頁面,因為這種東西不能只看標題。

我先講結論:Spark 4.2 不是真的要把所有 AI 工具都吃掉。它更像是在把 AI serving 的重心往自己身上拉,讓 ingestion、feature prep、vector search、streaming、metrics 都有機會待在同一個 SQL/engine 裡。這種改法不只是在加功能,是真的會改你怎麼畫架構圖。

外部錨點很明確:觸發我寫這篇的就是 The New Stack 那篇文章,原文沒有提供觀看數或收藏數,我就不亂猜了。真正值得看的,是它把 Spark 4.2 說成 AI workloads 的基礎層,而不是另一個單點工具。

向量庫最容易先被懷疑,因為它本來就常是多餘的一層

訂閱 AI 趨勢週報

每週精選模型發布、工具應用與深度分析,直送信箱。不定期,不騷擾。

不會寄垃圾信,隨時可取消。

“Spark 4.2 has a feature that could retire your vector database.”

這句話如果直翻,不是叫你明天把 Pinecone 刪掉。它的意思比較務實:Spark 正在往很多團隊原本會丟給專門向量庫的那一段靠攏。也就是說,如果 Spark 已經能把 embedding 建好、存好、查好,而且延遲和吞吐對你的工作負載夠用,那獨立向量庫就不再是必需品,而是選項。

Spark 4.2 把 AI 搜尋收進 SQL

我以前看過兩種很典型的翻車。第一種是先買了向量庫,覺得架構很乾淨,結果後面每次資料更新都要從 Postgres、Kafka、Spark job 一路同步過去,最後變成同步系統比檢索系統還難維護。第二種更慘,硬把向量檢索塞進一般資料庫,結果查詢慢、調參痛苦、大家都只想假裝沒看到。

所以我現在看向量庫,不會先問它酷不酷,我只問兩件事:source of truth 在哪裡,還有我到底想維護幾份同樣的資料。只要你開始多一份索引、多一份同步、多一份 drift,後面就是成本一路疊上去。

實操上我會這樣判斷:如果 embeddings 本來就在 Spark pipeline 裡產生,或 feature pipeline 也已經在 Spark 裡,那就先畫 retrieval path。看向量庫除了 similarity search 之外,有沒有真的提供你非它不可的能力。如果沒有,先把「一定要獨立一套」這個預設拿掉。

  • 保留專門向量庫:當你有硬性低延遲 SLA,Spark 真的扛不住。
  • 考慮 Spark-first retrieval:當 embeddings 與資料管線本來就綁在一起,freshness 比極致延遲更重要。
  • 先算 duplication tax:每多一個 store,就多一份同步、多一份 drift、多一份故障面。

Spark 想變成 serving 層,這件事比加一個 API 重要

以前我對 Spark 的理解很簡單:它負責處理資料,真正對外服務的交給別的系統。這個切法在 batch 時代很合理,因為「serving」通常就是 app 去打資料庫,沒那麼多花樣。但 AI 工作負載把這條線弄模糊了,很多所謂 inference-adjacent 的東西,本質上就是資料工程加一個搜尋步驟。

Spark 4.2 讓我在意的地方,是它開始像一個 serving 中樞:同一個引擎既能 ingest、也能算特徵、也能查相似項。這代表少掉很多 handoff。少 handoff 通常就少 stale copy、少 sync job、少那種半夜才發現索引已經落後六小時的事故。

我之前做過一個推薦系統,特徵一套 pipeline、上線一套 pipeline、nearest-neighbor lookup 又是第三個 service。產品說要改一個小規則,我得先翻三個 codebase,再對兩個部署節奏。圖上看起來很整齊,實際上根本是 coordination tax 機器。

所以我現在會把 Spark 這條路理解成:它不是再多一層工具,而是把「查詢」變成 engine 的原生能力。當 retrieval、table、stream、Python logic 都在同一個地方時,很多原本要靠 glue code 撐住的東西就會消失。

實操寫法很直接:把你現在 AI request path 從 ingestion 畫到 response,逐段數系統切換次數。再把那些只是因為歷史包袱才存在的切換標出來。這些地方,就是 Spark 有機會吃掉的地方。

  • 資料只 ingest 一次,不要三頭同步。
  • Embeddings 和 feature derivation 盡量靠近。
  • 架構還在變動時,先選一個 operational control plane。

治理過的 metrics 很無聊,但出事時最值錢

大家看到向量搜尋會興奮,我反而先盯住 governed metrics。來源文章提到 Spark 4.2 在 metrics 上也有治理能力,這種東西平常沒人想聊,等到第一次 audit、第一次 billing dispute、第一次模型事故,大家才開始追問:到底哪個數字是真的?

Spark 4.2 把 AI 搜尋收進 SQL

白話一點,就是 Spark 4.2 想讓 metric definitions 更集中、更可重複。聽起來很 boring,沒錯,這就是我喜歡的地方。因為最常出事的,不是模型本身,而是 training、offline evaluation、production monitoring 三邊各算各的 accuracy,最後每個人都覺得自己沒有錯。

我看過很多團隊把 metric 放在 notebook,之後搬到 BI tool,再後來又寫成一個沒人想接手的 custom service。只要 AI 系統開始影響產品行為,metric drift 就不是 data science 小事,而是治理問題。你沒辦法拿三個不同版本的「正確答案」去跟主管討論。

如果 Spark 把 metric 定義和計算都留在同一個 engine 裡,chain of custody 會乾淨很多。這不只對受監管產業有用,對一般團隊也有用,因為你終於不用一直吵誰的數字才算數。

實操上,我會先列出團隊所有 KPI、模型 metric、retrieval quality metric。每一個都回答三題:定義在哪、計算在哪、誰負責。只要這三個答案分散在三套系統,你就已經有一個治理問題了。

串流升級不是配角,它決定這套東西能不能真的近即時

只有 vector search 不夠。資料一 stale,檢索就 stale;事件一 lag,特徵就 lag。這也是為什麼 Spark 4.2 的 streaming 改進,我看得跟搜尋一樣重。

The New Stack 那篇提到 streaming upgrades,我覺得這是整個 AI-serving 敘事能不能成立的關鍵。真正的近即時系統,靠的不是某個酷炫 API,而是資料流能不能持續往前推。如果 Spark 能同時處理 streams,還能把結果直接餵給 retrieval,那你的索引就不需要靠 cron job 和祈禱維持新鮮。

我踩過太多這種坑:stream processor 看起來健康,indexer 看起來健康,產品卻還是錯。最後才發現問題不是單點壞掉,而是兩套系統之間的 handoff 慢到爆。使用者感受到的不是「系統很複雜」,而是「你這個 real-time 功能其實晚了快一小時」。

串流也會直接影響 embedding pipeline。只要 source data 持續變動,embedding 就不能用一個慢吞吞的離線流程硬拖。Spark 的方向,是把這件事收回同一個引擎處理,不要再把協調工作丟給另一套 stack。

實操寫法:先把所有依賴 freshness 的 AI 功能列出來,像推薦、fraud、search、ranking、support routing。接著問自己一句很殘酷的話:現在這套是不是 batch-first,外面再補一層 streaming?如果是,那這個設計多半已經老了。

Python 支援不是小事,因為 adoption 卡死通常卡在這裡

很多平台團隊會低估 Python 這件事,覺得反正底層 JVM 很穩,寫法漂亮一點就好。問題是,資料科學家和 ML 工程師大多活在 Python notebook 裡,你如果要他們為了平台切去另一種語言,阻力會很真實。

我對 Spark 4.2 的 Python 支援比較有感,因為它其實在做一件很務實的事:去接大家已經在用的工作方式。技術上很漂亮的系統,如果沒人想碰,還是失敗。這句很難聽,但我看過太多次了,工具差一點但好用,最後就是贏。

Python 也讓 AI prototype 到 production 的距離短一點。不是說會變簡單,而是少掉很多 runtime 邊界、wrapper、adapter、重寫邏輯。少掉這些,團隊才有機會把時間花在模型和資料,而不是花在「怎麼把同一段邏輯再包一次」。

實操上,我會先算你現在的 split brain 成本:Python 實驗環境和 JVM 生產環境之間,有多少轉譯、多少重寫、多少工具只存在於語言邊界?如果答案讓你皺眉,Spark 4.2 的 Python 方向就值得你認真看。

順手補兩個外部參考:Apache Spark docs 可以看官方能力邊界,專案首頁 可以看版本節奏。這些東西比社群轉貼更可靠。

我真正想省下來的是 babysit 系統的時間

講到底,Spark 4.2 最有意思的地方,不是它又多了一個 shiny feature,而是它提供了一條減少系統數量的路。這件事很無聊,但很值錢。因為在真實世界裡,省下來的通常不是算力,是人力和注意力。

每多一個 store、index、service,你就多一份 patch、多一份 monitor、多一份 backup、多一份 incident review 裡要解釋的東西。新同事來了還要教一次:這個為什麼存在?那個為什麼不能刪?如果 Spark 能吞掉 AI serving path 的一大段,架構就會比較好懂,也比較好養。

但我不想把話講死。不是每個工作負載都該被 Spark 吃掉。某些場景就是需要專門向量基礎設施,某些團隊就是已經把 retrieval 系統做得很好,硬搬反而更糟。只是預設值正在變:現在輪到獨立系統去證明自己值得存在。

實操上,我會做一次 stack audit。把一個 AI feature 相關的所有系統列出來,標成 source、transform、store、retrieve、serve。只要某個元件只是因為別人做不到才存在,就該被認真質疑。你要找的是能刪掉的地方,不是再多加一層。

  • 先保留 rollback path,再談 cutover。
  • 把 freshness、recall、query latency 分開量。
  • 別把實驗 metric 和 production metric 混在一起。
  • Python ergonomics 要當成正式需求,不是 bonus。

可抄的模板

# Spark 4.2 AI serving 模板(可直接改成你自己的版本)

## 目標
把 ingestion、feature prep、embeddings、retrieval、governed metrics 收進同一條 Spark pipeline。

## 適用情境
- embeddings 已經在 Spark 或靠近 Spark 的 Python jobs 裡產生
- 你想少掉同步 job,讓 retrieval 更新更快
- 你想把 batch、streaming、AI serving 放進同一個操作面
- 你想把 metric 定義和計算留在同一個地方

## 先保留獨立向量庫,如果你有這些需求
- 你有硬性低延遲 SLA,Spark 目前扛不住
- 你需要 Spark 環境裡沒有的專門 ANN 能力
- 你的 retrieval 工作負載已經很穩,沒必要重構

## 架構長相
1. 把來源資料 ingest 到 Spark
2. 做清理、正規化、去重
3. 產生 embeddings
4. 存到 Spark 可存取的 tables 或 indexes
5. 用 Spark 做相似項查詢
6. 在 Spark 裡計算 governed metrics
7. 把結果送到 app 或 model service

## 決策清單
- Spark 現在是不是資料 source of truth?
- embeddings 是否跟來源資料同一條 pipeline 更新?
- 是否已經有重複的 retrieval data copy?
- retrieval 和 quality metrics 能不能用 code 一次定義?
- freshness 是否比 sub-millisecond latency 更重要?

## 遷移步驟
### Phase 1:畫圖
先把目前 AI request path 的每個系統畫出來。

### Phase 2:收斂
把 embedding generation 和 metric computation 拉近 Spark。

### Phase 3:對照測試
拿現有 vector store 做 side-by-side retrieval 比對。

### Phase 4:切換
只切 latency 和 quality 都達標的 workload。

## 風險控管
- 保留回退到舊向量庫的路
- 分開量 freshness、recall、query latency
- 不要把實驗 metric 混進 production metric
- 把 Python ergonomics 當成正式需求

## 可直接放進評估文件的一句話
如果 Spark 4.2 能替這個工作負載承擔 ingestion、embeddings、retrieval 和 governed metrics,我們就能少一個專門系統和一條同步路徑。

這份模板我刻意寫得保守一點。我的經驗是,先少掉一個系統、少掉一條同步路徑,通常就已經很有感了;不要一開始就想玩平台純度競賽,最後把自己搞得更亂。

來源致謝:這篇拆解主要來自 The New Stack 的原文,以及 Apache Spark 官方專案與 文件。我寫的判斷、案例和模板是衍生整理,不是原文逐字翻譯。