AI Agent开发实战:从零构建一个能自主规划任务的智能体
AI Agentå¼€å‘实战:从零构建一个能自主规划任务的智能体引言2025年被许多人称为AI Agentåƒå¹´ã€‚ä¸åŒäºŽä¼ 统的èŠå¤©æœºå™¨äººï¼ŒAI Agent是一个能够自主感知环境ã€åˆ¶å®šè®¡åˆ’ã€ä½¿ç”¨å·¥å·å¹¶æ‰§è¡Œå¤æ‚任务的智能系统。从AutoGPT的爆ç«åˆ°Claudeçš„Computer Use,Agentæ£åœ¨é‡æ–°å®šä¹‰æˆ‘们与AI的交互方å¼ã€‚æœ¬æ–‡å°†ä»Žé›¶å¼€å§‹ï¼Œå¸¦ä½ æž„å»ºä¸€ä¸ªå·å¤‡è§„划ã€å·¥å·è°ƒç”¨å’Œè®°å¿†åŠŸèƒ½çš„AI Agentï¼Œå®Œæ•´è¦†ç›–æž¶æž„è®¾è®¡ã€æ ¸å¿ƒå®žçŽ°å’Œç”Ÿäº§åŒ–éƒ¨ç½²ã€‚ä¸€ã€ä»€ä¹ˆæ˜¯AI Agent?1.1 Agentçš„æ ¸å¿ƒå®šä¹‰AI Agent䏿˜¯ä¸€ä¸ªå•ç‹¬çš„æ¨¡åž‹ï¼Œè€Œæ˜¯ä¸€ä¸ªç³»ç»Ÿæž¶æž„ã€‚å®ƒç”±å››ä¸ªæ ¸å¿ƒç»„ä»¶æž„æˆã€‚大脑组件通常是LLM,负责推ç†å’Œå†³ç–,决定了Agent的智能上é™ã€‚è§„åˆ’ç»„ä»¶å°†å¤æ‚ä»»åŠ¡åˆ†è§£ä¸ºå¯æ‰§è¡Œçš„åæ¥éª¤ï¼Œå¸¸ç”¨æŠ€æœ¯åŒæ‹¬ReActã€Plan-and-Solveå’ŒTree of Thought。工å·ç»„件是Agent与外部世界交互的接å£ï¼Œå¯ä»¥æ˜¯API调用ã€ä»£ç æ‰§è¡Œã€æµè§ˆå™¨æ“ä½œã€æ–‡ä»¶è¯»å†™ç‰ã€‚è®°å¿†ç»„ä»¶åˆ†ä¸ºçŸæœŸè®°å¿†å¦‚对è¯ä¸Šä¸‹æ–‡çª—å£ã€é•¿æœŸè®°å¿†å¦‚å‘釿•°æ®åº“å˜å‚¨çš„知识ã€å·¥ä½œè®°å¿†å¦‚当å‰ä»»åŠ¡çš„çŠ¶æ€è·Ÿè¸ªã€‚1.2 Agent vs ä¼ ç»ŸChatBot维度ChatBotAI Agent交互模å¼å•轮问ç”多轮自主执行工å·ä½¿ç”¨æ—å¯è°ƒç”¨API/代ç /æµè§ˆå™¨ä»»åС夿‚度简å•é—®ç”夿‚多æ¥éª¤ä»»åŠ¡è®°å¿†èƒ½åŠ›ä¸Šä¸‹æ–‡çª—å£çŸæœŸé•¿æœŸå·¥ä½œè®°å¿†è‡ªä¸»æ€§è¢«åЍå“应主动规划执行二ã€Agent架构设计2.1 ReAct模å¼ReAct(Reasoning Actingï¼‰æ˜¯ç›®å‰æœ€ä¸»æµçš„AgentæŽ¨ç†æ¨¡å¼ã€‚æ ¸å¿ƒå¾ªçŽ¯åˆ†ä¸ºå››æ¥ã€‚第一æ¥Thought:分æžå½“å‰çжæ€ï¼Œæ€è€ƒä¸‹ä¸€æ¥è¡ŒåŠ¨ã€‚ç¬¬äºŒæ¥Action:执行å·ä½“æ“作如调用工å·ã€‚第三æ¥Observation:观察æ“作结果。第四æ¥å¾ªçŽ¯ï¼Œæ ¹æ®è§‚察结果更新状æ€å¹¶ç»§ç»æ€è€ƒä¸‹ä¸€æ¥ã€‚这个循环æŒç»è¿›è¡Œç›´åˆ°ä»»åŠ¡å®Œæˆæˆ–è¾¾åˆ°ç»ˆæ¢æ¡ä»¶ã€‚用户: 帮我查一下北京今天天气,如果下雨就æé†’我带伞 Agent Thought: 需è¦å ˆèŽ·å–åŒ—äº¬å¤©æ°”ä¿¡æ¯ Agent Action: call_weather_api(北京) Observation: {city: 北京, weather: å°é›¨, temp: 18} Agent Thought: 天气是å°é›¨ï¼Œéœ€è¦æé†’用户带伞 Agent Action: respond(北京今天å°é›¨ï¼Œæ°”温18℃,记得带伞哦ï¼)2.2 系统架构图整体架构分为三层。应用层定义Agent角色ã€ä»»åŠ¡ã€çº¦æŸï¼Œæ˜¯é¢å‘用户的接å£ã€‚编排层是ReAct循环引擎,管ç†è§„åˆ’ã€æ‰§è¡Œã€è§‚察的完整æµç¨‹ï¼Œæ˜¯Agentçš„å¤§è„‘ã€‚åŸºç¡€è®¾æ–½å±‚åŒæ‹¬LLMæœåŠ¡ï¼ˆæ¨¡åž‹æŽ¨ç†ï¼‰ã€å·¥å·æ³¨å†Œä¸å¿ƒï¼ˆå·¥å·å‘现和调用)ã€è®°å¿†ç³»ç»Ÿï¼ˆçŸæœŸå’Œé•¿æœŸè®°å¿†ç®¡ç†ï¼‰ã€‚ä¸‰ã€æ ¸å¿ƒå®žçް3.1 ReAct引擎实现importjsonfromtypingimportAnyfromdataclassesimportdataclassdataclassclassAgentStep:thought:straction:straction_input:dictobservation:strclassReActAgent:def__init__(self,llm,tools,max_steps10):self.llmllm self.tools{t.name:tfortintools}self.max_stepsmax_steps self.history:list[AgentStep][]defrun(self,task:str)-str:promptself._build_prompt(task)forstep_numinrange(self.max_steps):responseself.llm.generate(prompt)thought,action,action_inputself._parse(response)resultself._execute_action(action,action_input)stepAgentStep(thoughtthought,actionaction,action_inputaction_input,observationstr(result))self.history.append(step)ifactionFINISH:returnaction_input.get(answer,str(result))promptself._format_step(step)returnè¾¾åˆ°æœ€å¤§æ¥æ•°é™åˆ¶def_build_prompt(self,task:str)-str:tools_desc\n.join(f-{t.name}:{t.description}fortinself.tools.values())returnfä½ æ˜¯ä¸€ä¸ªAI Agent。 ## å¯ç”¨å·¥å ·{tools_desc}## 任务{task}## å“åº”æ ¼å¼ Thought: [ä½ çš„æ€è€ƒ] Action: [å·¥å ·åæˆ–FINISH] Action Input: [JSONæ ¼å¼å‚æ•°] 3.2 å·¥å·ç³»ç»Ÿè®¾è®¡classTool:def__init__(self,name:str,description:str,func):self.namename self.descriptiondescription self.funcfuncdefexecute(self,**kwargs)-Any:returnself.func(**kwargs)# 定义工å·defsearch_web(query:str)-str:æœç´¢ç½‘络信æ¯returnfæœç´¢ç»“æžœ:å ³äºŽ{query}çš„ç›¸å ³ä¿¡æ¯...defexecute_code(code:str)-str:执行Python代ç try:resulteval(code)returnf执行结果:{result}exceptExceptionase:returnf执行错误:{e}defread_file(path:str)-str:è¯»å–æ–‡ä»¶å† 容withopen(path,r)asf:returnf.read()tools[Tool(search,æœç´¢ç½‘络信æ¯ï¼Œå‚æ•°: query,search_web),Tool(run_code,执行Python代ç ï¼Œå‚æ•°: code,execute_code),Tool(read_file,è¯»å–æ–‡ä»¶ï¼Œå‚æ•°: path,read_file),]3.3 记忆系统实现fromcollectionsimportdequeimportchromadbclassMemorySystem:def__init__(self,short_term_size20):self.short_termdeque(maxlenshort_term_size)self.working{}# 当å‰ä»»åŠ¡çŠ¶æ€self.long_termchromadb.Client()defadd_short_term(self,message:dict):self.short_term.append(message)defget_context(self)-list:returnlist(self.short_term)defstore_long_term(self,key:str,value:str):collectionself.long_term.get_or_create(knowledge)collection.add(documents[value],ids[key])defquery_long_term(self,query:str,k5):collectionself.long_term.get_collection(knowledge)returncollection.query(query_texts[query],n_resultsk)å››ã€Prompt工程在Agentä¸çš„特殊应用4.1 结构化输出约æŸAgentä¸Prompt最é‡è¦çš„æ˜¯çº¦æŸè¾“å‡ºæ ¼å¼ï¼Œä¾¿äºŽè§£æžã€‚ä½ å¿ é¡»ä¸¥æ ¼æŒ‰ç §ä»¥ä¸‹JSONæ ¼å¼å›žå¤ï¼Œä¸è¦åŒ å«ä»»ä½•å ¶ä»–å† å®¹ï¼š { thought: ä½ çš„æŽ¨ç†è¿‡ç¨‹, action: å·¥å ·å称或FINISH, action_input: {key: value} }4.2 错误æ¢å¤Prompt在Agentçš„Promptä¸åŠ å¥é”™è¯¯å¤„ç†é€»è¾‘至å³é‡è¦ã€‚å¦‚æžœå·¥å ·è¿”å›žé”™è¯¯ï¼Œè¯·ï¼š 1. 分æžé”™è¯¯åŽŸå› 2. å°è¯•ä¿®æ£å‚æ•°åŽé‡è¯•(最多3次) 3. 如果3次ä»å¤±è´¥ï¼Œæ¢ç”¨æ›¿ä»£æ–¹æ¡ˆ 4. å¦‚æ— æ›¿ä»£æ–¹æ¡ˆï¼Œå‘ç”¨æˆ·è¯´æ˜Žæƒ å†µäº”ã€ç”Ÿäº§åŒ–部署考é‡5.1 安卿²™ç®±Agent执行代ç å’ŒShell命令å¿é¡»æœ‰å®‰å¨æ²™ç®±ã€‚推è使用Docker容器隔离ã€é™åˆ¶ç½‘络访问ã€è®¾ç½®æ‰§è¡Œè¶æ—¶ã€ç¦æ¢å±é™©ç³»ç»Ÿè°ƒç”¨ã€‚5.2 æˆæœ¬æŽ§åˆ¶Agentå¯èƒ½äº§ç”Ÿå¤§é‡LLM调用。优化ç–ç•¥åŒæ‹¬ï¼šå¯¹ç®€å•任务使用mini模型(如GPT-4o-mini),ä»å¤æ‚推ç†ä½¿ç”¨å¼ºæ¨¡åž‹ï¼›è®¾ç½®æœ€å¤§æ¥æ•°å’Œæ€»Token预算;缓å˜ç›¸åŒæˆ–相似的å任务结果;对工å·è°ƒç”¨ç»“果进行摘è¦åŽ‹ç¼©åŽå†æ”¾å¥ä¸Šä¸‹æ–‡ã€‚5.3 å¯è§‚测性importloggingclassObservableAgent(ReActAgent):defrun(self,task:str)-str:logging.info(fAgent开始执行:{task})forstepinself.history:logging.info(fStep: thought{step.thought}, faction{step.action})returnsuper().run(task)åã€å®žæˆ˜æ¡ˆä¾‹ï¼šè‡ªåŠ¨ç ”ç©¶åŠ©æ‰‹ç»¼åˆä»¥ä¸Šå†å®¹å®žçŽ°ä¸€ä¸ªèƒ½æœç´¢ã€åˆ†æžã€æ€»ç»“çš„è‡ªåŠ¨ç ”ç©¶åŠ©æ‰‹ã€‚æµç¨‹ä¸ºï¼šæŽ¥æ”¶ç ”究主题,æœç´¢ç›¸å³èµ„料,æå–å³é”®ä¿¡æ¯ï¼Œç»¼åˆåˆ†æžç”ŸæˆæŠ¥å‘Šï¼Œä¿å˜åˆ°æœ¬åœ°ã€‚这个Agent展示了完整的感知-规划-执行-å馈é—çŽ¯ã€‚ä¸ƒã€æœªæ¥å±•望Agentå‘展方å‘主è¦åŒæ‹¬ä¸‰ä¸ªæ–¹é¢ã€‚多Agentå作,多个专用Agenté€šè¿‡æ¶ˆæ¯æ€»çº¿å作完æˆè¶å¤æ‚任务,类似AutoGen的设计æ€è·¯ã€‚自主å¦ä¹ ,Agent从执行历å²ä¸å¦ä¹ ,优化Promptå’Œç–略,å‡å°‘é‡å¤é”™è¯¯ã€‚多模æ€Agent,整åˆè§†è§‰ã€è¯éŸ³ç‰å¤šæ¨¡æ€è¾“å¥ï¼Œå®žçŽ°æ›´ä¸°å¯Œçš„çŽ¯å¢ƒæ„ŸçŸ¥èƒ½åŠ›ã€‚æ€»ç»“æž„å»ºç”Ÿäº§çº§AI Agent需è¦å³æ³¨å››ä¸ªå³é”®ç‚¹ã€‚第一,稳å¥çš„ReAct循环,这是Agent能自主执行多æ¥ä»»åŠ¡çš„æ ¸å¿ƒå¼•æ“Žã€‚ç¬¬äºŒï¼Œçµæ´»çš„å·¥å·ç³»ç»Ÿï¼Œå·¥å·æ˜¯Agentèƒ½åŠ›çš„å»¶ä¼¸ï¼Œè®¾è®¡å¥½å·¥å·æŽ¥å£æ˜¯æˆåŠŸçš„ä¸€åŠã€‚第三,有效的记忆管ç†ï¼ŒçŸæœŸã€é•¿æœŸã€å·¥ä½œè®°å¿†ä¸‰è€ç¼ºä¸€ä¸å¯ã€‚第四,完善的错误处ç†ï¼Œç”Ÿäº§çŽ¯å¢ƒä¸é”™è¯¯ä¸å¯é¿å,优é›é™çº§æ˜¯å³é”®ã€‚Agent从一个概念到å¯ç”¨çš„产å“,ä¸é—´æœ‰å¤§é‡çš„å·¥ç¨‹ç»†èŠ‚éœ€è¦æ‰“ç£¨ã€‚å¸Œæœ›æœ¬æ–‡èƒ½ä¸ºä½ æå»ºè‡ªå·±çš„Agent系统æä¾›æ¸æ™°çš„æŠ€æœ¯è·¯çº¿å›¾ã€‚本文约2800å—,完整覆盖了AI Agentä»Žæ¦‚å¿µåˆ°å®žçŽ°çš„å¨æµç¨‹ã€‚