AI Agent 30天速成|Day7 笔记

引言:从基础到进阶的第七天今天是我们AI Agent速成课程的第7天。在前六天里,我们已经学习了Agent的基础概念、环境搭建、简单对话系统、记忆机制、工具调用以及多轮交互。今天,我们将深入探讨一个核心进阶主题:Agent的决策与规划能力。这不仅是从“被动响应”到“主动思考”的关键一步,也是构建智能Agent的里程碑。## 基础概念回顾:Agent决策的三大核心在深入代码之前,我们先快速回顾一下Agent决策的基础。一个智能Agent通常需要三个关键组件:1. 感知模块:接收用户输入或环境状态。2. 推理引擎:基于当前状态和记忆,决定下一步行动。3. 执行模块:将决策转化为具体动作(如调用工具、生成回复)。今天我们将重点放在推理引擎上,学习如何让Agent具备多步骤规划的能力。我们会从最简单的“如果-那么”规则开始,逐步过渡到使用语言模型(LLM)进行动态规划。## 第一步:基于规则的简单规划最基础的规划是硬编码规则。虽然灵活性低,但适合确定性场景。下面是一个简单的“任务队列”Agent示例,它根据预定义顺序执行操作。python# 示例1:基于规则的任务规划Agentclass RuleBasedAgent: def __init__(self): # 定义任务队列:每个任务包含名称和操作函数 self.task_queue = [ {"name": "收集数据", "action": self.collect_data}, {"name": "分析数据", "action": self.analyze_data}, {"name": "生成报告", "action": self.generate_report} ] self.current_step = 0 def collect_data(self): print("步骤1: 正在从数据库收集原始数据...") return {"raw_data": [1, 2, 3, 4, 5]} def analyze_data(self): print("步骤2: 正在分析数据,计算平均值...") data = [1, 2, 3, 4, 5] # 假设从上下文获取 avg = sum(data) / len(data) return {"average": avg} def generate_report(self): print("步骤3: 正在生成最终报告...") return {"report": "数据分析完成,平均值为3.0"} def run(self): print("Agent启动:开始按规则执行任务") results = [] for task in self.task_queue: result = task["action"]() # 顺序执行 results.append(result) print(f" -> {task['name']}完成") print("所有任务执行完毕!") return results# 运行Agentagent = RuleBasedAgent()final_results = agent.run()print("最终输出:", final_results)输出解释:这个Agent严格按照预设顺序执行三个步骤。它适用于流程固定的场景,比如数据ETL流程。但问题在于:如果环境变化(比如数据为空),它无法调整计划。## 第二步:引入条件分支与状态感知为了让Agent更智能,我们可以加入条件判断。比如,如果数据收集失败,就跳过分析步骤。python# 示例2:带条件分支的Agentclass ConditionalAgent: def __init__(self): self.state = {"data_collected": False, "data_valid": False} def collect_data(self): print("尝试收集数据...") # 模拟可能失败的情况 import random success = random.choice([True, False]) if success: self.state["data_collected"] = True print("数据收集成功!") else: print("数据收集失败!") return success def validate_data(self): print("验证数据有效性...") if self.state["data_collected"]: self.state["data_valid"] = True print("数据有效,可以分析") return True else: print("数据无效,跳过分析") return False def analyze_and_report(self): if self.state["data_valid"]: print("执行分析并生成报告...") return "报告生成完毕" else: print("由于数据无效,无法生成报告") return "错误:缺少有效数据" def run(self): print("条件Agent开始执行") # 步骤1: 收集数据 if self.collect_data(): # 步骤2: 验证数据 if self.validate_data(): # 步骤3: 分析并报告 result = self.analyze_and_report() else: result = "数据验证失败,流程终止" else: result = "数据收集失败,流程终止" print("最终结果:", result)# 运行多次以观察不同路径for i in range(3): print(f"\n--- 第{i+1}次运行 ---") agent = ConditionalAgent() agent.run()关键点:这个Agent会根据环境状态(数据是否成功收集)动态选择路径。这比硬编码队列更灵活,但依然依赖程序员预定义所有分支。## 第三步:使用LLM进行动态规划(高级用法)现在进入今天的核心:让Agent利用大语言模型(LLM)自主生成规划。我们将使用OpenAI API(或任何兼容的LLM)来让Agent思考“接下来该做什么”。这里假设你已经配置了API密钥。python# 示例3:基于LLM的动态规划Agent(高级)import openai # 需要安装:pip install openaiclass LLMAgent: def __init__(self, api_key): openai.api_key = api_key self.memory = [] # 对话历史记忆 self.tools = { "search_web": "搜索互联网获取信息", "calculate": "执行数学计算", "send_email": "发送电子邮件" } def think_and_plan(self, user_goal): """让LLM根据目标生成下一步计划""" prompt = f""" 你是一个智能Agent。用户的目标是:{user_goal} 你可以使用以下工具:{self.tools} 请以JSON格式输出你的下一步计划,格式为: {{"action": "工具名称", "params": {{"参数名": "参数值"}}}} 如果任务完成,输出:{{"action": "finish", "result": "最终结果"}} """ response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "你是一个任务规划Agent"}, {"role": "user", "content": prompt} ] ) plan = response.choices[0].message.content # 这里简化处理,实际需要解析JSON return eval(plan) # 注意:生产环境应使用json.loads def execute_action(self, action, params): """执行具体动作(模拟)""" if action == "search_web": print(f"正在搜索:{params['query']}") return f"搜索结果:关于{params['query']}的信息" elif action == "calculate": print(f"计算:{params['expression']}") return eval(params['expression']) elif action == "send_email": print(f"发送邮件给:{params['recipient']}") return "邮件发送成功" elif action == "finish": print(f"任务完成!结果:{params['result']}") return params['result'] else: return f"未知动作:{action}" def run(self, user_goal): print(f"目标:{user_goal}") while True: plan = self.think_and_plan(user_goal) print(f"Agent计划执行:{plan}") result = self.execute_action(plan["action"], plan.get("params", {})) # 将结果存入记忆 self.memory.append({"plan": plan, "result": result}) if plan["action"] == "finish": break return result# 使用示例(请填入你的API密钥)# agent = LLMAgent(api_key="sk-你的密钥")# result = agent.run("计算5+3的结果,然后搜索关于Python的信息")# print("最终结果:", result)重要说明:这个示例展示了LLM如何动态决定下一步动作。Agent会:1. 将用户目标和可用工具告诉LLM。2. LLM输出一个结构化的计划(如{"action": "calculate", "params": {"expression": "5+3"}})。3. Agent执行该动作并记录结果。4. 重复直到LLM输出finish指令。这种模式让Agent可以处理复杂、非确定性的任务,比如“先搜索天气,然后根据天气决定是否发送提醒邮件”。## 总结与进阶方向今天我们完成了从基础规则到LLM动态规划的跨越。以下是今天的关键收获:### 核心要点1. 规则规划:适合固定流程,简单可靠但缺乏灵活性。2. 条件分支:引入状态感知,能处理简单异常。3. LLM规划:让Agent具备真正的“思考”能力,能自主分解复杂任务并选择工具。### 实践建议- 从规则Agent开始,逐步增加条件分支。- 当任务复杂度超过10个分支时,考虑引入LLM。- 注意LLM的响应延迟和成本,混合使用规则和LLM(如规则做框架,LLM做细节)。### 明天预告Day8我们将学习Agent的记忆与长上下文管理,包括如何让Agent记住之前的对话、使用向量数据库存储知识,以及如何避免“遗忘”关键信息。这将让我们的Agent不仅会思考,还能持续学习。记住:好的Agent不是“最智能”的,而是“最适合”任务的。从简单开始,逐步增加智能层,这才是构建可靠AI Agent的最佳路径。

Logo

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

更多推荐