首页 / 文章 / 当代理加入工作流时,谁来编写代码?

当代理加入工作流时,谁来编写代码?

将地图编码助手从自动补全功能扩展到群体协作模式,并将等级与爆炸范围、测试及审核关卡相对应。

2200 词

AI编程工具已不再仅限于自动补全功能。它们还包括实时协同编程工具、可执行任务的单个智能体、负责管理代码分支的自主项目智能体,以及多个智能体相互评审和修复错误的实验性集群。关键问题不在于该选择哪个品牌,而在于哪一层级能匹配相应变更带来的风险。

从自动补全到自主操作

早期的辅助工具仅能完成光标下的代码行。新型智能体则可以打开文件、运行测试并提交拉取请求。自主性随影响范围扩大而提升,因此审查深度、沙箱环境以及为它们设定的目标清晰度也应随之提高。

第一层级——AI协同编程工具

具备实时自动补全和IDE内聊天功能的工具。你需要亲自掌控每一次代码提交,最适合用于生成标准代码、重命名文件以及解释晦涩的代码。在没有指导的情况下,处理多文件重构功能较为薄弱。

# Conceptual representation of a Tier 3 agent's execution loop
def execute_project_goal(goal: str):
    plan = agent.generate_plan(goal)
    while not plan.is_complete():
        action = plan.get_next_action()
        result = workspace.run(action)      # Runs commands, edits files
        if result.has_errors():
            plan.replan(result.logs)       # Self-correction loop
        else:
            plan.mark_step_done()

第二层级——特定任务智能体

目标导向的执行者:“为这个处理程序添加日志记录”,“为这个模块编写测试”。他们会规划简短的工具循环,一旦目标检查通过就停止。合并时仍需人工审核。

import time
from typing import Dict, Any

def run_agent_loop(task_prompt: str, max_iterations: int = 15) -> bool:
    # Initialize the agent's state, workspace, and execution context
    state: Dict[str, Any] = {
        "task": task_prompt,
        "workspace_files": get_project_files(),
        "history": [],
        "completed": False
    }

    for step in range(max_iterations):
        # 1. Perception: Observe current system state and tool outputs
        observation = observe_environment(state)

        # 2. Planning: Reason through the current state to generate a thought and next action
        thought, action = LLM_reasoning_engine(state, observation)
        state["history"].append({"step": step, "thought": thought, "action": action})

        if action.name == "task_complete":
            print(f"Task successfully completed in {step} steps.")
            return True

        # 3. Action: Execute the tool and capture the side effects
        try:
            action_result = execute_action(action)
            state = update_state(state, action_result)
        except Exception as execution_error:
            # Feed the error back to the LLM to allow for self-correction
            state = update_state(state, {"error": str(execution_error)})

        time.sleep(1) # Implement rate limiting and token management

    print("Agent failed: Reached maximum iteration budget.")
    return False

第三级——自主项目代理

负责特定项目的端到端工程师:搭建框架、实现功能、进行测试、不断迭代。他们需要明确的验收标准以及封闭的环境。没有测试的话,工作就会陷入混乱。

import subprocess
import json
import sys

def execute_agentic_workflow(specification_path: str) -> bool:
    """
    Orchestrates an agent by feeding it a structured specification,
    applying the generated code changes, and running unit tests to verify correctness.
    """
    # Step 1: Load the structured technical specification
    with open(specification_path, "r") as f:
        spec = json.load(f)

    print(f"🤖 Agent starting task: {spec['task_id']} - {spec['description']}")

    # Step 2: Agent generates code based on spec (simulated here)
    generated_code_diff = simulate_agent_generation(spec)

    # Step 3: Apply the generated patches to the codebase
    if not apply_patch(generated_code_diff):
        print("❌ Critical: Agent-generated patch failed to apply cleanly.")
        return False

    # Step 4: Run automated validation suites
    print("🧪 Running verification test suite...")
    test_result = subprocess.run(["pytest", "tests/test_agent_features.py"], capture_output=True, text=True)

    if test_result.returncode == 0:
        print("✅ Success: Agent changes verified successfully.")
        return True
    else:
        print("❌ Failure: Automated tests failed. Raw stderr output:")
        print(test_result.stderr)
        return False

def simulate_agent_generation(spec: dict) -> str:
    # Simulates returning a git patch block matching the spec constraints
    return "diff --git a/app.py b/app.py..."

def apply_patch(diff: str) -> bool:
    # Logic to apply git patch
    return True

if __name__ == "__main__":
    execute_agentic_workflow("specs/new_feature_spec.json")

第四级——代理群体

协作式的多代理网络:研究者、实现者、审核者。功能强大但成本高昂。协调问题会成为新的故障模式。

+----------------+      +-----------------+      +-----------------+      +-----------------+
|     Define     | ---> |     Prompt      | ---> |      Test       | ---> |     Verify      |
|  (Requirements |      | (Context, Specs |      |   (Automated    |      | (Human Approves |
|  & Interfaces) |      |   & Constraints)|      |  Suites & Runs) |      |   Final Diffs)  |
+----------------+      +-----------------+      +-----------------+      +-----------------+

编码代理的构成

感知(代码库工具)、规划(任务分解)、行动(编辑/命令)以及记忆(临时存储区、PR上下文)。缺少任何一部分都会导致该层级功能失效。

Generated by AI Agent: Provisions a secure, auto-scaling AWS ECS Fargate service
resource "aws_ecs_task_definition" "app" {
  family                   = "production-api"
  requires_compatibilities = ["FARGATE"]
  network_mode             = "awsvpc"
  cpu                      = "256"
  memory                   = "512"

  container_definitions = jsonencode([{
    name      = "api-service"
    image     = "backend-service:latest"
    essential = true
    portMappings = [{
      containerPort = 8080
      hostPort      = 8080
    }]
  }])
}

选择层级

根据代码库的重要性、测试的严格程度以及变更的可逆性来确定匹配等级。在具备相应的评估工具之前,优先选择支付流程中的1级或2级。当持续集成机制极为严格且沙箱环境无法接触生产环境中的敏感信息时,可使用3级。

# safe_executor.py
import ast

# An allowlist of pre-approved libraries prevents hallucinated dependency injection.
ALLOWED_PACKAGES = {"requests", "pandas", "numpy", "json", "pydantic"}

def verify_agent_imports(agent_code: str) -> bool:
    """Parses agent code into an AST to audit imports before execution."""
    try:
        tree = ast.parse(agent_code)
        for node in ast.walk(tree):
            if isinstance(node, ast.Import):
                for alias in node.names:
                    base_package = alias.name.split('.')[0]
                    if base_package not in ALLOWED_PACKAGES:
                        raise SecurityError(f"Blocked unapproved import: {alias.name}")
            elif isinstance(node, ast.ImportFrom) and node.module:
                base_package = node.module.split('.')[0]
                if base_package not in ALLOWED_PACKAGES:
                    raise SecurityError(f"Blocked unapproved import from: {node.module}")
        return True
    except (SyntaxError, SecurityError) as e:
        print(f"Safety Gate Tripped: {e}")
        return False

class SecurityError(Exception):
    pass

# Example of agent output containing a hallucinated or malicious library.
untrusted_code = "import requests\nimport fast_json_validator_fake_pkg"
is_safe = verify_agent_imports(untrusted_code)
print(f"Is code safe to execute? {is_safe}") # Prints: Is code safe to execute? False

让人类保持掌控权的流程习惯

在调用自动化工具之前先编写验收检查规则。要求将差异以可审查的块形式呈现。记录每一次工具调用。禁止在敏感主机上使用无限制的shell命令。当缺陷率上升时,将自动化工具的处理速度视为一种风险指标。

“谁来编写代码”的未来在于通过明确的关卡实现共同创作,而非允许未经审查的代码直接提交到主分支。要确保测试用例始终正常运行,逐个阶段进行检测,绝不能仅凭感觉就发布版本——因为下一次发布很可能会以新的名称重新出现同样的隐性故障模式。要确保测试用例始终正常运行,逐个阶段进行检测,绝不能仅凭感觉就发布版本——因为下一次发布很可能会以新的名称重新出现同样的隐性故障模式。要确保测试用例始终正常运行,逐个阶段进行检测,绝不能仅凭感觉就发布版本——因为下一次发布很可能会以新的名称重新出现同样的隐性故障模式。要确保测试用例始终正常运行,逐个阶段进行检测,绝不能仅凭感觉就发布版本——因为下一次发布很可能会以新的名称重新出现同样的隐性故障模式。要确保测试用例始终正常运行,逐个阶段进行检测,绝不能仅凭感觉就发布版本——因为下一次发布很可能会以新的名称重新出现同样的隐性故障模式。

该问题可能会以新的名称再次出现同样的隐性故障模式。请保持测试环境正常运行,逐个阶段进行检测,切勿仅凭感觉就决定发布,因为下一次版本仍可能以新名称重现同样的隐性故障模式。请保持测试环境正常运行,逐个阶段进行检测,切勿仅凭感觉就决定发布,因为下一次版本仍可能以新名称重现同样的隐性故障模式。请保持测试环境正常运行,逐个阶段进行检测,切勿仅凭感觉就决定发布,因为下一次版本仍可能以新名称重现同样的隐性故障模式。请保持测试环境正常运行,逐个阶段进行检测,切勿仅凭感觉就决定发布,因为下一次版本仍可能以新名称重现同样的隐性故障模式。请保持测试环境正常运行,逐个阶段进行检测,切勿仅凭感觉就决定发布,因为下一次版本仍可能以新名称重现同样的隐性故障问题。用新名称发布颂歌。保持测试环境正常运行,逐个阶段单独检测,切勿仅凭感觉就发布产品——因为下次更新完全可能以新名称重新引入同样的隐性故障模式。保持测试环境正常运行,逐个阶段单独检测,切勿仅凭感觉就发布产品——因为下次更新完全可能以新名称重新引入同样的隐性故障模式。保持测试环境正常运行,逐个阶段单独检测,切勿仅凭感觉就发布产品——因为下次更新完全可能以新名称重新引入同样的隐性故障模式。保持测试环境正常运行,逐个阶段单独检测,切勿仅凭感觉就发布产品——因为下次更新完全可能以新名称重新引入同样的隐性故障模式。保持测试环境正常运行,逐个阶段单独检测,切勿仅凭感觉就发布产品——因为下次更新完全可能以新名称重新引入同样的隐性故障模式。保持测试环境正常运行,检测……分别检测每个阶段,切勿仅凭感觉就发布产品,因为下次版本可能会以新名称重新出现同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就发布产品,因为下次版本可能会以新名称重新出现同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就发布产品,因为下次版本可能会以新名称重新出现同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就发布产品,因为下次版本可能会以新名称重新出现同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就发布产品,因为下次版本可能会以新名称重新出现同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就发布产品。下次发布时很可能以新名称重新出现同样的隐性故障模式,绝不能仅凭感觉就进行翻译。保持测试环境正常运行,逐个阶段单独检测,绝不能仅凭感觉就发布产品,因为下次发布时很可能以新名称重新出现同样的隐性故障模式。保持测试环境正常运行,逐个阶段单独检测,绝不能仅凭感觉就发布产品,因为下次发布时很可能以新名称重新出现同样的隐性故障模式。保持测试环境正常运行,逐个阶段单独检测,绝不能仅凭感觉就发布产品,因为下次发布时很可能以新名称重新出现同样的隐性故障模式。保持测试环境正常运行,逐个阶段单独检测,绝不能仅凭感觉就发布产品,因为下次发布时很可能以新名称重新出现同样的隐性故障模式。保持测试环境正常运行,逐个阶段单独检测,绝不能仅凭感觉就发布产品,因为下次发布时很可能再次出现同样的问题。用新的名称来引入同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就决定发布,因为下一次版本仍可能以新名称重新引入同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就决定发布,因为下一次版本仍可能以新名称重新引入同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就决定发布,因为下一次版本仍可能以新名称重新引入同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就决定发布,因为下一次版本仍可能以新名称重新引入同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就决定发布,因为下一次版本仍可能以新名称重新引入同样的隐性故障模式。一个新的名称。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就发布产品,因为下一次版本很可能以新名称重新出现同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就发布产品,因为下一次版本很可能以新名称重新出现同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就发布产品,因为下一次版本很可能以新名称重新出现同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就发布产品,因为下一次版本很可能以新名称重新出现同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就发布产品,因为下一次版本很可能以新名称重新出现同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段。将各阶段分开测试,切勿仅凭感觉就决定发布,因为下次版本完全可能以新名称重新出现同样的隐性故障模式。保持测试环境正常运行,分别检测每个阶段,切勿仅凭感觉就决定发布,因为下次版本完全可能以新名称重新出现同样的隐性故障模式。