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

球队打到季后赛,主力再强也要引外援:缺射手签射手,缺中锋签中锋。Agent 也一样——大模型自己不会查天气、不会看股价,但它会「请外援」:调用外部工具。

外援怎么请?原理一句话:AI 在回答里喊「暗号」(约定好的格式),你的代码看到暗号就替它去办,把结果塞回去,它接着往下说。

🏃 训练动作 1:请第一个外援「本地知识搜索」(15 分钟) 我们在第 19 课的 loop.js 基础上加一个「查词典」外援。新建 tools.js

const key = process.env.DEEPSEEK_API_KEY;
const dictionary = {  // 外援1号:一个迷你维汉词典(真实项目里换成数据库)
  "你好": "ياخشىمۇسىز (yaxshimusiz)",
  "谢谢": "رەھمەت (rehmet)",
  "再见": "خەير خوش (xeyr xosh)"
};
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 })
  });
  return (await res.json()).choices[0].message.content;
}
async function agent(word) {
  const messages = [{ role: "user", content:
    "用户想查「" + word + "」的维语说法。如果你需要查词典,请只回复一行暗号:LOOKUP:" + word }];
  const reply = await ask(messages);
  if (reply.startsWith("LOOKUP:")) {                     // 听到暗号
    const found = dictionary[word] || "词典里暂缺这个词";
    const final = await ask([{ role: "user", content:
      "词典返回:" + found + "。请用这个结果友好地回答用户,并附一个例句。" }]);
    return final;
  }
  return reply;
}
agent("谢谢").then(console.log);

🏃 训练动作 2:跑并实验(10 分钟)

node tools.js

✅ 验收:输出了基于词典的回答。再把 agent("谢谢") 改成 agent("再见")agent("多少钱"),观察「词典有」和「词典缺」两种情况下它的不同表现。

看懂这三行,外援原理就通了:约定暗号格式 → 代码检测暗号 → 结果塞回去再问一次。真实世界的搜索插件、数据库查询、支付接口,全是这个套路的放大版。

请外援的两条军规:① 暗号格式要在提示词里写死(第 8 课的「要求」);② 外援返回的结果要当「不可信输入」处理,别直接展示给用户,让 AI 转述一道更安全。

口诀:暗号一喊,外援上场;结果回传,接着进攻。

金句:一个人走得快,一队外援才走得远。