使用 ASA Core v1.0 的确定性再生
Source: Dev.to
再生成陷阱
大多数 AI 驱动的编码工具擅长一次又一次地生成代码……
你更新规格,点击 regenerate,结果突然出现:
- 你的自定义逻辑消失
- 验证规则不见了
- 测试结构不再匹配
- 处理器和模型出现偏差
这就是再生成陷阱。
为什么传统工具的再生成会失败
生成器并不知道你写了什么。典型的生命周期如下:
- 第 1 天 – 生成脚手架 → 看起来很棒
- 第 2 天 – 实现业务逻辑 → 感觉很好
- 第 3 天 – 需求变更 → 再生成 → 所有东西都没了
后果
- 开发者时间浪费
- 对生成器产生畏惧感
- 规格与代码出现分歧
- 架构衰退
你失去的不仅是代码——还有信任。
ASA 的确定性流水线
切片(Slices)
自包含的垂直特性单元,例如:
domains/auth/login/
├── slice.spec.md
├── slice.contract.json
├── handler.py
├── service.py
├── repository.py
├── schemas.py
└── tests/
规格(Human‑readable)
每个切片都包含一个规格文件,必须包含七个章节:
- 目的
- 输入
- 输出
- 行为
- 错误
- 副作用
- 依赖
合约(Machine‑readable)
从规格生成的 JSON Schema,例如:
{
"inputs": { "email": "string", "password": "string" },
"outputs": { "jwt_token": "string", "expires_in": "int" }
}
确定性模板和基于标记的保留
ASA 的模板不包含随机性。ASA 不再猜测“你的代码”和“生成代码”的边界,而是显式标记需要保留的区域:
# === BEGIN USER CODE ===
def execute(self, request: LoginRequest) -> LoginResponse:
user = self.repo.get_user_by_email(request.email)
token = self.repo.generate_jwt(user.id)
return LoginResponse(jwt_token=token, expires_in=3600)
# === END USER CODE ===
在再生成过程中,ASA:
- 提取标记之间的所有内容
- 再生成外围结构
- 将你的代码准确插回原位
这种 100 % 确定性的往返保证了你的代码永远不会被意外覆盖。
安全再生成示例
你已有一个可工作的登录切片。后来,安全团队想记录 ip_address。
- 更新
slice.spec.md:
- email: string
- password: string
- ip_address: string # new
- 运行再生成命令:
asa generate-contract auth/login
asa regenerate-slice auth/login
ASA 会更新:
- 模型
- 处理器签名
- 测试
- 合约
你的自定义逻辑保持完整。
为什么确定性对 AI 辅助开发至关重要
- 多个代理可能会同时触及同一个切片
- 规格可能每天都在变化
- 合约快速演进
- 自动化工作流需要可预测的行为
- CI 流水线必须在无人监管的情况下再生成并进行 lint
ASA 确保:
- 相同规格 → 相同合约
- 相同合约 → 相同文件
- diff 中没有意外
- 逻辑不会被意外覆盖
该架构专为 AI 时代而构建。
ASA Core v1.0:适用场景
- 长期运行的后端系统
- 多代理编码环境
- 快速演进的功能集合
- 团队厌倦代码漂移
- 需要确定性输出的组织
- 任何以 LLM 为核心进行构建的项目
ASA 让你 拥抱再生成 而不是害怕它。再生成不应让人感觉像:
rm -rf my_code
而应像在保留业务逻辑的同时安全地更新结构。
ASA Core v1.0 的关键要素
- 切片共置
- 确定性模板
- 机器可读合约
- 基于标记的保留
- 通过 linter 实现边界强制
如果你想要一种能够跟上 AI 驱动开发节奏的后端架构,ASA 正是你的不二选择。
Source code & starter kit: