前言:
在 AI 辅助编程日益普及的今天,如何高质量地与 AI 协作已成为开发者的核心技能。本文将通过正反两方面的案例,展示提示词质量对编程结果的决定性影响,并总结出一套实用的 AI 协作行为准则。
1. 提示词正确使用案例
本节展示了 3 个覆盖不同角色(开发、安全、运维)的正面案例,演示如何使用结构化提示词引导 AI 生成高质量代码。所有代码文件均由 AI 根据提示词自动创建和生成。
1.1 开发角色:猜数字游戏
作为开发者,不仅要保证核心功能,还要充分考虑各种异常情况(如非数字输入),确保代码健壮性。程序应“优雅”地处理异常而非直接崩溃。
AI 提示词示例:
角色:你是一位注重代码稳健性的 Python 开发者。
任务:编写一个猜数字游戏的脚本。
约束:
- 随机生成 1~100 的整数;
- 使用
while循环持续猜测;- 必须处理非数字输入,禁止程序报错;
- 猜对后必须输出 "Bingo" 并退出。
参考:使用
input()获取用户输入;使用random.randint(1, 100)生成目标数字。
验收标准:输入非数字提示“无效”并继续循环;输入 50 时输出 "Bingo";输入 60 时提示 "Too big"。
AI 生成的代码如下 (guess_number.py):
1 import random 2 3 target = random.randint(1, 100) 4 5 while True: 6 user_input = input("请猜一个1-100的数字:") 7 try: 8 guess = int(user_input) 9 if guess == target: 10 print("Bingo!") 11 break 12 elif guess > target: 13 print("Too big") 14 else: 15 print("Too small") 16 except ValueError: 17 print("无效")代码说明:
- 使用
random.randint(1, 100)随机生成目标数字。 - 使用
while True循环持续让用户猜测。 - 使用
try-except ValueError完美处理非数字输入,提示“无效”并继续循环。 - 猜对后输出 "Bingo!" 并使用
break退出。
1.2 安全角色:密码强度检测
密码安全是系统安全的第一道防线。我们需要编写一个脚本检测密码强度,帮助用户设置符合要求的密码。
AI 提示词示例:
角色:你是一位安全审计工程师。
任务:编写一个 Python 密码强度检测脚本。
约束:
- 长度必须在 8~16 位;
- 必须同时包含数字和字母;
- 必须包含特殊字符(如 !@# $ %);
- 满足所有条件输出 "Strong",否则输出 "Weak"。
参考:使用
str.isdigit(),str.isalpha()检测字符类型。
验收标准:输入 "abc123!x" 输出 'Strong';输入 "abcdefg" 输出 'Weak' (缺数字和特殊字符)。
AI 生成的代码如下 (password_checker.py):
1 password = input("请输入密码:") 2 3 has_digit = any(c.isdigit() for c in password) 4 has_alpha = any(c.isalpha() for c in password) 5 has_special = any(c in "!@#$%" for c in password) 6 length_ok = 8 <= len(password) <= 16 7 8 if has_digit and has_alpha and has_special and length_ok: 9 print("Strong") 10 else: 11 print("Weak")代码说明:
- 检查密码长度是否在 8~16 位。
- 使用
str.isdigit()和str.isalpha()检查是否包含数字和字母。 - 使用自定义集合检查是否包含特殊字符。
- 只有所有条件满足才输出 "Strong"。
1.3 运维角色:端口存活检测
在运维工作中,及时发现服务器端口异常是保障稳定运行的关键。
AI 提示词示例:
角色:你是一位资深运维开发工程师。
任务:编写检测 localhost 80 端口存活的脚本。
约束:
- 超时设置为 1s;
- 如果连接失败,必须重试 2 次;
- 最终成功输出 "UP",失败输出 "DOWN";
- 使用
socket库。验收标准:端口存活时输出 "UP";端口不可达时重试后输出 "DOWN"。
AI 生成的代码如下 (port_check.py):
1 import socket 2 3 def check_port(host, port, timeout=1, max_retries=2): 4 attempts = max_retries + 1 5 6 for attempt in range(attempts): 7 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 8 sock.settimeout(timeout) 9 10 try: 11 result = sock.connect_ex((host, port)) 12 if result == 0: 13 sock.close() 14 return True 15 finally: 16 sock.close() 17 18 return False 19 20 host = 'localhost' 21 port = 80 22 23 if check_port(host, port): 24 print("UP") 25 else: 26 print("DOWN")代码说明:
- 使用
socket库检测端口。 - 超时设置为 1s (
sock.settimeout(1))。 - 使用
connect_ex进行检测。 - 连接失败时重试 2 次(共尝试 3 次)。
2. 提示词使用中的常见问题
根据日常工作,我们可以总结出 AI 编程中常见的四个“坑”及其改进方法。
2.1 需求不明确
问题描述:提示词过于模糊,导致 AI 做出大量假设。例如只说“写一个用户注册 API”,AI 会自行决定框架、字段和验证规则,生成的代码往往不符合实际预期。
改进方案:提供完整上下文,包括技术栈(Flask/FastAPI)、接口路径、请求方法、字段定义、验证规则、返回格式及异常处理。
2.2 上下文缺失
问题描述:缺乏量化基线和架构约束。例如修复 N+1 查询问题时,如果不给出“性能提升目标”或“禁止修改表结构”的约束,AI 可能会给出无法落地的建议。
改进方案:建立“项目上下文文档”,包含技术栈、架构约束、数据库 Schema 等。
表 1:正反提示词在本案例中的作用
| 要素 | 在本案例中的作用 | 如果缺失会怎样 |
|---|---|---|
| 项目背景 | 锁定技术栈和架构风格,AI 会自动遵循项目规范 | AI 可能引入无关依赖或错误模式 |
| 约束条件 | 明确定义优化边界和禁区 | AI 可能引入新缺陷,或修改不安全的表 |
| 验收标准 | 3 条中的验收标准明确,AI 能判断是否有有效的依据 | 只能让人工一审 |
2.3 异常处理不完善
问题描述:忽略边界条件导致生产事故。例如批量发送短信任务,如果没有考虑服务重启、并发竞争、重试机制等,极易导致重复发送或消息丢失。
改进方案:在提示词中显式列出异常场景(幂等性、并发锁、超时重试)。
表 2:缺少边界条件可能引发的事故
| 缺少的边界条件 | 多 worker 部署时可能的故障 | 可能引发的事故 |
|---|---|---|
| 缺少幂等处理 | 多个 worker 会重复发送同一条短信 | 重复扣短信费 |
| 缺少并发控制 | 两条短信同时发送,状态更新冲突 | 重复发送短信 |
| 缺少重试机制 | 网络抖动导致部分 API 调用失败,消息永久丢失 | 短信漏发 |
| 缺少优雅关闭 | 进程被 kill 时正在处理的短信被丢弃 | 大量未发送 |
| 缺少超时控制 | 某条短信阻塞整个 Celery worker 进程 | 队列积压 |
2.4 需求描述不完整
问题描述:“挤牙膏”式的迭代。用户像切香肠一样一点点提需求(先写基础版 -> 加过期处理 -> 加刷新逻辑...),导致 AI 每次都在旧代码上打补丁,最终代码结构混乱,难以维护。
改进方案:一次性给出完整需求。利用“项目上下文文档”避免重复描述公共信息,专注于当前任务的完整逻辑。
表 3:五步迭代 vs 一步到位对比
| 维度 | 五步迭代的解决方策 | 一次性给出的完整解决方案 |
|---|---|---|
| 代码结构 | 每轮都在上一轮基础上打补丁,层层嵌套 | 直接设计统一的 Token 类,API 一开始就组织好 |
| 测试覆盖率 | 每轮只测新增功能,老功能可能退化 | 完整设计测试用例,首轮就覆盖所有场景 |
| 格式规范 | 第一轮不规范,后续几轮不一致 | 开始就统一命名和返回值格式 |
| 调试难度 | 出错时要排查是哪一轮引入的问题 | 出问题就是整体设计问题,定位更快 |
3. 与 AI 协作的行为准则
为了最大化 AI 的效能,建议遵循以下三条核心准则。
3.1 验收优先:先定义正确标准
将 TDD(测试驱动开发)思想引入 AI 协作。先写验收标准,再让 AI 写代码。
- 反例:“帮我写个登录功能”。
- 正例:“帮我实现登录,要求:密码错误返回 401,成功返回 JWT Token,Token 有效期 2 小时”。
这样 AI 生成的代码天然符合预期,且方便验证。
3.2 小步推进:一次只做一件事
把大任务拆小,降低试错成本。
- 第一轮:先实现基础功能。
- 第二轮:加上异常处理。
- 第三轮:完善错误码和日志。
每完成一个任务立即测试验证,确认没问题再进入下一个。
3.3 善用版本控制:Git 是你可靠的恢复工具
在使用 AI 编程时,Git 不仅仅是代码管理工具,更是你的“后悔药”。
- 每个新功能从干净的 Git 状态开始:确保
git status无未提交变更,随时可以通过git checkout .一键还原。 - 一个小功能点一次提交:不要等到完成所有功能再提交。对于 AI 生成的每个独立可工作的部分,都应当及时提交。
- 遇到问题及时重置:如果 AI 的多次修改让代码越来越复杂,不要继续“修补”。使用
git reset --hard HEAD回到已知的干净状态,开启新对话,重新用完整的提示词来解决。 - 避免累积问题:多次失败的尝试会产生一层又一层的修补代码。当你最终找到解决方案时,先回滚再干净地实现,而不是在失败代码上继续修改。
3.4 及时验证,不要盲目信任
在 AI 修改了代码后,不要立刻开始下一个任务,而是先测试验证当前的修改是否正确。
正确的做法是对于 AI 生成的代码一定要及时验证,如图 1 所示。这种“修改一步验证一步”的工作节奏,能够将问题的解决成本降到最低。
(注:修改文件 -> 运行测试 -> 测试通过? -> 是:继续下一个 / 否:解决问题)
希望这篇整理后的博客内容对你有所帮助!如果有具体的代码需要补充或调整,欢迎随时告诉我。