了解 Jev 後,我重新想起我們在 EMNLP 2025 發表的 KG-RAG。當時,我們用 LLM 為 GUI 的候選 trajectories 評分,再交由搜尋演算法決定探索哪些路徑。Jev 也把模型的判斷變成有明確範圍的 probabilities,讓程式直接使用。
兩者確實有相似之處,尤其是模型負責判斷、程式負責控制流程的分工。但仔細比較後,搜尋的對象、分數的算法,以及訓練想改善的能力,都有不同。
我想用同一個例子,看看兩種評分方式何時會做出相同選擇、何時會分歧,再思考 Jev 為我們下一版 trajectory scorer 帶來甚麼值得測試的想法。
1 相似的核心:把模型放進程式裡,擔任評審
KG-RAG 處理的是 agent 缺乏 app 導航知識的問題。Offline pipeline 會探索 UI Transition Graph(UTG),利用 intent milestones 評估 trajectories,再把有用的 intent–trajectory pairs 存起來,供 online retrieval 使用。搜尋每輪批次展開候選路徑、評分,再保留 top-K 作為下一輪 frontier。這裡搜尋的是 UI 路徑,不是 token-decoding tree。[論文 §3.2、Algorithm 3]
假設任務有兩個 milestones:先到設定頁,再打開私隱政策。我們可以問模型:「這條 trajectory 已完成 0、1,還是 2 個 milestones?」取出相關 LLM logits,經過 softmax,就得到這三種答案的 probability distribution。
這就是和 structured scoring 相似的地方:模型對明確的答案範圍給出數字,外面的程式決定如何利用這些數字完成任務。
Jev 把這個介面明確化,例如用 Noul 表達 yes/no probability、Choice 選擇類別、Score 評估有順序的 levels。Choice 和 Score 另外回傳 confidence 指標。對我們的 milestone 例子,最接近的是 Score。[TypeSafe primitives]
2 同一個例子,其實在回答四個問題
假設某條 trajectory 得到以下分布:
- 0尚未完成
- 10%
- 1完成一個
- 20%
- 2完成兩個
- 70%
我們的 progress score:最高 probability 有多高?
這裡有兩個不同的數字:「2」是模型最相信的完成數量;「0.7」是它給這個答案的 probability。按論文的 progress 定義,我們取後者。所以 0.7 並不代表「完成了 70% 的任務」。只保留最高 probability,也會丟掉其餘分布的資訊;這就是下一個分數能補充的地方。
我們的 proximity score:排序是否偏向較多進展?
先問一個更直觀的問題:模型的判斷是否傾向「完成越多越可能」?我們想偏好的排序是「完成 2 個」排第一、「完成 1 個」第二、「完成 0 個」最後,也就是 [2, 1, 0]。這個例子的 probabilities 是 70% > 20% > 10%,剛好符合。Algorithm 2 比較實際排序與這個目標排序,逐個位置計算差距的平方,再取負號:
Progress 一樣,proximity 為甚麼不同?
現在比較兩條候選路徑。兩者都給「完成兩個 milestones」70% probability,所以 progress 同分:
左右滑動表格,查看全部分數 →
| 路徑 | P(0), P(1), P(2) | Progress | Proximity |
|---|---|---|---|
| A | [0.1, 0.2, 0.7] | 0.7 | 0 |
| B | [0.2, 0.1, 0.7] | 0.7 | −2 |
再看剩下的 30%。A 的第二選擇是「完成一個」;B 的第二選擇卻是「一個也沒完成」。換句話說:如果模型猜錯了「全部完成」,A 的後備判斷仍然比較有進展。 單看同樣是 0.7 的 progress,就看不到這個差別。
A 把結果排成 [2, 1, 0],與目標排序完全相同。B 則排成 [2, 0, 1],最後兩個位置倒轉了。因此 B 得到 −(0² + 1² + 1²) = −2,A 則得到 0。Progress 同分時,KG-RAG 便優先保留 A。
為甚麼 0 比較好?它代表「排序沒有扣分」,不是「沒有進展」。 差距的平方只可能是 0 或正數;加上負號後,分數就只可能是 0 或負數。完全吻合目標排序時,沒有任何扣分,所以 0 已是最高分。可以想成一開始有 0 分,每個排錯的位置都會扣分。
這也解釋了 proximity 的意思:它量度的是離理想排序有多近,不是 UI 上還要走幾步。0 也不代表任務肯定完成。例如 [0.32, 0.33, 0.35] 與 A 排序相同,同樣得到 0,但判斷明顯不那麼肯定。Proximity 只看名次,沒有保留 probabilities 之間的差距。[論文 Algorithm 2]
Actions 是否真的完成了 milestones,仍要由 trajectory evaluator 判斷。Proximity 只是把 evaluator 給出的 probabilities 整理成一個排序分數。
Jev 的 Score:預期完成多少?
這是以 probability 加權的 level 平均數。平均的是 milestone 數量,不是 logits。1.6 表示分布下的期望值,並不代表介面真的完成了小數個 milestone。[官方 Score 文件]
Jev 的 Score confidence:判斷有多集中?
為甚麼有了 Score,還要 confidence?「肯定完成 1 個 milestone」和「一半機會完成 0 個、一半機會完成 2 個」的平均都是 1,但後者的判斷分歧大得多。Confidence 把這種分散程度濃縮成一個數字,讓程式決定是否需要更多證據。在 BFS 中,我們可以測試:遇到分散的判斷時,多保留幾條候選路徑。
Levels 是有順序的答案刻度;n 才是刻度的數量。這裡的三個 levels 是「完成 0、1、2 個 milestones」,相鄰兩級相差 1,所以 0 距離 2 比 1 距離 2 更遠。「貓、狗、鳥」也是三個 classes,卻沒有這種距離,應使用 Choice。公式按 level 的索引計算等距步幅;對「低、中、高」這類文字標籤,等距是評分方式的設定,不代表現實差異必然相等。
沿用同一個分布:P(0) = 0.1、P(1) = 0.2、P(2) = 0.7。最可能答案是完成 2 個 milestones。Confidence 在問:其他可能性,是否也集中在這個答案附近?這與 Score 把所有 levels 加權平均、得到 1.6,是兩個不同問題。
第一步:量度 probability 離最可能答案有多遠
想像在數線上放 100 顆棋子:10 顆放在 level 0、20 顆在 level 1、70 顆在 level 2。現在量度每顆棋子離最可能答案 2 有多遠。10 顆相距兩格,20 顆相距一格,70 顆已經在那裡。平均距離就是:
把這個距離叫做 D。它的單位是 levels,不是 probability。D 越小,分布越集中在最可能答案附近。由於答案有順序,相差一個 level,應該比相差兩個 levels 扣得少。
第二步:找一個「平均分散」的比較基準
要把距離變成正規化的 confidence,需要一把尺。Jev 文件選用的基準是 uniform distribution:每個 level 的 probability 一樣。對 0、1、2 三個 levels 而言,中間位置是 1。
2/3 就是這樣來的:距離 1、0、1 的平均數。 它不是訓練出來的參數,也不是「有三分之二機會正確」。分母由 level scale 決定。若有 0–4 五個 levels,基準就會變成 (2 + 1 + 0 + 1 + 2) / 5 = 6/5。
這裡有兩個不同的參考點:分子量度離這次預測的最可能 level有多遠,本例是 2;分母則量度 uniform reference 離整把尺的中間位置有多遠,本例是 1。不要把分母的中心也移到 2。這是 TypeSafe 定義的 normalization 方式。
第三步:把「分散程度」轉成 confidence
先把 D 除以基準距離 U,再用 1 減去這個比例,最後把負數截到 0:
這樣設計後,D = 0 時 confidence = 1,因為所有 probability 都在同一個 level。當 D 等於基準的分散程度,confidence 就是 0。若 D 更大,也一律取 0,因為 uniform baseline 只是參考值,並非所有分布中最大的距離。這是一個選定的統計指標,並非 confidence 唯一可能的數學定義。[TypeSafe 的定義]
回到我們的候選路徑,平均距離 0.4 是基準 2/3 的 60%。用 1 減去這個比例,便得到:
這次 spread 和最後的 confidence 剛好都是 0.4,純粹是巧合。例如候選 B 的分布 [0.2, 0.1, 0.7],D 是 0.5,但 confidence 是 0.25。
Confidence = 0.4,不代表「答案有 40% 機會正確」。 模型給「完成全部」的 probability 仍是 0.7;confidence 描述的是分布是否集中在最可能答案附近。模型也可以非常肯定「完成 0 個」,所以 high confidence 不代表路徑有前景。這是 Score 的公式;沒有高低順序的 Choice 使用另一個公式。
試試看:最可能的答案不變,分歧可以有多遠?
完成 2 個的 probability 固定為 70%。只改變剩餘 30% 放在 1 個還是 0 個。
D = 0.40 · Confidence = 0.40
| 指標 | 結果 | 它在問甚麼? |
|---|---|---|
| Progress | 0.7 | 最高 probability 有多高? |
| Proximity | 0 | Probability 排序是否偏向較高完成數量? |
| Jev Score | 1.6 | 預期完成多少 milestones? |
| Jev Score confidence | 0.4 | 分布是否集中在最可能答案附近? |
自己調整分布,看看四個分數
選擇例子,或調整相對權重;系統會正規化至合共 100%。所有計算都在本機完成,不會呼叫模型。
- KG-RAG progress*
- 0.7 最高 probability
- KG-RAG proximity
- 0 0 是最符合的排序
- Jev-style Score
- 1.6 預期完成數量
- Jev-style Score confidence
- 0.4 集中程度,不是正確率
公式與相同 probability 的處理方式
*Progress 按論文文字取最高 probability。Proximity 比較排序與 [2, 1, 0]。相同 probability 時,本示範把較高 milestone 排前;Algorithm 2 沒有指定這個 tie rule。Confidence 沿用官方範例 code,取第一個最高值作 mode。結果最多顯示三位小數,並不代表任何實測效能。
3 兩種評分方式,可以找到同一條路嗎?
可以。上面的 A/B 例子已經是一次相同決定:KG-RAG 用 proximity 打破 0.7 的同分;Jev 的 expected score 則是 A 得 1.6、B 得 1.5。兩者都選 A,只是計算的方式不同。
再把整個搜尋走一次。任務仍然是先到 Settings,再打開 Privacy Policy。為了清楚看見每次選擇,這裡用一個很小的 top-K search,設 K = 1:每輪展開一個 UI action,只保留一條候選路徑繼續走。這是會剪枝的搜尋,不是遍歷所有候選的 BFS。
兩種 scoring rule 使用同一組假設 probabilities,以及相同的終點畫面檢查。第二個版本是在我們的 search loop 裡,改用 Jev-style expected milestone score。Jev 提供判斷,搜尋流程仍然由程式控制。
第一輪:從 Home,選 Settings 還是 Help?
兩條路都尚未通過終點畫面檢查。Evaluator 給出以下估計:
左右滑動表格,查看全部分數 →
| 候選路徑 | Probabilities | KG-RAGprogress / proximity | Jev-style預期完成數量 |
|---|---|---|---|
| Home → Settings | [0.20, 0.70, 0.10] | 0.70 / −6 | 0.90 |
| Home → Help | [0.70, 0.20, 0.10] | 0.70 / −8 | 0.40 |
KG-RAG 保留 Settings:progress 都是 0.70,但 −6 比 −8 高。Settings 把結果排成 [1, 0, 2],所以是 −(1² + 1² + 2²) = −6;Help 則排成 [0, 1, 2],所以是 −(2² + 0² + 2²) = −8。
Jev-style scoring 也保留 Settings:它的 expected completion 是 0.70 + 2 × 0.10 = 0.90;Help 則是 0.20 + 2 × 0.10 = 0.40。直覺上,一條路很可能已完成第一個 milestone,另一條路則很可能一個也沒完成。
第二輪:從 Settings,選 Privacy Policy 還是 Notifications?
左右滑動表格,查看全部分數 →
| 下一個畫面 | Probabilities | KG-RAGprogress / proximity | Jev-style預期完成數量 |
|---|---|---|---|
| Privacy Policy | [0.02, 0.08, 0.90] | 0.90 / 0 | 1.88 |
| Notifications | [0.20, 0.70, 0.10] | 0.70 / −6 | 0.90 |
兩者都選 Privacy Policy。KG-RAG 比較 progress:0.90 高於 0.70,這次不需要用 proximity 打破同分。Jev-style scoring 則偏好較高的 expected count:0.08 + 2 × 0.90 = 1.88。最後,相同的畫面檢查確認 Privacy Policy 已經打開。
這個例子的重點是:分數不同,行為不一定不同。剪枝時真正影響選擇的,是誰排在前面。這裡兩種規則每次都選同一條路。它示範了「可以一致」,但不代表兩個訓練過的模型總會給相同 probabilities 或搜尋結果。下一個例子便說明,為甚麼仍然要分清楚這些分數。
4 對我們的 BFS,我會怎樣測試?
現在把 A 與一條「模型很肯定它沒甚麼進展」的路徑比較:
| 路徑 | 分布 | Progress | Proximity | 預期完成數量 | Confidence |
|---|---|---|---|---|---|
| A | [0.1, 0.2, 0.7] | 0.7 | 0 | 1.6 | 0.4 |
| C | [0.9, 0.08, 0.02] | 0.9 | −8 | 0.12 | 0.82 |
C 的 confidence 更高,但 A 更值得探索。 模型很肯定一條路失敗,不等於那條路值得繼續展開。如果最高 probability 是主要排序依據,而 proximity 只用來打破同分,C 就可能排在 A 前面。這是按字面公式推導的結果,並不代表我們已在實際程式中重現了這種錯誤。
如果做下一輪 ablation,我會把三個決定分開:
- 下一輪展開甚麼:嘗試以 expected milestone count 作主要 progress heuristic。
- 甚麼路徑看來已完成:檢查完成所有 milestones 的 probability,再配合適合任務的成功驗證。
- 哪裡需要更多判斷:用 uncertainty 決定是否重新評分,或保留更多候選。低 confidence 就直接剪枝,可能錯過好路徑。
Expected progress 仍然只是 heuristic,不保證最終成功。完成較少 milestones 的路徑,也可能有更好的後續選擇;等權平均還假設每個 milestone 同樣重要。真正有意義的實驗,是固定 evaluator、候選圖和搜尋預算,只改 scoring rule,再比較找到多少成功路徑,以及花了多少搜尋成本。
5 Jev 在程式裡負責甚麼?
首先,我們到底叫 Jev 做甚麼?
可以把它想成大型程式裡,一個職責明確的 function call。我們提供待判斷的證據,叫做 state,再寫下問題,以及允許答案的描述。Jev 回傳 probabilistic judgment;我們的 code 再決定如何處理。
沿用開啟 privacy policy 的任務,三種 question types 可以這樣理解:
- Noul:「提供的 trajectory 是否顯示 privacy policy 已經打開?」回傳 yes 的 probability。
- Choice:「這段描述屬於哪種畫面:Settings、Help、Privacy Policy,還是 Other?」回傳 category、整個分布,以及 confidence。
- Score:「這條 trajectory 完成了多少 milestones?」先定義有順序的 0、1、2 三個 levels,再回傳分布、預期 level,以及 confidence。
Typed 的意思,是答案符合宣告的格式,而且落在允許的答案範圍內。這不代表模型一定理解正確:畫面明明是 Help,卻選了 Privacy Policy,仍然是可能的語意錯誤。Types 限制了程式會收到甚麼,卻沒有替我們驗證現實。[Noul] [Choice] [Score]
Jev 會取代整個 KG-RAG 嗎?
最自然的實驗,是替換或比較其中的 trajectory evaluator。KG-RAG 的 graph expansion 仍然負責提出路徑,ranking code 仍然決定下一輪 frontier,offline knowledge construction 和 online retrieval 也各有工作。Jev 能夠評分,不會自動接手整套系統的職責。
假設 evaluator 回傳 [0.1, 0.2, 0.7]。無論分布來自我們的 LLM 還是 Jev,普通 code 都能算出 Score 1.6 和 confidence 0.4。接著,我們可以測試「用 expected progress 排序;evaluator 不肯定時,多保留一些候選路徑」這類策略。這是我們的設計選擇,confidence 公式本身不會替我們決定。
反過來,在現有 scorer 加上相同兩條公式,也不等於重現了 Jev 的模型。算出一樣的數學結果很直接;底層 probabilities 的品質和 calibration 是否一樣,則需要實驗。
這裡的「parallel」是甚麼意思?
我們的 BFS 在同一輪評估多條候選路徑。Jev 的 speculative fan-out,則是對已經取得的證據一次問多條問題,即使 code 還不知道最後會用到哪些答案。
例如一張 support ticket:逐步流程先問「是不是 bug?」等答案是 yes,才問「bug 有多嚴重?」Fan-out 把兩條問題一起問。如果原來是帳單問題,code 就忽略 severity。由於 ticket 本來已經包含兩個判斷需要的證據,提前問可以省下一次來回呼叫。[官方 fan-out 模式]
但它不能憑空產生新證據。如果判斷某個 GUI action,必須先看到尚未觀察的下一個畫面,我們仍然要取得那個 observation。把已知問題一起問,與消除真正的依賴關係,是兩回事。
為甚麼比較速度時,要留意我們的 baseline?
TypeSafe 描述了一套為 structured judgments 設計的模型和 parallel sampler。與生成文字或 JSON 的 LLM 比較,可以說明這種介面的動機;但我們的 scorer 已經直接讀指定 logits,不需要生成長篇解釋。要知道 Jev 對我們的 BFS 實際有多少加速,仍需在相同 trajectory judgments、相近品質和 serving 條件下直接比較。[TypeSafe 發布文章]
6 Probability 可靠嗎?用 calibration 檢查
「預測 probabilities 對應實際結果的發生頻率」可以換成一句話:當模型對很多不同例子都說「完成的機會約 70%」,事後檢查,應該有大約七成真的完成。這就是 calibration 想檢查的事情。
例如,收集 100 條沒有用來訓練的不同 trajectories,模型對每條都給出約 70% 的「完成兩個 milestones」probability。再逐條查看實際操作紀錄,核實是否完成:
100 條路徑,每條都預測 70% 完成機會
綠色:實際完成兩個 milestones · 灰色:未完成兩個
預測 70% → 實際 70/100:這一組吻合。
切換成 40 條完成:模型仍然說 70%,但結果只有 40%。這一組的完成機會被高估了。這裡的 70% 不是完成了 70% 的 milestones,也不是 confidence = 0.7;它是模型對「兩個 milestones 都完成」這件事給出的 probability。
單一組例子只方便理解。真正評估時,要在不同 probability 區間收集足夠的案例;有限樣本不必剛好吻合。TypeSafe 把改善這種機率可靠性列為 RLCD 的目標。[官方 AI primer]
Confidence 看模型的答案分布有多集中;calibration 要拿預測與實際結果比較。只看一條路徑的分布就能算 confidence,但看不到真實結果,就無法驗證 calibration。模型可以很肯定,卻經常判斷錯誤。
對我們的 BFS,計算 Jev 式 Score 和 confidence 很容易;更值得驗證的是:這些 probabilities 是否可靠,以及使用它們後能否用較少搜尋找到正確路徑。
資料來源與範圍
本文根據 2026 年 10 月 22–23 日查閱的公開論文與文件撰寫。數值例子是示意計算,不是 benchmark 結果或即時 Jev 輸出。Progress 按論文 §3.2 的文字取最高 probability,proximity 作為次要排序依據;本文沒有核對實作程式。兩輪搜尋例子刻意固定 probabilities、K = 1 與終點檢查,只比較 scoring rule。
- Guan et al., KG-RAG, EMNLP 2025,尤其是論文的 §3.2 與 Algorithms 1–3。
- Aman Arora, Jev: A New Way to Make Probabilistic Decisions:引起這次比較的文章。
- TypeSafe 文件:Score、Confidence、Speculative fan-out。
- TypeSafe:Introducing System One Models & Jev 與 AI primer。