AI Agent 30天速成|Day3 笔记:深入理解Agent的感知与行动循环

引言:从静态模型到动态交互在AI Agent的开发中,Day1和Day2我们分别学习了Agent的基本架构和工具链设计。今天,我们将深入探讨Agent的核心机制——感知-行动循环(Perception-Action Loop)。这个循环是Agent与环境交互的基础,决定了Agent如何接收信息、处理信息并采取行动。理解这一原理,是构建智能Agent的关键。## 1. 感知-行动循环的底层原理感知-行动循环是Agent系统设计的核心范式。它模拟了生物体与环境交互的方式:通过传感器(感知)获取环境状态,通过处理器(推理)做出决策,通过执行器(行动)改变环境。在AI Agent中,这一循环通常由以下步骤组成:1. 感知(Perception):Agent从外部环境接收数据。这些数据可以是文本、图像、传感器读数等。在LLM-based Agent中,感知通常通过自然语言输入实现。2. 推理(Reasoning):Agent使用内部模型(如大型语言模型)处理感知数据,结合历史记忆和目标,生成行动计划。3. 行动(Action):Agent执行具体的操作,如调用API、生成文本、控制物理设备等。4. 反馈(Feedback):行动的结果影响环境,环境产生新的状态,Agent再次感知,形成闭环。这个循环的核心挑战在于延迟不确定性。感知到行动的延迟可能导致Agent做出过时决策,而环境的不确定性要求Agent具备鲁棒性。## 2. 实现一个简单的感知-行动循环让我们通过一个Python示例来演示基本的感知-行动循环。我们将创建一个文本交互Agent,它能够感知用户输入,进行推理,并输出响应。pythonimport timefrom typing import Dict, Anyclass SimpleAgent: """一个基于感知-行动循环的简单Agent实现""" def __init__(self, name: str = "Agent"): self.name = name self.memory = [] # 存储历史交互 def perceive(self, input_text: str) -> Dict[str, Any]: """感知阶段:接收并处理输入""" # 模拟感知延迟(实际中可能来自网络或传感器) time.sleep(0.1) return { "raw_input": input_text, "timestamp": time.time(), "processed": input_text.strip().lower() } def reason(self, perception: Dict[str, Any]) -> str: """推理阶段:基于感知和历史生成响应""" # 简单的规则推理(实际中可用LLM) user_input = perception["processed"] # 检查历史记忆 if "hello" in user_input: response = f"Hi! I'm {self.name}. How can I help you?" elif "time" in user_input: response = f"The current time is {time.ctime()}" else: response = f"You said: '{user_input}'. I'm learning to respond better." # 存储到记忆 self.memory.append({ "user": user_input, "response": response, "timestamp": perception["timestamp"] }) return response def act(self, response: str) -> None: """行动阶段:输出响应""" print(f"[{self.name}] {response}") def run_cycle(self, user_input: str) -> None: """执行完整的感知-行动循环""" print(f"\n--- New Cycle ---") print(f"User: {user_input}") # 1. 感知 perception = self.perceive(user_input) print(f"Perception: {perception}") # 2. 推理 response = self.reason(perception) print(f"Reasoning: {response}") # 3. 行动 self.act(response) # 反馈阶段隐含在下次循环中# 使用示例agent = SimpleAgent()agent.run_cycle("Hello, world!")agent.run_cycle("What time is it?")这个示例展示了感知-行动循环的基本结构。注意,我们通过run_cycle方法将三个步骤组合在一起,形成一个完整的闭环。在实际应用中,感知阶段可能涉及更复杂的输入处理(如语音识别),推理阶段可能调用大语言模型,行动阶段可能调用外部工具。## 3. 高级感知-行动循环:带反馈和状态管理在实际的AI Agent中,感知-行动循环需要处理更复杂的场景,如多轮对话、异步反馈和状态持久化。下面的示例展示了一个更高级的实现,它包含反馈机制和动态状态管理。pythonimport asyncioimport jsonfrom typing import Optional, Dict, Anyclass AdvancedAgent: """高级Agent,支持异步感知-行动循环和状态管理""" def __init__(self, config: Optional[Dict[str, Any]] = None): self.config = config or {} self.state = { "conversation_id": None, "turn_count": 0, "last_action": None, "environment": {"status": "idle"} } self.memory_store = [] # 持久化记忆 async def perceive(self, input_data: Any) -> Dict[str, Any]: """异步感知:从多源获取数据""" # 模拟从不同来源感知 if isinstance(input_data, str): # 文本感知 return { "type": "text", "content": input_data, "length": len(input_data), "source": "user" } elif isinstance(input_data, dict): # 结构化感知(如传感器数据) return { "type": "structured", "content": input_data, "source": input_data.get("source", "unknown") } else: return {"type": "unknown", "content": str(input_data)} async def reason(self, perception: Dict[str, Any]) -> Dict[str, Any]: """推理:结合状态和记忆生成行动计划""" self.state["turn_count"] += 1 # 更新环境状态 self.state["environment"]["last_perception"] = perception # 生成响应逻辑(模拟LLM调用) if perception["type"] == "text": content = perception["content"] if "action" in content.lower(): return { "type": "action", "plan": "execute_task", "parameters": {"task": content}, "confidence": 0.85 } elif "status" in content.lower(): return { "type": "response", "content": f"Current state: {json.dumps(self.state, indent=2)}", "include_state": True } else: return { "type": "response", "content": f"Received: {content}. Processing..." } else: return { "type": "response", "content": "Unsupported input type." } async def act(self, plan: Dict[str, Any]) -> None: """行动:执行计划并更新状态""" # 记录行动 self.state["last_action"] = plan if plan["type"] == "action": # 模拟执行任务 task = plan.get("parameters", {}).get("task", "unknown") print(f"[ACTION] Executing task: {task}") # 更新环境状态 self.state["environment"]["status"] = "busy" await asyncio.sleep(0.5) # 模拟执行时间 self.state["environment"]["status"] = "idle" print(f"[ACTION] Task completed: {task}") elif plan["type"] == "response": # 输出响应 print(f"[RESPONSE] {plan['content']}") # 记忆存储 self.memory_store.append({ "turn": self.state["turn_count"], "plan": plan, "state_snapshot": dict(self.state) }) async def run_cycle(self, input_data: Any) -> None: """异步运行完整的感知-行动循环""" print(f"\n--- Cycle {self.state['turn_count'] + 1} ---") # 1. 感知 perception = await self.perceive(input_data) print(f"Perception: {perception}") # 2. 推理 plan = await self.reason(perception) print(f"Plan: {plan}") # 3. 行动 await self.act(plan) # 反馈循环隐含:下次感知将包含环境变化# 使用示例async def main(): agent = AdvancedAgent() # 模拟多轮交互 await agent.run_cycle("What is the current status?") await agent.run_cycle("Execute action: fetch_data") await agent.run_cycle("Show status again")# 运行异步主函数asyncio.run(main())这个高级实现引入了几个关键概念:- 异步处理:使用asyncio支持非阻塞操作,模拟真实Agent处理多个并发输入。- 状态管理:通过state字典跟踪Agent内部状态和环境变化,实现有状态的交互。- 记忆存储:将每次循环的结果保存到memory_store,支持长期学习和上下文维护。- 反馈机制:行动的结果会更新环境状态,影响后续感知,形成真正的闭环。## 4. 感知-行动循环的优化策略在实际部署中,感知-行动循环需要优化以应对挑战:### 4.1 延迟优化- 预计算:在感知阶段进行部分推理,减少响应时间。- 缓存:对重复输入使用缓存结果,避免重新推理。### 4.2 鲁棒性增强- 重试机制:当行动失败时,自动重试或选择替代方案。- 异常处理:在感知和行动阶段捕获异常,提供降级响应。### 4.3 可扩展性- 插件化组件:将感知、推理、行动模块设计为可插拔的,便于替换和扩展。- 消息队列:使用消息队列(如RabbitMQ)解耦循环中的步骤,支持分布式部署。## 总结通过Day3的学习,我们深入剖析了AI Agent的感知-行动循环原理。这个循环是Agent与环境交互的基础,包含感知、推理、行动和反馈四个阶段。我们从简单的同步实现开始,逐步过渡到异步、带状态管理的复杂实现,并讨论了优化策略。关键要点:1. 循环结构:感知-行动循环是Agent的核心设计模式,必须闭环运行。2. 状态管理:维护Agent状态和环境状态是实现智能交互的关键。3. 异步处理:现代Agent需要支持异步操作以处理并发和延迟。4. 反馈驱动:每次行动的结果都是下一次感知的输入,形成持续学习的基础。在接下来的Day4中,我们将学习如何将感知-行动循环与工具链集成,构建能够调用外部API和数据库的Agent。请继续关注,我们将一步步构建一个完整的AI Agent系统。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐