随着 GPT、Claude、Gemini、Qwen 等大模型的发展,软件开发正在进入一个新的时代。
过去需要数小时甚至数天完成的编码工作,如今 AI 几分钟便可以完成。 然而,很多团队却发现了一个令人困惑的现象:

代码越写越多,项目却崩溃得越来越快。

原因并不是 AI 不够聪明,而是:

缺少架构约束。

现代 AI Agent 能够相对稳定地运行,一个重要原因就是:不会让大模型毫无约束地自由发挥。

成熟的 Agent 系统通常会通过 系统提示词、权限控制、工作流、状态管理和结果校验等机制,为大模型划定明确的行为边界。

从本质上说,这与软件架构的思想高度一致:

先定义边界和规则,再让 AI 在边界内发挥能力。
即使能力很强的大模型,在缺乏明确约束、上下文持续膨胀或工具权限过大的情况下,也可能逐渐出现格式漂移、职责越界、错误调用工具或代码风格不一致等问题。


📌 技术名片

软件架构设计(Software Architecture)
软件系统的顶层结构与组织规范。它定义了:

  • 系统如何拆分
  • 模块如何协作
  • 职责如何划分
  • 系统如何演进

目标是保证软件在不断扩展过程中依然保持:

✅ 可维护
✅ 可扩展
✅ 可测试
✅ 可演进

💡 一句话理解

架构设计,就像房屋施工图。

AI 可以是世界上最快的施工队工人,但如果没有图纸,它大概率只会把砖越堆越高…

架构的作用


一、 通俗拆解:为什么越依赖 AI,越不能“放飞自我”?

如果您不懂编程,可以把写代码想象成“盖房子”:

  • 以前的开发模式: 你需要自己一块砖、一块砖地砌(手写每一行代码),速度很慢,但因为每块砖都是你亲自放的,你心里很清楚哪里是承重墙。

  • 现在的 AI 模式: AI 变成了一个拥有超级力量的施工队工人,你喊一声“给我造个厨房”,它半分钟就能给你搬来一堆砌好的墙壁。

听起来很美妙对不对?但问题恰恰出在这里。

AI的天然缺陷

1. AI 是“近视眼”,天然缺少长期全局视角

现代 AI 编程工具已经能够读取大量项目文件,甚至搜索整个代码仓库。

真正的问题是:

AI 的判断高度依赖当前提供给它的 Context(即:上下文,大模型的上下文长度有限制)。

如果项目没有明确的模块边界、架构说明和工程规范,AI 很难仅凭散落的代码稳定推断出整个系统的设计意图。

于是,当你要求它“再加一个功能”时,它很容易优先选择当前最容易完成任务的局部方案,而不是最适合系统长期演进的方案。

2. 坏结构会被 AI 快速复制和放大

AI 非常擅长根据现有代码寻找模式。

这本来是优势,但也意味着:

好架构会被复制,坏架构同样会被复制。

如果项目中已经存在职责混乱、重复代码和不合理依赖,AI 很可能沿用这些模式,并以远高于人工编码的速度继续扩散。

原本几十行的“坏味道”,很快就可能演变成成千上万行难以维护的“大泥球”代码。

3. AI 不会自动补齐所有安全边界

AI 的首要任务通常是完成当前指令,而项目中的许多安全要求并不会自动出现在 Prompt 中。

例如,你只要求:

写一个登录接口。

如果没有进一步规定鉴权方式、密码存储、输入校验、权限模型和异常处理,生成的代码即使“能运行”,也未必符合生产环境的安全要求。

因此,安全规范同样需要显式成为架构约束的一部分。


二、 架构规范:人类工程师的新角色

当“搬砖”这件体力活被 AI 承包后,人类工程师、技术管理者乃至跨界开发者,身份发生了根本性的转变:你从一个“砌砖工”,升级成了“施工总指挥”。

核心思想:从“自己动手”到“给 AI 立规矩”

在 AI 编程的时代,架构设计就是你给 AI 颁布的“施工守则”:

  • 划定界限(不准乱串门): 明确告诉 AI,负责界面的代码不准直接去动数据库,负责算账的代码不准掺杂发短信的逻辑。
  • 制定标准(不准乱干脏活): 禁止 AI 把数据库密码硬编码在代码里,强制要求所有报错必须按照统一的格式返回。
  • 搭好骨架(填空式开发): 先由你或者一套标准的架构模板把大楼的“钢筋水泥骨架”搭好,让 AI 只需要在指定的房间里去“贴瓷砖”、“放家具”。

🎯 一句话

给 AI 自由发挥的空间,也要先给它清晰的边界。


三、 把架构规范转化为项目规则

过去,架构规范通常存在于设计文档、Wiki 或架构师脑中。
AI 编程时代,一个重要变化是:
这些规范可以直接变成 AI 每次编码时都会读取的项目级指示。

现代 AI IDE(即:集成开发工具,比如Cursor、Claude Code 等)已经支持项目级规则。

例如:

  • Cursor:.cursor/rules/*.mdc
  • GitHub Copilot:.github/copilot-instructions.md
  • 通用 Agent 规范:AGENTS.md
  • Claude Code:CLAUDE.md

这些文件,本质上就是:

把架构文档翻译成 AI 能理解的 System Prompt(即:系统提示词)。

这样一来,每次 AI 准备生成代码时,都会先看一眼这份规矩,使模型更稳定地遵循项目约定。

示例:企业级 Python 架构规则

你是一个严格遵循企业级软件工程规范的资深 Python 架构师。在为本项目生成任何代码时,必须强制遵守以下**架构三原则**:
1. **严禁职责混乱(分层隔离)**
- 负责接收用户请求的视图/接口层(Router),**严禁**包含具体的业务计算逻辑或直接操作数据库。
- 核心业务逻辑层(Service)必须保持纯粹,**严禁**直接感知 HTTP 协议或请求细节。


2. **解耦与模块化**
- 数据库、HTTP Client、LLM Client、Repository 等可替换的基础设施依赖,不应在核心业务逻辑中硬编码创建。


3. **通用功能抽离与类型安全**
- API 边界、Tool 参数、配置对象及需要运行时校验的数据结构使用 Pydantic,模块内部简单数据优先使用原生 Type Hints。
- 鉴权、日志记录、错误处理等通用功能,必须调用项目中已有的公共组件,**严禁**在业务代码中重复编写冗余代码。


如果用户的指令会破坏上述架构原则,请主动提醒用户并给出符合架构规范的改进建议,而不是直接生成违规代码。

四、 实战效果对比

需求: 编写一个 Agent,接收用户指令(例:“列出当前目录下的文件”),自动触发 bash 工具执行命令,并将命令行输出结果再反馈给大模型,最终返回生成解答。


1. 无架构约束

如果直接让 AI :

写个 Python 脚本,调 OpenAI 执行 bash 命令并把结果传回给模型。

AI 很可能会不加思索地把 SDK 初始化、JSON Schema 编写、工具执行、二次调用对话循环 全部塞在单个函数中:

❌ AI 自由发挥:所有逻辑全部堆在一个函数中。

import os
import json
import subprocess
from openai import OpenAI

def process_user_request(user_prompt: str) -> str:
    # 1. 强耦合:业务流程直接依赖 OpenAI SDK 和具体模型
    client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
    
    messages = [{"role": "user", "content": user_prompt}]
    # 2. 混乱的数据结构:工具定义硬编码在函数内
    tools = [{
        "type": "function",
        "function": {
            "name": "run_bash",
            "description": "Run bash commands",
            "parameters": {
                "type": "object",
                "properties": {"command": {"type": "string"}},
                "required": ["command"]
            }
        }
    }]
    
    # 第一次 LLM 请求
    response = client.chat.completions.create(
        model="gpt-4o", messages=messages, tools=tools
    )
    response_message = response.choices[0].message
    
    # 3. 硬连线控制流:手写繁琐的 tool_calls 触发与结果回传逻辑
    if response_message.tool_calls:
        messages.append(response_message)
        for tool_call in response_message.tool_calls:
            if tool_call.function.name == "run_bash":
                args = json.loads(tool_call.function.arguments)
                # 裸运行 subprocess,没有任何目录沙箱隔离和异常保护
                result = subprocess.check_output(args["command"], shell=True).decode()
                
                messages.append({
                    "role": "tool",
                    "tool_call_id": tool_call.id,
                    "content": result
                })
        
        # 第二次 LLM 请求:拿结果重新生成回答
        final_response = client.chat.completions.create(
            model="gpt-4o", messages=messages
        )
        return final_response.choices[0].message.content
    
    return response_message.content

2. 有架构约束

如果遵循 miniagent 的架构设计规范:

工具通过 `@tool` 装饰器独立解耦(高内聚),Agent 与 LLMClient 通过依赖注入组合(低耦合),Tool Call 循环由 Agent 内部自动统领。

✅ miniagent:每个模块职责单一,代码组织清晰且极度简洁。

# 1. 独立工具模块 (tools.py):类型安全、隔离工作区
from pydantic import BaseModel, Field
from miniagent.tools import tool
import subprocess

class BashInput(BaseModel):
    command: str = Field(description="The bash command to execute")

@tool(name="bash", description="Execute a bash command with the specified working directory")
def create_bash_tool(workspace: str = "./"):
    def execute(input_data: BashInput) -> str:
        # 指定默认工作目录;注意:cwd 并不等同于安全沙箱
        return subprocess.check_output(
            input_data.command, shell=True, cwd=workspace
        ).decode()
    return execute
# 2. 核心运行模块 (main.py):模型与 Agent 解耦,两行完成流水线
import asyncio
from miniagent import Agent, LLMClient
from tools import create_bash_tool

async def main():
    # 1. 依赖注入:LLM 独立抽象,想换 DeepSeek 或 Anthropic 仅改配置
    llm = LLMClient(provider="openai", model="gpt-4o")
    
    # 2. 组合装配:Agent 自动统管模型、系统 Prompt 和工具集的循环回调
    agent = Agent(
        llm_client=llm,
        tools=[create_bash_tool(workspace="./sandbox")]
    )
    
    # 3. 极简的交互:自动完成【调用 LLM -> 执行工具 -> 结果回传 -> 输出最终回答】
    result = await agent.run("列出当前目录下的文件")
    print(result.final_answer)

if __name__ == "__main__":
    asyncio.run(main())

同功能直观对比

衡量维度❌ 无明确架构约束✅有明确架构约束
职责边界容易随需求不断漂移模块职责清晰
更换 LLM业务代码绑定 SDKLLMClient 隔离具体 Provider
新增工具Schema 与 Tool Loop 不断堆积Tool 独立注册
工具循环业务代码自己维护Agent Runtime 统一处理
可测试性组件难以隔离Tool / Client / Agent 可分别测试
AI 输出一致性不同会话容易采用不同结构Rules + 架构模板约束输出

总结:AI 提升速度,架构决定方向

大模型改变了代码的生产方式,却没有改变软件工程的基本规律。

决定一个系统能否长期演进的,仍然是:

  • 架构设计
  • 模块边界
  • 工程规范
  • 系统抽象

AI 提升开发速度,架构决定软件能走多远。


⭐ 人类与 AI 的新分工

AI 更擅长微观实现:

  • 写函数
  • 写模块
  • 写 CRUD
  • 补测试
  • 重构局部代码

人类更应该负责宏观决策:

  • 理解业务
  • 设计架构
  • 划分模块
  • 制定约束
  • 审查关键决策

架构方案本身当然也可以让 AI 参与设计和讨论。

但最终决定系统应该成为什么样子,并为这个决定负责的,仍然应该是人。

架构不是 AI 的束缚,而是 AI 高质量发挥能力的边界与导航系统。


🪐祝您好运🪐