jevbooks

← 全部设计模式

代笔

判断与生成分离 · Ghostwriter

Jev 点头,字另外找人写

让 Jev 决定做什么、对谁做;只有真需要写一句话的那一步,才叫会写字的模型出场。

LLM「paris」校验

问题

你的浏览器 agent(自己在网页上操作的程序)第一版只会点:Jev 选第几个元素,代码去点,一步 300 毫秒,四十步的任务半分钟跑完。

第二版要往搜索框里打字 —— 而 Jev 不写字。它只在你给的选项里挑,从不交回一串自己编的文字。最顺手的改法是整条链路换成大模型:反正它会写,就顺便让它把「点哪里」也定了。

换完你会发现三件事一起变差:每步从 300 毫秒变成 2 秒,每步从千分之一美分变成几美分,而且它交回来的又是那种代码没法校验的东西。为了一步要打字,你把另外十六步都赔了进去。

解决方案

代笔模式说:把每一步拆成「决定」和「写字」两件事,只有落到真需要写字的那条分支,才请代笔出场。

Jev 照旧回答这一步做哪种操作、对哪个元素做。只有当答案是「打字」,才把字段名和目标交给一个小的写字模型,让它写出要填的那几个字。十七步的任务里,通常只有一两步会走到这儿。

代笔交回来的东西要过一遍检查:只有一个文本字段、不为空、不超长。它写砸了或者超时了,就退回一个笨办法 —— 直接用目标里的关键词 —— 并在记录里写明这句话是哪条路产出的。代笔死了,不能把整个任务弄死。

问 · 答 · 拍

  1. 把目标、页面和能填的字段放进去,一次问两件事:这一步做哪种操作;如果是打字,打在哪个字段里。
  2. 操作选「打字」0.88,字段选搜索框 0.79。
  3. 既然是打字,就请代笔写出要填的字,检查一遍不为空也不超长,再填进去。

名字从哪来

代笔。主意始终是你的 —— 见谁、答应什么、拒绝什么。只有落到纸面上那几句漂亮话,请别人写。写手改不了你的决定,写砸了拿主意的人也还是你。

什么时候用

动作能列成一张清单,但其中一两个动作需要一段自由文本:字段值、提交信息、工具参数。

什么时候别用

整件事就是写东西(写文章、写邮件)—— 那是大模型的活,Jev 顶多在写完之后审一道。或者要填的文字本来就在材料里:让 Jev 把那一段挑出来,代码原样复制。

做这件事的项目

  • jev-ultrafast — 由 Jev 决定每一步操作与元素的浏览器智能体。
  • jev-browser — 用 Jev 逐步决策的快速、低成本浏览器自动化。
  • foreman — 使用 Jev 监督编码工人的软件工厂工头。

用这种模式的全部项目 →

看谁的代码
想看代码
const { answers } = await jev(state, {
  op:            choice("这一步做哪种操作?", ops),
  "type.target": choice("如果是打字,填在哪个字段?", fields),
});
if (answers.op.choice !== "type") return act(answers);   // 这一步没有字要写
let text, via = "writer";
try { text = TextSchema.parse(await smallLlm({ field, goal })).text; }
catch { text = keywordFrom(goal); via = "fallback"; }    // 写手挂了,判断没挂
trace.push({ step, via });
await typeInto(answers["type.target"].choice, text);
jevbooks 怎么认出它

我们怎么知道一个项目用没用这一招?拿它的 README 问 Jev 一句话,Jev 给个百分比,数字越高说明越像。你要抄这道题,记住一点:别问「这个项目好不好」,要问「有没有讲到这一件具体的事」。

questions.json · 每份 README 都发这道题
{
  "decide-generate-split": {
    "type": "noul",
    "instructions": {
      "what": "Does the text describe Jev choosing the action or target while a separate text model writes any free text (a typed value, a message, a tool argument), with Jev never producing text?",
      "not_for": "Projects that use only Jev, or a single LLM that both decides and writes."
    },
    "criteria": {
      "true": "The text explicitly describes this. One sentence is enough; other content does not cancel it.",
      "false": "The text does not describe this."
    }
  }
}

用 Jev 做一个 →