这单外卖会不会超时
实用出餐 + 骑行,算完再决定要不要提前告诉用户
调度系统里的预警层,每个订单每分钟重算一次。
为什么要快 几十万单同时在跑。这一层贵一毫秒,全局就贵一大截。
接线长什么样
判断层和计算层之间没有依赖,所以它们并行发 —— 串起来等于白花一个来回。
① 你的程序
状态一直在你这边,模型不持有任何东西
合法动作由你的代码生成,模型只在里面挑
一段话 + 选项
② 判断层 · Jett
3 个问题一次前向答完,不是问 3 次
回来的是选项 + 把握程度,不用再解析文字
② 数值 · Jett(与判断同一次请求)
需要的那个数随判断一起回来
精确值,带单位,可以逐位核对
答案 + 那个数
③ 你的程序
执行动作,世界更新
然后进入下一个 tick
往返 3 问 · 1 个数值问题
当时的情况
一段话,和你真的会拿到的一样
骑手距商家 1.2 公里,商家还要 8 分钟出餐,商家到你家 3.4 公里。骑手平均速度 18 公里/小时。承诺 30 分钟送达,现在已经过了 6 分钟。
要判断的事
一次问完,回来的是选项和把握程度,不是一段还要再解析的文字
选一个这一单的送达情况会怎样?
能准时送到会小幅超时,但在可接受范围会明显超时,需要提前告知以上都不合适
是 / 否是否应当主动发放补偿?
打个档超时风险
很低中等很高
要算的那个数
从现在起还要多久送到
- 总骑行距离4.6 km
- 骑手均速18 km/h
- 商家出餐8 min
展开这一步
#0 = 4.6 km (总骑行距离) #1 = 18 km/h (骑手均速) #2 = 8 min (商家出餐) n0 = DIV(#0, #1) n1 = ADD(@n0, #2) result = @n1
两段路程、一段等待,单位还不一样(公里、公里每小时、分钟)。这种「加起来」最容易出错的地方不是算错,是把分钟加到公里上 —— 而那会被当场拦下。
① 你的程序
状态一直在你这边,模型不持有任何东西
合法动作由你的代码生成,模型只在里面挑
一段话 + 选项
② 判断层 · Jett
3 个问题一次前向答完,不是问 3 次
回来的是选项 + 把握程度,不用再解析文字
② 数值 · Jett(与判断同一次请求)
需要的那个数随判断一起回来
精确值,带单位,可以逐位核对
答案 + 那个数
③ 你的程序
执行动作,世界更新
然后进入下一个 tick
往返 3 问 · 1 个数值问题
接进你的系统
下面就是这一页真正发出去的东西。把 state 换成你的场景、criteria 换成你的动作集, 它就是你的了。
① 判断层 —— 一次请求,3 个问题一起问
POST /v1/systemone
{
"model": "memorylake-c1",
"state": "骑手距商家 1.2 公里,商家还要 8 分钟出餐,商家到你家 3.4 公里。骑手平均速度 18 公里/小时。承诺 30 分钟送达,现在已经过了 6 分钟。",
"questions": {
"verdict": {
"type": "choice",
"instructions": "这一单的送达情况会怎样?",
"criteria": {
"on_time": "能准时送到",
"slight": "会小幅超时,但在可接受范围",
"late": "会明显超时,需要提前告知",
"other": "以上都不合适"
}
},
"needs_comp": {
"type": "noul",
"instructions": "是否应当主动发放补偿?"
},
"risk": {
"type": "score",
"instructions": "超时风险",
"criteria": [
"很低",
"中等",
"很高"
]
}
}
}回来的是 {answers: {key: {value, probs}}} ——不用再写一个解析器去猜模型想说什么, 也不用为「它这次多说了一句」写兜底。
② 需要的那个数
"从现在起还要多久送到": {
"type": "number",
"unit": "min"
}
→ { "value": ..., "unit": ..., "exact": true }数值问题和其它问题写在同一个 questions 里, 一次请求一起答完。返回的 exact: true 表示 这个值可以直接拿去跟阈值比大小。