Code Agent不听话?一个文件让它乖乖按你的规矩来

Code Agent不听话?一个文件让它乖乖按你的规矩来

上周五下午4点,我让Claude Code给一个Python项目加个用户导出功能。它5分钟写完了,跑起来也没毛病。但我一看代码——全裸的except: pass,密钥直接硬编码在config.py里,日志一行没写。

我花20分钟把这些毛病改完,心想:下次它还会犯同样的错。

答案是会。而且每次都犯。

直到我在项目根目录扔了一个AGENTS.md文件,情况才彻底改观。

AGENTS.md到底是个啥

简单说,它就是一个放在项目根目录的规矩文件。Code Agent(Claude Code、Cursor、Copilot这类工具)启动时会自动读取它,然后按照里面的规矩干活。

不是README,不是文档,是规矩

你写README.md是给新同事看的,告诉他们"这个项目是干嘛的"。你写AGENTS.md是给AI看的,告诉它"在这个项目里,你必须怎么做,绝对不能怎么做"。

为什么需要这玩意

我做了个实验。同一个任务——"给FastAPI项目加一个文件上传接口",分别在有AGENTS.md和没有的情况下让Claude Code执行。

没有AGENTS.md的结果:

  • 异常处理:except Exception: pass(1处)
  • 输入校验:无
  • 日志:无
  • 类型标注:缺失3个参数
  • 测试:没写
  • AGENTS.md的结果:

  • 异常处理:分层捕获,每个异常有明确的HTTP状态码和错误信息
  • 输入校验:文件大小、类型、扩展名全部校验
  • 日志:关键路径有结构化日志,带request_id
  • 类型标注:完整
  • 测试:写了3个边界用例
  • 同一个模型,同一个提示词,差距就这么大。原因很简单:AI需要具体的、可执行的约束,而不是"写好代码"这种废话。

    怎么写一个管用的AGENTS.md

    我摸索了一个月,总结出一个模板。直接上干货:

    # AGENTS.md
    
    ## 项目概述
    这是[项目名],一个[一句话描述]。技术栈:Python 3.11 + FastAPI + PostgreSQL。
    
    ## 核心规则(违反即打回)
    
    ### 1. 异常处理
    - 禁止 `except: pass`、`except Exception: pass`
    - 捕获具体异常类型,每种异常有对应的错误处理
    - 关键操作必须有try/finally确保资源释放
    - 所有异常必须记录日志
    
    ### 2. 输入校验
    - 所有外部输入(API参数、文件、用户数据)必须校验
    - 使用Pydantic模型做参数校验,不要手动if/else
    - 文件上传必须校验:大小(<10MB)、类型(白名单)、扩展名
    
    ### 3. 日志规范
    - 使用structlog,不用print
    - 关键路径必须记录:请求进入、数据库操作、外部调用、异常
    - 每条日志带request_id
    - 日志格式:JSON,方便ELK收集
    
    ### 4. 代码风格
    - 所有函数必须有类型标注
    - 使用dataclass或Pydantic,不要裸dict传参
    - 常量用大写,放config.py,禁止硬编码
    - 数据库操作用SQLAlchemy ORM,禁止裸SQL
    
    ## 禁止事项
    - 禁止在代码中硬编码密钥、密码、token
    - 禁止用 `os.system()` 执行命令,用 `subprocess.run()`
    - 禁止用 `from module import *`
    - 禁止在生产代码中留 `TODO`、`FIXME`、`XXX`
    
    ## 文件结构

    src/

    api/ # 路由层,只做参数接收和响应返回

    services/ # 业务逻辑层

    models/ # 数据模型

    utils/ # 工具函数

    tests/ # 测试文件,与src结构对应

    
    ## 测试要求
    - 新功能必须写测试,覆盖率不低于80%
    - 测试用pytest,放在tests/目录
    - 测试命名:test_{功能}_{场景}_{预期结果}

    这个模板有几个关键设计:

    1. 规则分层

    "核心规则"是红线,违反就打回。"禁止事项"是底线,碰都不能碰。这种分层比一锅粥列20条规则有效得多——AI会优先关注标"禁止"的内容。

    2. 具体到可执行

    "写好代码"是废话。"禁止except: pass,捕获具体异常类型"是规矩。AI需要的不是方向感,是检查清单。

    3. 跟项目绑定

    每个项目的AGENTS.md应该不一样。FastAPI项目写FastAPI的规矩,Vue项目写Vue的规矩。通用模板可以共用,但技术栈特定的规则必须定制。

    几个实战踩坑

    坑1:规则太多反而没用

    我一开始写了47条规则。结果AI要么漏掉几条,要么为了满足所有规则把代码写得巨复杂。

    后来砍到15条核心规则,效果反而好了。原因:AI的上下文窗口有限,规则太多会稀释优先级。

    经验:核心规则不超过20条,宁可少而精。

    坑2:规则之间会冲突

    我写过"所有函数不超过30行"和"每个错误路径必须有独立的处理逻辑"。结果AI为了把错误处理塞进30行,用了各种嵌套和跳转,代码反而更难读。

    经验:写完规则后,自己假装是AI走一遍,看看有没有互相打架的。

    坑3:AGENTS.md不是一劳永逸的

    项目在变,规矩也得变。我现在的做法是:每次Code Review发现问题,就把对应的规矩加进AGENTS.md。相当于用Review经验训练AI。

    # 我的迭代流程
    # 1. Code Review发现AI犯了某个错
    # 2. 把对应的规矩加进AGENTS.md
    # 3. 下次AI就不会再犯同样的错

    坑4:不同目录需要不同规矩

    大项目里,前端和后端的规矩肯定不一样。我的做法是用多层AGENTS.md

    project/
      AGENTS.md           # 全局规则
      backend/
        AGENTS.md         # 后端专属规则(覆盖全局的同名规则)
      frontend/
        AGENTS.md         # 前端专属规则

    Code Agent会自动合并这些文件,子目录的规则优先级更高。

    效果量化

    我在3个项目上跑了2个月,统计了Code Review的打回率:

    指标无AGENTS.md有AGENTS.md下降幅度 异常处理问题12次/月2次/月83% 输入校验缺失8次/月1次/月87% 硬编码问题5次/月0次/月100% 日志缺失15次/月3次/月80% 总打回率40%8%80%

    打回率从40%降到8%。最直接的好处不是代码质量提升——那个是附带的——而是我花在Review上的时间从每周6小时降到了每周1.5小时

    跟其他方案的对比

    你可能会想:Cursor Rules、.cursorrules、Copilot Instructions这些不也是干这个的吗?

    是的,但AGENTS.md有一个优势:它是工具无关的

    .cursorrules只对Cursor生效,.github/copilot-instructions.md只对Copilot生效。AGENTS.md目前被Claude Code、Hermes Agent、Windsurf等多个工具支持,而且正在成为事实标准。

    我在项目里只维护一份AGENTS.md,不管团队成员用什么AI工具,规矩都一样。

    一个完整的实战案例

    这是我最近一个真实项目的AGENTS.md,做的是内部的API网关:

    # AGENTS.md - API Gateway
    
    ## 项目
    内部API网关,处理请求路由、鉴权、限流、日志。 
    技术栈:Go 1.22 + Gin + Redis + PostgreSQL。
    
    ## 核心规则
    
    ### 性能
    - 所有中间件必须在1ms内完成(不含下游调用)
    - Redis操作必须设置超时,默认200ms
    - 数据库查询必须有索引,禁止全表扫描
    - HTTP客户端必须设置连接池:MaxIdleConns=100, MaxIdleConnsPerHost=10
    
    ### 安全
    - 所有外部输入必须校验和清洗
    - SQL查询必须用参数化,禁止字符串拼接
    - 敏感数据(token、key)在日志中必须脱敏
    - CORS配置必须白名单,不能用 `*`
    
    ### 可观测性
    - 每个请求必须有trace_id,贯穿全链路
    - 关键指标必须暴露Prometheus格式:请求量、延迟、错误率
    - 日志必须包含:trace_id、method、path、status、latency_ms
    
    ### 错误处理
    - 所有错误必须返回统一格式:`{"code": "ERR_XXX", "message": "..."}`
    - 内部错误不暴露堆栈给客户端
    - 超时必须有明确的错误码,不是500

    这个文件只有30行,但覆盖了API网关最核心的4个维度:性能、安全、可观测性、错误处理。AI每次生成代码时都会自动遵守这些规矩。

    写在最后

    AGENTS.md不是银弹,AI还是会犯错。但它把犯错的概率从"经常"降到了"偶尔",把Review的重点从"基础规范"提升到了"业务逻辑"。

    如果你现在每天花超过1小时在Code Review上纠正AI的基础错误,试试在项目根目录放一个AGENTS.md。花30分钟写规矩,能省你30小时的Review时间。

    这笔账,怎么算都划算。



    关注「安全值班室」公众号

    每天一篇AI安全早报 + 实战攻防案例

    关注安全值班室

    posted on 2026-05-20 09:00  明.Sir  阅读(23)  评论(0)    收藏  举报

    导航