Agent 是如何“一步一步把活干完”的?本章拆解 ReAct 经典循环骨架、参数校验防御性编程、新一代标准化 MCP 协议,以及技能的渐进式披露设计。
传统的 LLM 是一问一答;而 Agent 则运行在一个由代码控制的 while 循环 中,直到任务彻底完成或达到安全边界。最经典也是工业界最常用的循环范式是 ReAct (Reasoning + Acting)。
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!");
}
while(true)。
假设用户提出复杂复合问题:“查询英伟达 (NVDA) 当前股价,并计算折算为 5000 欧元能买多少股整股?”
点击下方“单步执行”按钮,观察 Harness 内部的思维与状态流转:
get_stock_price({ ticker: "NVDA" })
{ ticker: "NVDA", price_usd: 125.00, currency: "USD", timestamp: "2026-11-08" }
convert_currency({ from: "EUR", to: "USD", amount: 5000 })
{ from: "EUR", to: "USD", original: 5000, converted: 5400.00, rate: 1.08 }
工具调用参数常以 JSON 字符串或结构化对象返回,格式取决于模型 API。JSON Schema 描述契约;执行端仍需解析、验证和授权,不能假定模型保证参数正确。
// 粗暴的 JSON.parse
const args = JSON.parse(toolCall.arguments);
// 如果模型少填参数、填错类型,直接抛出未捕获异常
const res = await db.query(args.sql); // 💥 甚至可能引发 SQL 注入!
// 本例假设 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);
在候选人的技术栈中,特别强调了 MCP (Model Context Protocol) 与 Skills。这是 2024~2026 年 Agent 领域的重大变革:
在过去,每个 Agent 框架都要自己写一套连接 GitHub、Slack、本地文件的插件代码,互不通用。MCP 是 Anthropic 主导的开放协议,被誉为 “AI 工具界的 Type-C 接口”。它通过标准 JSON-RPC 2.0,将工具 (Tools)、资源 (Resources) 和提示词模板 (Prompts) 标准化。支持 MCP 的 Host 可对接兼容版本和能力的 Server;实际仍需考虑传输、认证、授权与功能支持。
如果系统有 200 个工具,是否应该把 200 个工具的完整定义全部塞进每一次调用的 Prompt 里?
Skills 概览目录(每项仅一行名字和简述);当且仅当模型判断当前任务需要该 Skill 时,Harness 才动态拉取该 Skill 的详细说明和子工具。这就是简历中所体现的高阶架构思维!