AI Agent开发实战:从工具调用到自主任务规划的完整技术路线
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"](数组)。
规避方案:在执行工具之前,用zod或ajv做参数校验。如果校验失败,把错误信息返回给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的执行步骤:
- 调用
search_posts工具,查询"AI"关键词,时间范围"去年" - 得到10篇文章的列表,调用
read_post工具读取每篇文章的内容 - 调用
summarize_content工具(内部调用Claude API做总结)生成每篇文章的核心观点 - 调用
final_answer工具,返回汇总结果
这个任务如果人工做,需要约30分钟。Agent在约2分钟内完成。
L2的局限:任务规划的准确率
目前(2026年中)LLM的任务规划能力,在"清晰目标的任务"上准确率约80%,在"模糊目标的任务"上准确率约50%。
提升准确率的方法:
- 给LLM更多上下文:在System Prompt里提供"类似任务的成功规划示例"
- 用Few-shot Prompting:给LLM看2-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能力演进
目前能看到几个明显的趋势:
- 多Agent协作:不是"一个Agent做所有事",而是"多个专业Agent协作"(如"规划Agent"负责拆解任务,"执行Agent"负责调用工具,"反思Agent"负责检查执行结果的质量)。
- Long-context Agent:随着LLM的上下文窗口持续扩大(Claude 4支持200K Token,GPT-4 Turbo支持128K),Agent能把更多信息放在上下文里,减少"遗忘之前步骤"的问题。
- Agent的可靠性和安全性提升:目前Agent的"幻觉"和"执行错误操作"的风险仍然很高。2026下半年的重点会是"如何让Agent的执行更可预测、更可控"。
结论:AI Agent不是"未来技术",而是2026年就可以落地的产品能力。独立开发者不需要自己训练Agent模型,但需要理解"如何把Tool Calling、任务规划、执行循环集成到产品中"——这是2026年独立产品竞争力的重要来源。
更多推荐
所有评论(0)