架构模式,附可运行代码
四个套路覆盖了大多数人用 Jev 做的事。统一的思想:把大判断拆成原子问题,组合逻辑留在你的代码里。每个模式下面给出形状、适用时机,主力模式还给了真代码。
1. 投机式扇出
把你可能需要的每个问题一次发出去——包括最后可能忽略的——让代码挑相关的。因为问题并行、几分钱,宁多勿少。13 合 1 的基准(比 13 次便宜 12.2 倍)就是"过度提问是特性而不是浪费"的经济学依据。
2. 置信门控路由 主力
把置信度当成第二决策轴。高 → 自动执行;中 → 请人确认;低 → 转人工。阈值按风险档设:只读操作 0.5 就能跑;涉及钱或不可逆的操作要 0.9+。一个对挪威法院信函的第三方测试发现:模型答错的题,正是它报告置信度最低的题——不确定性信号在干实事。
from typesafe import TypeSafeClient
import logging
client = TypeSafeClient() # 读 TYPESAFE_API_KEY
log = logging.getLogger("jev.gate")
# 风险档 -> 自动执行的最低置信度
THRESHOLDS = {"readonly": 0.50, "write": 0.80, "money": 0.95}
def gate(action_risk: str):
"""返回 (decision, tier),decision ∈ {"auto","confirm","human"}"""
a = client.system_one(
state=STATE,
questions={
"safe": {"type": "noul",
"instructions": "Is this state safe to act on now?"},
"intent": {"type": "choice",
"instructions": "Primary intent",
"criteria": {"refund": "Asks for money back",
"status": "Asks for status",
"other": "Something else"}},
},
)
p_yes = a.answers["safe"]["noul"]
p_top, top = max(a.answers["intent"]["probabilities"].items(), key=lambda kv: kv[1])
conf = a.answers["intent"]["confidence"]
tier = THRESHOLDS.get(action_risk, 0.80)
# "不安全"判断永远优先,不论风险档
if p_yes < 0.50:
return "human", "unsafe"
if conf >= tier:
log.info("AUTO %s conf=%.2f", top, conf)
return "auto", top
if conf >= tier * 0.8:
return "confirm", top
log.warning("ESCALATE %s conf=%.2f", top, conf)
return "human", top
为什么 0.8× 区间?它给你一个软性的"也许"带,而不是一堵硬悬崖。
tier 要按动作单独调,不要全局一个值。并且把一切记日志——低置信度的升级请求就是你调阈值的免费评测集。3. 复合打分
把一个复杂评级拆成多个 Score 问题(如 bug 严重度 × 客户情绪 × 可复现性),然后在代码里按权重合成。好处:调权重改源码里的数字就行,不用重新写 prompt,而且每个维度仍可解释。
4. 意图路由
先用 Choice 分类用户意图,再路由到确定性代码 / 专家 LLM / 人工。收益是:绝大多数简单请求根本不碰贵模型——Jev 是你 LLM 预算前面那道便宜的初筛。
四个模式的共同设计规则:Jev 只判断,不算数。问题里不要算术、数数、比日期——那些在代码里做,需要的话把结果作为新字段塞回 state。见 已知短板。