AI Agent从原理到实践:手写一个能自主调用工具的智能体

📅 发布时间:2026/8/30 14:55:37
AI Agent从原理到实践:手写一个能自主调用工具的智能体 最近一段时间AI 圈最明显的一个变化是大家不再讨论“哪个大模型更会聊天”而是开始讨论“哪个 Agent 能真正帮我完成一整套任务”。从“我问你答”的对话式助手到“你负责思考我负责执行”的自主智能体AI 的工作方式正在发生一次底层切换。换句话说AI 不再只是听命令的“问答机器”它开始自己拆解目标、选择工具、检查结果出了问题还会自己重试。这篇文章想聊清楚几件事Agent 和普通对话机器人到底差在哪里一个能“自己干活”的 Agent 内部是怎么运转的如果你想在自己的项目里落地一个最小可用的 Agent应该从哪里开始又会遇到哪些坑。1. 这篇文章真正要解决的问题很多人对 Agent 的第一印象是“能自动写代码的编程助手”。但这个理解太窄了。Agent 的重点不是“生成文本”而是“完成任务”。举个例子。传统聊天机器人收到“帮我查一下上海明天适合穿什么衣服”它只能根据训练数据里的知识或者上下文里的天气信息给你一段通用建议。但如果换成一个 Agent同样的请求它会先调用天气 API拿到明天的温度和降水概率再结合“体感温度”“是否需要带伞”这些判断最终给你一个可执行的结论。这个过程的差异不在“模型变聪明了”而在“系统结构变了”。普通对话是一条直线用户输入 - 模型输出。Agent 是一条回路用户输入 - 模型规划 - 调用工具 - 观察结果 - 模型再判断 - 继续执行直到完成。所以这篇文章真正想解决的是三个问题理解 Agent 的核心机制它为什么能“自己干活”靠的到底是模型能力还是工程结构。跑通一个最小的 Agent 项目不依赖复杂框架用最少的代码实现“调用工具-观察结果-继续执行”的闭环。避开落地 Agent 时最常见的坑工具调用不稳定、上下文爆炸、安全边界模糊、成本失控这些问题是绝大多数项目都会遇到的。如果你正在做 AI 应用开发或者准备把大模型能力接入真实业务这篇文章适合你。如果你只是好奇 Agent 是什么也能从概念和示例里得到一个清晰的判断。2. Agent 的核心概念LLM 是大脑Agent 是身体不要被“智能体”这个名字吓到。Agent 本质上是一个以大模型为决策核心通过工具与环境交互并逐步完成任务目标的系统。这里的关键词有两个决策和工具。大模型本身不具备真实世界的行动能力。它能做的只是根据输入的 token 预测下一个 token。但当我们给大模型提供一些“工具”比如搜索接口、代码执行器、数据库查询、文件读写并且允许它根据任务目标自主选择调用哪些工具时它就从一个“文本生成器”变成了一个“任务执行者”。可以用一个更直观的类比来理解大模型像一个知识渊博但手脚不便的专家靠脑子思考。工具像专家面前的电脑、电话、文件柜是他完成工作的辅助手段。Agent把这套“专家 工具 工作流程”组装起来的整体系统。所以Agent 并不只是“大模型 工具”的简单相加。它还需要一套机制来决定“用哪个工具”“什么时候用”“用完工具之后下一步做什么”。这套机制通常包含四个模块模块作用通俗解释规划Planning把大目标拆解成小步骤就像你写周报前先列一个提纲记忆Memory保存上下文、历史结果、长期知识就像你有工作笔记也有长期经验库工具调用Tool Use执行外部动作如查 API、写文件就像你拿起手机打电话、打开 Excel 查数反思Reflection检查结果是否合理必要时重试就像你写完代码先跑一遍测试不过就改这四块缺一不可。很多早期 Agent 项目失败不是因为大模型不够聪明而是因为“规划”和“反思”这两个模块做得太弱。模型生成了一堆步骤但执行到一半发现前面错了没人管整个任务就崩了。3. 为什么现在 Agent 突然火了三个变化的叠加Agent 的概念并不新鲜。早在几十年前人工智能领域就有“智能体”的讨论。但过去很长一段时间它只停留在实验室。现在 Agent 真正进入工程视野是因为三个条件同时成熟了。第一个变化是大模型的推理能力大幅提升。早期的语言模型擅长续写但不擅长多步推理。现在的主流模型已经能在“给定目标 - 拆解步骤 - 选择工具 - 输出中间结果”的循环中保持稳定。这是 Agent 能自主干活的前提。第二个变化是外部工具和服务的 API 高度标准化。无论是天气、地图、支付还是数据库、代码仓库几乎都能用 HTTP 接口或 SDK 调用。Agent 只需要学会“调用工具”这一种能力就能触达大量真实世界的资源。第三个变化是开发框架逐渐成熟。像 LangChain、LlamaIndex、AutoGen、Spring AI 这些框架把 Agent 的规划、记忆、工具调用封装成了可复用的模块。过去从零搭一个 Agent 可能要写几百行胶水代码现在几十行就能跑起来。换句话说Agent 的爆发不是某一家公司的单点突破而是“模型能力 工具生态 工程基础设施”三股力量同时到位的结果。这也解释了为什么 2024 年之后几乎所有大模型厂商都在推自己的 Agent 方案。4. 主流的 Agent 架构模式你知道这四种就够了在动手写代码之前先建立架构认知。当前被验证有效的 Agent 架构大致可以分成四类。它们的复杂度从低到高适用场景也完全不同。4.1 ReAct 架构边想边做做一步看一步ReActReasoning Acting是当前最主流的单 Agent 架构。核心思想是让模型在一个循环里交替进行“推理”和“动作”。流程大致是模型接收用户目标。输出思考过程和下一步要调用的工具。系统执行工具把结果返回给模型。模型根据结果继续推理直到认为任务完成。这种方式的优点是灵活适合任务步骤不确定、需要根据中间结果调整策略的场景。缺点是循环次数多token 消耗高模型可能绕圈子。4.2 Plan-and-Execute 架构先定计划再执行这种架构把“规划”和“执行”分开。模型先根据任务目标生成一个完整计划然后逐个执行计划里的小步骤。每执行完一步可以观察结果并决定是否调整计划。它比 ReAct 更稳定适合步骤清晰、可预见的任务比如数据分析、报告生成。缺点是面对突发情况时调整能力较弱。4.3 Multi-Agent 架构让不同角色协作当任务足够复杂时单个 Agent 会显得力不从心。Multi-Agent 架构让多个 Agent 分别承担不同角色比如一个负责拆解任务一个负责写代码一个负责检查代码一个负责汇总结果。这种架构像一个虚拟团队能并行处理多个子任务但对系统设计能力要求很高。角色之间的通信协议、任务分配、结果合并都是需要额外设计的地方。4.4 Human-in-the-Loop 架构人机协作关键节点人工确认在真实业务中完全自主的 Agent 风险很高。更稳妥的做法是在关键环节引入人工审批。比如 Agent 生成内容后先由人审核再发布Agent 执行数据库变更前先由人确认。这不是退步而是工程上负责任的表现。Agent 的自主性应该是对任务粒度的自主而不是对权限边界的无限制延伸。这四种架构可以混合使用。实际项目里很多系统是“ReAct 为主关键节点加人工确认复杂任务拆成多 Agent”。5. 环境准备自己搭 Agent 前需要哪些基础这里我们以一个最小可运行的 Agent 示例为目标环境如下操作系统Windows / macOS / Linux 均可本文示例不依赖特定系统。Python建议使用 3.9 及以上版本。大模型 API本文示例使用 OpenAI 风格的 API兼容 OpenAI SDK 的接口即可。如果你使用国内模型只要接口兼容代码基本通用。依赖库推荐使用openaiSDK版本请以实际项目为准。如果使用 LangChain需要另外安装对应依赖但本文会尽量用原生 Python 实现核心逻辑避免框架版本差异带来的困惑。安装命令pip install openai如果你使用其他 API 服务通常只需要修改base_url、api_key和模型名称即可。这个设计对国内开发者尤其友好因为现在很多模型服务都提供了 OpenAI 兼容接口。还需要准备一个工具这里我们用两个最简单的内置工具来演示 Agent 的“工具调用”能力计算器执行简单的数学表达式。模拟搜索从一个本地字典里查询信息。真实项目中你可以把这些工具替换成天气 API、数据库查询、内部系统接口等。6. 手写一个最小 Agent完整代码实现为了让你看清楚 Agent 的内部机制这里不用任何 Agent 框架直接用 Python OpenAI SDK 实现一个 ReAct 风格的最小 Agent。先写一个简单的工具注册表# tools.py import math def calculator(expression: str) - str: 计算数学表达式的值例如 (12 34) * 2 try: result eval(expression, {__builtins__: {}}, {math: math}) return str(result) except Exception as e: return f计算错误: {e} def search(query: str) - str: 模拟信息检索从本地知识库返回答案 knowledge_base { CSDN: CSDN 是全球知名中文 IT 技术交流平台。, Python: Python 是一种简单易学、生态丰富的编程语言。, Agent: Agent 是能够自主规划、调用工具并完成任务目标的智能体系统。, } for key, value in knowledge_base.items(): if key.lower() in query.lower(): return value return 未找到相关信息。然后写 Agent 主逻辑# agent.py import json from openai import OpenAI from tools import calculator, search client OpenAI( api_keyYOUR_API_KEY, base_urlYOUR_API_BASE_URL, # 如果你使用兼容 OpenAI 的服务地址 ) TOOLS { calculator: calculator, search: search, } SYSTEM_PROMPT 你是一个 AI Agent。你的任务是帮助用户完成任务。 你可以使用以下工具 - calculator(expression): 计算数学表达式 - search(query): 查询本地知识库 请按照以下格式输出 思考你推断下一步需要做什么 工具需要调用的工具名称参数为 JSON 格式例如 {expression: 11} 如果任务已完成请直接输出最终答案不要输出工具调用。 .strip() def run_agent(user_input: str, max_steps: int 5): messages [ {role: system, content: SYSTEM_PROMPT}, {role: user, content: user_input}, ] for step in range(max_steps): response client.chat.completions.create( modelgpt-4o-mini, # 请根据你的服务商替换 messagesmessages, temperature0, ) reply response.choices[0].message.content print(f 第 {step 1} 轮 ) print(reply) # 判断模型是否调用了工具 if 工具 in reply: # 简单解析工具名和参数实际项目建议用 structured output try: tool_line reply.split(工具)[1].strip().split(\n)[0] tool_name, args_str tool_line.split((, 1) args_str args_str.rstrip()).replace(, \) args json.loads(f{{{args_str}}}) tool_func TOOLS[tool_name.strip()] result tool_func(**args) print(f--- 工具 {tool_name.strip()} 返回: {result}) messages.append({role: assistant, content: reply}) messages.append({role: user, content: f工具执行结果: {result}}) except Exception as e: messages.append({role: user, content: f工具调用失败: {e}}) else: # 没有工具调用说明任务完成 return reply return 达到最大执行步数任务未完成。运行示例if __name__ __main__: print(run_agent(请问 Python 是什么)) print(---) print(run_agent(计算 (12 34) * 2 的结果))这段代码虽然简单但已经具备了 Agent 的核心闭环模型根据用户输入判断是否调用工具、调用哪个工具、得到返回结果后继续推理直到输出最终答案。在实际项目中你不需要每次都从零写 Agent 主循环可以用 LangChain 或其他框架替代。但理解这段原生代码等于理解了所有 Agent 框架背后的共同逻辑。7. 运行结果与效果验证假设你配置好了 API 密钥运行上面的代码你会看到类似下面的输出注意模型输出内容受模型版本和 Prompt 影响不一定完全一致 第 1 轮 思考用户想了解 Python 是什么这可以通过查询本地知识库获得。 工具search(queryPython) --- 工具 search 返回: Python 是一种简单易学、生态丰富的编程语言。 第 2 轮 Python 是一种简单易学、生态丰富的编程语言。第二轮的输出就是最终答案。因为这个消息里没有“工具”关键字Agent 判断任务已经完成直接返回结果。第二个示例 第 1 轮 思考用户需要计算 (12 34) * 2 的结果这需要调用计算器工具。 工具calculator(expression(12 34) * 2) --- 工具 calculator 返回: 92 第 2 轮 (12 34) * 2 的结果是 92。验证是否成功主要看两点工具是否被正确调用日志中是否出现了--- 工具 xxx 返回的输出。最终答案是否基于工具结果如果模型直接忽略工具结果自己编了一个答案说明 Prompt 或上下文设计有问题。如果你的环境运行失败常见情况有API 密钥配置错误报401或403。base_url指向的服务不支持所用模型名。模型输出格式不稳定导致工具解析失败。遇到这些情况先把 API 连通性测一遍再调整 Prompt 格式。8. 从最小示例到工程化Agent 落地的四个关键难题上面这个最小示例能跑通但不代表它能直接上生产。如果你想把它变成一个稳定、可控、安全的业务功能必须认真面对下面四个问题。8.1 工具调用不稳定是最大的坑最小示例用“文本解析”来识别工具调用这在简单场景下可行但一旦工具数量增多、参数复杂模型很容易输出不规范的文本。实际项目更推荐使用大模型的function calling / tool calling能力也就是让模型输出结构化的 JSON而不是从自然语言里解析。用 OpenAI SDK 的 tool calling 写法大致是这样的tools [ { type: function, function: { name: calculator, description: 计算数学表达式, parameters: { type: object, properties: { expression: {type: string, description: 数学表达式} }, required: [expression] } } } ] response client.chat.completions.create( modelgpt-4o-mini, messagesmessages, toolstools, )response.choices[0].message.tool_calls里会直接给出结构化参数。这种方式的稳定性远超文本解析。8.2 上下文爆炸要设计记忆策略Agent 每执行一步就要把“模型输出 工具结果”拼接进对话历史。步骤一多上下文很快就满了。解决方案是设计分层记忆短期记忆当前任务相关的步骤与结果保留在上下文里。工作记忆把重要的中间结论提取出来作为摘要放入上下文。长期记忆历史任务的经验存入向量数据库需要时再检索。不要把所有历史都塞进 prompt。越多的无用 token不仅增加成本还会让模型注意力分散更容易出错。8.3 安全边界是 Agent 的生死问题Agent 的强大在于它能执行动作危险也在于它能执行动作。一个具有代码执行、数据库写入、文件删除权限的 Agent一旦被恶意 prompt 注入可能造成严重后果。工程上必须做到“最小权限原则”工具权限按角色隔离Agent 默认只读。高风险操作必须走人工审批。外部输入包括工具返回的内容都要当作用户输入来看待不能盲目信任。所有工具调用要有审计日志。8.4 成本与速度需要“模型路由”来解决Agent 循环调用大模型token 消耗是普通对话的几倍甚至几十倍。优化方式是给不同环节分配不同模型复杂规划使用强推理模型。简单工具调用使用轻量模型。总结和格式化使用廉价模型。这叫模型路由也是 AI 应用工程中非常实用的一招。9. 常见问题与排查思路问题现象可能原因排查方式解决方案Agent 不调用工具Prompt 里工具描述不清晰或模型不支持 function calling查看模型返回的原始输出确认是否包含工具调用关键词改进 Prompt给每个工具配一个明确示例切换支持 tool calling 的模型Agent 调用工具后答案仍然错误工具返回结果没有被正确放入上下文或模型忽略工具结果打印每一轮 messages检查工具结果是否拼接成功显式让模型基于工具结果作答如“请根据工具返回结果回答”循环次数过多任务无法终止模型在不断重复同一工具调用设置最大步数并加入“重复检测”在代码中判断相同工具参数是否重复出现若重复则提前终止上下文长度超限工具结果或对话历史太长查看 token 使用统计截断工具结果只保留关键信息使用记忆摘要API 返回 401/403API Key 错误或服务地址不对检查配置文件使用 curl 测试接口连通性正确配置环境变量或客户端参数工具调用格式解析失败模型输出了非法 JSON 或字段名不一致打印原始文本观察格式偏差使用 function calling 结构化输出增强解析容错10. 最佳实践与工程建议如果你决定在真实项目里落地 Agent下面这些建议可以帮你少走弯路。10.1 先定义“成功标准”不要一开始就追求“全自动”。先选定一个窄场景定义清楚什么算“任务完成”。例如客服 Agent 的成功标准是“在用户不转人工的情况下解决 80% 的常见问题”。有了可量化的指标才能评估 Agent 是否值得上线。10.2 用评估集持续回归Agent 的行为具有随机性。同一个问题这次能解决下次可能就失败了。建议建立一个任务测试集每次改动 Prompt 或工具后都跑一遍回归测试。没有评估集Agent 优化就是盲人摸象。10.3 让 Agent 学会“说不知道”很多 Agent 失败不是因为能力不够而是因为过度自信。在 Prompt 里明确告诉模型如果工具结果不足或者信息不确定直接说“无法回答”不要编造。这能显著提高系统可信度。10.4 事件驱动与异步化长时间运行的 Agent 任务不应该用同步 HTTP 请求。把任务提交到消息队列Agent 异步执行通过回调或轮询获取结果。否则一次复杂的 Agent 推理可能会让用户等到超时。10.5 记录完整 Trace每个 Agent 的每一步思考、工具、参数、结果、耗时、成本都要记录。出现问题时Trace 是你唯一能定位问题的线索。可以借助 OpenTelemetry 或自建日志系统实现。11. 总结与后续学习方向现在回头看你就会发现“AI 不再听命令”这个说法的背后是从“语言模型”到“任务执行系统”的一次能力跃迁。对话模型只会给你答案Agent 会替你干活。而支撑这个跃迁的并不是某一个大模型突然开悟而是一套工程化的系统设计规划、记忆、工具、反思环环相扣。我们在本文中通过一个最小 Python 示例演示了 Agent 最核心的 ReAct 循环。你理解了这段代码就理解了 LangChain、AutoGen 这些框架的底层逻辑。接下来值得深入的方向包括学习 function calling 的标准用法掌握结构化工具调用。探索 LangGraph 等状态化 Agent 框架处理更复杂的工作流。研究 Multi-Agent 协作方案用角色分工解决单 Agent 的瓶颈。关注 Agent 的评测与可观测性建立自己的任务回归集。深入安全对抗了解 prompt injection 对 Agent 的威胁模型并设计防护策略。Agent 的赛道还远没有定型。今天看起来先进的技术可能半年后就会被新的模式替代。但只要掌握了“模型 工具 控制流”这个基本框架无论行业怎么变你都能快速适应。下次再有人问你“Agent 到底是什么”你不需要去背概念。你只需要打开一个终端写一个能调用工具的最小 Agent跑起来给他看。