随着 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 | 业务代码绑定 SDK | LLMClient 隔离具体 Provider |
| 新增工具 | Schema 与 Tool Loop 不断堆积 | Tool 独立注册 |
| 工具循环 | 业务代码自己维护 | Agent Runtime 统一处理 |
| 可测试性 | 组件难以隔离 | Tool / Client / Agent 可分别测试 |
| AI 输出一致性 | 不同会话容易采用不同结构 | Rules + 架构模板约束输出 |
总结:AI 提升速度,架构决定方向
大模型改变了代码的生产方式,却没有改变软件工程的基本规律。
决定一个系统能否长期演进的,仍然是:
- 架构设计
- 模块边界
- 工程规范
- 系统抽象
AI 提升开发速度,架构决定软件能走多远。
⭐ 人类与 AI 的新分工
AI 更擅长微观实现:
- 写函数
- 写模块
- 写 CRUD
- 补测试
- 重构局部代码
人类更应该负责宏观决策:
- 理解业务
- 设计架构
- 划分模块
- 制定约束
- 审查关键决策
架构方案本身当然也可以让 AI 参与设计和讨论。
但最终决定系统应该成为什么样子,并为这个决定负责的,仍然应该是人。
架构不是 AI 的束缚,而是 AI 高质量发挥能力的边界与导航系统。
🪐祝您好运🪐