AI Agent开发实战:从工具调用到自主任务规划的完整技术路线

AI Agent的三个核心能力层次

2024年到2026年,AI Agent从"技术概念"变成"可落地的产品能力"。但很多人对Agent的理解仍然模糊——"Agent"到底是什么意思?

我的定义是:Agent = LLM + 工具调用(Tool Calling)+ 任务规划(Task Planning)+ 执行循环(Execution Loop)

三个核心能力层次:

L1:工具调用(Tool Calling / Function Calling)
给LLM接入外部工具(搜索、计算器、数据库查询、代码执行),让它能"不只是生成文字,还能执行动作"。这是目前(2026年中)最成熟的Agent能力,Claude、GPT-4、Gemini都支持。

L2:任务规划(Task Planning / ReAct)
给LLM一个高层目标(如"帮我规划一次去东京的旅行,预算1万元人民币"),它能自主拆解成子任务(查签证要求→查机票价格→查酒店价格→做行程安排),并按顺序执行。

L3:自主执行循环(Autonomous Execution Loop)
L2的规划仍然是"一次性的"(规划完执行完就结束)。L3是"持续运行的"——Agent有目标,不断感知环境、做决策、执行动作、根据反馈调整,直到目标达成或用户中断。

我在2024年Q4到2026年Q2,在自己的产品里逐步集成了这三个层次的Agent能力。以下是技术实战记录。

L1实战:Tool Calling的技术实现与工程陷阱

Tool Calling(工具调用)是目前最成熟的Agent能力。核心原理是:LLM输出一个"调用某个工具的请求"(JSON格式),你的代码执行这个工具,然后把结果返回给LLM,LLM根据结果决定下一步

以Claude的Tool Calling为例:

步骤一:定义工具Schema

const tools = [
  {
    name: "search_posts",
    description: "搜索用户历史生成的AI写作记录",
    input_schema: {
      type: "object",
      properties: {
        query: { type: "string", description: "搜索关键词" },
        limit: { type: "number", description: "返回结果数量上限" }
      },
      required: ["query"]
    }
  },
  {
    name: "get_weather",
    description: "获取某个城市的天气",
    input_schema: {
      type: "object",
      properties: {
        city: { type: "string", description: "城市名称" }
      },
      required: ["city"]
    }
  }
];

步骤二:在API调用里传入工具定义

const response = await anthropic.messages.create({
  model: "claude-sonnet-4",
  max_tokens: 1000,
  tools: tools,  // 传入工具定义
  messages: [
    { role: "user", content: "帮我搜索一下我之前写过的关于React的技术博客" }
  ]
});

步骤三:解析LLM的Tool Calling请求,执行工具,返回结果

// LLM的返回可能包含tool_use内容块
const toolUseBlocks = response.content.filter(block => block.type === 'tool_use');

for (const block of toolUseBlocks) {
  const { name, input } = block;
  
  let toolResult;
  if (name === 'search_posts') {
    toolResult = await searchPosts(input.query, input.limit);
  } else if (name === 'get_weather') {
    toolResult = await getWeather(input.city);
  }
  
  // 把工具执行结果返回给LLM
  const followUpResponse = await anthropic.messages.create({
    model: "claude-sonnet-4",
    max_tokens: 1000,
    tools: tools,
    messages: [
      { role: "user", content: "帮我搜索一下我之前写过的关于React的技术博客" },
      { role: "assistant", content: response.content },
      { 
        role: "user", 
        content: [
          { type: "tool_result", tool_use_id: block.id, content: JSON.stringify(toolResult) }
        ]
      }
    ]
  });
}

工程陷阱与规避:

陷阱一:Tool Calling的"幻觉参数"
LLM可能生成"不符合input_schema"的参数(如search_posts工具要求query是string,但LLM生成了query: ["React", "Hooks"](数组)。

规避方案:在执行工具之前,用zodajv做参数校验。如果校验失败,把错误信息返回给LLM,让它修正参数后重试。

陷阱二:工具执行时间太长,导致API超时
如果某个工具需要10秒才能返回(如"生成一份10页的PDF报告"),而你的API调用设置了timeout: 30000(30秒),可能因为"LLM等待工具结果"的总时间超标而超时。

规避方案:对于执行时间长的工具,用"异步任务模式"——工具立即返回一个task_id,LLM告诉用户"任务已提交,稍后查看结果";然后后台执行任务,执行完后通过WebSocket或SSE通知客户端。

L2实战:ReAct框架与任务规划

L2的核心是让LLM做"任务规划"——把一个高层目标拆解成多个步骤,并按顺序执行。

目前最成熟的任务规划框架是ReAct(Reasoning + Acting):LLM在每一步,先"思考"(Reasoning:我应该做什么),然后"行动"(Acting:调用工具),然后根据"观察"(Observation:工具返回的结果)决定下一步。

我的实现方案(简化版):

async function runAgent(userGoal: string, maxSteps: number = 10) {
  const conversationHistory = [
    { 
      role: "system", 
      content: `你是一个AI助手,可以调用工具来完成用户的目标。
      
      在每一步,你需要:
      1. 思考:我现在的进度是什么?下一步应该做什么?
      2. 行动:调用合适的工具
      3. 观察:工具返回的结果是什么?目标达成了吗?
      
      当你认为目标已经达成时,用final_answer工具返回最终结果。`
    },
    { role: "user", content: userGoal }
  ];
  
  for (let step = 0; step < maxSteps; step++) {
    const response = await anthropic.messages.create({
      model: "claude-sonnet-4",
      max_tokens: 2000,
      tools: [...tools, finalAnswerTool],  // finalAnswerTool是一个特殊工具,表示"任务完成"
      messages: conversationHistory
    });
    
    // 把LLM的输出加入到对话历史
    conversationHistory.push({ role: "assistant", content: response.content });
    
    // 检查是否有final_answer工具调用
    const hasFinalAnswer = response.content.some(block => 
      block.type === 'tool_use' && block.name === 'final_answer'
    );
    if (hasFinalAnswer) {
      const finalAnswerBlock = response.content.find(block => 
        block.type === 'tool_use' && block.name === 'final_answer'
      );
      return finalAnswerBlock.input.answer;
    }
    
    // 执行工具调用
    const toolUseBlocks = response.content.filter(block => block.type === 'tool_use');
    for (const block of toolUseBlocks) {
      const toolResult = await executeTool(block.name, block.input);
      conversationHistory.push({
        role: "user",
        content: [{ type: "tool_result", tool_use_id: block.id, content: JSON.stringify(toolResult) }]
      });
    }
  }
  
  throw new Error("Agent执行步骤超过上限");
}

实战效果:

我给Agent的目标是:"帮我找一下我去年写过的关于AI的技术博客,然后生成一份总结,包含每篇文章的核心观点"。

Agent的执行步骤:

  1. 调用search_posts工具,查询"AI"关键词,时间范围"去年"
  2. 得到10篇文章的列表,调用read_post工具读取每篇文章的内容
  3. 调用summarize_content工具(内部调用Claude API做总结)生成每篇文章的核心观点
  4. 调用final_answer工具,返回汇总结果

这个任务如果人工做,需要约30分钟。Agent在约2分钟内完成。

L2的局限:任务规划的准确率

目前(2026年中)LLM的任务规划能力,在"清晰目标的任务"上准确率约80%,在"模糊目标的任务"上准确率约50%。

提升准确率的方法:

  1. 给LLM更多上下文:在System Prompt里提供"类似任务的成功规划示例"
  2. 用Few-shot Prompting:给LLM看2-3个"目标→规划步骤"的示例
  3. 让LLM输出"规划理由":不只是输出步骤列表,还要输出"为什么这样规划"——这能强迫LLM更认真地思考

L3实战:自主执行循环与人工监督

L3(自主执行循环)是目前最不成熟但最有前景的Agent能力。核心是Agent能持续运行,不需要用户每一步都确认

我的实战场景:"AI辅助内容营销"Agent

这个Agent的目标是:"每周自动从用户的产品使用数据里,找出值得写博客的选题,然后生成博客草稿,发送给用户审核"。

执行循环:

async function contentMarketingAgentLoop() {
  while (true) {  // 持续运行,直到用户中断
    try {
      // 步骤1:分析用户数据,找选题
      const analyticsData = await getProductAnalytics();
      const topics = await identifyBlogTopics(analyticsData);
      
      // 步骤2:生成博客草稿
      for (const topic of topics) {
        const draft = await generateBlogDraft(topic);
        
        // 步骤3:发送给用户审核(不自动发布)
        await sendDraftForReview(draft);
        
        // 步骤4:等待用户反馈
        const approval = await waitForUserApproval(draft.id);
        if (approval.approved) {
          await publishBlogPost(draft);
        }
      }
      
      // 步骤5:等待下周再执行
      await sleep(7 * 24 * 60 * 60 * 1000);  // 7天
      
    } catch (error) {
      // 出错时通知用户,但不停止循环
      await notifyUserAboutError(error);
    }
  }
}

人工监督的必要性:

L3的Agent如果完全自主运行,风险很高。我的原则是**"高级决策人工确认,低级执行Agent自主"**。

  • 需要人工确认的操作:发布博客、发送营销邮件、修改产品配置
  • 可以自主执行的操作:分析数据、生成草稿、整理资料

未来展望:2026年下半年的Agent能力演进

目前能看到几个明显的趋势:

  1. 多Agent协作:不是"一个Agent做所有事",而是"多个专业Agent协作"(如"规划Agent"负责拆解任务,"执行Agent"负责调用工具,"反思Agent"负责检查执行结果的质量)。
  2. Long-context Agent:随着LLM的上下文窗口持续扩大(Claude 4支持200K Token,GPT-4 Turbo支持128K),Agent能把更多信息放在上下文里,减少"遗忘之前步骤"的问题。
  3. Agent的可靠性和安全性提升:目前Agent的"幻觉"和"执行错误操作"的风险仍然很高。2026下半年的重点会是"如何让Agent的执行更可预测、更可控"。

结论:AI Agent不是"未来技术",而是2026年就可以落地的产品能力。独立开发者不需要自己训练Agent模型,但需要理解"如何把Tool Calling、任务规划、执行循环集成到产品中"——这是2026年独立产品竞争力的重要来源。

更多推荐