最近在尝试将大语言模型LLM应用到更复杂的自动化任务流中时遇到了一个典型困境单次调用模型生成的代码或方案往往需要经过多轮人工验证、调试和反馈才能最终可用。这个过程不仅效率低下也限制了AI在复杂工程场景中的自主性。为了解决这个问题我开始深入研究“循环工程”与“Agent协同”这两个核心概念并尝试结合最新的GLM-5.3模型构建一个能够自我迭代、自我修正的智能体系统。本文将系统性地拆解如何利用GLM-5.3的扩展编程能力结合循环工程思想构建一个具备安全边界的、可重写的Agent协同框架。无论你是想了解AI Agent开发的前沿实践还是希望将大模型深度集成到自己的开发工作流中这篇文章都将提供从理论到代码的完整路径。1. 背景与核心概念从单次问答到循环工程在传统的AI应用模式中我们通常将大模型视为一个“超级问答机”输入问题获取答案任务结束。然而对于软件开发、数据分析、系统运维等复杂任务一个答案往往只是起点。真正的工程价值产生于“构思-执行-验证-修正”的循环中。1.1 什么是循环工程循环工程是一种方法论它强调将AI驱动的任务执行过程设计为一个闭环系统。在这个系统中AI Agent不仅负责生成初始方案还负责执行或调用工具执行、检查结果、分析错误并根据反馈自动调整策略重新生成方案直到任务成功或达到终止条件。这模仿了人类工程师解决问题时的迭代思维。1.2 Agent协同与重写单个Agent的能力是有限的。Agent协同是指多个具备不同专长如编码、测试、部署、安全检查的AI Agent相互协作共同完成一个复杂任务。而“重写”在这里有两层含义一是Agent能够根据环境反馈重写即修改自己之前生成的代码或计划二是在架构上系统支持动态地替换或升级某个Agent的能力模块实现系统的持续进化。1.3 GLM-5-3的角色与安全边界GLM-5-3作为一个功能强大的大语言模型在这个框架中扮演着“核心决策与生成引擎”的角色。它的“扩展编程”能力意味着我们可以通过系统提示词、函数调用、代码解释等机制极大地扩展其行为模式使其不仅能聊天还能进行结构化思考、调用工具和生成复杂代码。“安全边界”是此类自主系统的生命线。它意味着操作安全Agent执行任何具有潜在风险的操作如文件写入、系统命令、网络访问前必须经过明确的授权或沙箱环境。内容安全对模型的输入和输出进行过滤与审查防止生成有害、偏见或不安全的代码与内容。流程安全设置循环的最大迭代次数、超时机制、资源消耗监控防止失控循环。2. 环境准备与版本说明我们将构建一个基于Python的本地原型系统。这个环境侧重于展示核心逻辑在实际生产中可能需要更强大的基础设施。基础环境操作系统Windows 10/11, macOS 或 Linux (Ubuntu 20.04)Python版本3.9 或 3.10推荐3.10兼容性更好包管理工具pip核心库与版本我们将使用openai风格的SDK来调用GLM模型此处以智谱AI的开放平台API为例原理通用。同时需要一些工具库。# 创建项目目录并初始化虚拟环境可选但推荐 mkdir glm-agent-loop cd glm-agent-loop python -m venv venv # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate # 安装核心依赖 pip install zhipuai # 智谱AI官方SDK用于调用GLM模型 pip install python-dotenv # 管理环境变量 pip install requests # 用于可能的工具调用如API查询 pip install docker # 可选用于代码沙箱执行高级安全关键配置.env文件在项目根目录创建.env文件用于安全存储API密钥等敏感信息。切记将该文件加入.gitignore。# .env ZHIPUAI_API_KEYyour_glm_api_key_here # 其他配置如循环最大次数、沙箱配置等 MAX_ITERATIONS10 SAFE_MODETrue项目结构预览glm-agent-loop/ ├── .env # 环境变量配置保密 ├── .gitignore # 忽略.env等文件 ├── requirements.txt # 依赖列表 ├── main.py # 主程序入口 ├── core/ │ ├── __init__.py │ ├── agent.py # Agent基类与协同管理器 │ ├── glm_client.py # GLM模型封装客户端 │ └── safety.py # 安全边界检查模块 ├── tools/ │ ├── __init__.py │ ├── code_executor.py # 代码执行工具安全沙箱 │ └── web_searcher.py # 网络搜索工具可控 └── tasks/ └── example_task.json # 示例任务定义3. 核心组件拆解Agent、循环引擎与安全层3.1 GLM-5-3客户端封装首先我们需要一个稳定、易用的客户端来与GLM-5-3交互。这里不仅要完成API调用还要集成提示词模板和管理对话历史。# core/glm_client.py import os from typing import List, Dict, Any from zhipuai import ZhipuAI from dotenv import load_dotenv load_dotenv() # 加载环境变量 class GLMClient: 封装GLM-5-3 API调用的客户端 def __init__(self, model: str glm-5-3): self.api_key os.getenv(ZHIPUAI_API_KEY) if not self.api_key: raise ValueError(请在 .env 文件中设置 ZHIPUAI_API_KEY) self.client ZhipuAI(api_keyself.api_key) self.model model self.conversation_history: List[Dict[str, str]] [] def _format_messages(self, system_prompt: str, user_prompt: str) - List[Dict[str, str]]: 格式化消息为API所需格式并维护历史上下文简化版 messages [] if system_prompt: messages.append({role: system, content: system_prompt}) # 添加上下文历史可根据需要控制长度 messages.extend(self.conversation_history[-6:]) # 保留最近3轮对话 messages.append({role: user, content: user_prompt}) return messages def chat_completion(self, system_prompt: str, user_prompt: str, **kwargs) - str: 与GLM模型进行对话补全。 Args: system_prompt: 系统角色设定定义Agent的能力和约束。 user_prompt: 用户输入的具体任务或问题。 **kwargs: 其他API参数如temperature, max_tokens等。 Returns: 模型生成的文本响应。 messages self._format_messages(system_prompt, user_prompt) try: response self.client.chat.completions.create( modelself.model, messagesmessages, temperaturekwargs.get(temperature, 0.7), # 创造性 max_tokenskwargs.get(max_tokens, 2000), top_pkwargs.get(top_p, 0.95), ) result response.choices[0].message.content # 更新对话历史 self.conversation_history.append({role: user, content: user_prompt}) self.conversation_history.append({role: assistant, content: result}) return result except Exception as e: print(fGLM API调用失败: {e}) # 在实际应用中这里应有更完善的错误处理和重试逻辑 return fError: {str(e)} def clear_history(self): 清空对话历史 self.conversation_history.clear()3.2 Agent基类与协同设计我们设计一个基础的Agent类不同的专业Agent如CoderAgent,TesterAgent,SecurityAgent将继承它。# core/agent.py from abc import ABC, abstractmethod from typing import Dict, Any, List from core.glm_client import GLMClient class Agent(ABC): 所有智能体的抽象基类 def __init__(self, name: str, expertise: str, glm_client: GLMClient): self.name name self.expertise expertise self.glm glm_client self.system_prompt self._define_system_prompt() abstractmethod def _define_system_prompt(self) - str: 定义该Agent的系统提示词描述其角色、能力和约束。 pass abstractmethod def execute(self, task_description: str, context: Dict[str, Any] None) - Dict[str, Any]: 执行任务的核心方法。 Args: task_description: 任务描述。 context: 来自其他Agent或环境的上下文信息。 Returns: 包含执行结果和状态的字典。 pass def reflect(self, feedback: str) - str: Agent对反馈进行反思调整策略。这是“重写”能力的关键。 Args: feedback: 对上次执行结果的反馈可能来自用户、其他Agent或工具。 Returns: 反思后的调整计划或总结。 reflection_prompt f 你刚刚完成了一项任务但收到了以下反馈 {feedback} 请基于你的专长{self.expertise}分析哪里可以改进并简要说明如果再次执行类似任务你会如何调整方法。 return self.glm.chat_completion( system_prompt你是一个善于自我反思和改进的AI助手。, user_promptreflection_prompt, temperature0.3 # 反思需要更确定性 ) class CoderAgent(Agent): 负责编写和修改代码的Agent def _define_system_prompt(self) - str: return f 你是一个资深{self.expertise}开发工程师。你的任务是编写、分析、修改和解释代码。 你必须遵守以下规则 1. 只生成安全、高效、可读性高的代码。 2. 如果任务描述不清晰主动询问或做出合理假设并说明。 3. 生成的代码必须包含必要的注释。 4. 如果涉及文件操作、网络请求或系统调用必须在代码中明确标出潜在风险并建议在沙箱中运行。 5. 输出格式首先用一句话总结你的方案然后以language的代码块形式提供完整代码。 def execute(self, task_description: str, context: Dict[str, Any] None) - Dict[str, Any]: user_prompt f 任务{task_description} 上下文信息 {context if context else 无} 请根据以上信息完成编码任务。 code_response self.glm.chat_completion( system_promptself.system_prompt, user_promptuser_prompt ) # 这里可以添加代码解析逻辑从响应中提取出纯代码部分 return { agent: self.name, action: code_generation, result: code_response, status: completed } class AgentOrchestrator: Agent协同编排器管理任务流和Agent间的通信 def __init__(self): self.agents: Dict[str, Agent] {} self.workflow_history: List[Dict[str, Any]] [] def register_agent(self, agent: Agent): self.agents[agent.name] agent def run_task(self, initial_task: str, max_iterations: int 5) - Dict[str, Any]: 运行一个循环工程任务。 Args: initial_task: 初始任务描述。 max_iterations: 最大循环次数防止无限循环。 print(f开始执行任务: {initial_task}) current_context {task: initial_task, history: []} iteration 0 while iteration max_iterations: iteration 1 print(f\n--- 迭代第 {iteration} 轮 ---) # 1. 规划决定由哪个或哪些Agent执行这里简化为按顺序调用Coder, Tester # 在实际复杂系统中可以引入一个Planner Agent来动态规划 for agent_name in [Coder, Tester]: # 简化的工作流 if agent_name in self.agents: agent self.agents[agent_name] print(f[Orchestrator] 调度 {agent_name}...) result agent.execute(current_context[task], current_context) current_context[history].append(result) # 2. 执行与检查这里Tester Agent的结果可以作为反馈 # 假设Tester Agent的结果中包含‘feedback’字段 if feedback in result and failed in result[feedback].lower(): print(f[Orchestrator] 检测到失败反馈触发反思与重写...) # 3. 反思让相关Agent根据反馈进行反思 reflection agent.reflect(result[feedback]) print(f{agent_name}反思: {reflection[:200]}...) # 4. 重写将反思结果作为新上下文进入下一轮循环 current_context[task] f基于以下反思调整之前的方案{reflection}\n原始任务{initial_task} break # 跳出当前迭代进入下一轮 else: print(f[Orchestrator] {agent_name} 执行成功。) # 简化逻辑如果顺利执行完所有Agent且无失败反馈则认为任务完成 if iteration 1 and len(current_context[history]) len(self.agents): print([Orchestrator] 任务一次性执行成功循环结束。) break final_result { completed: iteration max_iterations, iterations: iteration, final_context: current_context, workflow_history: self.workflow_history } print(f\n任务结束。状态: {成功 if final_result[completed] else 达到最大迭代次数}。) return final_result3.3 安全边界层实现安全是自主系统的基石。我们实现一个基础的安全检查模块。# core/safety.py import re import ast from typing import List, Tuple class SafetyChecker: 基础安全与内容检查器 def __init__(self, safe_mode: bool True): self.safe_mode safe_mode self.dangerous_patterns [ ros\.system\s*\(, rsubprocess\.Popen\s*\(, reval\s*\(, rexec\s*\(, r__import__\s*\(, ropen\s*\([^)]*w[^b]?\), # 非二进制写模式 rrequests\.(get|post|put|delete)\s*\(, # 可以添加更多危险模式 ] self.sensitive_keywords [密钥, 密码, token, apikey, secret] def validate_code(self, code_block: str, language: str python) - Tuple[bool, List[str]]: 验证代码块的安全性。 Returns: (是否安全, 警告信息列表) warnings [] if not self.safe_mode: return True, warnings # 1. 检查危险操作模式 for pattern in self.dangerous_patterns: if re.search(pattern, code_block, re.IGNORECASE): warnings.append(f检测到潜在危险操作: {pattern}) # 2. 检查是否包含敏感信息硬编码 for keyword in self.sensitive_keywords: if keyword in code_block.lower(): warnings.append(f代码中可能包含敏感关键词: {keyword}请确保未泄露真实凭证。) # 3. 尝试进行简单的语法检查仅Python if language python: try: ast.parse(code_block) except SyntaxError as e: warnings.append(fPython语法错误: {e}) is_safe len(warnings) 0 if not is_safe: warnings.insert(0, 【安全警告】生成的代码需要人工审查) return is_safe, warnings def sanitize_output(self, text: str) - str: 对模型的文本输出进行基础清理防止注入攻击等。 # 这是一个非常基础的示例实际应用需要更严格的策略 # 例如如果输出是HTML/JS需要不同的清理库 sanitized text # 移除可能用于XSS的简单脚本标签非常基础的防护 sanitized re.sub(rscript[^]*.*?/script, [SCRIPT REMOVED], sanitized, flagsre.DOTALL | re.IGNORECASE) return sanitized4. 完整实战案例构建一个自我修正的Python脚本编写Agent系统现在我们将上述组件组合起来完成一个可以编写简单Python脚本并能在测试失败后自动尝试修正的循环工程Demo。4.1 项目初始化与Agent创建首先创建主程序文件并初始化各个组件。# main.py import os from core.glm_client import GLMClient from core.agent import CoderAgent, AgentOrchestrator from core.safety import SafetyChecker from tools.code_executor import SafeCodeExecutor # 假设我们有一个安全执行工具 from dotenv import load_dotenv load_dotenv() def main(): # 1. 初始化核心组件 glm_client GLMClient(modelglm-5-3) safety_checker SafetyChecker(safe_modeTrue) # 2. 创建Agent coder_agent CoderAgent(namePythonCoder, expertisePython, glm_clientglm_client) # 3. 创建编排器并注册Agent orchestrator AgentOrchestrator() orchestrator.register_agent(coder_agent) # 注意这里我们简化了没有真正的TesterAgent我们用模拟反馈来演示循环 # 4. 定义一个任务编写一个计算斐波那契数列第N项的函数并返回列表 task 请编写一个Python函数 fibonacci_sequence(n)它接受一个整数n返回一个列表包含斐波那契数列的前n项。 要求 1. 包含类型提示。 2. 处理n0的情况返回空列表。 3. 包含简单的文档字符串。 4. 提供一个示例调用。 print(*50) print(初始任务:, task) print(*50) # 5. 第一轮执行生成代码 print(\n 第一轮CoderAgent生成代码...) result coder_agent.execute(task) generated_code result[result] print(生成的代码响应) print(generated_code[:500], ...) # 打印前500字符 # 6. 安全审查 # 假设我们从响应中提取出了代码块这里需要解析为简化我们手动提取 # 在实际中你需要编写一个从模型响应中提取代码块的函数。 code_block def fibonacci_sequence(n: int): \\\返回斐波那契数列的前n项。\\\ if n 0: return [] elif n 1: return [0] seq [0, 1] for i in range(2, n): seq.append(seq[i-1] seq[i-2]) return seq if __name__ __main__: print(fibonacci_sequence(10)) is_safe, warnings safety_checker.validate_code(code_block) print(f\n安全审查结果: {通过 if is_safe else 未通过}) for w in warnings: print(f - {w}) # 7. 模拟测试与反馈循环 print(\n 模拟测试环节...) # 假设我们有一个“测试”发现生成的函数在n1时返回[0, 1]而不是[0]这是一个bug test_feedback 测试失败 当输入 n1 时函数返回了 [0, 1]但根据定义斐波那契数列的前1项应该是 [0]。 你的代码逻辑在 n1 时返回了 [0, 1]这是错误的。请检查初始条件。 print(f测试反馈: {test_feedback}) # 8. 触发反思与重写 print(\n 触发CoderAgent的反思与重写...) reflection coder_agent.reflect(test_feedback) print(f反思结果: {reflection}) # 9. 基于反思生成新代码 new_task f 基于以下反思调整之前的方案{reflection} 原始任务{task} 请特别注意处理 n1 的边界情况。 print(\n 基于新任务重新生成代码...) new_result coder_agent.execute(new_task) print(修正后的代码响应) print(new_result[result][:500], ...) print(\n *50) print(演示完成。在实际系统中测试、反馈、重写的过程会自动循环直到成功。) print(*50) if __name__ __main__: main()4.2 运行与验证运行main.py观察控制台输出。你应该能看到GLM-5-3根据任务描述生成第一版代码。安全模块对代码进行基础检查。模拟测试反馈指出边界条件错误。CoderAgent进行自我反思。CoderAgent根据反思和原始任务生成修正后的第二版代码。这个过程模拟了“生成-测试-反馈-重写”的核心循环。在一个更完整的系统中TesterAgent会真实地执行代码并比对结果Orchestrator会根据测试结果自动决定是继续循环还是终止。4.3 扩展集成安全代码执行工具为了让循环真正闭环我们需要一个能在受控环境中执行生成代码的工具。这里提供一个极度简化的概念实现生产环境务必使用更安全的沙箱如Docker容器、Firecracker等。# tools/code_executor.py (概念示例切勿直接用于生产) import subprocess import tempfile import os import sys class SafeCodeExecutor: 一个非常基础的、不安全的代码执行器仅用于演示概念。生产环境必须使用隔离沙箱。 staticmethod def execute_python_code(code: str, timeout: int 5) - dict: 在子进程中执行Python代码。 警告此方法极不安全可能执行任意代码。仅用于封闭、可控的演示环境。 result {success: False, output: , error: , returncode: None} # 将代码写入临时文件 with tempfile.NamedTemporaryFile(modew, suffix.py, deleteFalse) as f: f.write(code) temp_file_path f.name try: # 执行代码 process subprocess.run( [sys.executable, temp_file_path], capture_outputTrue, textTrue, timeouttimeout ) result[returncode] process.returncode result[output] process.stdout result[error] process.stderr result[success] (process.returncode 0) except subprocess.TimeoutExpired: result[error] fExecution timed out after {timeout} seconds. except Exception as e: result[error] str(e) finally: # 清理临时文件 os.unlink(temp_file_path) return result # 使用示例 if __name__ __main__: code def fibonacci_sequence(n: int): if n 0: return [] elif n 1: return [0] seq [0, 1] for i in range(2, n): seq.append(seq[i-1] seq[i-2]) return seq print(fibonacci_sequence(5)) executor SafeCodeExecutor() exec_result executor.execute_python_code(code) print(执行成功:, exec_result[success]) print(输出:, exec_result[output]) if exec_result[error]: print(错误:, exec_result[error])5. 常见问题与排查思路在构建和运行此类AI Agent系统时你可能会遇到以下典型问题问题现象可能原因排查思路与解决方案GLM API调用失败或超时1. API密钥错误或过期。2. 网络连接问题。3. 请求频率超限或额度不足。4. 请求内容触发了平台安全策略。1. 检查.env文件中的ZHIPUAI_API_KEY是否正确。2. 使用ping或curl测试网络连通性。3. 登录平台控制台查看额度与调用日志。4. 简化请求内容避免过长或敏感的提示词。Agent陷入无限循环1. 终止条件设置不合理。2. 反馈机制有缺陷无法识别任务成功。3. Agent反思未能产生有效的策略变更。1. 严格设置max_iterations并添加超时监控。2. 增强TesterAgent的判断逻辑使其能明确返回“成功”或“失败”。3. 在反思提示词中要求Agent提供具体的、可操作的修改点。生成的代码不安全或无法运行1. 系统提示词中对安全约束强调不足。2. 缺少执行前的安全审查环节。3. 模型对复杂逻辑理解有偏差。1. 强化系统提示词中的安全规则例如“禁止使用eval”、“文件操作需提示”。2. 集成像SafetyChecker这样的模块对输出进行强制扫描。3. 将大任务拆解为更小、更明确的子任务降低模型复杂度。多Agent协作效率低下1. Agent间通信协议不清晰上下文传递混乱。2. 编排器逻辑过于简单无法处理复杂依赖。1. 设计标准化的上下文格式例如使用JSON Schema定义每个Agent的输入输出。2. 引入更高级的编排模式如基于有向无环图的工作流或引入一个专用的Planner Agent来动态规划任务。系统资源消耗过大1. 每次循环都调用大模型token消耗快。2. 代码执行沙箱创建销毁开销大。1. 优化提示词减少不必要的上下文长度。对中间结果进行总结而非全量传递。2. 考虑使用长上下文模型减少轮次或对简单判断使用小模型/规则引擎。3. 复用沙箱环境而不是每次执行都新建。6. 最佳实践与工程建议将循环工程与Agent协同投入实际项目需要遵循以下工程原则1. 提示词工程是核心角色定义要清晰每个Agent的系统提示词必须明确其职责、边界和输出格式。例如CoderAgent的提示词应包含代码规范、安全要求和输出模板。上下文管理要智能不是所有历史对话都需要传给模型。设计摘要机制将冗长的多轮交互提炼成关键决策点和当前状态避免token浪费和模型混淆。迭代反思提示词reflect方法的提示词需要精心设计引导模型进行结构化分析如问题根因、方案对比、具体修改点而不是泛泛而谈。2. 安全边界必须多层防御输入过滤对用户输入和Agent间传递的消息进行基础清洗防止提示词注入。过程审查像SafetyChecker一样对模型生成的代码、命令、配置进行静态模式匹配和动态沙箱测试。输出净化对最终返回给用户的内容进行二次检查防止数据泄露或不当内容。权限最小化执行环境沙箱的权限必须被严格限制例如无网络、只读文件系统、CPU/内存限制。3. 设计可观测性与可调试性完整日志记录每一轮循环中每个Agent的输入、输出、耗时、token使用量。状态可视化考虑为工作流提供简单的状态图实时展示任务进行到哪一步哪个Agent正在工作。人工介入点系统必须允许人类在关键节点如执行高风险操作前、循环多次失败后进行审核和干预。4. 面向失败设计优雅降级当某个Agent或工具失败时系统应能尝试备用方案或给出明确错误而不是崩溃。重试与回退对暂时性错误如API超时设计指数退避重试机制。对于复杂的多步骤操作考虑实现操作回滚。成本控制设置预算上限监控每次循环的API调用成本防止因逻辑错误导致巨额费用。5. 从简单到复杂演进不要一开始就设计庞大的多Agent系统。建议的路径是单Agent单任务让一个Agent完成一个明确的小任务并自我修正。单Agent多步骤让一个Agent按照规划可以是硬编码或简单规则执行多个子任务。多Agent流水线设计固定的线性工作流如Planner - Coder - Tester - Reviewer。动态多Agent协作引入更复杂的编排逻辑让Planner Agent根据任务动态调用和组合其他Agent。通过GLM-5-3等大模型的扩展编程能力结合循环工程的思想我们能够构建出真正具备“动手-检查-思考-改进”能力的AI智能体系统。本文提供的框架是一个起点你可以在此基础上扩展更多的工具如数据库查询、API调用、Shell命令、更复杂的Agent类型如架构师Agent、部署Agent以及更稳健的编排与安全逻辑。记住构建自主系统的同时牢牢握住安全的缰绳是人机协作走向成熟的关键。