JEV - 告别提示词诗学:封闭题怎么设计

是非、单选和档位够当一门语言,前提是把业务拆成互不干扰的封闭题,并把状态压过故事。券发不发,留给代码里的阈值。

JEV - 告别提示词诗学:封闭题怎么设计

联合作者:folkbench.com (Folkbench 是面向 AI API、模型服务及相关站点的可复核评测与选择平台,依据已发布的服务资料、价格、可用性、延迟与证据窗口,帮助用户比较并选择使用路径。)

这一组共十篇:

前半场的提示词像诗学。为了稳定拿到一个 JSON,人们写角色、写恐吓、写示例、写 XML。那是在无限的 token 组合里围堵。Jev 把围堵取消了。解空间在推理之前就收拢。你要设计的不是一句更好的咒语,是一份状态,加上几道互不干扰的封闭题。是非、单选、档位够不够当语言,取决于你肯不肯把业务拆到这三种形状里。

从围堵到问卷

[ 生成式 ]
提示词(角色、示例、格式约束) → 无限 token → 一段可能漂走的文本

[ Jev ]
state + 封闭题(Noul / Choice / Score) → 有限集合 → 一张分布

三种题把能问的话说死:

  1. 是非,Noul。要的是“是”的概率,用来卡一个临界。代码里再决定过不过阈值。它不是空值。
  2. 单选,Choice。选项事先给死,最多 255 项。每一项后面写清指什么。用来做意图和路由。
  3. 档位,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": "功能崩溃,数据丢失"},
    {"role": "agent", "intent": "apology", "content": "正在修复"},
    {"role": "user", "intent": "churn_explicit", "content": "询问退款,并说停止使用"}
  ]
}

原始对话可以留一句原文,但意图和影响要单独放出来。模型读的是一棵状态,不是一篇作文。

一道业务题拆成三问

“要不要发 50 元券”不是一道封闭题。里面叠了意图、火气、欺诈和成本。Jev 里一步到位会失败。拆成三道正交的题,券的政策留给代码。

state ─┬─ Choice  主意图
       ├─ Score   负面程度,1 到 5 档
       └─ Noul    像不像薅羊毛

意图

单选。解空间写成:纯技术咨询、产品建议、故障投诉、恶意索赔。题干只问这一次交互的主意图,不问该不该赔。

[State]
{ ...已压缩的状态... }

[Question]
根据对话,这次交互的主意图是哪一类。

程度

档位。1 是疑问或轻微不满,3 是明确不满并要求解释,5 是极端情绪或已经提出退款、销户。不要只丢一个“1 到 5”给它。每一档写成情形。

[State]
{ ...已压缩的状态... }

[Question]
按下面的档评估负面程度。
1:疑问或轻微不满
3:明确不满,要求解释
5:极端情绪,或已经提出退款、销户

是非

Noul。把近 30 天的索赔次数放进 state,问这一次是否符合薅羊毛的特征。回来的是概率。过不过线,代码里写阈值。

[State]
{ ...状态,加上近 30 天索赔次数... }

[Question]
历史索赔次数大于 3,且这次故障影响为低。这一次是否符合薅羊毛特征。

代码只收分布

下游不再解析一段容易碎的 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
稳定 靠措辞和温度 靠结构,输出天生是分布
调试 改形容词、加语气、补例子 改状态的字段、把题目再拆正交

是非、单选、档位够当一门语言,当且仅当你把“接下来怎么办”拆到这三种里。拆不开的那一截,不是这门语言的失败,是它不该进关节。那一截留给会说话的模型,或者留给人。

系列