菜谱是 4 人份,我要做 6 人份
实用面粉按比例放大,烤箱时间不能
智能烤箱和菜谱 App 里的换算层。
为什么要快 手上沾着面。这种事不值得等一次云端往返。
接线长什么样
判断层和计算层之间没有依赖,所以它们并行发 —— 串起来等于白花一个来回。
① 你的程序
状态一直在你这边,模型不持有任何东西
合法动作由你的代码生成,模型只在里面挑
一段话 + 选项
② 判断层 · Jett
3 个问题一次前向答完,不是问 3 次
回来的是选项 + 把握程度,不用再解析文字
② 数值 · Jett(与判断同一次请求)
需要的那个数随判断一起回来
精确值,带单位,可以逐位核对
答案 + 那个数
③ 你的程序
执行动作,世界更新
然后进入下一个 tick
往返 3 问 · 1 个数值问题
当时的情况
一段话,和你真的会拿到的一样
菜谱写的是 4 人份:面粉 250 克,黄油 120 克,烤箱 180℃ 烤 25 分钟。今天要做 6 人份,用的是同一个烤盘,所以饼坯会更厚。
要判断的事
一次问完,回来的是选项和把握程度,不是一段还要再解析的文字
选一个烤的时间应该怎么调?
也按 1.5 倍放大到 37 分钟保持 25 分钟不变略微延长,并靠观察上色判断以上都不合适
是 / 否是否应该换一个更大的烤盘?
打个档失败(夹生或烤过)的风险
很小有一些很大
要算的那个数
6 人份要用多少面粉
- 4 人份面粉250 g
- 目标人数6
- 原始人数4
展开这一步
#0 = 250 g (4 人份面粉) #1 = 6 (目标人数) #2 = 4 (原始人数) n0 = DIV(#1, #2) n1 = MUL(#0, @n0) result = @n1
配料按比例放大是算术,而烤箱时间不按比例 —— 把两者分开的前提是那个比例先被准确算出来。
① 你的程序
状态一直在你这边,模型不持有任何东西
合法动作由你的代码生成,模型只在里面挑
一段话 + 选项
② 判断层 · Jett
3 个问题一次前向答完,不是问 3 次
回来的是选项 + 把握程度,不用再解析文字
② 数值 · Jett(与判断同一次请求)
需要的那个数随判断一起回来
精确值,带单位,可以逐位核对
答案 + 那个数
③ 你的程序
执行动作,世界更新
然后进入下一个 tick
往返 3 问 · 1 个数值问题
接进你的系统
下面就是这一页真正发出去的东西。把 state 换成你的场景、criteria 换成你的动作集, 它就是你的了。
① 判断层 —— 一次请求,3 个问题一起问
POST /v1/systemone
{
"model": "memorylake-c1",
"state": "菜谱写的是 4 人份:面粉 250 克,黄油 120 克,烤箱 180℃ 烤 25 分钟。今天要做 6 人份,用的是同一个烤盘,所以饼坯会更厚。",
"questions": {
"time": {
"type": "choice",
"instructions": "烤的时间应该怎么调?",
"criteria": {
"scale": "也按 1.5 倍放大到 37 分钟",
"keep": "保持 25 分钟不变",
"extend": "略微延长,并靠观察上色判断",
"other": "以上都不合适"
}
},
"bigger_pan": {
"type": "noul",
"instructions": "是否应该换一个更大的烤盘?"
},
"risk": {
"type": "score",
"instructions": "失败(夹生或烤过)的风险",
"criteria": [
"很小",
"有一些",
"很大"
]
}
}
}回来的是 {answers: {key: {value, probs}}} ——不用再写一个解析器去猜模型想说什么, 也不用为「它这次多说了一句」写兜底。
② 需要的那个数
"6 人份要用多少面粉": {
"type": "number",
"unit": "g"
}
→ { "value": ..., "unit": ..., "exact": true }数值问题和其它问题写在同一个 questions 里, 一次请求一起答完。返回的 exact: true 表示 这个值可以直接拿去跟阈值比大小。