1. 项目概述:从混乱到有序的AI辅助开发

几个月前,我每个月都在Claude上烧掉一笔令人尴尬的Token费用,但真正能交付的有价值功能却寥寥无几。那个让我彻底清醒的时刻,发生在一个调试场景里:我花了将近一个小时,让Claude解释为什么同一个函数在不同的上下文里表现不同,最后才发现,我一直在给它喂三个迭代之前的、早已过时的代码片段。那一刻我意识到,问题不在于AI的能力,而在于我使用它的方式——一种毫无章法、想到哪问到哪的“即兴开发”模式。这种模式不仅昂贵,而且低效,甚至会产生误导性的结果。

这种破碎的AI开发流程具体是什么样子?通常是这样开始的:你打开Claude,想让它帮你添加一个用户认证功能。聊了三十条消息后,你们的话题已经跑到了数据库迁移上,又过了几条消息,你发现自己正在重构整个错误处理系统。每一次上下文切换都在燃烧Token,更糟糕的是,AI开始基于它“认为”存在但实际上并不存在的代码,产生幻觉般的解决方案。我当时把Claude当成了一个带聊天界面的Stack Overflow——被动地向它抛问题,而不是系统性地利用它。结果就是:一堆半成品功能、让调试变得不可能的上下文漂移,以及让我怀疑AI开发是否值得的高昂账单。

这个项目的核心,就是将我摸索出的这套从GitHub Issue到合并PR的完整、AI驱动的开发工作流程固化下来。它不仅仅是一套操作步骤,更是一种思维模式的转变:从依赖AI的即时反应,转向构建一个可重复、可扩展、能保证产出质量的系统。这套流程特别适合独立开发者、小团队的技术负责人,或者任何希望将AI(不仅仅是Claude,也包括其他大语言模型)深度、高效地整合到日常编码工作中的人。它的价值在于,将AI从一个“聪明的聊天伙伴”转变为一个可控、可预测的“开发协作者”,最终实现开发速度、代码质量和成本控制的三重提升。

2. 核心思路:将系统思维引入AI协作

我经历的最大转变,是认识到可持续的AI开发不在于找到那个“完美的提示词”,而在于构建可重复的系统,来预防那些代价高昂的错误。前期规划、全程文档化和使用全新的上下文会话,这些看似增加了“开销”的步骤,恰恰是阻止Token燃烧死亡螺旋、让AI开发变得可持续的关键。而且,这套系统的开销是能够产生复利的:规划文档成为了项目的知识库,对抗性代码审查帮我发现了需要改进的编码模式,而结构化的流程让我可以在任何地方无缝衔接开发工作,不会丢失进度。

2.1 规划先行:为AI划定清晰的战场

我的突破始于一个简单的改变:在写任何一行代码之前,先进行规划。现在,每个新功能的开发都始于一次结构化的对话,在对话中,我和Claude必须明确三件事,然后才会触及代码。

第一是 上下文边界 。我们必须明确当前代码库的确切状态、近期做了哪些更改、以及我们可以做出哪些假设。这意味着杜绝“你知道我们之前构建的那个认证系统”这类模糊指代,转而使用明确的文件引用和状态描述。例如,我会说:“请基于 main 分支的最新提交(哈希 a1b2c3d )进行开发。 /app/auth/ 目录下的 middleware.py 文件是当前的认证中间件,版本是2.1。我们假设用户模型位于 /app/models/user.py 。” 这种精确性为AI提供了稳固的立足点。

第二是 工具约束 。Claude需要知道它是在为哪个具体的环境编写代码。这包括我们正在使用的API(例如,FastAPI还是Django REST framework)、部署流水线的期望(比如,我们的Dockerfile结构、GitHub Actions的workflow配置),以及测试框架的能力(pytest的特定插件、覆盖率要求)。告诉Claude“我们使用GitHub Actions进行CI/CD,请确保代码符合 flake8 black 的格式要求”,远比让它写“通用的CI代码”要高效得多。

第三是 成功标准 。我们需要定义“完成”不仅仅意味着功能可用,还包括如何确保代码在六个月后依然是可维护的。这包括代码风格约定、性能基准(如API响应时间<200ms)、测试覆盖率目标(如>80%),以及关键的架构决策(如是否采用新的设计模式)。提前明确这些,能引导AI生成更符合长期利益的代码。

这个规划阶段消耗的Token相对较少,但能在后续节省大量成本。Claude在明确知道要解决什么问题、且在既定约束条件下时,生成的代码质量会高得多。

2.2 文档化与上下文重置:对抗“幻觉”与漂移

保持一个漫长的对话线程,感觉上很高效,但事实并非如此。在经过足够多的来回交流后,Claude会开始基于早期(可能已失效)的上下文做出假设。我学会了识别那些警告信号:Claude引用了我在当前会话中从未分享过的代码;针对简单问题的解决方案变得过度复杂;AI开始建议修复一些根本不存在的问题。

与其费力对抗上下文漂移,不如主动管理它。我的策略是 在对话中持续文档化,并果断开启新会话 。在规划一个功能时,我会让Claude生成一份结构化的项目简报,内容包括技术方案、文件结构变更图和关键实现说明。然后,我会保存这份简报。当真正开始编码时,我会开启一个全新的Claude会话。

这份简报就成了会话之间的“交接文档”。新的Claude会话会收到这份简报、当前代码库的状态(通过上传相关文件或提供git diff),以及具体的编码任务。这样一来,没有上下文漂移,没有幻觉解决方案。每个开发任务都在一个干净、专注的上下文中完成。

2.3 对抗性代码审查:打破AI的自满盲区

这是我偶然发现的一个关键点:Claude会对它自己写的代码感到“舒适”。如果我让它评审刚刚写好的代码,它倾向于认可自己的模式,即使这些模式可能存在问题。AI会对自己产生的工作产生盲点。

解决方案是引入 使用不同模型进行的对抗性审查 。在Claude完成一个功能的编码后,我会将代码粘贴到与另一个模型(例如GPT-4、DeepSeek-Coder或Codestral)的对话中,并要求进行批判性评审,且不提及代码是Claude写的。不同的模型会捕捉到不同的问题。

例如,Claude写了一个认证装饰器:

# Claude写的认证装饰器
def require_auth(f):
    def decorated_function(*args, **kwargs):
        if 'user_id' not in session:
            return redirect('/login')
        return f(*args, **kwargs)
    return decorated_function

当让Claude评审自己的这段代码时,它说:“看起来不错,正确地处理了认证检查。” 然而,对抗性评审(来自另一个模型)指出:“这个装饰器丢失了原函数的元数据(如 __name__ , __doc__ ),并且在重定向时没有正确处理POST数据。此外,缺少CSRF保护。”

这两点批评都是有效的。Claude已经对一个“能用但不够健壮”的模式感到自在了。跨模型审查能在这些问题演变成生产环境的事故之前,抓住这些盲点。

3. 完整工作流实战解析

现在,一个典型的功能开发周期是这样运作的。我将以“为用户系统添加密码重置功能”为例,拆解每一个步骤。

3.1 第一阶段:头脑风暴与问题定义

这个阶段的目标是生成理解,而不是代码。我会以对话的方式向Claude描述功能需求。我们会探讨不同的实现路径,讨论权衡,并识别出核心的复杂性所在。

我的提示词示例:

“我们的SaaS平台目前只有基本的邮箱/密码登录。用户反馈强烈需要密码重置功能。请帮我头脑风暴一下实现这个功能需要考虑哪些方面?我们用的是Python Flask,用户数据在PostgreSQL里,目前通过Session做登录状态管理。我希望流程是标准的:用户输入邮箱请求重置 -> 系统发送带令牌的链接邮件 -> 用户点击链接进入重置页面 -> 输入新密码完成重置。”

Claude的典型回复会涵盖:

  • 安全考量 :重置令牌必须是唯一且不可预测的,需要设置有效期(如24小时),使用哈希存储令牌而非明文,防止重放攻击。
  • 数据模型变更 :需要在User表中添加 reset_token reset_token_expires_at 字段。
  • 外部服务集成 :需要集成邮件发送服务(如SendGrid、SMTP),并设计邮件模板。
  • 流程端点 :需要新增三个端点: POST /auth/forgot-password (发起请求), GET /auth/reset-password/<token> (验证令牌并展示页面), POST /auth/reset-password/<token> (提交新密码)。
  • 用户体验 :成功/失败页面的设计,错误处理(如令牌无效或过期)。

这个阶段结束时,我们对“要做什么”和“主要难点在哪”有了清晰、共享的理解。

3.2 第二阶段:结构化规划与Issue创建

接下来,Claude会将头脑风暴的成果转化为可执行的计划。我会要求它创建一份详细的项目计划,并将功能拆解为离散的GitHub Issue。每个Issue都需要包含验收标准、技术备注和优先级。

我的提示词示例:

“基于刚才的讨论,请为‘添加密码重置功能’创建一个详细的项目计划。请将其分解为多个具体的GitHub Issue,并为每个Issue编写标题、描述、验收标准和技术备注。优先级从P0(最高)到P2(最低)。”

Claude生成的输出示例:

## Issue: [P1] 扩展User数据模型以支持密码重置
**描述:** 在现有的User模型中添加字段,用于存储密码重置令牌及其过期时间。
**验收标准:**
- 向 `User` 模型添加 `reset_token_hash` (String) 和 `reset_token_expiry` (DateTime) 字段。
- 创建数据库迁移脚本(如使用Alembic)。
- 添加对应的模型方法:`generate_reset_token()`, `is_reset_token_valid(token)`, `clear_reset_token()`。
**技术备注:**
- 使用 `secrets.token_urlsafe()` 生成令牌。
- 使用 `werkzeug.security.generate_password_hash` 对令牌进行哈希存储,切勿存明文。
- 过期时间设为当前时间+24小时。

## Issue: [P1] 实现密码重置请求端点与邮件服务
**描述:** 创建接收邮箱地址、生成令牌、并发送重置邮件的端点。
**验收标准:**
- 创建 `POST /api/auth/forgot-password` 端点。
- 端点验证邮箱是否存在(避免信息泄露,统一返回“如果邮箱存在,重置邮件已发送”)。
- 调用User模型的 `generate_reset_token` 方法。
- 集成邮件服务(如SendGrid),发送包含重置链接(如 `https://app.com/reset-password?token=xxx`)的邮件。
- 编写单元测试,模拟邮件发送。
**技术备注:**
- 使用环境变量管理邮件服务API密钥。
- 邮件内容需包含明确的过期提示。

## Issue: [P1] 实现密码重置验证与更新端点
**描述:** 创建验证重置令牌并更新密码的端点。
**验收标准:**
- 创建 `GET /api/auth/reset-password/<token>` 用于验证令牌有效性(返回成功或错误信息)。
- 创建 `POST /api/auth/reset-password` 接收 `token` 和 `new_password`,验证后更新用户密码。
- 密码更新后,立即使用 `clear_reset_token()` 使当前令牌失效。
- 用户成功重置后,可选:自动登录或跳转至登录页。
- 编写完整的集成测试。
**技术备注:**
- `POST` 端点需进行密码强度校验。
- 确保令牌在一次使用后立即失效,防止重复使用。

我会直接将这个输出复制粘贴到GitHub仓库的Issue列表中。这一步将模糊的想法转化为了团队(即使团队只有我和AI)可以跟踪和执行的明确任务。

3.3 第三阶段:项目看板与自动化配置

为了可视化和管理这些Issue,我会使用GitHub Projects。我会让Claude生成GitHub Projects的配置,包括列的定义和自动化规则。

我的提示词:

“请为上述三个Issue设计一个简单的GitHub Projects看板配置。包括看板列(例如:待办、进行中、代码审查、完成)和自动化规则(例如:当Issue被分配时自动移动到‘进行中’,当关联的PR被打开时移动到‘代码审查’)。请给出可以直接在GitHub界面中操作的步骤或YAML配置片段。”

Claude的回复会指导我:

  1. 在仓库中创建新的Project。
  2. 设置列: Backlog , Ready , In Progress , Review , Done
  3. 设置自动化:
    • 规则1 :当Issue被添加到项目时,状态设为 Backlog
    • 规则2 :当Issue被分配(Assignee)时,自动移动到 In Progress
    • 规则3 :当有关联的Pull Request被打开时,自动移动到 Review
    • 规则4 :当关联的PR被合并后,自动移动到 Done

这创建了一个轻量级的项目管理流程,让进度一目了然。

3.4 第四阶段:聚焦式开发与编码

这是核心的编码阶段。每个Issue都会在自己的、聚焦的Claude会话中完成。我会使用GitHub Codespaces(一个云开发环境)来保证环境一致性。

具体操作流程:

  1. 开启新会话 :在Claude中,我开启一个全新的聊天。
  2. 提供上下文 :我将之前生成的对应Issue的描述、验收标准和技术备注粘贴进去。同时,我会上传或粘贴当前相关的代码文件(例如 models/user.py , app/auth/__init__.py )。
  3. 发出明确指令 :我的提示词会非常具体。“请基于我们当前的Flask应用和附上的User模型,实现Issue ‘扩展User数据模型以支持密码重置’ 中描述的所有验收标准。请提供完整的代码更改,包括模型修改和Alembic迁移脚本。”
  4. 迭代与澄清 :Claude生成代码后,我会在Codespaces中实时查看、运行测试。如果有问题,我会在同一个会话中针对具体代码行提问,避免话题扩散。
  5. 本地测试与提交 :代码通过本地测试后,我直接在Codespaces的终端里提交: git add . , git commit -m “feat: add reset token fields to User model”

这种“一个Issue,一个会话”的模式,极大地保持了上下文的纯净和任务的专注度。

3.5 第五阶段:对抗性审查与PR流程

在本地提交后,在创建Pull Request之前,我会执行对抗性审查。

  1. 复制代码 :将Claude生成的关键代码片段(例如新的端点函数、模型方法)复制出来。
  2. 寻求外部评审 :打开另一个AI工具(如Cursor的Chat模式,其背后可能是GPT-4),粘贴代码并提问:“请以严格的代码评审员身份,评审以下Flask端点代码。重点关注安全性、错误处理、Flask最佳实践和潜在漏洞。不要假设上下文,直接指出问题。”
  3. 整合反馈 :外部AI通常会提出一些Claude遗漏的点,比如:是否对输入进行了充分的验证和清理?错误响应是否遵循了统一的JSON格式?是否有日志记录?是否存在SQL注入或XSS风险?(即使使用了ORM,也可能有疏忽)。我会将这些反馈带回原始的Claude会话,让它解释或修改代码。
  4. 创建PR :确认代码无误后,推送分支并创建Pull Request。在PR描述中,我会引用相关的Issue编号(如 Closes #45 ),并简要说明更改。
  5. 利用GitHub Actions :我的仓库配置了GitHub Actions工作流,在PR创建时会自动运行测试套件、代码风格检查(flake8/black)和安全扫描(如Bandit)。这是另一层自动化保障。

4. 工具链深度配置与优化

一个流畅的工作流离不开精心配置的工具。以下是我为这个AI驱动工作流优化的关键工具配置。

4.1 GitHub Actions工作流配置

GitHub Actions是实现自动化质量门禁的核心。我的 /.github/workflows/ci.yml 文件配置如下:

name: CI Pipeline
on: [push, pull_request]

jobs:
  test-and-lint:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: ‘3.11’

      - name: Install dependencies
        run: |
          pip install -r requirements.txt
          pip install pytest pytest-cov flake8 black bandit

      - name: Run security lint (Bandit)
        run: bandit -r ./app -f json -o bandit-report.json || true # 不因发现漏洞而失败,仅报告

      - name: Run code style check (Black)
        run: black --check ./app

      - name: Run linter (Flake8)
        run: flake8 ./app --count --max-complexity=10 --statistics

      - name: Run tests with coverage
        run: pytest --cov=./app --cov-report=xml --cov-report=term-missing

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v3
        if: github.event_name == ‘pull_request’ # 仅在PR时上传
        with:
          file: ./coverage.xml
          fail_ci_if_error: false

这个工作流确保了每次提交和PR都会自动进行安全检查、风格检查和测试,为AI生成的代码提供了即时反馈。我会把工作流运行结果(成功或失败)的链接分享给Claude,让它根据错误信息进行修正,这本身也是一个极佳的学习循环。

4.2 Claude上下文管理与提示工程

为了最大化Claude的效率,我总结了一套提示词结构:

  1. 角色设定 :“你是一个经验丰富的Python/Flask后端工程师,擅长编写安全、可维护且符合PEP 8规范的代码。”
  2. 上下文锚定 :“我们正在开发一个Flask Web应用。当前代码库状态基于 main 分支的最新提交(哈希: x7y8z9 )。相关文件已附在本消息中。”
  3. 具体任务 :“你的任务是实现 [具体功能]。验收标准是:[列出1,2,3]。请优先考虑使用我们已经导入的库(如 flask-sqlalchemy , werkzeug.security )。”
  4. 输出格式 :“请提供完整的代码块,并附上简短的修改说明。对于新文件,请给出完整路径。”

此外,我充分利用Claude的“自定义指令”或“项目”功能(取决于使用界面),将项目级别的约束固化下来,比如:“本项目的代码风格是Black,行宽88。所有公开API端点都需要有文档字符串。数据库操作必须使用服务层,避免在视图函数中直接写复杂查询。” 这样,每次新会话都能继承这些基础规则。

4.3 开发环境标准化:Codespaces的优势

GitHub Codespaces对这个工作流至关重要。它提供了一个预配置、可复现的云端开发环境。

  • 环境即代码 :我的 .devcontainer/devcontainer.json 文件定义了所有扩展、Python版本、预装命令和端口转发。这意味着无论我从哪台设备(主力电脑、备用笔记本甚至平板)通过浏览器访问,都能获得完全相同的开发环境。
  • 无缝上下文共享 :在Codespaces中,我可以直接将整个工作区的文件树或单个文件轻松拖入Claude的聊天窗口,为AI提供最准确的上下文。
  • 快速启动 :针对简单的Bug修复或小功能,我可以在几分钟内从创建Issue到在Codespaces中完成编码,无需在本地处理环境依赖问题。

5. 常见问题、避坑指南与效能提升

在实际运行这套流程中,我遇到了不少坑,也总结出一些提升效能的心得。

5.1 典型问题与解决方案

问题现象 可能原因 解决方案
AI生成的代码无法通过现有测试 AI不了解全部测试用例或测试的边界条件。 1. 将失败的测试用例输出和错误信息提供给AI。2. 在规划阶段就明确测试覆盖要求。3. 让AI先编写测试,再编写实现(TDD模式)。
代码风格与项目现有风格不一致 AI的通用训练数据与项目特定约定不符。 1. 在自定义指令中明确风格要求(Black、单双引号等)。2. 提供项目中的几个典型文件作为风格参考。3. 利用GitHub Actions的Black检查进行自动纠正。
AI建议了不熟悉或过时的库 AI的知识截止日期或训练数据偏差。 1. 在约束中明确指定技术栈和已批准的库列表。2. 对于AI推荐的新库,要求它给出与现有库的对比分析。3. 最终决策权在人,对不熟悉的依赖项保持谨慎。
对抗性审查提出大量琐碎意见 不同模型对“代码整洁度”的标准不同,可能过于严苛。 1. 区分“阻塞性问题”(安全漏洞、功能错误)和“改进建议”(命名、小重构)。2. 只要求解决阻塞性问题,改进建议放入后续优化TODO。3. 设定审查范围,例如“本次只审查安全性和核心逻辑”。
规划阶段过于冗长,感觉在空谈 试图在规划中解决所有细节,导致分析瘫痪。 遵循“刚好足够的规划”原则。规划的目标是识别主要模块和接口,而不是每个函数。允许在开发单个Issue时进行微调。为每个规划阶段设置时间盒(如15分钟)。

5.2 成本控制与Token节省技巧

Token消耗是AI开发的主要成本。以下是我控制成本的几种有效方法:

  1. 压缩上下文 :在上传文件给AI前,先手动或写脚本删除注释、空白行,只保留关键的函数和类定义。对于大型文件,只上传你即将修改的那个类或函数所在的部分。
  2. 使用摘要而非全文 :对于提供背景信息,可以先让AI对一段代码或文档进行总结,然后在后续会话中使用这个总结,而不是反复粘贴大段原文。
  3. 善用“系统提示词” :许多AI接口允许设置“系统”角色提示词,这部分内容通常以不同方式计费或不计费。将项目不变的约束(如技术栈、代码规范)放在系统提示词中。
  4. 分层对话 :将一次复杂的开发拆分成多个会话。第一个会话专门做高层设计和规划,产出文档。第二个会话基于文档做模块A开发,第三个会话做模块B开发。这比在一个不断膨胀的会话中完成所有事情要便宜得多。
  5. 选择合适的模型 :不是所有任务都需要最强大、最昂贵的模型。代码补全、简单的语法修正可以使用更轻量、更便宜的专用代码模型。将Claude或GPT-4用于最需要创造性和复杂推理的规划与设计阶段。

5.3 流程的扩展与适应

这套流程并非一成不变,可以根据项目规模和团队情况进行调整。

  • 对于微型项目(个人周末项目) :可以简化。跳过正式的GitHub Projects看板,用Issue列表管理。对抗性审查可以简化为自己休息片刻后重新审视代码,或者使用简单的linter工具。
  • 对于小型团队 :这套流程可以很好地协作。规划文档和Issue成为团队沟通的基础。可以指定不同的AI模型进行交叉审查(如开发者A用Claude写,开发者B用GPT-4审)。GitHub Actions的自动化检查是团队的共同守门员。
  • 整合其他AI工具 :除了对话式AI,还可以整合:
    • Cursor/VS Code Copilot :用于实时代码补全和文件内的小范围重构,减少开启完整会话的频率。
    • 专门的分析工具 :用SonarCloud进行持续的代码质量分析,将结果反馈给AI用于改进建议。
    • RAG(检索增强生成)实验 :正如原文末尾提到的,可以尝试用FolioChat或自建RAG,将项目文档、API参考、过往的解决方案索引起来,让AI能直接“查阅”项目知识库,进一步减少上下文依赖和幻觉。

这套从GitHub Issue到合并PR的AI驱动工作流,其精髓在于将人的战略思维、项目管理能力与AI的战术执行、代码生成能力相结合。它通过结构化的流程设计,规避了AI辅助开发中最常见的陷阱——上下文丢失、成本失控和质量不稳定。最终,它让我从一个被AI对话牵着鼻子走的被动使用者,转变为驾驭AI能力、高效产出可靠代码的主动管理者。最大的收获不是节省了多少时间,而是建立了一种可以持续运行、不断积累、并让人安心的开发节奏。

Logo

免费领 200 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐