## 场景:又是一次凌晨的产线调试

凌晨两点,你盯着屏幕上闪烁的告警灯,Qt程序又崩了。通信线程和UI线程抢资源,数据丢包查了三天,最后发现是AI生成的代码里`deleteLater()`用错了位置。你气得想砸键盘——这AI写代码怎么总在关键时候掉链子?其实不是AI不行,是你喂料的方式不对。今天我聊聊我这半年总结的「AI调教三板斧」,专治DeepSeek写C++上位机各种不服。

## 第一斧:需求拆解——别让AI猜你的工业逻辑

**观点**:AI不是神仙,你给它一句「写个串口通信」,它只能给你堆一个玩具demo。工业级需求得拆成原子动作喂进去。

**坑点**:大多数工程师拿AI当搜索引擎,上来就甩整段需求。结果AI给你生成一个`QSerialPort`裸奔类,波特率硬编码,没有错误重试,没有断线重连——现场跑两天就死。

**代码示范**:拆解前和拆解后的Prompt对比(简化版)

```cpp
// 拆解前(错误示范)
// 需求:写一个串口通信类

// 拆解后(正确示范)
// 需求1:串口参数可配置,支持波特率/数据位/停止位动态修改
// 需求2:接收数据使用事件驱动,不可阻塞UI线程
// 需求3:通信异常自动重连,最多重试3次,间隔5秒
// 需求4:提供心跳包接口,检测链路存活

```
喂给DeepSeek时,我会故意把需求写成**验收标准**(Acceptance Criteria),让它写的不只是函数,而是可测试的行为。这样生成的代码,变量命名、异常处理、生命周期管理才靠得住。

**实操指南**:

1. 每次生成前,把大需求拆成3-5个小的**行为描述**,每个描述带**边界条件**(超时、错误码、线程切换)。

2. 明确告诉AI「这是7x24小时运行环境」,让它自动补充看门狗逻辑。

3. 让AI列出它假设的前提条件,你来确认——比如「默认使用`QThread`而不是`std::thread`」就得提前讲清。

## 第二斧:上下文喂投——给AI建一个「项目记忆库」

**观点**:DeepSeek记性不好,你不在prompt里强调「上次说的」,它就真当你是新用户。这招最狠,直接用**「项目状态快照」**喂投。

**坑点**:你第二次让它改功能,它把你的类名从`SerialManager`改成了`MyClass`,编译通过但运行起来链接错误满天飞。或者更常见的——它完全忘记了你用的是Qt 5.15而不是Qt 6,生成一堆新API。

**代码示范**:这是我自己写的Prompt模板,每次开新对话前粘贴一下——

```text
我们正在开发一个工业级Qt上位机,框架如下(请牢记):

- 编译器:MSVC2019,Qt版本5.15.2,禁用C++17新特性

- 核心类:`CommHandler`(通信),`DataParser`(解析),`MainWindow`(UI)

- 线程模型:所有网络操作在`QThreadPool`中,信号槽跨线程用`QueuedConnection`

- 代码风格:变量名前缀`m_`,函数名大驼峰,常量大写

现在请基于以上事实,完成以下需求:
<你的具体需求>

```

**实操指南**:

1. 每次对话开始,花30秒贴这份快照,比写10句废话管用。

2. 如果你改了某个类的接口,把改动后的**头文件**直接复制进prompt,让AI基于最新定义生成实现,永远不要让它「凭记忆」。

3. 给AI反馈时,指正错误的同时,把这些错误规则也加进快照里——比如「上次你说`QProcess`可以跨线程调用,其实是错的,记住禁止」。

## 第三斧:编译反馈——让错误信息成为AI的老师

**观点**:AI生成的代码不可能一次过,但你得让它从编译错误里学习。这里有个反直觉的操作:**故意把错误信息原封不动抛给它**,包括你的编译工具链日志。

**坑点**:很多人自己先手工改了错误,然后跟AI说「不行,你重写吧」。AI一脸懵,生成一堆同样的错误代码。正确的做法是——把报错视为宝贵训练数据。

**代码示范**:拿一次真实错误流程举例——

```cpp
// 用户粘贴给AI的错误输出(原样)
error: C2664: 'void QComboBox::addItem(const QString &, const QVariant &)' : cannot convert argument 1 from 'const char [6]' to 'const QString &'

```
然后加一句指令:「根据这个编译错误,指出我代码中类型转换问题的根源,并给出修正后的代码段,不要改变原有业务逻辑。」

**实操指南**:

1. 把编译器的**完整错误原文**(不要删减行号和C++代码片段)喂回去,AI能定位到具体行。

2. 告诉AI「修复后,请总结一条规则加入我的项目记忆」,这样三次以后,它不会再犯同类低错。

3. 如果链接错误(LNK系列),要贴上整个`*.obj`列表和依赖库名称,特别是Qt的DLL依赖——AI经常漏掉`QT += serialport`这种pro文件配置。

## 实战:一套完整的调教过程回放

给你们看看我怎么调教出一个稳定的Modbus TCP客户端代码。

**第一轮喂投**:

```text
项目快照:...
需求:写一个Modbus TCP客户端类,支持保持连接和异常重试。

```
AI生成了一坨有`QModbusClient`的代码,但没加自动重连。我没骂它,而是加了拆解后的需求:「增加状态机:连接->请求->响应->重试->断开」。

**第二轮反馈**:

```cpp
// 这次它生成了重试逻辑,但用了sleep()阻塞现场线程
// 我的编译反馈:
warning: C4189: 'retryCount' : local variable is initialized but not referenced
// 还有运行时卡顿——我把这个现象也描述给它,不是简单说「卡」

```

**第三轮调优**:我把编译警告和UI卡顿的截图大概描述给AI,它在代码里改用`QTimer::singleShot`做非阻塞延时重试,还帮我加了超时信号。

关键点:每次对话我都坚持「**一个错误一个反馈**」,不要一次性丢5个问题给它。它学得慢,你得耐心喂。

## 结尾:要想AI不坑你,先把自己变成「需求分析师+测试工程师」

三句话总结:

1. **需求拆解**至少花3分钟,写成验收标准,AI才能写出稳定代码;

2. **上下文快照**每次对话必贴,尤其记录AI犯过的错,作为反面教材;

3. **编译反馈**是最高频的调优手段,坚持原样贴错误,让它自己找纠。

说实话,这套方法用下来,我的AI生成代码上板通过率从30%提到了70%,剩下30%还是电气硬件问题。最后留两个问题想知道你们的现场经历:

- 你们遇到的AI生成代码里,最让你崩溃的是什么类型的坑?内存泄漏还是线程死锁?

- 有没有试过用AI写PLC的通讯协议栈,那家伙是不是总搞错字节序?欢迎评论区聊聊你的「AI调教血泪史」。
 

 

更多推荐