文件導航

Jev 1.13 的參差之處

Jev 並非完美。以下是我們在 jev-1.13 上已知的一些參差之處。其中許多將在後續版本中修復。

jev-1.13 快速、校準良好、擅長常識判斷,但並非完美。jev-1.13 在 System One 任務上表現最好。它可能難以應付需要多一層間接的任務。它的理解可能相當字面。它不擅長需要數值精確度的任務。

失敗模式詳解

# 失敗模式 改為這樣做
1 字面理解 寫出確切的判斷條件,以及每個可用選項的判定標準
2 數學與數字 把算術留在程式碼裡
3 日期與時間比較 抽取各個組成部分;在程式碼裡比較
4 間接 減少跳轉;指向相關的狀態
5 充滿無關細節的大狀態 先過濾;只發送問題需要的內容
6 對抗性內容 寫精確的提示詞,並在部署前測試邊界情況
7 互相矛盾的 instructions 和 criteria 讓 criteria 和 instructions 對齊
8 Choice 的選項順序 重排選項,檢查答案是否保持一致
9 生成 使用生成式模型

字面理解

jev-1.13 回答的是你寫下的問題,而不是你心裡想問的那個。限定詞、否定和隱含條件都按字面理解。模型會依據 instruction 中寫下的字面來作答,而人可能會讀出指令背後的意圖。

改為: 在 instructions 裡寫明確切的條件。要具體。把邊界情況放進 criteria。當你看到一個錯誤答案、忍不住要解釋你真正想表達什麼時,那段解釋就是 instruction 缺失的另一半。在解釋不可避免的地方,把它拆成兩個字面問題,在程式碼裡組合。

數學與數字

Jev 不是計算器。我們強烈建議把任何數學邏輯放在程式碼裡實現。Jev 在語義問題上比在數學問題上表現更好。

計數

jev-1.13 數數不可靠。這包括單詞裡的字元數、某個詞在段落中出現的次數,以及長列表中的項數。模型是在辨認答案的大致形狀,而不是逐項累加,而且被數的東西越大,誤差越大。

在提出計數問題之前,先問一句:為什麼這個計數需要一個模型?如果被數的單位是正規表示式或解析器能找到的東西,那計數就該放在程式碼裡,模型幫不上忙。

改為: 在程式碼裡計數。想統計滿足某些標準的項時,在程式碼裡遍歷候選項,每項問一個問題,然後自己把答案加起來。

from typesafe_sdk import Noul, TypeSafeClient

client = TypeSafeClient(model="jev-1.13")
YES = 0.5  # up to you on what you want the threshold to be, depends on your usecase.

items = ["typesafe", "apple", "california", "banana", "likes", "calibration", "orange", "vertex"]

result = client.system_one(
    {"items": items},
    {
        f"item_{i}": Noul(instructions=f"Is `items[{i}]` the name of a fruit?")
        for i in range(len(items))
    },
)

count = sum(result.nouls[f"item_{i}"].noul > YES for i in range(len(items)))

數值表示

jev-1.13 在語義表示上比在數值表示上表現更好。例如,用十六進位制值詢問顏色,效果不如用英文顏色名。給定 RGB 三元組或十六進位制值,它無法可靠地判斷兩個值是否相近。

同理,關於高階程式語言的問題,表現會好於關於底層彙編或二進位制編碼指令的問題。

改為: 在程式碼裡做轉換,傳入算好的數字或命名的分桶。把模型留給真正屬於判斷的部分,比如某個顏色讀起來是否像警告。

用 score 做數學

請不要用 score 的輸出(例如期望和機率)去計算某個數在 criterion 兩級之間的確切大小。你可以用期望來判斷它是否越過某個閾值,但 jev-1.13 的 score 檔位在數值校準上很弱。它無法通過在最近的兩個檔位之間插值來幫你還原確切的數字。

日期與時間比較

jev-1.13 把日期當作文本讀,而不是有序的量。問兩個日期哪個更早、相隔多遠、或某個日期是否落在某視窗內,都不可靠。格式混用、相對指代,以及季度、結算視窗、計息期這類領域邊界,會讓情況更糟。

改為: 把工作拆開。抽取是判斷,交給模型。算術不是,留在程式碼裡。

日期的每一部分都是一個小範圍閉集:十二個月、三十一種可能的日、有界的年份範圍。這樣抽取就變成在一個Choice 上對列舉選項的選擇,而不是自由形式的解析,而且你還多了一個地方放顯式的“未說明”選項,這樣缺失的部分會被報告出來而不是被猜。程式碼再把各部分組裝成真正的日期,並接管之後的一切,包括排序、時長、偏移和星期。

完整示例見日期抽取 cookbook,包括相對日期和置信度門控。

間接

帶有雙重否定或複雜間接的指令,回答的可靠性更低。關於“屬性的屬性”,或需要多跳推理的問題,都會損失準確率。

改為: 把指令寫得儘可能直接。儘可能按名字指出狀態中相關的部分。

充滿無關細節的大狀態

當狀態裡塞進與決策無關的內容時,準確率會下降。無關細節會充當干擾項,而龐大的狀態會讓你更難判斷是輸入的哪一部分導致了錯誤答案。

改為: 先在程式碼裡檢索和過濾,只發送問題需要的欄位。當無法在 state 裡過濾時,可以用 Noul 過濾相關性。對 RAG 段落分類的 cookbook 有一個完整示例。

對抗性內容

狀態是資料,jev-1.13 預設不把它當作敵意的。為了對抗性地操控模型而寫的內容——無論是注入的指令、刻意誤導的框定,還是為自己的分類辯護的文本——都可能改變答案。我們期望未來在這方面有所改進。

改為: 在 criteria 裡寫清楚。在部署給大量使用者之前,充分測試你的整合。

互相矛盾的 instructions 和 criteria

當 instructions 和 criteria 要求的是不同的東西時,jev-1.13 可能會困惑。最好的表現來自清晰的措辭。例如,一個讓 true 對映為“否”、false 對映為“是”的 Noul,表現會更差。目標是讓普通人也能輕鬆讀懂你的 instructions。

改為: 把 criteria 當作 instruction 的延伸。用清晰精確的語言把兩者對齊。

Choice 的選項順序

在某些情況下,我們觀察到 Choice 的選項順序會影響答案,而 jev-1.13 更傾向於排在最前面的選項。

改為: 重新排列選項,複核答案是否保持一致。

生成

jev-1.13 沒有為生成文本而訓練。雖然你可以通過串聯 choice 強迫它生成,但效果不好而且會很慢。對於資料抽取,更好的做法是用正規表示式或生成式模型抽出可能的選項,再讓 jev-1.13 挑出正確的那個抽取結果。

改為: 當答案空間有界時,把抽取變成在選項上的 Choice,而不是直接問那個值本身。如果你真的需要生成文本……那有別的模型來做這件事。