第3章 配置受Git约束的AI协同开发工作台

前两章由学生独立完成了项目克隆、基线运行、手工修改、验证和提交。本章开始引入AI协同开发工具,建立VS Code、Cline、校内Qwen服务和Git仓库之间的基本关系。

本章只允许AI读取限定文件、解释工程和形成修改计划,不实施代码修改。只读阶段用于判断AI取得的上下文是否正确,以及它提出的计划能否验证。

确认Git基线
→ 打开完整工作区
→ 连接校内模型
→ 设定文件和命令权限
→ 限定AI读取范围
→ 让AI解释工程
→ 让AI提出计划
→ 人工审查计划
→ 确认仓库未被修改

完成本章后,应当能够:

3.1 从干净的Git状态开始

3.1.1 检查第2章提交

进入课程仓库,执行:

git branch --show-current
git log -1 --oneline
git status --short

应确认:

AI进入项目前必须先固定基线。若AI工作后出现差异,可以与这一提交比较;若一开始工作区就不干净,后续很难区分哪些变化来自学生、编辑器或AI工具。

3.1.2 建立本章分支

从第2章提交建立新分支:

git switch -c lab/ch03-ai-workbench

本章预计不产生源代码提交,但使用独立分支可以保持章节边界,也为意外变化提供清晰的比较起点。

记录当前提交:

git rev-parse HEAD

3.2 使VS Code工作区与仓库边界一致

3.2.1 打开正确范围

在仓库根目录执行:

code .

不要只打开firmware/sound_event_terminal.ino。AI需要从工作区取得README.md、事件规则、模型清单和项目约束。只打开单个文件,会使它缺少目录关系和Git上下文。

在VS Code集成终端中再次执行:

git rev-parse --show-toplevel
git status --short

第一条命令应输出当前课程仓库根目录。若输出另一个路径,说明终端位于错误仓库。

3.2.2 判断是否信任工作区

VS Code打开新目录时可能要求确认工作区信任。确认前应检查:

工作区信任会影响扩展、任务和调试配置是否可以执行。它不是一个应当机械点击的提示,而是一次代码来源判断。

3.2.3 课程扩展与项目设置

课程环境卡给出当学期测试过的扩展版本。基本扩展包括:

个人主题、字号和快捷键属于用户设置;换行符、格式化规则和构建任务属于项目设置,应由课程仓库统一提供。不要让扩展在第一次打开项目时自动格式化全部源文件。

安装扩展后,再次执行:

git status --short

如果 .vscode/ 或源代码出现变化,应先检查扩展行为,不要继续配置AI。

3.3 连接Cline与校内Qwen服务

3.3.1 从环境卡取得参数

校内模型服务的实际参数不写入纸质教材。统一资源定位符(Uniform Resource Locator,URL)用于标识服务地址。应用程序编程接口(Application Programming Interface,API)规定调用方式。

学生从当学期环境卡取得以下参数:

参数 作用
接口类型 Cline应选择的服务方式
基础地址(Base URL) 校内模型服务入口
模型标识(Model ID) 当前课程模型标识
接口密钥(API Key) 个人访问凭据
最大上下文 单次任务可使用的上下文范围
并发与配额 课堂服务限制

界面字段沿用工具名称,正文分别称为“基础地址”和“接口密钥”。若校内服务提供兼容接口,Cline应采用相应协议。这里的“兼容”只描述请求格式,不表示使用某个特定的外部模型服务。

3.3.2 保护个人凭据

接口密钥只填写在课程规定的凭据位置,不写入:

如果凭据已经出现在仓库或公开截图中,应立即按课程流程撤销并重新签发。只删除文件不能使已经泄露的凭据重新安全。

3.3.3 先测试对话连接

发送一个不读取项目、不调用工具的最小请求:

请只回答“连接正常”,不要读取文件,不要调用工具。

能够得到回答,只证明以下链路可用:

`Cline`界面
→ 校内模型接口
→ `Qwen`模型
→ 文本响应

它还不能证明Cline具有项目文件权限、命令执行能力或稳定的工具调用能力。AI开发智能体还需要接受后续测试。

早期的编程辅助工具主要根据当前文件补全代码。此后,交互式模型能够依据对话生成较长的程序片段。AI开发智能体又增加了读取文件、调用终端和修改工程的能力,因而可以连续完成多步任务。

能力范围扩大后,错误的影响也从“生成一段不合格代码”扩大为“改变真实工程状态”。因此,模型回答正确不等于智能体配置合格。还要检查它取得了哪些上下文、能够调用哪些工具,以及每项调用能否被Git和验证记录追踪。

3.3.4 记录连接但不记录秘密

实验记录可以保存:

`Cline`版本:
接口类型:
模型标识:
连接时间:
连接结果:

不要记录基础地址中的内部路径、个人接口密钥和完整响应头。课程运维需要的敏感信息由教师单独保存。

3.4 设置最小权限

3.4.1 区分四类能力

AI协同开发工具可能具有四类能力:

能力 主要风险 本章设置
读取文件 读取密钥、个人数据或无关大文件 逐项限定
写入文件 产生超范围修改 不允许
执行命令 安装、删除、联网或改变仓库 不允许
访问外部服务 泄露代码或取得不可靠内容 不允许

本章只使用读取能力。即使工具界面提供“自动批准”,也不启用写文件、终端命令、Git提交和网络访问。

3.4.2 规划模式与实施模式

Cline使用规划模式讨论问题、读取上下文和形成方案,使用实施模式修改文件和执行命令。工具界面可能分别使用Plan和Act。界面名称可以变化,两类责任应保持分离:

规划阶段
→ 理解任务
→ 读取限定文件
→ 找出受影响范围
→ 提出实施和验证步骤

实施阶段
→ 按批准计划修改
→ 运行批准命令
→ 展示结果

本章保持在规划阶段。模式名称不是安全保证,真正的控制仍来自文件权限、命令审批、Git差异和人工验证。

3.4.3 不向AI提供的内容

以下文件默认不进入模型上下文:

模型文件很大并不是唯一原因。当前任务只需要理解调用关系,把大量无关内容加入上下文会降低任务边界的清晰度。

3.5 用规则文件保存稳定约束

3.5.1 课程仓库中的规则

课程仓库在根目录提供AGENTS.md,并在.clinerules/中提供Cline适配规则。两者记录稳定的项目约束,例如:

# AI协同开发基本规则

- 先说明目标、受影响文件和验证方法,再申请实施。
- 只读取和修改任务明确列出的文件。
- 不读取或输出密钥、个人数据和内部服务地址。
- 不修改模型数据、生成文件和第三方代码,除非任务明确要求。
- 不自行更改验收阈值、接口契约和依赖版本。
- 删除、安装、联网、提交、推送、合并和发布需要单独批准。
- 修改后展示Git差异,由学生执行构建和实机验证。
- 无法从当前文件确认的事实必须标为“待核查”。

规则应简短、可执行,并与课程实际权限一致。规则写得再严格,也不能代替学生检查。

3.5.2 规则优先级和冲突

执行任务前应确认:

如果这些内容冲突,应暂停任务并请求教师确认。AI不能自行选择一个“看起来合理”的规则继续实施。

3.5.3 用Git检查规则是否改变仓库

打开规则文件后执行:

git status --short
git diff

规则由课程仓库提供,本章只读取,不修改。若编辑器改变了换行或空白,应恢复后再继续。

3.6 第一次让AI读取真实工程

3.6.1 任务说明的四个组成部分

一个适合AI协同的任务说明至少包含:

  1. 目标:需要回答什么工程问题;
  2. 上下文:允许读取哪些文件;
  3. 约束:不得读取、修改和假设什么;
  4. 输出:回答应采用什么结构。

本章第一次任务如下:

目标:
解释智能声音识别通知器从声音输入到事件通知的程序路径。

只允许读取:
1. README.md
2. firmware/sound_event_terminal.ino
3. firmware/event_policy.h
4. models/model-manifest.json

不得执行:
- 不读取其他文件;
- 不修改任何文件;
- 不运行命令;
- 不推测未在文件中出现的板卡参数、模型指标和服务配置。

请按以下结构回答:
1. 声音输入从哪个调用进入;
2. 特征和模型推理由哪些对象完成;
3. 模型输出怎样进入事件规则;
4. 阈值和冷却分别控制什么;
5. 哪些事实无法从这四个文件确认。

最后一项要求AI列出无法确认的事实,可以检查它是否区分源码证据和推测。

3.6.2 核查AI的回答

不要只根据语言是否流畅判断。逐项回到源文件:

核查项 证据位置
音频输入调用 主程序实际函数调用
特征处理对象 主程序对象和头文件引用
模型版本与类别 model-manifest.json
阈值和冷却 event_policy.h
通知接口 主程序调用位置

合格回答应当:

若回答出现错误,不要立即要求AI“再认真一点”。应指出具体证据:

你把trigger_threshold解释为模型准确率。
请重新阅读event_policy.h,并区分单次模型输出、触发阈值和数据集评价指标。
仍然只读取原来的四个文件。

这种修正方式把反馈绑定到项目事实,而不是使用模糊评价。

3.7 让AI为下一项修改提出计划

3.7.1 选择一个小而可验证的任务

第4章将把事件策略修改纳入议题、任务分支和合并请求。本章先让AI为一项小修改提出计划:

当事件被冷却规则阻止时,在串口日志中输出剩余冷却时间,便于区分“模型没有识别”与“事件处于冷却期”。

这个任务具有明确输入、输出和验证方法:

3.7.2 提交规划请求

继续保持规划模式:

目标:
为“冷却期内输出剩余冷却时间”制定实施计划。

允许读取:
- firmware/sound_event_terminal.ino
- firmware/event_policy.h

允许在计划中涉及:
- firmware/sound_event_terminal.ino
- firmware/event_policy.h

不得涉及:
- audio_frontend.h
- model_runner.h
- model_data.h
- notification_client.h
- secrets.local.h
- 模型清单和模型类别

约束:
- 不改变trigger_threshold;
- 不改变cooldown_ms;
- 不改变事件是否触发的现有行为;
- 不增加第三方依赖;
- 不在本章实施修改。

计划必须包含:
1. 当前接口怎样传递冷却状态;
2. 需要修改的函数或数据结构;
3. 每一步预期产生的Git差异;
4. 构建验证;
5. 正例、冷却期和冷却结束三种实机验证;
6. 可能影响现有接口的风险。

3.7.3 审查计划

按下面六项审查:

  1. 问题是否准确? 计划解决的是日志可观察性,不是重新设计事件策略。
  2. 文件是否越界? 只能涉及两个批准文件。
  3. 现有行为是否保持? 阈值、冷却时间和通知条件不得改变。
  4. 接口变化是否必要? 如果需要扩大公开接口,应解释理由和调用方影响。
  5. 验证是否完整? 不能只写“编译通过”,必须包含实机时间边界。
  6. 计划能否分步检查? 每一步应产生有限而清楚的差异。

若AI建议顺便重构整个事件模块、添加日志框架或更换依赖,应删除这些内容。当前任务不需要的“改进”会扩大评审和验证成本。

3.8 保存人工审查结论

本章不要求保存完整对话截图。实验记录只保留有助于复查的内容:

# 第3章AI规划审查

## 任务
冷却期内输出剩余冷却时间。

## 允许范围
- 读取:
- 计划修改:
- 禁止修改:

## AI计划摘要
1.
2.
3.

## 人工审查
- 接受:
- 修改:
- 拒绝:

## 验证要求
- 构建:
- 实机:
- Git差异:

## 待确认事项
-

记录重点是人工判断,不是对话长度。接口密钥、内部地址、个人数据和不必要的完整提示上下文不得进入公开仓库。

第4章建立GitLab协作后,这类计划摘要可以进入议题讨论或合并请求说明,由团队共同审查。

3.9 确认AI没有修改项目

本章结束前执行:

git status --short
git diff
git diff --staged

三条命令都应没有输出。再检查当前提交:

git log -1 --oneline

它仍应是第2章提交。模型对话和计划文本不等于项目变化;只有文件进入工作区,Git才会显示差异。

如果出现意外变化:

  1. 记录 git status --short;
  2. 使用 git diff -- <文件>查看具体内容;
  3. 判断变化来自AI、扩展还是人工操作;
  4. 保存必要证据;
  5. 对确认不需要的未暂存变化使用 git restore <文件>恢复;
  6. 检查工具权限设置后再继续。

不要在不查看差异的情况下直接批量恢复。

3.10 常见问题

模型对话正常,但不能读取文件

检查VS Code是否打开仓库根目录。确认工作区是否受信任,Cline是否取得文件读取权限。还要核对任务中的路径。

AI回答了许多文件中不存在的参数

要求它逐项给出文件和代码位置;无法定位的内容标记为待核查。减少上下文不会自动保证正确,仍需要人工查证。

AI要求读取整个仓库

根据当前问题补充最小必要文件。模型数据、凭据和无关模块不应因为“可能有用”而全部加入。

AI在规划阶段提出修改多个模块

重新明确目标和禁止范围。若任务确实需要扩大范围,应由学生和教师先改变任务定义,而不是由AI自行扩大。

Cline准备执行命令

拒绝执行,并检查当前模式和自动批准设置。本章只读取和规划。

安装扩展后Git出现大量变化

检查换行符、格式化和 .vscode/设置。先恢复课程基线,再关闭自动格式化或使用仓库规定的配置。

3.11 本章小结

本章建立了第一次受控AI协同,但没有让AI直接修改代码。学生完成了四项基础工作:

  1. 从干净Git提交建立AI协同基线;
  2. 使用课程环境卡连接Cline和校内Qwen服务;
  3. 控制AI的文件、命令和敏感信息边界;
  4. 依据源代码审查AI的工程解释和修改计划。

AI协同的起点不是生成代码,而是把任务、上下文、约束和验证写清楚。Git则提供前后状态的客观比较,使学生能够确认工具是否越界。

第4章将把本章计划转化为一个GitLab议题。学生从议题建立任务分支,允许AI按批准计划实施修改。随后通过Git差异、构建、实机验证、合并请求和同伴评审,完成第一次团队协作闭环。

3.12 综合实践

  1. 从课程仓库选择一个尚未学习的组件,为它编写只读分析任务。任务限定文件范围,要求AI引用代码位置,并列出无法确认的事项。
  2. 设计一张最小权限表,分别规定读取、写入、执行命令和访问网络的条件。每项权限写出一个风险和一个人工确认点。
  3. 使用两组不同上下文分析同一工程问题。其中一组缺少关键文件。比较两份回答中的依据、推测和遗漏,形成审查结论。
  4. 选择一份AI修改计划,标出“接受”“退回修改”和“缺少证据”3类内容。修订计划,使每项变化都对应文件、约束和验证方法。