问题
你在做一个浏览器 agent(自己在网页上操作的程序):给它一个目标,比如「把这本书加进购物车」,它每一步问 Jev「下一步该点哪个按钮」,Jev 从页面上的按钮里选一个,代码去点。一步 300 毫秒,几十步就能完成一个任务。
很快你发现一个毛病:任务明明已经完成了,它还在点。书已经在购物车里了,它又点了一次「加入购物车」,数量变成两本。
你想到一个自然的修法:执行之前再问一句「目标达成了吗」。为了让它判得准,你把刚选好的动作也放进去:「我准备点加入购物车,目标达成了吗?」结果没变。翻记录你才明白:第二道题看见了第一道的答案,只会替它辩护 —— 刚说了要点购买,它就不会承认任务已经完成。
解决方案
盲审模式说:复核题和主问题放在同一次请求里,但它只看页面 —— 不看主问题,更不看主问题的答案。
所以复核题只问页面上的事实,一个动作都不提:「就这个页面看,目标是不是已经达成了」「最近三步是不是毫无进展」。写题的时候刻意不让「准备点什么」这类字眼出现。
你的代码先读复核题,再读主答案。目标达成了就收工,卡住了就交给人;两样都没有,才去点主问题选中的那个按钮。闸门在动作前面。
问 · 答 · 拍
- 问把页面文字和按钮列表放进去,一次问三件事:下一步点哪个、就这个页面看目标是不是已经达成、最近三步有没有进展。
- 答点「加入购物车」0.62(几个按钮里最像的那个,不代表有把握);目标达成 0.91;卡住 0.08。
- 拍目标达成那道过了 0.85,收工,不点。
名字从哪来
论文盲审。审稿人不知道作者是谁,也看不到编辑的意见,所以他的意见才算数。要是先把编辑那句「我打算录用」给他看,十个审稿人有九个会同意。
什么时候用
主答案会触发一个动作(点击、提交、停止),而且页面上有一个不知道动作也能判断的事实:目标达成了、卡住了、路被堵了、这一块真的有匹配。
什么时候别用
复核题和主问题其实是一个意思。「实现完成了吗」「需求满足了吗」「可以收工了吗」三道一起要求通过,不是三重保险,是同一个数问了三遍。
做这件事的项目
- jev-browser — 由 TypeSafe 的 Jev 模型驱动的快速、低成本浏览器自动化。
- foreman — 使用决策模型的智能体监督者与软件工厂工头。
- jev-axi — 为 TypeSafe 的 Jev 提供的 CLI:从 shell 快速获得校准判断。
看谁的代码
- jev-browser
src/questions.ts:10-24注释里直接写着:这三道题互相看不见答案,正因如此,「目标达成了吗」才是对「该点哪个」的诚实复核。
- jev-browser
src/navigate.ts:436-441闸门本身:先读「目标达成了吗」和「卡住了吗」,再决定要不要执行选中的动作。
- foreman
src/foreman/policy.py:21-127收工要三道独立的题一起同意;「卡住了吗」和「有进展吗」是刻意配成的一对反问。
想看代码
const { answers } = await jev(state, {
action: choice("下一步该点哪个?", buttons),
goal_done: noul("就这个页面看,目标是不是已经达成了?"),
stuck: noul("最近三步是不是毫无进展?"),
});
if (answers.goal_done.p >= 0.85) return done(); // 复核题先说话
if (step > 2 && answers.stuck.p >= 0.8) return escalate();
click(answers.action.choice); // 然后才轮到主答案jevbooks 怎么认出它
我们怎么知道一个项目用没用这一招?拿它的 README 问 Jev 一句话,Jev 给个百分比,数字越高说明越像。你要抄这道题,记住一点:别问「这个项目好不好」,要问「有没有讲到这一件具体的事」。
{
"cross-check": {
"type": "noul",
"instructions": {
"what": "Does the text describe a second question that independently verifies the main answer, such as goal_done or stuck alongside the action choice?",
"not_for": "A single question, or verification done by code rather than by another question."
},
"criteria": {
"true": "The text explicitly describes this. One sentence is enough; other content does not cancel it.",
"false": "The text does not describe this."
}
}
}