返回博客列表

面向 Spec 与 Architecture 的 AI 编程:从写代码到写规格

2026-08-15T04:00:00+08:00
AI编程Spec-DrivenArchitectureClaude CodeAgentContext Engineering

面向 Spec 与 Architecture 的 AI 编程:从写代码到写规格

看完你会发现,你对「AI编程」的理解可能要更新了。

用 Claude Code 写了半年代码后,一个变化悄然发生:我花在写 CLAUDE.md、设计类型注解、画架构图上的时间,开始超过写业务代码的时间。

不是因为我变懒了,是因为 AI 生成代码的质量,越来越取决于你给它的规格有多清晰。

这正在成为一个系统性趋势。AI 编程的主流形态正在从「prompt → 代码」迁移到「spec → architecture → 代码」。规格文件取代提示词,成为 AI 编程的核心产物。

本文提纲

  1. 为什么「prompt → 代码」不够了
  2. Spec 层:CLAUDE.md / AGENTS.md / 类型注解
  3. Architecture 层:从规格到系统设计
  4. Context Engineering:规格的艺术
  5. 实战工作流:Spec → Architecture → Implementation → Review
  6. 五个正在成型的工具范式
  7. 你现在应该做什么

为什么「prompt → 代码」不够了

「prompt → 代码」是 AI 编程的 1.0 形态:你说一句话,AI 给你一段代码。这在写单个函数、生成组件、补全逻辑时很好用。但它有三个结构性瓶颈。

瓶颈一:上下文窗口有限,复杂系统装不下。 一个真实项目有几十个模块、上百个依赖、数千个文件。你不可能在 prompt 里描述整个系统。Claude Code 的解决方案是 CLAUDE.md——一个项目级的规格文件,Agent 每次启动时自动读取。但很多人还是把 CLAUDE.md 当注释写,没有把它当作「规格」来设计。

瓶颈二:AI 生成的代码缺乏架构一致性。 你让 AI 写一个 API 端点,它能写出能跑的代码。但这个端点的错误处理风格和项目其他端点一致吗?日志格式对吗?认证逻辑和现有中间件兼容吗?如果规格里没写,AI 就按自己的默认风格来——结果就是一个项目里混着五种错误处理模式。

瓶颈三:审查成本随代码量线性增长。 AI 一分钟能生成 200 行代码,你审 200 行代码需要五分钟。当代码量从 200 行变成 2000 行,审查就变成了瓶颈。解决方法不是让你审查得更快,而是让 AI 生成的代码从设计上就更可审查——这就是规格的价值:规格定义了契约,审查变成对契约的验证,而不是逐行读代码。

Spec 层:CLAUDE.md / AGENTS.md / 类型注解

Spec 层是 AI 编程的 2.0 形态。不是告诉 AI「写什么代码」,而是告诉 AI「这个项目的规则是什么」。

CLAUDE.md:项目级规格

CLAUDE.md 是 Claude Code 的项目上下文文件。Agent 每次启动时自动加载,不需要在 prompt 里重复。一个好的 CLAUDE.md 应该包含:

# Project: E-commerce API

## Architecture
- Monorepo: frontend/ (Next.js) + backend/ (Go) + shared/ (protobuf)
- API style: RESTful, OpenAPI 3.0 spec in docs/openapi.yaml
- Auth: JWT with RS256, refresh token rotation
- Database: PostgreSQL with sqlc (no ORM, generated code)

## Conventions
- Error handling: return (response, error) tuples, wrap with fmt.Errorf
- Logging: structured JSON via slog, never fmt.Println
- Testing: table-driven tests, coverage > 80%
- Naming: exported types PascalCase, unexported camelCase

## Agent Instructions
- Always check docs/openapi.yaml before adding endpoints
- Run `make generate` after modifying protobuf definitions
- Never bypass sqlc — if you need raw SQL, add it to sqlc.yaml
- Run `golangci-lint run` before considering a task complete

关键区别:这不是文档,是规格。它定义了 AI 必须遵守的约束——架构决策、编码规范、工具链规则。AI 违反这些约束就是 bug,不是风格选择。

AGENTS.md:仓库级协议

AGENTS.md 是更通用的仓库协议格式,被越来越多的 AI 工具支持(Claude Code、Codex、Cursor、NOOA)。它定义的不只是单个项目的规则,还有跨仓库的约定:

# Agent Conventions

## Testing
- Every PR must pass: `pytest -x --cov=src --cov-fail-under=80`
- Integration tests require Docker; mark with @pytest.mark.integration

## Dependencies
- Add new deps via `uv add`, never edit pyproject.toml manually
- Security scan: `pip-audit` must pass before merge

## Agent Skills
- Skills live in skills/ directory, each with SKILL.md
- Load skills progressively: only when the task matches

类型注解:机器可读的契约

类型注解是最被低估的规格形式。NVIDIA NOOA 的核心设计就是:类型注解就是接口契约

class OrderService(Agent):
    async def create_order(
        self, user_id: UserID, items: list[OrderItem]
    ) -> OrderResult:
        """Create an order from cart items.
        
        Returns OrderResult with order_id on success,
        or InsufficientStockError if any item is unavailable.
        """
        ...

... 方法体告诉运行时:这个方法由 LLM 实现。但类型签名——UserIDlist[OrderItem]OrderResult——是硬约束。AI 生成的代码必须匹配这些类型,否则运行时报错。这比写一段自然语言的 prompt 描述接口要精确得多。

Spec 层的三种形式——CLAUDE.md(项目规则)、AGENTS.md(仓库协议)、类型注解(接口契约)——构成了 AI 编程的规格基础设施。

Architecture 层:从规格到系统设计

规格定义了「规则」,架构定义了「结构」。当 AI 需要实现一个复杂功能时,你不应该让它直接写代码——你应该先让它理解架构。

架构图作为 AI 输入

Diagram Design(23K Stars)的 38 种图表类型在这里有了新用途:不只是给人看的文档,是给 AI 看的架构规格。

你: "根据这个架构图,实现订单服务的微服务拆分"
     [附上 architecture.html — 一个 5 服务的 C4 架构图]

Agent: -> 读取架构图,理解服务边界
       -> 为每个服务生成 API 定义
       -> 实现 gRPC 通信层
       -> 生成 Docker Compose 配置
       -> 写集成测试验证服务间通信

当你把架构图作为输入给 AI,它不再是「写一个函数」,而是「实现一个系统设计」。输出的一致性大幅提升,因为架构约束了所有后续决策。

分层实现:不要让 AI 一次做完

工业化的核心原则是分工。AI 编程也应该分层:

graph TB
    A["Spec Layer
CLAUDE.md + AGENTS.md + Type Annotations"] --> B["Architecture Layer
Diagrams + API specs + Module boundaries"] B --> C["Interface Layer
OpenAPI / protobuf / GraphQL schemas"] C --> D["Implementation Layer
AI generates code per interface"] D --> E["Review Layer
Tests + Lint + Agent Eval"] style A fill:#FF6B6B,color:#000000 style B fill:#4ECDC4,color:#000000 style C fill:#45B7D1,color:#000000 style D fill:#96CEB4,color:#000000 style E fill:#FFEAA7,color:#000000

每一层有明确的输入和输出:

  • Spec → 规则和约束
  • Architecture → 系统结构和边界
  • Interface → 机器可读的契约(OpenAPI、protobuf)
  • Implementation → AI 按契约生成代码
  • Review → 自动化质量验证

这个分层模型的好处:每一层的输出是下一层的输入,任何一层出问题都只影响下游,不会污染整个链路。

Context Engineering:规格的艺术

Anthropic 在 Engineering 博客里反复强调的一个概念:Context Engineering 比 Prompt Engineering 更重要。

Prompt Engineering 是「怎么说让 AI 理解你的意图」。Context Engineering 是「怎么组织信息让 AI 在正确的时间获得正确的上下文」。

Spec-driven AI 编程本质上是 Context Engineering 的实践。好的规格不是把所有信息一次性塞给 AI,而是渐进式披露(progressive disclosure):

  1. CLAUDE.md 提供项目级常驻上下文——每次都在
  2. AGENTS.md 提供仓库级协议——跨项目复用
  3. 类型注解提供方法级契约——编译时检查
  4. Architecture 文档提供任务级上下文——按需加载
  5. Skill 文件提供领域知识——匹配时激活

NOOA 的 SKILL.md 系统就是这个模式的实践:13 个内置 Skills 不是全部加载,而是「progressive disclosure——SKILL.md 先路由行为,再路由布局。类型、动画参考只在相关时加载」。

Diagram Design 也一样:38 个类型参考文件,只有被选中时才加载。不是把 38 种图表的规则全部灌给 AI,是让它先选择类型,再加载对应规格。

实战工作流:Spec → Architecture → Implementation → Review

一个完整的 spec-driven AI 编程工作流长这样:

第一步:写 Spec(10 分钟)

在 CLAUDE.md 里新增一段:

## Feature: Order Tracking
- New service: tracking/ (Go package)
- API: GET /orders/{id}/tracking returns tracking events
- Events sourced from carrier webhook (POST /webhooks/carrier)
- Cache: Redis, TTL 5 min, key: tracking:{order_id}
- Fallback: if cache miss and carrier timeout, return last known event

10 行规格定义了功能边界、API 契约、缓存策略和降级逻辑。

第二步:让 AI 设计 Architecture(5 分钟)

你: "根据 CLAUDE.md 里的 Order Tracking spec,
     画一个架构图,展示 tracking 服务的组件和数据流"

Agent: -> 生成 architecture.html (Diagram Design)
       -> 展示: Webhook handler -> Event store -> Cache -> API

第三步:让 AI 实现 Interface(3 分钟)

你: "根据架构图,生成 OpenAPI spec 和 protobuf 定义"

Agent: -> 生成 openapi.yaml (tracking endpoint)
       -> 生成 tracking.proto (gRPC service)
       -> 运行 make generate 生成 Go stubs

第四步:让 AI 实现(10 分钟)

你: "根据 interface spec 和 CLAUDE.md 规范,
     实现 tracking 服务"

Agent: -> 实现 webhook handler
       -> 实现 event store (PostgreSQL)
       -> 实现 cache layer (Redis)
       -> 实现 API endpoint
       -> 写 table-driven tests
       -> 运行 golangci-lint

第五步:Review(5 分钟)

你: "审查这个 PR:spec 是否被正确实现?
     测试覆盖率?有没有违反 CLAUDE.md 的规范?"

Agent: -> 对照 spec 逐项验证
       -> 运行测试 + lint
       -> 输出审查报告

总计 33 分钟,产出:规格文档 + 架构图 + API 定义 + 完整实现 + 测试 + 审查报告。传统方式这个工作量至少 2-3 小时。

五个正在成型的工具范式

范式一:项目规格文件(CLAUDE.md / AGENTS.md)。 从可选的注释变成必选的规格。未来每个项目根目录都有一个 spec 文件,就像每个项目都有 README 一样。

范式二:架构图作为 AI 输入(Diagram Design)。 从「给人看的文档」变成「给 AI 看的规格」。38 种编辑级图表类型,每一种都是一种架构语言的语法。

范式三:类型注解作为接口契约(NOOA)。 Python 类型注解从「可选的文档」变成「强制的契约」。... 方法体是「AI 实现」的信号,类型签名是「AI 必须遵守」的约束。

范式四:Skill 作为领域知识包。 SKILL.md 格式成为跨平台标准(Claude Code / Codex / Pi / NOOA)。Skill 不是文档,是可被 Agent 自动加载和使用的知识包——在正确的时间提供正确的上下文。

范式五:Agent Eval 作为质量门禁(HarnessEval-W)。 评测本身变成 Agent 任务——不是跑个 lint 就完事,是让 Agent 推理「这个实现是否满足规格」。证据树(evidence tree)让每次评测都可审计。

你现在应该做什么

第一,把 CLAUDE.md 当规格写,不是当注释写。 定义架构决策、编码规范、工具链规则。AI 违反这些规则就是 bug。每加一个功能,先更新 spec。

第二,先画架构图再让 AI 写代码。 用 Diagram Design 或任何工具,先确定系统结构和数据流。架构图是给 AI 的最高层规格。

第三,用类型注解定义接口契约。 不管你用什么语言,类型注解是最精确的规格形式。AI 生成的代码必须匹配类型,这是编译时/运行时的硬约束。

第四,分层实现,不要让 AI 一次做完。 Spec → Architecture → Interface → Implementation → Review。每一层有明确的输入输出,出问题只影响下游。

第五,建一个 Skill 库。 把团队的最佳实践、设计模式、领域知识编码成 SKILL.md 文件。Agent 按需加载,不需要在每次 prompt 里重复。

工业化的逻辑在这里同样适用:规格取代手艺成为核心产物。 程序员的价值不在于写代码,在于定义规格和审查实现。CLAUDE.md 就是你的蓝图,类型注解就是你的施工标准,架构图就是你的工程图纸。AI 是你的施工队,但施工队只按图纸干活。

参考文档与链接

你用 CLAUDE.md 吗?写的什么内容?评论区聊聊你的 spec 实践。觉得有用点个赞让更多人看到。


作者: itech001 来源: 公众号:AI人工智能时代 网站: https://www.theaiera.cn/ 每日分享最前沿的AI新闻资讯和技术研究。

本文首发于 AI人工智能时代,转载请注明出处。

分享给朋友