赛区:职业赛 · 第 19 课 | 前置:第 7、11 课 | 成本:约 0.05 元

每个球星都有一个招牌动作:艾弗森的变向、库里的急停三分。动作拆开都不复杂,复杂的是练一万次。

Agent 的招牌动作,拆开也只有三件事:调用(问 AI)→ 判断(看结果)→ 循环(不行再来)。第 11 课你懂了原理,今天把它写成代码——30 行,Agent 的心脏。

🏃 训练动作 1:抄下「心脏」(10 分钟) 在 my-agent 新建 loop.js

const key = process.env.DEEPSEEK_API_KEY;
async function ask(messages) {
  const res = await fetch("https://api.deepseek.com/chat/completions", {
    method: "POST",
    headers: { "Authorization": "Bearer " + key, "Content-Type": "application/json" },
    body: JSON.stringify({ model: "deepseek-chat", messages })
  });
  const data = await res.json();
  return data.choices[0].message.content;
}
async function agent(task) {
  const messages = [{ role: "user", content: task }];
  for (let round = 1; round <= 3; round++) {                    // 循环:最多 3 圈
    const draft = await ask(messages);                          // 调用:AI 出招
    const review = await ask([                                  // 判断:让 AI 自查
      { role: "user", content: "检查下面这段内容是否有事实错误或不完整,只回答「合格」或「不合格:原因」:\n" + draft }
    ]);
    console.log("第" + round + "圈自查:" + review.slice(0, 30));
    if (review.includes("合格") && !review.includes("不合格")) return draft;  // 合格→输出
    messages.push({ role: "assistant", content: draft });
    messages.push({ role: "user", content: "上次的问题:" + review + ",请修正后重新输出。" });
  }
  return "3 圈后仍未完全合格,请人工检查最后一版:\n" + draft;
}
agent("写一段 100 字的赛里木湖旅游推荐,给第一次去新疆的人看").then(console.log);

🏃 训练动作 2:跑并观察(5 分钟)

node loop.js

✅ 验收:看到「第 1 圈自查:……」字样,最终输出一段推荐文案。多跑两次,观察有时 1 圈过关、有时要 2 圈。

刚才发生了什么:你的程序第一次自己决定「要不要再试一次」——不再是你盯着屏幕当裁判,是代码里的循环在临场指挥。这就是第 11 课的循环,活了。

诚实说明:让 AI 自查只是最简单的判断方式,会漏错;职业做法还会加规则校验(比如必须包含某个词)。但骨架你已经有了,以后都是往上贴肉。

口诀:调用出招,判断把关,循环兜底。

金句:招牌动作的秘密从来不是复杂,是把简单练到不假思索。