代码评审提示词优化:ChatGPT减少重复句式的实用指南
代码评审意见写来写去总是那几句“应校验”“须补全”“建议优化”——这个困境,说到底是因为ChatGPT偷懒,死抱着通用动词模板不放。要让它真正给出有语言特色的具体意见,得从三个维度下手:用语言特性锁定动词、用缺陷类型驱动句式、用角色切换打乱表达惯性。
先说核心逻辑:让ChatGPT生成的代码评审意见摆脱“应”“须”“改为”“补全”这些万能词,关键不在于叠限定词,而在于强制它绑定具体的语言运行时和语法结构。
用语言特征锚定动作动词
第一步,在提示词开头把当前代码的语言上下文交代清楚。比如写成“当前代码为Python 3.11 + FastAPI 0.115,所有异步函数均使用async/await,无threading.Lock”。这一步是给模型划出动作边界。
第二步,列出该语言里不可替代的语法结构,并要求每条意见必须调用其中至少一个。拿Python举例:with contextlib.suppress、try/except ValueError、typing.Optional、dataclass(slots=True)、@cached_property。这些是模型绕不开的具体锚点。
第三步,直接禁用四个通用动词:“应”“须”“改为”“补全”。明确写清楚——若意见中间出现了上述任一词,整条意见作废重写。这样一来,模型只能从语言本身找出口。比如“应校验空值”会自然转换成“第37行调用json.loads()前未包裹try/except JSONDecodeError,导致上游HTTP 400被吞没”。语义没变,但表达从“万能模板”掉到了“具体代码场景”。
用缺陷类型反向驱动句式变异
方法其实很直接:给模型喂三类真实缺陷示例,并标注各自的句式基因。
① 空指针类 → 必须含.get(key, default)或or None结构
② 类型混淆类 → 必须含isinstance(obj, ExpectedType)或pydantic.BaseModel.model_validate
③ 资源泄漏类 → 必须含with open() as f:或async with aiohttp.ClientSession() as session:
然后在提示词末尾加一条硬性格式指令:每条意见必须以缺陷类型开头,且后续动词必须来自该类型对应的动作结构库。举个例子:
【空指针类】→ 使用.get()替代[]
【类型混淆类】→ 插入isinstance校验
【资源泄漏类】→ 改为with语句包裹
这一步不做,ChatGPT就会持续输出“建议增加类型检查”这种跨语言万能句式,而不会落到Python的isinstance或TypeScript的as const上。只有把缺陷类型和具体语法绑死,才能破掉模板化。
用评审角色切换打乱表达惯性
直接告诉模型它此刻的身份:你是一个Code Review Bot v2.3,职责是模拟三位不同背景的工程师轮流出意见——前端工程师(关注DOM操作与事件流)、后端工程师(关注事务边界与序列化)、SRE(关注超时设置与panic日志)。
每条意见开头强制标注角色缩写:
[FE] 第89行document.querySelector()未加null check → 触发Uncaught TypeError阻塞整个React组件挂载
[BE] 第12行JSON.parse()未捕获SyntaxError → 导致FastAPI中间件返回500而非400
[SRE] 第55行fetch timeout设为0 → 请求永不超时,连接池耗尽后服务雪崩
角色标签天然携带动词偏好:FE倾向用“触发/阻塞/挂载”,BE倾向用“导致/返回/抛出”,SRE倾向用“耗尽/雪崩/熔断”。模型一旦需要切换角色,就无法复用同一套动词模板,表达自然就活了。
