JEV - 告別提示詞詩學:封閉題怎麼設計
是非、單選和檔位夠當一門語言,前提是把業務拆成互不干擾的封閉題,並把狀態壓過故事。券發不發,留給代碼裡的閾值。

聯合作者:folkbench.com (Folkbench 是面向 AI API、模型服務及相關站點的可覆核評測與選擇平台,依據已發布的服務資料、價格、可用性、延遲與證據窗口,幫助用戶比較並選擇使用路徑。)
這一組共十篇:
- JEV - 關節不需要大腦
- JEV - 系統潤滑劑:控制節點不再生成
- JEV - 從 BERT 到 Jev:分類回到一張分佈
- JEV - 告別提示詞詩學:封閉題怎麼設計
- JEV - 反 Token 經濟學:大廠為什麼不先做
- JEV - 兩個 demo:回來的只是一張分佈
- JEV - 退出環路:置信度寫進程式碼
- JEV - 能力過線之後,更聰明不再是賣點
- JEV - 直覺與理性:有些話不該問關節
- JEV - 從操作螢幕到只出概率
前半場的提示詞像詩學。為了穩定拿到一個 JSON,人們寫角色、寫恐嚇、寫示例、寫 XML。那是在無限的 token 組合裡圍堵。Jev 把圍堵取消了。解空間在推理之前就收攏。你要設計的不是一句更好的咒語,是一份狀態,加上幾道互不干擾的封閉題。是非、單選、檔位夠不夠當語言,取決於你肯不肯把業務拆到這三種形狀裡。
從圍堵到問卷
[ generative ]
prompt (role, examples, format restraints) → infinite tokens → text that can drift
[ Jev ]
state + closed questions (Noul / Choice / Score) → a finite set → one distribution
三種題把能問的話說死:
- 是非,Noul。要的是“是”的概率,用來卡一個臨界。代碼裡再決定過不過閾值。它不是空值。
- 單選,Choice。選項事先給死,最多 255 項。每一項後面寫清指什麼。用來做意圖和路由。
- 檔位,Score。2 到 10 檔,從低到高寫成具體情形。用來表示程度,不用來發明新類別。
格式約束那一類提示詞因此失效。剩下的手藝是狀態怎麼壓,以及一道大題怎麼拆開。
狀態要壓過故事
State 不聽故事。原則是去掉修飾、把時序留清、把事實留住。
評估一個用戶會不會離開,生成式寫法常常是這樣:
你是資深客服。閱讀資料和對話,判斷他是不是要退訂,說明理由,輸出 JSON。資料:張三,VIP3,註冊兩年。用戶說功能又崩了,數據沒了。客服說在修。用戶說算了,告訴我怎麼退款。
問題在角色句和語氣詞。模型要把注意力分給“你是專家”,輸出還會被“算了吧”帶著跑。
Jev 吃的是壓過的狀態:
{
"user_profile": {"tier": "VIP3", "tenure_months": 24},
"last_event": {"type": "system_error", "impact": "data_loss"},
"dialogue_history": [
{"role": "user", "intent": "complain", "content": "feature crashed, data lost"},
{"role": "agent", "intent": "apology", "content": "fix in progress"},
{"role": "user", "intent": "churn_explicit", "content": "asks for a refund and says they will stop"}
]
}
原始對話可以留一句原文,但意圖和影響要單獨放出來。模型讀的是一棵狀態,不是一篇作文。
一道業務題拆成三問
“要不要發 50 元券”不是一道封閉題。裡面疊了意圖、火氣、欺詐和成本。Jev 裡一步到位會失敗。拆成三道正交的題,券的政策留給代碼。
state ─┬─ Choice primary intent
├─ Score negative degree, rungs 1 to 5
└─ Noul does this look like farming coupons
意圖
單選。解空間寫成:純技術諮詢、產品建議、故障投訴、惡意索賠。題幹只問這一次交互的主意圖,不問該不該賠。
[State]
{ ...compressed state... }
[Question]
From the dialogue, which class is the primary intent of this turn.
程度
檔位。1 是疑問或輕微不滿,3 是明確不滿並要求解釋,5 是極端情緒或已經提出退款、銷戶。不要只丟一個“1 到 5”給它。每一檔寫成情形。
[State]
{ ...compressed state... }
[Question]
Score the negative degree on these rungs.
1: a question, or a mild complaint
3: a clear complaint that demands an explanation
5: extreme emotion, or a refund or closure already requested
是非
Noul。把近 30 天的索賠次數放進 state,問這一次是否符合薅羊毛的特徵。回來的是概率。過不過線,代碼裡寫閾值。
[State]
{ ...state, plus claim count for 30 days... }
[Question]
Historical claims are greater than 3, and the impact of this incident is low. Does this turn match coupon farming.
代碼只收分佈
下游不再解析一段容易碎的 JSON。三種結果各自是一個數或一張表。業務條件留在函數裡。
intent = jev.choice(
state=user_state,
options=["tech_support", "feedback", "complaint", "malicious"],
)
anger = jev.score(state=user_state, rungs=5)
fraud = jev.noul(state=user_state_with_history)
def handle_coupon(intent, anger, fraud):
if fraud.p_yes >= 0.9:
return "DENY_AND_HANDOFF"
if intent.top == "complaint" and anger.expected >= 4:
return "ISSUE_50_COUPON"
return "STANDARD_APOLOGY"
模型迭代時,輸出的形狀仍是這三種。格式崩潰不再是一條故障類型。確定性沒有變成“模型永不分錯”。確定性是:分錯也分在你寫好的格子裡,分支仍然可以測試。
修辭退場
| 維度 | 生成式提示詞 | Jev |
|---|---|---|
| 手藝 | 文采、示例、格式咒語 | 拆業務、壓狀態、劃離散空間 |
| 解空間 | 開放 | 封閉:Noul / Choice / Score |
| 穩定 | 靠措辭和溫度 | 靠結構,輸出天生是分佈 |
| 調試 | 改形容詞、加語氣、補例子 | 改狀態的字段、把題目再拆正交 |
是非、單選、檔位夠當一門語言,當且僅當你把“接下來怎麼辦”拆到這三種裡。拆不開的那一截,不是這門語言的失敗,是它不該進關節。那一截留給會說話的模型,或者留給人。