AI 编程 Agent 已经不只是“帮我写一段代码”的工具。Claude Code 这类终端式 Agent,把文件读取、代码修改、命令执行、测试、Git 工作流和外部工具连接放到同一个开发循环里,让模型可以真正参与工程任务。

但很多人用这类工具时,效果差异非常大。

有人能把它变成稳定的结对工程师:先规划、再实现、再验证、再沉淀规则。也有人每次都让它直接开写,最后得到一堆过度设计、跑不通、上下文混乱的代码。

差异往往不在模型本身,而在工作方式。

NoneLinear 兼容 OpenAI SDK,适合作为 AI 编程 Agent、代码审查 Agent、自动化修复工具和内部开发助手的模型调用层。无论你使用现成的 Claude Code 类工具,还是自己构建 Agent,下面这些实践都值得系统化沉淀。

AI 编程 Agent 工作流概览

快速接入 NoneLinear

如果你的 Agent 已经基于 OpenAI SDK 调用模型,接入 NoneLinear 通常只需要替换 base_url

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_NONELINEAR_API_KEY",
    base_url="https://api.nonelinear.com/v1",
)

response = client.chat.completions.create(
    model="your-model-name",
    messages=[
        {
            "role": "system",
            "content": "你是一个严谨的 AI 编程 Agent。先确认计划,再修改代码,最后验证结果。",
        },
        {
            "role": "user",
            "content": "请为当前项目新增邮箱登录功能,并在实现前先给出方案。",
        },
    ],
)

print(response.choices[0].message.content)

API 调用很简单,真正难的是让 Agent 在复杂项目里持续做对事。

第一原则:先规划,再写代码

很多失败的 AI 编程任务,都是从一句过于宽泛的指令开始的:

帮我做一个认证系统。

这类指令会给 Agent 太多自由度。它可能新建多余文件、引入不必要抽象、绕开现有模型、忽略项目已有约定,最后生成一个看起来完整但很难合入的实现。

更好的方式是先让 Agent 进入规划阶段。规划阶段不要急着写代码,而是先确认:

• 要修改哪些模块
• 现有数据模型是什么
• 会话存储在哪里
• 哪些路由需要保护
• 需要新增哪些测试
• 哪些边界条件不能漏
• 哪些实现方式明确不要采用

例如:

请先不要写代码。

我们要在现有 User 模型上增加邮箱/密码登录。
要求:
1. session 存储在 Redis,过期时间 24 小时
2. 保护 /api/protected 下所有路由
3. 复用当前 middleware 结构
4. 不引入新的认证框架
5. 先列出你会修改的文件、数据流和测试计划

这类输入会显著降低返工概率。Agent 的输出质量来自输入质量,规划就是把隐含需求显式化的过程。

把项目约束写进上下文文件

Claude Code 中常见的做法是维护一个项目级上下文文件,例如 CLAUDE.md。如果你在自建 Agent,也可以使用类似的 AGENTS.mdPROJECT_CONTEXT.mdDEV_GUIDE.md

它的作用不是写一份完整的新员工手册,而是保存 Agent 每次工作前必须知道的项目规则。

一个好的上下文文件应该包含:

• 项目使用的技术栈
• 常用命令
• 重要目录结构
• 不寻常的业务约束
• 测试和构建方式
• 常见坑点
• 代码风格和架构偏好
• 不能做的事情

示例:

# Project Context

## Commands

• `npm run test` runs unit tests.
• `npm run typecheck` must pass before submitting changes.
• `npm run lint` fixes most formatting issues.

## Architecture

• API routes live in `src/server/routes`.
• Database access must go through `src/server/db`.
• Do not import database clients directly from UI components.

## Constraints

• Keep auth logic inside existing middleware.
• Do not add a new state management library.
• Use TypeScript strict mode because implicit `any` caused production bugs before.

关键点是:不仅告诉 Agent “做什么”,还要告诉它“为什么”。

例如,“使用 TypeScript strict mode”是一条规则;“因为过去隐式 any 导致过线上问题”则能帮助模型在不确定时做出更合理的判断。

上下文文件要短、具体、持续更新

很多团队会把上下文文件写得很长,甚至把完整项目文档都塞进去。这通常会适得其反。

模型能够可靠遵循的指令数量是有限的。文件太长时,Agent 可能随机忽略某些规则,而你很难知道它忽略了哪一条。

更好的原则是:

• 保持短:只放高频、关键、容易犯错的规则
• 保持具体:不要解释通用概念,只写本项目特有信息
• 保持活:每当你第二次纠正 Agent 同一个问题,就把规则写进去
• 保持可执行:尽量写命令、路径、约束和反例

糟糕的上下文文件像一篇大而全的入职文档。好的上下文文件更像你留给“明天会失忆的自己”的工程备忘录。

管理上下文窗口:越满不一定越聪明

很多人误以为,只要模型上下文窗口足够大,就可以不断把文件、日志、历史对话和工具结果塞进去。

实际使用中,质量下降往往早于窗口打满。随着上下文变长,模型更容易:

• 混淆旧任务和新任务
• 继续沿用已经废弃的假设
• 忽略关键约束
• 重复尝试失败方案
• 对当前任务的注意力下降

更稳的做法是按任务隔离会话。

一个功能一个会话,一个 bug 一个会话,一个重构一个会话。不要在同一个长会话里先做认证系统,再重构数据库层,再写 UI,再排查部署问题。上下文会互相污染。

用外部文件保存长期记忆

对于复杂任务,不要把所有计划都留在聊天记录里。让 Agent 把计划、进度和决策写入项目文件,例如:

PLAN.md
TODO.md
IMPLEMENTATION_NOTES.md

这些文件可以跨会话存在,也能被人 review。

例如:

# Auth Implementation Plan

## Goal

Add email/password login using the existing User model and Redis-backed sessions.

## Files to inspect

• `src/server/models/User.ts`
• `src/server/middleware/auth.ts`
• `src/server/routes`

## Decisions

• Reuse existing middleware.
• Do not introduce a new auth framework.
• Session TTL is 24 hours.

## Progress

• [x] Inspect current User model
• [ ] Add password verification
• [ ] Add protected route tests

当上下文需要重置时,Agent 可以重新读取这些文件,而不是依赖一段已经臃肿的对话历史。

必要时清空上下文,而不是继续补丁式解释

当 Agent 开始反复尝试同一个错误方案时,继续追加说明通常不会变好。常见信号包括:

• 你已经解释同一件事三次
• Agent 不断修复同一个测试但始终失败
• 它开始修改与任务无关的文件
• 它反复引入你明确禁止的抽象
• 它的总结和当前代码状态不一致

这时更有效的方式是重置上下文:

  1. 保存当前关键结论到 PLAN.mdTODO.md
  2. 清空会话
  3. 只带回必要背景
  4. 重新描述最小任务

例如:

我们重新开始。

当前事实:
1. User 模型已存在,不要新建用户表
2. Redis session 已可用
3. 当前失败测试是 auth middleware 没有读取 session cookie

请只修改 middleware,先不要动 UI。

干净上下文通常比臃肿上下文更有价值。

提示词要具体、带约束、带反例

AI 编程 Agent 最怕模糊任务。

不要只说:

优化这个接口。

改成:

请优化 `GET /api/search` 的响应时间。

约束:
1. 不改变响应 JSON 结构
2. 不引入新的缓存服务
3. 优先检查数据库查询和索引
4. 修改后补充性能相关测试
5. 如果需要 schema change,先给出迁移方案,不要直接改

还可以加负面约束:

保持实现简单。
不要新建抽象层。
不要引入新的依赖。
如果 30 行以内可以解决,不要拆成多个文件。

很多高级模型会倾向于“做完整”,这在生产工程里不一定是好事。你需要明确告诉它哪些复杂度是不需要的。

让模型知道权衡背景

同一个技术问题,在不同阶段会有不同解法。

如果这是一个生产接口,你可能会要求:

这个逻辑在每个请求都会执行,请优先考虑性能和可观测性。

如果这是一个三天后会废弃的原型,你可以说:

这是一次性原型,优先快速验证,不要过度设计。

如果这是一个安全敏感模块,你需要明确:

这是认证链路。不要吞掉错误,不要记录明文 token,不要绕过现有权限检查。

模型无法读取你没有说出来的业务约束。把“为什么”交代清楚,Agent 才能在代码细节上做出符合目标的取舍。

模型分工:规划和执行可以分开

在 AI 编程工作流里,不同模型适合不同阶段。

一般来说:

• 更强的推理模型适合架构规划、方案比较、复杂调试和风险分析
• 更快、更便宜的模型适合执行明确计划、批量重构、生成样板代码和补测试

一个实用流程是:

高推理模型:分析需求 -> 制定方案 -> 列出风险和测试计划
执行模型:按方案修改代码 -> 跑测试 -> 修复明确错误
高推理模型:最终审查 -> 判断是否存在架构问题

NoneLinear 的价值在于可以作为统一的模型接入层,让开发者在同一套 OpenAI SDK 调用方式下切换不同模型,把规划、执行和审查拆成更可控的阶段。

MCP:减少复制粘贴上下文

MCP 这类连接协议的核心价值,是让 Agent 直接访问外部系统,而不是让人来回复制信息。

常见连接对象包括:

• GitHub issue 和 PR
• 数据库
• 日志系统
• Slack 或飞书消息
• 内部 API
• 文档系统
• 监控平台

如果你经常手动把某个系统里的信息复制给 Agent,就应该考虑把它做成工具连接。

但工具返回要为 Agent 设计,不要直接返回一大坨 UI 文本。更好的返回格式是:

{
  "issue_id": 1248,
  "title": "Login fails when session cookie is present",
  "status": "open",
  "reproduction_steps": [
    "Login with a valid account",
    "Refresh the page",
    "Request to /api/protected returns 401"
  ],
  "related_files": [
    "src/server/middleware/auth.ts",
    "src/server/session.ts"
  ]
}

结构化工具上下文比长文本更省 token,也更容易让模型采取正确行动。

Hooks:把机械检查自动化

有些事情不应该每次都靠 Agent 想起来。

例如:

• 修改文件后自动运行格式化
• 修改 TypeScript 文件后自动运行类型检查
• 修改 API 路由后自动运行相关测试
• 提交前自动检查 lint
• 生成文档后自动检查链接

这些都适合用 hooks 或脚本做自动化。

示例思路:

After file edit:
  -> run formatter
  -> run typecheck for changed package
  -> report errors back to Agent

这会让错误尽早暴露,而不是等 Agent 改了很多文件后才发现基础检查不过。

Slash Commands:把重复提示词变成命令

如果你经常对 Agent 说同一类话,就应该把它固化成命令。

例如:

/review-pr
/debug-test
/write-migration
/summarize-logs
/prepare-release-note

每个命令背后可以是一段固定提示词:

# /review-pr

Review the current diff.
Focus on behavioral bugs, regressions, missing tests, security issues, and risky assumptions.
Report findings first, ordered by severity.
Do not spend space on style issues unless they cause real risk.

这类命令的价值不是省几次打字,而是保证团队反复执行同一类任务时,Agent 的评价标准和输出格式一致。

卡住时的四种处理方式

当 Agent 陷入循环,不要继续堆上下文。优先换策略。

1. 清空

把关键事实保存到文件或短摘要里,然后清空会话。上下文污染是很多循环的根源。

2. 拆小

如果它无法完成“实现整个支付流程”,就拆成:

• 只建数据模型
• 只写创建订单接口
• 只接入回调校验
• 只补测试

每一块完成后再整合。

3. 展示

如果它一直误解你的目标,自己写一个最小示例:

期望输出长这样:

{
  "status": "ok",
  "items": []
}

请把其余接口也改成这个模式。

示例通常比抽象描述更有效。

4. 重构问题表达

有时不是模型不会做,而是问题表述方式不适合。

例如,把“处理这些复杂状态转换”改成“请把它实现为有限状态机”,模型可能马上就能给出更稳定的结构。

从一次性使用升级为自动化系统

很多人只把 AI 编程 Agent 当成交互式助手。更高阶的用法,是把它接入自动化流程。

典型场景包括:

• 自动 PR 审查
• 自动生成 release note
• 自动分析失败日志
• 自动更新文档
• 自动回复支持工单草稿
• 自动检查迁移风险
• 自动生成测试用例

如果是自建 Agent,可以用 NoneLinear 做模型调用层,再把任务输入和输出接入 CI、GitHub Actions、内部平台或定时任务。

示例:自动 PR 审查流程

GitHub PR opened
  -> collect diff and changed files
  -> load project context
  -> call NoneLinear review agent
  -> post findings as PR comment
  -> record false positives and missed bugs
  -> update review prompt or project rules

这会形成一个飞轮:

Agent 出错 -> 人 review -> 改进上下文/命令/工具 -> 下次更稳定

同一个模型,因为上下文和工作流越来越好,实际效果也会持续变好。

一套可落地的 AI 编程 Agent 工作流

可以把完整流程设计成这样:

1. 读取项目上下文文件
2. 明确任务目标和约束
3. 进入规划阶段,不写代码
4. 人确认方案
5. Agent 分步修改代码
6. hooks 自动格式化和检查
7. 运行相关测试
8. Agent 根据错误做最小修复
9. 最终审查 diff
10. 把新规则写回上下文文件

这套流程的核心不是“让模型自由发挥”,而是给它一个清晰、可验证、可复用的工程轨道。

实践清单

开始使用 Claude Code 类 AI 编程 Agent 时,可以先检查这些点:

1、是否有项目级上下文文件
2、上下文文件是否短、具体、持续更新
3、复杂任务是否先规划再实现
4、是否按功能或 bug 隔离会话
5、是否把长期计划写入外部文件
6、是否在上下文混乱时及时重置
7、提示词是否包含技术栈、路径、约束和反例
8、是否明确告诉 Agent 不要做什么
9、是否把规划、执行、审查拆给不同模型或不同阶段
10、是否用 MCP 或工具减少复制粘贴
11、是否用 hooks 自动跑格式化、类型检查和测试
12、是否把重复任务沉淀成 slash commands
13、是否记录 Agent 的错误并更新上下文文件
14、是否把高频任务接入自动化系统

只要把这些基础做好,AI 编程 Agent 的稳定性会比单纯“换更强模型”提升得更明显。

总结

Claude Code 类工具的核心价值,不是让开发者少写几行代码,而是把模型接入真实工程循环:理解上下文、规划方案、修改文件、运行检查、修复错误、沉淀经验。

要用好这类工具,关键是几件事:

• 先规划,再写代码
• 用项目上下文文件约束 Agent
• 管理上下文窗口,不让会话无限膨胀
• 用外部文件保存长期计划和进度
• 用具体提示词、负面约束和示例减少误解
• 用 MCP、hooks 和命令把重复流程工程化
• 卡住时及时清空、拆小、展示和重构问题
• 把一次性对话升级成可记录、可评估、可改进的系统