从零实现一个 ReAct 智能体:架构原理、核心循环与进阶扩展
AI 智能体是当前人工智能领域最具变革性的方向之一。它不再局限于单轮问答,而是能够感知环境、自主规划、调用工具、记忆历史,并持续迭代以达成目标。从 AutoGPT 到 LangChain,从 ReAct 到多智能体协作,智能体正在重塑人机交互的范式。这篇文章从专业角度剖析智能体的核心架构,并给出可落地的代码实现——不讲空泛概念,直接手写一个最小但五脏俱全的 ReAct 智能体。
一、核心架构:Agent = LLM + 规划 + 记忆 + 工具
一个完整的 AI 智能体通常包含五个模块。感知(Perception)负责接收用户输入、环境状态或多模态信息;规划(Planning)把复杂任务分解为子任务、决定下一步行动;记忆(Memory)中短期记忆保存当前上下文、长期记忆通过向量数据库持久化;工具(Tools)调用外部 API、代码执行器、搜索引擎扩展能力边界;执行(Action)根据决策执行动作,并将结果反馈给规划模块。
其中大语言模型充当"大脑",负责推理与决策。智能体的本质是一个循环控制系统:观察→思考→行动→观察,直到任务完成。理解了这个循环,所有框架在你眼里都会变得通透——它们只是把这个循环工程化的壳。
二、两种主流范式:ReAct 与 Plan-and-Execute
ReAct(Reasoning + Acting)是最经典的智能体范式。它让 LLM 交替生成"思考"和"动作",通过工具调用获取外部信息,再根据结果继续推理。它的优势在于动态适应性强——模型可以根据中间结果调整策略,比如搜索"2026 年最新大模型排名"后发现信息不够,可以换个关键词再搜,而不是硬着头皮编。适合探索性、需要临场应变的任务。
Plan-and-Execute 则先制定完整计划,再逐步执行。它适合流程明确、步骤较多的任务,能减少 LLM 调用次数、降低成本。还有 Reflexion 范式引入自我反思机制,让智能体从失败中学习,修正后续决策。三种范式并不互斥,实践中常常组合使用。
三、代码实现:一个最小 ReAct 智能体
下面这段 Python 代码展示了一个具备工具调用和短期记忆的 ReAct 智能体核心逻辑。为了把原理讲透,我们刻意不依赖任何框架,直接用 OpenAI SDK:
importjson,osfromopenaiimportOpenAI client=OpenAI(api_key=os.getenv("OPENAI_API_KEY"))# 工具注册:实际应用中应使用安全沙箱,避免 eval 风险TOOLS={"calculator":lambdaexpr:str(eval(expr,{"__builtins__":{}},{})),"search":lambdaquery:f"[模拟搜索]{query}的相关结果",}defcall_llm(messages):resp=client.chat.completions.create(model="gpt-4o-mini",messages=messages,temperature=0)returnresp.choices[0].message.contentdefreact_agent(task,max_steps=6):scratchpad=[]# 短期记忆for_inrange(max_steps):prompt=f"""任务:{task}可用工具:{list(TOOLS.keys())}历史:{chr(10).join(scratchpad)}请严格按JSON输出:{{"thought":"...","action":"工具名或final","action_input":"..."}}"""raw=call_llm([{"role":"user","content":prompt}])try:decision=json.loads(raw)exceptjson.JSONDecodeError:scratchpad.append("解析失败,重试")continuescratchpad.append(f"思考:{decision['thought']}")ifdecision["action"]=="final":returndecision["action_input"]tool=TOOLS.get(decision["action"])ifnottool:scratchpad.append(f"未知工具:{decision['action']}")continuetry:result=tool(decision["action_input"])exceptExceptionase:result=f"工具错误:{e}"scratchpad.append(f"动作:{decision['action']}({decision['action_input']}) ->{result}")return"达到最大步数,任务未完成"``` 代码解析:TOOLS 字典注册了可调用工具;call_llm 封装 LLM 接口;react_agent 维护 scratchpad 作为短期记忆,循环执行"生成决策→解析 JSON→调用工具→记录结果"。当 LLM 输出 final 时返回答案。这个实现里有两个值得注意的设计:一是让模型以结构化 JSON 输出决策(thought/action/action_input),而不是自由文本,极大降低了解析成本;二是把每一步思考与工具结果都追加进 scratchpad 作为短期记忆,让模型在下一次决策时能看到完整的推理轨迹——这就是 ReAct 循环"观察"环节的工程化实现。## 四、进阶一:升级为原生 Function Calling上面用自由文本 JSON 的方式教学原理,但生产环境强烈建议使用原生 Function Calling。区别在于:模型直接输出结构化的 tool_calls,由框架保证格式,无需自己解析 JSON;消息历史中的角色语义(system/user/assistant/tool)更加清晰。用 Function Calling 版本,工具执行循环会更健壮: ```pythondefrun_agent(user_input,max_steps=5):messages=[{"role":"system","content":"你是严谨助手。"},{"role":"user","content":user_input}]for_inrange(max_steps):resp=client.chat.completions.create(model="gpt-4o-mini",messages=messages,tools=TOOLS_SCHEMA,tool_choice="auto")msg=resp.choices[0].message messages.append(msg)ifnotmsg.tool_calls:returnmsg.contentfortcinmsg.tool_calls:result=TOOL_MAP[tc.function.name](**json.loads(tc.function.arguments))messages.append({"role":"tool","tool_call_id":tc.id,"content":str(result)})return"达到最大步数"```## 五、进阶二:注入长期记忆scratchpad 只是短期记忆,会话结束就消失了。生产级智能体需要长期记忆:把用户偏好、历史行为、领域知识向量化存入向量数据库,新会话开始时检索相关片段注入上下文。可以先用最简单的方式实现——维护一个 JSON 文件或 SQLite 表存历史,再用 Embedding 检索。进阶方案是 Chroma/Qdrant+RAG。关键设计原则:检索回来的内容要经过重排序和压缩,只注入最相关的部分,避免上下文膨胀稀释指令。## 六、进阶三:自我反思与安全护栏Reflexion 范式让智能体在任务失败后反思错误、记录经验、下一轮避免重蹈覆辙。实现上可以在 scratchpad 末尾增加一步"反思":模型总结刚才哪里做错了、下次应该怎么做,作为后续决策的指导。这能显著提升长任务的成功率——实验表明,带反思的迭代循环比无反思的线性重试收敛更快、质量更稳。 安全护栏方面:计算类工具不要用eval,改用 AST 白名单解析(只允许加减乘除幂);工具执行异常要作为观察结果回传,而不是中断循环;所有工具调用记录审计日志;涉及高危操作设置人工确认门禁。## 七、挑战与展望当前 AI 智能体仍面临诸多挑战:幻觉导致错误决策,无限循环消耗资源,安全风险如工具滥用与提示注入,成本控制与对齐问题。未来,多模态感知、多智能体协作、持续学习与人类反馈强化学习将成为关键突破点。但无论技术怎么演进,"观察→思考→行动"的闭环不会变——理解了这个最小循环,你就拿到了智能体世界的钥匙。 AI 智能体标志着 AI 从"被动回答"走向"主动执行"。掌握其架构原理与工程实现,是开发者拥抱下一代 AI 应用的核心能力。随着生态成熟,智能体有望成为数字世界的通用执行单元。