ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从提示工程到循环工程:构建自主AI智能体的核心技术架构与实践

从提示工程到循环工程:构建自主AI智能体的核心技术架构与实践 1. 项目概述从“指令”到“循环”的范式跃迁最近和几个做AI应用开发的朋友聊天发现大家讨论的焦点已经从年初火热的“如何写出更好的Prompt”悄然转向了“如何让AI Agent自己跑起来甚至能自我优化”。这让我意识到我们可能正站在一个关键的拐点上AI编程的范式正在从“提示工程”向“循环工程”演进。Prompt Engineering或者说提示工程在过去一年多里几乎是每个AI开发者的必修课。它的核心是“一次性指令的艺术”——我们绞尽脑汁试图用最精确、最结构化的自然语言一次性告诉大模型我们想要什么。这就像给一个极其聪明但缺乏经验的实习生下达一份详尽到标点符号的工作清单期望他一次就交出完美答卷。我们研究思维链、Few-shot示例、角色扮演都是为了提升这一次性交互的“命中率”。然而随着像GPT-4、Claude 3等模型能力的提升以及各类AI Agent框架的涌现单纯依赖“一次性完美Prompt”的局限性越来越明显。复杂的任务往往需要多步骤推理、动态决策、环境交互和自我修正这远非单次Prompt所能覆盖。于是Loop Engineering循环工程的概念开始浮出水面。它不再追求“一击必中”而是设计一个能够自主运行、感知、决策、行动并不断迭代的“循环系统”。这个系统内置了目标、规则、反馈机制和进化逻辑让AI智能体Agent能够在循环中持续工作直至完成任务或达到某种稳定状态。如果说Prompt Engineering是给AI一张静态的地图那么Loop Engineering就是为AI装备了一套完整的导航系统、燃油补给和自我修复能力让它能自己开车上路应对途中的各种突发状况。这不仅仅是术语的更新它代表着开发重心的根本性转移从“如何与模型对话”转向“如何构建一个能自主运作的AI系统”。对于开发者而言这意味着我们需要掌握一套新的工具箱和设计哲学。本文将深入拆解这一范式转变探讨Loop Engineering的核心思想、关键技术栈、典型应用场景并分享从零搭建一个具备“闭环”能力的AI Agent的实战经验与避坑指南。2. 核心需求解析为什么我们需要“闭环”要理解Loop Engineering的必要性我们得先看看Prompt Engineering在应对复杂场景时遇到的“天花板”。2.1 Prompt Engineering的固有局限Prompt Engineering的精髓在于上下文设计。通过精心构造的指令、示例和格式我们在单次交互中引导模型输出期望的结果。这在许多场景下非常有效比如文本润色、代码片段生成、简单问答等。但其局限性也显而易见状态无法持久大模型本质上是无状态的。每次对话在非聊天模式下都是一次独立的推理。对于需要记住之前步骤、中间结果或环境状态的长任务纯Prompt方式需要将全部历史信息塞进上下文不仅效率低下而且很快会触及上下文长度限制。缺乏动态适应性一个写好的Prompt是静态的。如果任务执行过程中出现了预期之外的错误、环境发生了变化、或者得到了新的反馈原始的Prompt无法自动调整策略。开发者需要人工介入修改Prompt然后重试。复杂任务分解困难对于“开发一个完整网站”或“分析一份年度财报并生成投资建议”这类宏大目标试图用一个Prompt解决是不现实的。虽然可以通过思维链Chain-of-Thought提示让模型一步步思考但这仍然是在一次推理中模拟多步骤模型可能会“纸上谈兵”缺乏真正的执行和验证环节。外部工具调用与集成弱大模型擅长思考和生成但不擅长直接操作数据库、调用API、读写文件或控制硬件。纯Prompt方式很难与外部世界进行安全、可靠、循环的交互。2.2 Loop Engineering要解决的核心问题正是这些局限催生了对“闭环”系统的需求。Loop Engineering旨在构建的AI系统具备以下关键特征以解决上述问题状态管理系统需要有一个外部记忆体如向量数据库、传统数据库或简单内存来持久化存储任务目标、执行历史、中间结果和环境状态。这相当于给AI配备了“笔记本”。感知-决策-行动循环这是闭环的核心。系统能持续从环境用户、数据库、API、文件系统等获取输入感知根据当前状态和目标进行分析决策然后执行具体的动作行动如调用工具、生成内容、修改状态等。行动的结果又会作为新的感知输入开启下一轮循环。动态规划与反思系统不应机械执行预设步骤而应具备根据当前进展和反馈动态调整计划的能力。更重要的是它需要“反思”能力分析行动结果是否偏离目标总结失败原因并修正后续策略。这构成了一个更高阶的“规划-执行-反思”循环。安全与边界控制一个能自主循环的系统必须有明确的“护栏”。这包括工具调用的权限控制、循环次数的限制防止死循环、资源消耗的监控以及对输出内容的过滤审核。没有安全的闭环是危险的。因此Loop Engineering的需求本质上是构建一个可靠、自主、可进化的AI智能体使其能够处理开放域、多步骤、需交互的复杂任务将大模型的“思考”能力与外部系统的“执行”能力无缝衔接起来。3. 技术架构与核心组件拆解一个典型的基于Loop Engineering思想的AI Agent系统其架构可以类比为一个具有感知、思考和行动能力的智能机器人。下面我们来拆解其核心组件。3.1 大脑LLM核心与提示模板大语言模型仍然是系统的“大脑”负责所有的推理、规划和内容生成。但在Loop Engineering中我们不再直接向它发送最终的用户请求而是通过一套精心设计的“系统提示词”来定义Agent的角色、目标、约束和行为准则。这个系统提示词是一个动态模板会在每个决策循环中被实例化。它通常包含角色定义你是谁例如“你是一个专业的全栈开发助手”核心指令你的总体目标是什么行动规范你可以使用哪些工具格式是什么状态上下文当前任务是什么已经完成了哪些步骤得到了什么结果输出格式你必须以何种结构进行回复例如严格的JSON包含thought,action,action_input等字段。实操心得这里的系统提示词是“元Prompt”它定义了Agent的决策逻辑。它的质量直接决定了Agent行为的稳定性和可靠性。一个常见的技巧是加入“强制反思”指令例如“在每次行动前你必须简要说明为什么选择这个行动。如果上一步行动失败了你必须首先分析可能的原因。”3.2 记忆模块短期与长期记忆记忆是状态持久化的关键。通常分为两类短期记忆/对话记忆保存当前会话的交互历史。通常使用一个滑动窗口缓冲区只保留最近N轮的人类-Agent交互以防止上下文溢出。长期记忆/知识记忆存储超越本次会话的信息。这包括向量存储用于保存Agent执行任务过程中学到的知识、用户偏好、项目细节等支持基于语义的快速检索。例如Agent在开发过程中读到的API文档片段可以存进去后续需要时再检索出来。实体存储用传统数据库如SQLite、PostgreSQL存储结构化的任务状态、对象属性、关系等。例如一个项目管理Agent可以用它来跟踪每个子任务的状态待办、进行中、已完成。3.3 工具集Agent的“双手”工具是Agent与外部世界交互的接口。每个工具都是一个函数有明确的名称、描述、参数列表和执行逻辑。常见的工具包括代码执行器在安全沙箱中运行生成的代码并返回结果或错误。文件读写工具读取项目文件内容或将生成的代码写入文件。网络搜索工具调用搜索引擎API获取最新信息。专用API调用与第三方服务如GitHub、Jira、Slack交互。数据库查询工具执行SQL查询或更新。工具的描述会被动态地插入到系统提示词中让LLM知道它能做什么以及如何调用。3.4 控制流引擎循环的“心跳”这是Loop Engineering最核心的部分它驱动着整个感知-决策-行动循环。其基本工作流程如下观察引擎收集当前状态包括用户输入、记忆中的相关信息、环境变量等整合成完整的上下文。思考与决策将整合后的上下文和系统提示词一起发送给LLM。LLM根据这些信息进行“思考”并输出一个结构化的决策通常指定要调用哪个工具以及传入什么参数。行动控制流引擎解析LLM的输出找到对应的工具函数并以安全的方式执行它例如对代码执行进行超时和资源限制。观察结果获取工具执行的结果成功或失败附带输出或错误信息。反思与状态更新将“行动”和“结果”作为新的一轮信息更新到记忆尤其是对话历史中。如果设计有专门的“反思”步骤可能会在此触发一个子调用让LLM分析结果并总结经验。循环判断判断任务是否完成达到目标、用户喊停、出现无法处理的错误、或达到最大循环次数。如果未完成回到第1步。这个循环会一直持续直到退出条件被触发。高级的控制流还可能包含子任务分解、多Agent协作调度等复杂逻辑。4. 实战构建一个简单的代码生成闭环Agent理论说得再多不如动手实践。让我们用Python和流行的LangChain框架构建一个最简单的“代码生成与测试”闭环Agent。这个Agent的目标是根据用户描述生成一个Python函数并自动运行测试来验证其正确性如果不通过则尝试修复。4.1 环境准备与依赖安装首先确保你的Python环境在3.8以上。我们使用LangChain作为Agent框架并选择OpenAI的GPT-4系列模型作为大脑你也可以用OpenAI兼容的API如DeepSeek、通义千问等。pip install langchain langchain-openai python-dotenv创建一个.env文件来管理你的API密钥OPENAI_API_KEY你的密钥4.2 定义工具代码执行与测试我们将创建两个核心工具execute_python_code: 在安全环境中执行一段Python代码字符串并返回输出或错误。run_unit_test: 给定一个函数代码和测试用例执行测试并返回通过与否。这里我们使用subprocess在隔离环境中执行代码确保安全。import subprocess import sys import tempfile import os from langchain.tools import tool tool def execute_python_code(code: str) - str: Execute a string of Python code and return the output or error. with tempfile.NamedTemporaryFile(modew, suffix.py, deleteFalse) as f: f.write(code) temp_file_path f.name try: # 使用当前解释器执行可考虑使用docker或更严格的沙箱 result subprocess.run( [sys.executable, temp_file_path], capture_outputTrue, textTrue, timeout10 # 防止无限循环 ) output result.stdout if result.stderr: output f\n[STDERR]: {result.stderr} return output.strip() or Code executed successfully (no output). except subprocess.TimeoutExpired: return Error: Code execution timed out (possible infinite loop). except Exception as e: return fError during execution: {str(e)} finally: os.unlink(temp_file_path) tool def run_unit_test(function_code: str, test_code: str) - str: Run unit test against a function. Returns PASS or FAIL with details. # 将函数代码和测试代码组合成一个可执行脚本 full_code f{function_code}\n\nif __name__ __main__:\n try:\n {test_code}\n print(TEST PASS)\n except AssertionError as e:\n print(fTEST FAIL: {{e}}) result execute_python_code(full_code) if TEST PASS in result: return PASS else: # 提取失败信息 return fFAIL - {result}4.3 构建Agent与系统提示词我们使用LangChain的ReAct Agent模式它鼓励LLM进行“推理”(Reasoning)和“行动”(Acting)。from langchain.agents import AgentExecutor, create_react_agent from langchain_openai import ChatOpenAI from langchain.prompts import PromptTemplate from langchain.memory import ConversationBufferMemory import os from dotenv import load_dotenv load_dotenv() # 1. 初始化LLM llm ChatOpenAI(modelgpt-4-turbo-preview, temperature0, api_keyos.getenv(OPENAI_API_KEY)) # 2. 工具列表 tools [execute_python_code, run_unit_test] # 3. 创建ReAct风格的提示词模板 # 注意这里的模板包含了工具描述、格式要求和循环指令 prompt_template PromptTemplate.from_template( You are a meticulous Python programming assistant. Your goal is to write correct, efficient code based on user requests and VERIFY it through execution or testing. You have access to the following tools: {tools} Use the following format strictly: Question: the input question you must answer Thought: you should always think about what to do. Reflect on previous steps if needed. Action: the action to take, must be one of [{tool_names}] Action Input: the input to the action Observation: the result of the action ... (this Thought/Action/Action Input/Observation can repeat N times) Thought: I now know the final answer Final Answer: the final answer to the original input question Begin! Previous conversation history: {history} Question: {input} Thought: {agent_scratchpad} ) # 4. 创建Agent agent create_react_agent(llm, tools, prompt_template) # 5. 创建带有记忆的执行器 memory ConversationBufferMemory(memory_keyhistory, return_messagesTrue) agent_executor AgentExecutor(agentagent, toolstools, memorymemory, verboseTrue, max_iterations5) # 限制最大循环5次4.4 运行闭环一个完整的交互示例现在让我们运行这个Agent来处理一个任务“写一个函数计算斐波那契数列的第n项并测试n10时结果是否为55。”# 用户输入 task Write a Python function fibonacci(n) that returns the n-th Fibonacci number (starting with fib(0)0, fib(1)1). After writing the function, test it by asserting that fibonacci(10) equals 55. If the test fails, debug and fix the function. try: result agent_executor.invoke({input: task}) print(\n Final Result ) print(result[output]) except Exception as e: print(fAgent execution failed: {e})当你运行这段代码并将verbose设为True时你会在控制台看到完整的思考循环Thought 1: “用户要我写一个斐波那契函数并测试。我应该先写出函数。”Action:execute_python_code 输入是初步的函数代码。Observation: 代码执行成功无输出。Thought 2: “现在我需要测试它。我应该使用run_unit_test工具。”Action:run_unit_test 输入是函数代码和测试断言assert fibonacci(10) 55。Observation: “TEST FAIL: AssertionError”。假设第一次写的函数有bug。Thought 3: “测试失败了。我需要分析错误。让我先单独执行一下函数看看输出。” … 进入调试循环Action:execute_python_code 输入调试代码。Observation: 输出显示fibonacci(10)的结果是 34这是错误的。Thought 4: “我发现了错误我的递归函数没有正确处理边界条件。我需要修正它。” … 最终在几次循环后Thought N: “现在测试通过了。我知道最终答案了。”Final Answer: 提供最终正确的函数代码并确认测试通过。这个简单的例子展示了闭环的核心魅力Agent在无人干预的情况下自主完成了“编码 - 测试 - 失败 - 调试 - 再测试 - 成功”的完整循环。它具备了初步的自我修正能力。5. 进阶模式复杂闭环系统的设计模式基础的ReAct循环已经很强大了但对于更复杂的任务我们需要更高级的设计模式。5.1 规划-执行-反思Plan-Execute-Reflect超级循环这是对基础感知-行动循环的增强特别适合多步骤项目。规划阶段让LLM根据最终目标拆解成一个具体的、有序的子任务列表。例如“开发一个TODO应用”可以拆解为1. 设计数据模型2. 创建后端API3. 实现前端界面4. 编写集成测试。执行阶段Agent按照规划逐个攻克子任务。每个子任务内部可能又是一个小的ReAct循环。反思阶段在一个子任务或整个规划完成后让LLM回顾执行过程计划是否合理遇到了什么意外有哪些可以改进的地方反思的结论可以更新到长期记忆中用于优化未来的规划。这个模式使得Agent能处理更宏大的目标并具备从经验中学习的能力。5.2 分层Agent与管理者-工作者架构对于极其复杂的系统可以引入多Agent协作。一个常见的架构是管理者Agent负责顶层设计、任务分解和调度。它不直接执行具体操作而是将子任务分配给不同的工作者Agent并协调它们的工作。工作者Agent专注于特定领域的专家如“前端编码Agent”、“数据库设计Agent”、“测试Agent”。每个工作者都有自己的工具集和系统提示词。管理者Agent和工作者Agent之间通过消息传递进行通信。这种架构清晰、模块化并且易于扩展。5.3 工具学习与技能进化在一个长期运行的Agent系统中工具集不是一成不变的。我们可以设计机制让Agent自己发现需要新工具甚至描述新工具的功能由开发人员或另一个“工具创建Agent”来实现。更进一步Agent可以通过分析历史成功的行动序列将其抽象成可复用的“技能”或“工作流”存入知识库下次遇到类似任务时直接调用。这就实现了技能的沉淀和进化。6. 常见陷阱、调试技巧与优化策略构建闭环Agent的过程充满挑战。以下是一些我踩过的坑和总结的经验。6.1 典型陷阱与解决方案陷阱表现根本原因解决方案幻觉调用Agent尝试调用一个不存在的工具或工具参数格式错误。1. 工具描述不清晰。 2. LLM未能严格遵循输出格式。1. 为每个工具编写极其精确的描述和参数示例。 2. 在系统提示词中强化输出格式要求可使用JSON Schema进行约束。 3. 在解析LLM输出时增加严格的校验和错误恢复逻辑。循环失控Agent陷入死循环反复执行相同或无效的动作。1. 任务目标不明确或不可达成。 2. 缺乏有效的循环终止判断。 3. LLM的“思考”陷入逻辑怪圈。1. 设定清晰、可衡量的成功标准。 2.强制设定max_iterations最大迭代次数这是最重要的安全阀。 3. 引入“反思”步骤让Agent评估进展如果长时间无进展则主动终止或求助。状态污染记忆中的旧信息干扰了新任务的决策。对话历史或向量检索引入了无关或过时的上下文。1. 为记忆实现基于时间或会话的隔离。 2. 在检索长期记忆时提高查询的相关性阈值。 3. 定期清理或总结对话历史。工具执行风险执行的代码删除了文件、发起了恶意网络请求等。工具权限过高缺乏沙箱隔离。1.所有代码执行必须在严格沙箱中如Docker容器、安全沙箱库。 2. 实施网络访问控制、文件系统白名单。 3. 对工具调用进行事前审查对于高风险操作。成本失控API调用次数和Token消耗远超预期。循环次数过多或每次交互的上下文过于冗长。1. 监控每次循环的Token使用。 2. 压缩和总结记忆内容减少不必要的上下文。 3. 对非核心任务使用更小、更便宜的模型。6.2 调试与监控策略调试一个自主运行的Agent比调试普通代码更困难。你需要一套观察系统。结构化日志记录每一个循环的完整信息时间戳、用户输入、LLM的完整思考Thought、执行的动作Action、动作输入Input、观察结果Observation。这能帮你完整复现Agent的决策路径。可视化轨迹将上述日志转化为可视化的流程图直观展示Agent的决策分支和循环路径。这有助于快速定位“鬼打墙”的地方。关键指标监控循环次数接近最大限制时报警。工具调用分布是否过度依赖某个工具任务完成率与耗时衡量Agent的整体效率。Token消耗预测和控制成本。“中断与接管”机制在开发阶段设计一个允许人工随时中断循环、修改状态或注入新指令的后门。这对于纠正Agent的错误行为至关重要。6.3 提示词工程在闭环中的新角色在Loop Engineering中提示词工程并未消失而是升级了。它的重点从“如何得到一次性好答案”变成了“如何设计Agent的决策逻辑和行为风格”。设计系统角色你定义的“角色”决定了Agent的个性、专业领域和道德边界。一个“安全至上”的代码助手和一个“激进创新”的探索者其行为会截然不同。制定反思模板如何让Agent进行有效的反思你需要设计具体的反思问题例如“上一步行动失败的根本原因是什么是工具问题、参数问题还是逻辑问题”“当前的计划是否仍然可行是否需要调整”规划指令如何让Agent做出合理的规划你可以提供规划模板如“请将目标‘{goal}’分解为不超过5个具体的、可顺序执行的子任务。每个子任务应以动词开头并有一个明确的完成标准。”7. 未来展望与个人体会从Prompt Engineering到Loop Engineering我们正在将AI从“聪明的鹦鹉”转变为“可靠的学徒”。前者需要我们事无巨细地指导每一步后者则能在我们设定好目标和规则后独立地去探索和解决问题并回来向我们汇报。我个人在实践中的体会是构建闭环系统的最大挑战不在于技术实现而在于系统设计思维的转变。我们不再是“对话者”而是“系统架构师”和“规则制定者”。我们需要思考任务的边界在哪里失败该如何定义和处理如何平衡Agent的自主性与系统的安全性这更像是在设计一个具有特定能力的数字生命体。目前Loop Engineering仍处于早期阶段工具链和最佳实践都在快速演进。像LangChain、LlamaIndex、AutoGen、CrewAI等框架大大降低了构建Agent的门槛。未来我期待看到更多标准化与模块化出现像“应用商店”一样的可复用Agent模块、工具和技能库。更强大的底层模型具备更强规划、反思和工具使用原生能力的模型。可视化低代码平台让非专业开发者也能通过拖拽搭建自己的AI工作流。对于开发者而言现在正是深入探索Loop Engineering的黄金时期。不必追求构建一个通用全能Agent从一个能解决你日常工作中某个具体、重复性痛点的“小闭环”开始——比如自动写周报、智能排查日志、辅助代码审查——你会更快地体会到这种范式带来的效率革命。记住最好的学习方式就是动手从一个简单的ReAct循环开始看着你的AI助手第一次靠自己修好了一个bug那种感觉就像看着孩子学会了走路。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进