2026年AI Agent实战(一):用200行Python从零搭建一个能自主完成任务的智能体
本文是AI Agent实战系列的第一篇。我们将从零开始用Python实现一个基于ReAct框架的智能体它能自主思考、调用工具、完成任务。全文含完整可运行代码约3500字。目录一、什么是AI Agent二、ReAct框架思考-行动-观察循环三、核心架构设计四、从零实现完整代码五、运行效果演示六、局限性讨论总结一、什么是AI Agent普通的AI对话是这样的你问一个问题AI回答一个答案。一问一答AI不会主动做任何事情。AI Agent的区别在于它能自主规划和执行多步骤任务。举个例子普通AI对话 用户今天北京天气怎么样 AI我无法获取实时天气数据建议你查看天气应用。 AI Agent 用户今天北京天气怎么样 Agent思考我需要调用天气API获取北京的天气数据 Agent行动调用get_weather(北京) Agent观察{temp: 28, condition: 晴, humidity: 45} Agent回答北京今天晴天气温28°C湿度45%适合出行。关键区别Agent有工具使用能力和自主决策能力。需要说明的是Agent不是万能的。它受限于工具的能力和大模型的推理水平。本文实现的是一个基础但完整的Agent框架后续文章会逐步增强能力。二、ReAct框架思考-行动-观察循环ReActReasoning Acting是目前最主流的Agent框架核心思路很简单循环 { Thought思考分析当前状态决定下一步 Action行动调用一个工具 Observation观察获取工具返回结果 } 直到任务完成为什么这个框架有效因为它模拟了人类解决问题的过程你先想想要做什么Thought你去做某个动作Action你看结果怎么样Observation基于结果继续思考下一步与纯推理的区别方式特点适用场景纯推理CoT只思考不行动数学题、逻辑分析纯行动只执行不思考简单脚本ReAct思考行动结合需要外部信息的复杂任务三、核心架构设计我们的Agent由4个核心组件构成┌─────────────────────────────────┐ │ Agent Core │ │ ┌───────────┐ ┌─────────────┐ │ │ │ Planner │ │ Executor │ │ │ │ (思考规划) │ │ (执行动作) │ │ │ └───────────┘ └─────────────┘ │ │ ┌───────────┐ ┌─────────────┐ │ │ │ Memory │ │ Tools │ │ │ │ (记忆存储) │ │ (工具集) │ │ │ └───────────┘ └─────────────┘ │ └─────────────────────────────────┘Planner调用大模型进行推理生成Thought和ActionExecutor执行工具调用返回ObservationMemory保存对话历史和中间结果Tools可供调用的工具集合四、从零实现完整代码4.1 定义工具基类# tools/base.pyfromabcimportABC,abstractmethodfromtypingimportAnyclassTool(ABC):工具基类所有工具必须实现name、description和run方法propertyabstractmethoddefname(self)-str:工具名称Agent通过名称调用...propertyabstractmethoddefdescription(self)-str:工具描述告诉Agent什么时候该用这个工具...abstractmethoddefrun(self,**kwargs)-str:执行工具返回字符串结果...defget_prompt(self)-str:生成工具描述供大模型理解returnf-{self.name}:{self.description}4.2 实现具体工具# tools/calculator.pyfromtools.baseimportToolimportmathclassCalculatorTool(Tool):计算器工具执行数学运算propertydefname(self)-str:returncalculatorpropertydefdescription(self)-str:return执行数学计算。输入一个数学表达式如 23*4返回计算结果。defrun(self,expression:str,**kwargs)-str:try:allowedset(0123456789-*/.() )ifnotall(cinallowedforcinexpression):return错误表达式包含不允许的字符resulteval(expression,{__builtins__:{}},{math:math})returnf{expression}{result}exceptExceptionase:returnf计算错误{e}classWeatherTool(Tool):天气工具模拟天气查询实际项目中替换为真实APIpropertydefname(self)-str:returnget_weatherpropertydefdescription(self)-str:return查询指定城市的天气。输入城市名称返回天气信息。defrun(self,city:str,**kwargs)-str:mock_data{北京:晴天28°C湿度45%,上海:多云25°C湿度60%,深圳:阵雨30°C湿度75%,}returnmock_data.get(city,f未找到{city}的天气数据)classSearchTool(Tool):搜索工具模拟搜索实际项目中替换为真实搜索APIpropertydefname(self)-str:returnsearchpropertydefdescription(self)-str:return搜索互联网信息。输入搜索关键词返回相关结果摘要。defrun(self,query:str,**kwargs)-str:returnf[模拟搜索结果] 关于{query}的信息4.3 Agent核心实现# agent.pyfromopenaiimportOpenAIfromdotenvimportload_dotenvfromtypingimportOptionalimportre load_dotenv()classReActAgent:基于ReAct框架的AI Agentdef__init__(self,tools:list,model:strdeepseek-chat,max_steps:int5):self.tools{tool.name:toolfortoolintools}self.modelmodel self.max_stepsmax_steps self.clientOpenAI()tools_desc\n.join(tool.get_prompt()fortoolintools)self.system_promptf你是一个AI智能体能够通过思考和调用工具来完成任务。 可用工具{tools_desc}请严格按照以下格式回复 Thought: 分析当前情况决定下一步行动 Action: tool_name(query) 当你认为已经获得足够信息时 Thought: 我已经获得了足够的信息 Answer: 你的最终回答 注意 - 每次只调用一个工具 - 仔细分析观察结果后再决定下一步 - 不要编造工具返回的数据self.conversation[]def_parse_action(self,response:str)-Optional[tuple]:matchre.search(rAction:\s*(\w)\(([^)]*)\),response)ifmatch:returnmatch.group(1),match.group(2).strip().strip().strip()returnNonedef_is_final_answer(self,response:str)-Optional[str]:matchre.search(rAnswer:\s*(.),response,re.DOTALL)returnmatch.group(1).strip()ifmatchelseNonedefrun(self,task:str)-str:self.conversation[{role:system,content:self.system_prompt},{role:user,content:task},]forstepinrange(self.max_steps):responseself.client.chat.completions.create(modelself.model,messagesself.conversation,temperature0.3,max_tokens1000,)replyresponse.choices[0].message.content final_answerself._is_final_answer(reply)iffinal_answer:returnfinal_answer actionself._parse_action(reply)ifnotaction:self.conversation.append({role:assistant,content:reply})self.conversation.append({role:user,content:请使用Thought和Action格式继续。})continuetool_name,argumentaction toolself.tools.get(tool_name)observationtool.run(queryargument)iftoolelsef工具{tool_name}不存在self.conversation.append({role:assistant,content:reply})self.conversation.append({role:user,content:fObservation:{observation}})return达到最大步数限制任务未完成。if__name____main__:fromtools.calculatorimportCalculatorTool,WeatherTool,SearchTool agentReActAgent(tools[CalculatorTool(),WeatherTool(),SearchTool()],max_steps5,)resultagent.run(北京今天天气怎么样如果出去玩需要带伞吗)print(f最终结果:{result})五、运行效果演示执行上面的代码你会看到类似这样的输出 任务: 北京今天天气怎么样如果出去玩需要带伞吗 --- 步骤 1 --- 模型回复: Thought: 用户想知道北京的天气情况我需要调用天气查询工具 Action: get_weather(北京) 工具调用: get_weather(北京) 观察结果: 晴天28°C湿度45% --- 步骤 2 --- 模型回复: Thought: 已经获取到北京天气数据晴天28°C不需要带伞 Answer: 北京今天是晴天气温28°C湿度45%。天气很好 不需要带伞可以放心出门建议做好防晒。 最终答案: 北京今天是晴天气温28°C湿度45%。天气很好 不需要带伞可以放心出门建议做好防晒。关键观察第一步Agent正确选择了天气工具第二步基于观察结果晴天给出了合理的回答自主决策没有人工指定先查天气再分析Agent自己规划了步骤六、局限性讨论老实说这个基础Agent有不少限制工具调用解析依赖正则如果模型输出格式不规范就会失败。生产环境建议用Function Calling API没有长期记忆每次对话都是独立的不记得上次交互错误处理简单工具失败时缺乏重试和恢复机制单工具调用每步只能调用一个工具复杂任务效率不高成本不可控没有token计数和预算限制这些问题会在本系列后续文章中逐步解决。总结本文实现了一个基于ReAct框架的AI Agent核心要素Thought-Action-Observation循环Agent的核心运行模式工具抽象统一的工具接口方便扩展对话历史管理通过messages维护上下文代码量不到200行但包含了Agent的核心要素。理解这个基础框架比直接用LangChain等框架更有价值——因为你知道底层在做什么。下一篇《AI Agent实战二给智能体加上工具使用和记忆能力》将实现Function Calling集成和持久化记忆系统。本文由AI辅助整理经作者亲自验证和编辑。代码在Python 3.12 DeepSeek API环境下测试通过。如有问题欢迎评论区交流。最后更新2026年5月
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2580768.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!