
1. 什么是 Loop Engineering简单说Loop Engineering循环工程就是设计和优化“智能体Agent的执行循环”。不管是 ChatBot、代码助手、自动写周报的工具还是能帮你查天气、算账、搜资料的智能体剥开外壳后它们的核心都几乎长一个样用户输入 → 模型思考 → 需要工具 → 调用工具 → 拿到结果 → 再思考 → …… → 输出最终答案这个“再思考、再执行、直到完成”的往复过程就是Agent Loop。Loop Engineering 要解决的问题很具体循环什么时候该停下来工具调用结果如何回填给模型上下文越来越长怎么办模型反复调用同一个工具、陷入死循环怎么办怎样让循环既稳定又能控制成本下面我们不讲空话直接用代码把这件事跑通。2. 一个最小闭环感知—思考—行动所有 Agent 循环都可以抽象成三步否是用户输入模型推理需要调用工具?输出最终答案执行工具把结果回填给模型感知Perceive模型读取用户的输入和之前的历史消息。思考Think模型决定是直接回答还是调用某个工具。行动Act执行工具把观察结果重新交给模型。只要这个闭环转起来一个“会使用工具的智能体”就诞生了。3. 三种经典循环模式3.1 ReAct边想边做ReActReasoning Acting是最基础的循环模型一步步推理需要工具就调用拿到结果继续推理。问北京天气怎么样 思考我需要实时天气调用 get_weather。 行动get_weather(北京) 观察晴18°C 思考已经有答案直接回复。3.2 Reflexion带着反思再来一轮在 ReAct 基础上加入自我评价让模型先评判上一次执行结果再决定下一步。适合代码调试、写作润色等需要“回头看”的任务。执行 → 得到结果 → 模型点评哪里不好 → 带着反思重新执行3.3 Plan-and-Execute先规划再执行先用模型拆解出完整计划再逐条执行。适合步骤明确的复杂任务例如“帮我调研三个城市并给出出行建议”。不同场景选不同循环工程上最常见、最好入门的还是ReAct 循环下面我们就用它做实战。4. 保姆级环境搭建本项目使用Python OpenAI 兼容接口。只要你会装包、配一个 API Key 就能跑。4.1 准备环境# 建议使用 Python 3.9python-mvenv .venvsource.venv/bin/activate# Windows 使用 .venv\Scripts\activatepipinstallopenai4.2 配置密钥推荐用环境变量不要把 Key 硬编码进代码exportOPENAI_API_KEY你的 API Key# 如使用第三方中转或本地模型可额外指定 Base URLexportOPENAI_BASE_URLhttps://api.openai.com/v1代码里用os.getenv读取即可下面直接进入实战。5. 项目实战手写一个多工具 Agent 循环我们来实现一个会查天气和算数学表达式的智能体。它能回答下面这类问题北京现在天气怎么样如果气温再升高 5 度会是多少这句话需要连续调用两个工具最能体现“循环”的价值。5.1 完整代码importjsonimportosfromopenaiimportOpenAI clientOpenAI(api_keyos.getenv(OPENAI_API_KEY),base_urlos.getenv(OPENAI_BASE_URL,https://api.openai.com/v1),)MODELgpt-4o-mini# 可替换为你所用的模型名MAX_ITER8# 最大循环次数防止死循环# 1) 用 JSON Schema 声明工具TOOLS[{type:function,function:{name:get_weather,description:查询指定城市的实时天气,parameters:{type:object,properties:{city:{type:string,description:城市名如 Beijing}},required:[city],},},},{type:function,function:{name:calculate,description:计算四则运算表达式,parameters:{type:object,properties:{expression:{type:string,description:数学表达式如 (35)*2}},required:[expression],},},},]# 2) 工具的真实实现defget_weather(city:str)-str:# 演示用假数据真实项目请对接天气 APIweather_map{beijing:晴18°C北风 3 级,shanghai:多云22°C东南风 2 级,}returnweather_map.get(city.lower(),f{city}暂无数据请稍后重试)defcalculate(expression:str)-str:# 白名单校验只允许数字和四则运算符号避免任意代码执行allowedset(0123456789-*/(). )ifnotall(cinallowedforcinexpression):return表达式包含非法字符try:returnstr(eval(expression))exceptExceptionase:returnf计算出错{e}TOOL_FUNCS{get_weather:get_weather,calculate:calculate,}# 3) 核心循环defagent_loop(question:str)-str:messages[{role:system,content:(你是乐于助人的助手。遇到需要实时数据或计算的问题时优先调用工具不要凭空编造。完成回答后直接给出最终结果不要再调用工具。),},{role:user,content:question},]forstepinrange(MAX_ITER):respclient.chat.completions.create(modelMODEL,messagesmessages,toolsTOOLS,)msgresp.choices[0].message# 把模型回复追加进历史供下一轮感知messages.append(msg.model_dump(exclude_noneTrue))# 没有工具调用 这就是最终答案ifnotmsg.tool_calls:returnmsg.contentor# 有一个或多个工具调用逐个执行forcallinmsg.tool_calls:fnTOOL_FUNCS.get(call.function.name)iffnisNone:result未知工具请重新规划else:argsjson.loads(call.function.argumentsor{})resultfn(**args)# 工具结果以 tool 角色回填形成闭环messages.append({role:tool,tool_call_id:call.id,content:result,})return达到最大循环次数仍未能给出最终答案。if__name____main__:answeragent_loop(北京现在天气怎么样如果气温再升高 5 度会是多少)print(answer)5.2 运行结果python agent.py理想情况下你会看到北京现在是晴天气温 18°C。如果气温再升高 5 度就是 23°C。5.3 代码拆解部分作用TOOLS用 JSON Schema 告诉模型“我有哪些工具、参数长什么样”TOOL_FUNCS工具的实际 Python 实现收到参数后返回文本结果messages会话上下文整个循环就是不断往里面追加消息msg.tool_calls模型本轮是否想调用工具为空则代表回答完成6. 循环调优停止条件、上下文与会话记忆6.1 停止条件必须有循环一定要设置MAX_ITER否则模型一旦出现重复调用账单会一路狂奔。常见停止策略最大轮数简单粗暴到点强制收尾。模型主动结束不再返回tool_calls视为完成。重复检测连续两次调用同一个工具且参数相同可以中断并让模型总结。last_callNone# 循环内可加入current(call.function.name,call.function.arguments)ifcurrentlast_call:return检测到重复调用终止循环。last_callcurrent6.2 上下文会越长越贵每一轮循环都会往messages里追加内容。任务复杂时历史会迅速膨胀既烧 Token 又拖慢速度。常用优化裁剪旧观察把很久之前的tool消息替换成一句摘要。只保留关键信息工具返回太长的页面先截断或提取要点再回填。记忆外置把长期记忆放进向量库等存储循环里只带近期上下文。6.3 多轮对话的记忆单个问题跑完就丢掉messages是“无状态”模式。要做多轮对话只需在函数间共享messages并保留在关闭工具调用前的内容即可。7. 常见坑与最佳实践不要直接eval用户输入本示例用字符白名单兜底真实项目建议用ast解析或专用计算库。工具描述要清晰模型只能靠description判断何时调用工具写清楚“做什么、返回什么”。让模型知道何时收手System Prompt 里强调“完成后直接回答”能显著减少多余调用。小步验证先接一个工具跑通循环再逐步增加工具数量。失败要可读工具出错时返回错误文本而不是直接抛异常把问题交给模型重新规划。8. 总结这篇文章我们从一个最小闭环出发讲清了 Loop Engineering 的核心然后手写了一个完整的ReAct 多工具 Agent并给出了停止条件、上下文管理和常见坑的应对方法。你可以在这套骨架上继续扩展接入真实的天气、搜索、数据库工具加上 Reflexion 让模型自我纠错引入记忆系统支持多轮长对话。循环虽小却是所有智能体的心脏。把循环设计稳了你的 Agent 就成功了一半。