行业资讯
📅 2026/9/8 5:32:08
自主驱动AI智能体系统实战:从ReAct架构到Python代码实现
大家在日常开发中肯定遇到过这样的场景定时脚本按照固定规则去抓数据、发通知、做巡检一旦业务规则稍有变化脚本马上“罢工”或者一个自动化流程跑着跑着中间某一步报错整个链路就断了必须等人介入处理。传统自动化工具本质上是被动响应——每一步做什么、遇到什么情况怎么处理都是预先写死的。而当我们面对的任务边界模糊、步骤不固定、异常频发时一套能够自主感知、自主决策、自主执行的系统就显得格外重要。这篇文章会围绕“自主驱动的 AI 智能体系统”展开从核心概念讲起逐步拆解 Agent 的架构设计、决策逻辑与自动化工作流编排方式并带大家手写一个可运行的简易 Agent 框架。无论你是刚开始接触 AI Agents 的初学者还是想把 Agent 落地到项目里的后端开发者都能在这篇文章里找到可直接参考的代码和工程思路。1. 什么是自主驱动的 AI 智能体1.1 从自动化脚本到 AI Agent我们平时写的自动化脚本本质上是一条“无脑执行链”输入数据 - 按照规则A处理 - 按照规则B处理 - 输出结果这种模式在逻辑确定、环境稳定的场景中非常高效。但它的致命弱点是一旦出现规则之外的情况系统就不知道怎么处理。比如你写了一个爬虫脚本目标网站改版了HTML 结构变化之前的 XPath 选择器全部失效脚本就会立刻崩溃并抛出一堆异常。AI Agent智能体则不一样。它不再拘泥于固定的执行步骤而是具备目标理解、任务规划、工具调用和结果反思的能力。也就是说给它一个目标它会自己去思考“我应该分几步完成”“每一步用什么工具”“中途出错了我该如何调整方案”。这就像你带了一个实习生你不告诉他每件事的具体动作而是告诉他目标结果他会自己想办法并且遇到问题会换一种方式继续推进。1.2 自主驱动的四个核心能力一个真正的自主驱动 Agent应该具备以下四种能力感知能力Agent 需要能读取环境中的信息比如文件内容、数据库记录、用户输入、API 返回结果等。感知是决策的前提没有足够的环境信息Agent 就无法制定有效策略。规划与决策能力这是 Agent 的“大脑”。它会把一个大的目标拆解成若干子任务决定先做什么后做什么并在执行过程中根据中间结果动态调整计划。工具调用能力Agent 本身往往不做具体业务动作而是通过调用外部工具来完成任务。比如查数据库、发 HTTP 请求、操作文件、执行代码等。工具是 Agent 的“手和脚”。记忆与反思能力Agent 需要记住前面已经完成的工作和获得的信息避免重复劳动同时还要对执行结果进行反思如果结果不理想就调整策略重新尝试。这四点拼在一起才构成一个完整的自主闭环而不是简单地用大模型接口返回一段文本。1.3 常见应用场景AI Agents 的应用场景非常广泛典型的有场景说明智能客服自动理解用户问题、查询订单系统、回答售后疑问复杂问题转人工自动化运维根据告警信息自动排查日志、定位根因、执行预设的恢复操作数据分析根据业务需求自动取数、清洗、建模、生成可视化报告内容生产自动完成信息搜集、大纲规划、初稿撰写、事实校验个人助理自动整理邮件、排日程、回复常见消息这些场景都有一个共同特点任务目标明确但达成目标的具体路径充满不确定性。这正是自主驱动 Agent 最能发挥价值的地方。2. 自主驱动 Agent 的系统架构设计在实际工程中不要把一个 Agent 写成一个大而全的 God 类而是要按照分层思想进行架构设计。这样既能提升系统的可维护性也方便后续扩展新的能力。2.1 分层架构总览一个生产可用的 Agent 系统建议分成下面几层接入层用户请求入口、消息解析、权限校验 | 感知层读取文本、查询数据库、访问API、获取环境状态 | 决策层目标理解、任务拆解、行动计划、反思调整 | 执行层调用各类工具产生真实业务动作 | 记忆层短期记忆当前任务上下文、长期记忆历史经验 | 安全与监控层权限控制、操作审计、日志追踪、异常熔断每层各司其职层与层之间通过统一的数据结构交互。下面重点说一下决策层和执行层的设计。2.2 决策层Agent 的“大脑”决策层通常由一个核心循环构成业界最常见的模式是 ReActReasoning Acting也就是让 Agent 交替执行“思考”和“行动”。ReAct 的基本流程如下循环开始 1. 思考Thought根据当前状态分析下一步该做什么、为什么这么做。 2. 行动Action选择一个工具并传入参数执行。 3. 观察Observation读取工具返回的结果。 4. 重复以上步骤直到得到最终答案或达到最大步数限制。在这个流程中Agent 不是一次性生成完整计划然后盲目执行而是每走一步都会观察环境反馈及时调整后续方向。这种“边看边想边做”的模式比一次性规划再执行的方式更能应对真实世界的不确定性。2.3 工具层把能力标准化工具层是 Agent 与外部世界交互的桥梁。为了统一管理我们需要对每个工具进行标准化封装每个工具都应该包含工具名称唯一的标识便于 Agent 选择。功能描述说明这个工具能做什么、什么时候用。输入参数定义工具需要的参数以及参数格式。执行函数实际干活的方法。在代码层面我们可以用一个字典来管理所有工具然后让 Agent 根据工具描述来决定调用哪个。这也是后续扩展新工具的基础。2.4 记忆层短期与长期分开记忆层在 Agent 系统中经常被忽略但实际上它非常重要。短期记忆一般指当前任务执行过程中的上下文信息比如已经读取的文件内容、已经完成的步骤、当前的中间数据。在代码实现里可以用一个上下文对象或者列表来保存。长期记忆则用于沉淀经验比如“上次处理这类任务时哪种方案更有效”。长期记忆可以存储在数据库、Redis 或向量数据库中。对于简单系统先用文件或数据库表存起来即可等数据量大了再考虑向量检索方案。3. 环境准备与版本说明在开始写代码之前先明确一下本文示例的环境。由于不同项目的环境差异较大这里不做死板绑定大家根据自己的实际环境微调即可。项目本文章节示例环境操作系统Windows 10/11 或 macOS 均可编程语言Python 3.10关键依赖openai可选、requests、pydanticIDEVS Code 或 PyCharm 均可运行方式命令行直接执行 Python 脚本需要特别说明的是如果你的项目里要接入大模型 API你需要准备对应的 API Key并且把它配置到环境变量中不要硬编码在代码仓库里。3.1 初始化项目结构我们创建一个名为autonomous_agent的项目文件夹结构如下autonomous_agent/ ├── agent/ │ ├── __init__.py │ ├── core.py # Agent 核心循环 │ ├── tools.py # 工具定义与管理 │ └── memory.py # 记忆模块 ├── config.py # 配置文件 ├── main.py # 程序入口 └── requirements.txt # 依赖清单3.2 安装依赖如果只需要跑通核心框架理论上不依赖第三方库也能完成。但为了方便后续接入大模型、处理 HTTP 请求我们统一安装一下依赖pip install openai requests如果你的网络环境访问外部 API 有限制也可以先跳过 openai用本地规则函数来代替大模型决策本文示例会同时给出两种方式。4. 核心机制拆解Agent 的决策逻辑与工作流实现一个 Agent最核心的是决策逻辑。接下来我们先不写业务代码而是把决策循环、工具选择、任务编排和记忆机制拆开讲清楚。4.1 一个通用的决策循环决策循环是 Agent 的主引擎。它的输入是一个用户任务输出是任务完成后的最终结果中间会反复执行“思考-行动-观察”。在代码层面我们可以用下面的伪代码来描述这个循环def run(task, max_steps5): context [] # 保存所有观察结果 for step in range(max_steps): thought think(task, context) if thought.is_finish: # 决定已达成目标 return thought.final_answer action select_action(thought, tools) observation execute_action(action) context.append(observation) return 已达到最大步数任务结果可能未收敛这里有几个关键设计点think负责分析任务和上下文输出下一步行动或者决定结束。select_action根据思考结果选择一个工具。execute_action实际调用工具拿到观察结果。max_steps防止 Agent 陷入死循环是生产环境必须加的“保险丝”。4.2 工具选择的实现思路工具选择有两种常见方式一种是让大模型直接输出工具名称和参数这种方式智能程度高适合复杂场景。当前很多 Agent 框架都采用 function calling 机制来实现。另一种是使用规则映射比如根据任务中的关键词匹配工具。这种方式简单可靠、成本低适合任务类型固定的场景。在工程落地时建议把工具选择设计成可插拔的。也就是说Agent 核心循环不关心“怎么选工具”只关心“选到工具后怎么执行”。这样将来想升级决策策略只需要替换决策模块即可。4.3 工作流编排单步决策与任务拆解对于复杂任务Agent 不应该一上来就盯着最终目标而要先进行任务拆解。比如目标“生成一份竞品分析报告”可以拆解为检索竞品公开数据。整理核心功能对比。分析定价策略。生成结论与建议。任务拆解完成后Agent 再针对每个子任务做单步决策。这种“先纵向拆解、再横向执行”的方式能让 Agent 在长链路任务中保持方向感也方便记录每步的进度和日志。4.4 记忆机制的实现记忆模块最简单的实现方式是一个列表class Memory: def __init__(self): self.short_term [] self.long_term [] def add_short(self, record): self.short_term.append(record) def get_context(self): return \n.join(self.short_term)实际生产环境里短期记忆可以考虑用滑动窗口只保留最近 N 轮上下文避免超出大模型的 token 限制长期记忆则要设计持久化存储和检索机制用数据库或者向量检索库承载。5. 完整实战案例手写一个自主驱动的“技术问答整理 Agent”理论讲了不少接下来进入正题。我们手动实现一个虽然精简但结构完整的 Agent它能够自主完成这样一项任务把一段技术问答对话内容自动整理成结构化的归档记录包含问题分类、关键词、摘要和推荐处理动作。这里面的“自主”体现在Agent 会自己规划处理步骤、选择合适工具、根据中间结果决定是否调整方案并最终输出结构化结果。5.1 先看核心工具模块文件路径agent/tools.py 工具模块把 Agent 能做的动作统一封装在这里。 每个工具都是一个字典包含 name、description、parameters 和 func 四个字段。 def categorize_question(question: str) - str: 根据问题内容简单判断分类。 这里为了不依赖外部 API先用规则实现。 真实项目中可以替换成大模型分类接口。 keywords { 配置: [配置, 环境变量, 端口, 依赖], 报错: [报错, 异常, 失败, 错误, traceback], 性能: [性能, 慢, 超时, 并发, 内存], 代码逻辑: [函数, 面向对象, 循环, 递归, 变量], } for category, words in keywords.items(): for word in words: if word in question: return category return 其他 def extract_keywords(text: str, max_count: int 5) - list: 提取摘要关键词。 这里演示性地取出现频率较高的技术词。 stop_words {的, 了, 是, 在, 和, 如何, 为什么, 怎么} word_count {} # 简单按空格和标点切分 chunks text.replace(, ).replace(。, ).replace(, ).split() for chunk in chunks: if chunk in stop_words: continue if len(chunk) 2: continue word_count[chunk] word_count.get(chunk, 0) 1 sorted_words sorted(word_count.items(), keylambda item: item[1], reverseTrue) return [word for word, _ in sorted_words[:max_count]] def save_result(data: dict, output_path: str) - str: 将结构化结果写入文件。 import json with open(output_path, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2) return f结果已保存到 {output_path} tools [ { name: categorize_question, description: 对技术问题进行分类返回问题所属类别。, parameters: [question], func: categorize_question, }, { name: extract_keywords, description: 从文本中提取关键词列表。, parameters: [text, max_count], func: extract_keywords, }, { name: save_result, description: 把结构化数据保存到 JSON 文件。, parameters: [data, output_path], func: save_result, }, ] def get_tool(name: str): for tool in tools: if tool[name] name: return tool raise ValueError(f未找到工具: {name}) def list_tools(): return [tool[name] for tool in tools]这段代码做的核心事情有两点一是把 Agent 要用的动作统一封装成字典结构二是定义了工具的查询和列出方法。这里用简单的规则来实现分类和关键词提取是为了让大家在没有 API Key 的情况下也能把整个流程跑通。后面接大模型时只需要把categorize_question或extract_keywords的内部实现替换成模型调用即可。5.2 实现 Agent 核心循环文件路径agent/core.py Agent 核心模块实现 感知 - 规划 - 执行 - 反思 的循环。 决策部分默认使用规则函数也可以通过 llm_call 参数替换为大模型接口。 from agent.tools import get_tool class TechQAAnAgent: def __init__(self, llm_callNone, max_steps8): self.llm_call llm_call self.max_steps max_steps self.memory [] # 记录执行历史和观察结果 def remember(self, record: str): self.memory.append(record) def plan(self, task: str): 规划阶段根据任务生成一个大致的行动计划。 如果有 llm_call就交给大模型生成计划 否则返回默认的计划模板。 if self.llm_call: prompt ( 请把下面的任务拆解成有序步骤只需要输出步骤列表。\n f任务{task}\n ) plan_text self.llm_call(prompt) plan [line.strip() for line in plan_text.splitlines() if line.strip()] return plan # 默认场景整理技术问答记录固定拆成四步 return [ 分类问题类型, 提取关键词, 生成简短摘要, 保存结构化结果, ] def decide_action(self, step_description: str, context: dict): 决策阶段根据当前步骤描述和上下文决定调用哪个工具。 这里用规则判断哪个工具适合也可以换成大模型 function calling。 if 分类 in step_description: return categorize_question, {question: context[question]} if 关键词 in step_description: return extract_keywords, {text: context[dialogue]} if 摘要 in step_description: return generate_summary, {text: context[dialogue]} if 保存 in step_description: return save_result, {data: context[result], output_path: context[output_path]} return None, None def execute_action(self, action_name: str, params: dict, context: dict): 执行阶段调用工具并把观察结果写回上下文。 # 摘要能力暂未在 tools 中定义此处先用简单截断模拟 if action_name generate_summary: text params[text] if len(text) 60: return text[:60] ... return text tool get_tool(action_name) func tool[func] result func(**params) return result def run(self, task: str, question: str, dialogue: str, output_path: str): Agent 主入口。 context { task: task, question: question, dialogue: dialogue, output_path: output_path, result: {}, } self.remember(f任务开始: {task}) plan self.plan(task) self.remember(f规划步骤: {plan}) for step_index, step_description in enumerate(plan): action_name, params self.decide_action(step_description, context) if action_name is None: self.remember(f第 {step_index 1} 步未匹配到工具跳过) continue self.remember(f第 {step_index 1} 步执行: {action_name}, 参数: {params}) try: observation self.execute_action(action_name, params, context) self.remember(f观察结果: {observation}) except Exception as e: self.remember(f第 {step_index 1} 步执行异常: {e}) continue # 把结果收敛到 context[result] 中 if action_name categorize_question: context[result][category] observation elif action_name extract_keywords: context[result][keywords] observation elif action_name generate_summary: context[result][summary] observation elif action_name save_result: context[result][saved] observation # 任务结束返回上下文和记忆 return context[result], self.memory这个核心循环是本文最关键的代码。你可以看到Agent 并不是一次性把所有动作全部执行完而是先拿到一个计划然后逐步执行每一步都记录“记忆”在异常情况下并不会导致整个链路崩溃而是跳过当前步骤继续后续动作。这种设计保证了系统的鲁棒性。5.3 替换成大模型决策可选刚才的plan和decide_action都是用规则实现的。如果你需要更强的决策能力可以把llm_call替换为真实的大模型接口。最简单的接入方式是用 OpenAI SDK或者任何兼容 OpenAI 接口的服务import os from openai import OpenAI client OpenAI( api_keyos.getenv(OPENAI_API_KEY), base_urlos.getenv(OPENAI_BASE_URL), ) def llm_call(prompt: str) - str: response client.chat.completions.create( modelgpt-4o-mini, messages[{role: user, content: prompt}], temperature0.2, ) return response.choices[0].message.content然后实例化 Agentagent TechQAAnAgent(llm_callllm_call)其他业务代码完全不用改。这也验证了我们前面说到的“工具层可扩展、决策层可替换”的价值。5.4 编写程序入口文件路径main.pyfrom agent.core import TechQAAnAgent def main(): question Spring Boot 项目启动时端口被占用如何解决 dialogue ( 用户Spring Boot 项目启动时提示端口被占用我应该怎么处理\n 助手可以先检查占用端口的进程然后释放端口或者修改项目配置中的端口号。 ) agent TechQAAnAgent() result, memory agent.run( task整理技术问答记录并归档, questionquestion, dialoguedialogue, output_pathoutput.json, ) print( 整理结果 ) print(result) print(\n 执行过程 ) for record in memory: print(-, record) if __name__ __main__: main()5.5 运行与验证在项目根目录执行python main.py预期输出效果类似 整理结果 {category: 报错, keywords: [Spring, Boot, 项目, 启动, 端口], summary: 用户Spring Boot 项目启动时提示端口被占用我应该怎么处理..., saved: 结果已保存到 output.json} 执行过程 - 任务开始: 整理技术问答记录并归档 - 规划步骤: [分类问题类型, 提取关键词, 生成简短摘要, 保存结构化结果] - 第 1 步执行: categorize_question, 参数: {question: Spring Boot 项目启动时端口被占用如何解决} - 观察结果: 报错 - 第 2 步执行: extract_keywords, 参数: {text: 用户Spring Boot 项目启动时提示端口被占用我应该怎么处理...} - 观察结果: [Spring, Boot, 项目, 启动, 端口] - 第 3 步执行: generate_summary, 参数: {text: 用户Spring Boot 项目启动时提示端口被占用我应该怎么处理...} - 观察结果: 用户Spring Boot 项目启动时提示端口被占用我应该怎么处理... - 第 4 步执行: save_result, 参数: {data: {...}, output_path: output.json} - 观察结果: 结果已保存到 output.json同时项目目录下会生成一个output.json文件内容就是上面打印的result字典。到这里一个支持规划、执行、记忆和反思闭环的简易 Agent 就跑通了。虽然业务功能很简单但它已经具备了自主驱动系统的核心骨架。你可以在此基础上增加更多工具比如查询数据库、调用外部 API、发送邮件等打造真正贴合业务的智能体。6. 从单 Agent 到多 Agent 协作自动化工作流进阶真实业务里一个超大规模的自动化任务很难靠单个 Agent 高质量完成。这时就可能需要引入多个 Agent 分工协作。6.1 为什么需要多个 Agent单个 Agent 的“精力”是有限的上下文长度、token 成本、决策一致性都会成为瓶颈。而且如果所有工具和权限集中在同一个 Agent 内部安全风险也比较高。多 Agent 协作可以把不同职责拆分到不同 Agent 上比如规划 Agent负责拆解任务、制定工作计划。执行 Agent专注调用工具执行具体动作。校验 Agent检查执行结果的质量不符合要求就退回重做。汇报 Agent整理最终结果生成面向用户的报告。这种协作模式不仅更容易排查问题也能让每个 Agent 的提示词和工具集合更聚焦从而提升整体效果。6.2 常见协作模式主管-工人模式一个主管 Agent 负责任务分配和结果验收多个工人 Agent 并行执行子任务。这种模式适合任务可以明显拆成多个独立子任务的情况。流水线模式A Agent 的输出作为 B Agent 的输入任务按照固定顺序在多个 Agent 之间流转。适合步骤之间有严格先后依赖关系的场景。黑板模式多个 Agent 共享一块“黑板”公共数据区谁有想法就把中间结果写到黑板上其他 Agent 读取后继续加工。适合没有固定流程、需要群策群力的复杂任务。在代码层面多 Agent 系统无非就是重新设计一个调度器Orchestrator让它在合适的时机调用对应的 Agent。你完全可以基于前面实现的 Agent 类继续扩展。6.3 工作流状态管理当流程变长之后工作流的状态管理就变得很重要。建议引入状态机思想为每个任务定义状态待规划 - 规划中 - 待执行 - 执行中 - 待校验 - 完成/失败状态转移统一由调度器控制。这样可以非常方便地记录每个任务当前处于什么阶段也方便失败后的重试和恢复。7. 常见问题与排查思路在实际开发和运行 Agent 系统的过程中有几个问题出现频率很高这里整理成表格方便大家对照排查。问题现象常见原因解决思路Agent 执行到一半停止忘记设置最大步数或步数太小设置合理的 max_steps 上限同时检查是否存在死循环工具调用参数总是传错工具参数定义不清晰Agent 没理解在工具描述中写清楚参数含义、类型和示例任务结果不收敛反复重试反思逻辑太弱无法判断结果好坏引入校验 Agent 或增加结果评分规则大模型提示词超长短期记忆积累过多历史记录使用滑动窗口只保留最近 K 轮关键上下文切换大模型后效果变差不同模型对提示词语法敏感度不同用少量测试用例回归验证快速调整提示词线上任务频繁报错没有做异常捕获或工具本身不稳定在 execute_action 外层加 try-except并配置重试机制安全风险Agent 执行了危险操作工具权限过宽缺少审批机制对工具做权限分级危险操作引入人工确认如果你的 Agent 系统在生产环境出现“表现时好时坏”的情况不要把全部精力放在调提示词上面优先检查日志里历史执行轨迹看看 Agent 是在哪一步开始跑偏的。这也是为什么我们上面强调“记忆”和“日志”一定要设计好。8. 最佳实践与工程建议这一节我们跳出代码从工程落地的角度总结一些经验。这些建议在同类型的 Agent 项目中基本通用。8.1 提示词与决策逻辑解耦决策逻辑是代码层面的控制流提示词是大模型理解任务的文本描述。两者不要混在一起。建议把提示词单独维护成模板文件方便调试和版本管理。8.2 安全边界必须前置这是生产落地最需要重视的地方没有之一。Agent 如果具备操作数据库、删除文件、发送消息等权限必须做到最小权限原则。在执行敏感操作之前增加人工审核或者二次确认环节并且保留完整的审计日志。8.3 让系统可观测Agent 的每一次思考、行动、观察都应该有日志记录。建议至少记录时间戳任务 ID当前步骤选择了哪个工具传入参数是什么工具返回结果是什么是否有异常有了完整日志线上问题排查效率会高很多。在分布式系统中还可以接入 OpenTelemetry 进行链路追踪。8.4 成本控制调用大模型 API 是有成本的尤其是 Agent 自主循环可能要频繁调用模型。建议从以下几个方面控制成本设置最大步数阻止无限循环。优先使用便宜的模型处理简单分类、关键词提取等场景。相同内容的多次调用优先走缓存。长期记忆使用向量检索减少一次性塞入太多上下文。8.5 测试要分三层Agent 系统的“不确定性”让测试比传统系统更难。但再难也要测建议分三层单元测试单独测每个工具函数的输入输出是否符合预期。流程测试给定一个模拟任务跑完整条 Agent 链路断言关键步骤是否执行、最终结果是否合格。回归测试维护一批受控的测试用例集当提示词或决策逻辑调整后批量跑一遍看效果是否有退化。9. 总结与学习路线这篇文章我们从“传统自动化脚本只能被动响应”的痛点出发完整梳理了自主驱动 AI 智能体系统的概念、架构、决策逻辑和工作流编排方式并通过一个可运行的技术问答整理 Agent演示了如何用 Python 实现一个最小但完整的 Agent 闭环。这里做一个核心要点回顾Agent 与自动化脚本的本质区别在于Agent 具备感知、规划、工具调用和反思能力。架构上建议分层设计决策层和执行层解耦方便替换和升级。ReAct 是主流的 Agent 决策循环模式核心是“思考-行动-观察”交替进行。工具层用统一的字典结构管理便于扩展和检索。记忆分为短期记忆和长期记忆前者保证任务连续性后者沉淀经验。生产环境要注意安全边界、可观测性、成本控制和分层测试。如果你对 AI Agents 进一步深入建议按下面这个路线学习先持续使用本文的简易框架给它增加更多工具比如 HTTP 请求、数据库操作、代码执行等。再尝试接入大模型 function calling学习如何让模型输出结构化工具调用参数。深入了解 LangChain、LangGraph 等主流 Agent 编排框架理解它们的抽象层次。尝试构建多 Agent 协作系统掌握任务调度和状态管理。最后关注工程化包括日志追踪、权限控制、容量评估和效果评测。AI Agent 真正难的地方不在于某一个大模型 API 调用而在于如何设计一套稳定、可扩展、可维护的工程架构。希望这一篇文章能给你搭好一个起点接下来就动手去写属于你自己的第一个自主驱动 Agent 吧。