模块二 · 动力核心

Agent 执行循环、工具调用与 MCP / Skills 协议

Agent 是如何“一步一步把活干完”的?本章拆解 ReAct 经典循环骨架、参数校验防御性编程、新一代标准化 MCP 协议,以及技能的渐进式披露设计。

1
Agent Loop:让大模型成为图灵机

传统的 LLM 是一问一答;而 Agent 则运行在一个由代码控制的 while 循环 中,直到任务彻底完成或达到安全边界。最经典也是工业界最常用的循环范式是 ReAct (Reasoning + Acting)。

typescript - 标准生产级 ReAct Agent Loop 骨架
interface Message {
  role: 'system' | 'user' | 'assistant' | 'tool';
  content?: string;
  tool_calls?: ToolCall[];
  tool_call_id?: string;
}

async function runAgentLoop(userPrompt: string, tools: ToolDefinition[], maxIterations = 10) {
  const messages: Message[] = [
    { role: 'system', content: 'You are an autonomous AI Agent with Tool Use capability.' },
    { role: 'user', content: userPrompt }
  ];

  let iterations = 0;
  while (iterations < maxIterations) {
    iterations++;
    console.log(`[Harness Loop] 第 ${iterations} 轮推理...`);

    // 1. 调用模型获取回复
    const response = await callLLM({ messages, tools });
    messages.push(response.message);

    // 2. 检查模型是否决定调用工具
    if (!response.message.tool_calls || response.message.tool_calls.length === 0) {
      // 模型没有调用工具,说明已推理完毕,输出最终答案
      console.log("[Harness Loop] 任务完成,返回最终结果。");
      return response.message.content;
    }

    // 3. Harness 依次执行工具调用 (防御性执行与安全沙盒)
    for (const toolCall of response.message.tool_calls) {
      console.log(`[Tool Dispatch] 执行工具: ${toolCall.function.name}`);
      const result = await executeToolSafely(toolCall.function.name, toolCall.function.arguments);
      
      // 4. 将执行观测结果回传给上下文,供模型下一步决策
      messages.push({
        role: 'tool',
        tool_call_id: toolCall.id,
        content: JSON.stringify(result)
      });
    }
  }

  throw new Error("超出最大安全循环轮数 (Max Iterations Exceeded),防止死循环消耗 Token!");
}
⚠️ 工业级经验法则:死循环三道防线
  • 最大迭代次数硬限制 (Max Loop Cap):生产环境必须设置上限(如 10~15 轮),不可用 while(true)。
  • Token 累计消耗熔断:如果单次任务累积消耗超过设定预算(如 50,000 tokens),直接中断并通知人工。
  • 重复调用检测 (Ping-Pong Detection):当模型连续 3 次传入完全一样的工具名称和参数,判断其陷入死锁,Harness 必须注入强制干预 Prompt。
2
交互式实战:ReAct 循环步进模拟器

假设用户提出复杂复合问题:“查询英伟达 (NVDA) 当前股价,并计算折算为 5000 欧元能买多少股整股?”
点击下方“单步执行”按钮,观察 Harness 内部的思维与状态流转:

🔄 ReAct 步进执行器 (Step-by-Step Simulator)
Step 1 · LLM 思考 (Thought)
LLM 推理: 用户想知道 5000 欧元能买多少股 NVDA。我需要两步:1. 获取 NVDA 的实时美元股价;2. 获取 USD/EUR 汇率换算,然后整除。先查股价。
Step 2 · 生成工具调用 (Action)
Tool Call 发起: get_stock_price({ ticker: "NVDA" })
Step 3 · Harness 执行与观测 (Observation)
模拟 API 返回: { ticker: "NVDA", price_usd: 125.00, currency: "USD", timestamp: "2026-11-08" }
Step 4 · 第二轮思考与调用 (Thought & Action)
LLM 推理: 获得股价 125 美元。现在需要将 5000 欧元转换为美元,需要调用汇率换算工具。
Tool Call 发起: convert_currency({ from: "EUR", to: "USD", amount: 5000 })
Step 5 · 汇率观测 (Observation)
模拟 API 返回: { from: "EUR", to: "USD", original: 5000, converted: 5400.00, rate: 1.08 }
Step 6 · 终审生成答案 (Final Answer)
最终回复用户: 5000 欧元按当前汇率 (1.08) 可兑换 5400.00 美元。当前 NVDA 股价为 125.00 美元/股。 计算:5400 / 125 = 43.2 股。因此,5000 欧元最多可购买 43 股 NVDA 整股,剩余 25 美元现金。
当前状态:等待开始 (0/6)
3
Tool Use 核心:契约化 Schema 与防御性执行

工具调用参数常以 JSON 字符串或结构化对象返回,格式取决于模型 API。JSON Schema 描述契约;执行端仍需解析、验证和授权,不能假定模型保证参数正确。

初学者脆弱写法 (Crash & Burn)
// 粗暴的 JSON.parse
const args = JSON.parse(toolCall.arguments);
// 如果模型少填参数、填错类型,直接抛出未捕获异常
const res = await db.query(args.sql); // 💥 甚至可能引发 SQL 注入!
Harness 工业级防御写法 (Self-Healing)
// 本例假设 API 返回 JSON 字符串;不同 API 的格式可能不同
let args;
try { args = JSON.parse(toolCall.arguments); }
catch { return { error: "参数不是有效 JSON" }; }
const parseResult = StockSchema.safeParse(args);
if (!parseResult.success) {
  // 把校验错误格式化回传给模型,提示其自动修复参数!
  return { error: "参数不合规", details: parseResult.error.format() };
}
// 此处还需检查调用者权限、执行超时等
const res = await safeExecutor(parseResult.data);
4
行业新标准:Anthropic MCP 与 Skills 动态加载

在候选人的技术栈中,特别强调了 MCP (Model Context Protocol) 与 Skills。这是 2024~2026 年 Agent 领域的重大变革:

🔌 什么是 MCP (Model Context Protocol)?

在过去,每个 Agent 框架都要自己写一套连接 GitHub、Slack、本地文件的插件代码,互不通用。MCP 是 Anthropic 主导的开放协议,被誉为 “AI 工具界的 Type-C 接口”。它通过标准 JSON-RPC 2.0,将工具 (Tools)、资源 (Resources) 和提示词模板 (Prompts) 标准化。支持 MCP 的 Host 可对接兼容版本和能力的 Server;实际仍需考虑传输、认证、授权与功能支持。

💡 Skills 机制与渐进式上下文披露 (Progressive Disclosure)

如果系统有 200 个工具,是否应该把 200 个工具的完整定义全部塞进每一次调用的 Prompt 里?

5
本章知识通关自测
1. [单选] 在 Harness 执行 Tool Use 过程中,如果模型生成的参数不符合 Schema 规范,最规范的做法是什么?
上一章 ← 1. 什么是 Agent Harness 下一章 3. 上下文工程、KV Cache 意识与长期记忆 →