前言
在使用 ChatGPT、Claude、Copilot 等大模型辅助 Python 开发时,我们经常会发现生成的代码质量参差不齐:有时缺少类型注解,有时文档注释不完整,有时错误处理不规范。通过设置默认提示词(System Prompt),可以让大模型按照你的编码规范生成高质量代码,大幅提升开发效率。
本文将介绍默认提示词的作用、如何设置,以及提供一份生产级的 Python 开发提示词模板。
一、什么是默认提示词?
1.1 定义
默认提示词(System Prompt/Custom Instructions)是在对话开始前预设的系统级指令,用于定义大模型的角色、行为规范和输出格式。
1.2 作用
✅ 统一代码风格 - 确保生成的代码符合团队规范
✅ 提高代码质量 - 强制添加类型注解、文档、错误处理
✅ 节省沟通成本 - 无需每次都重复说明要求
✅ 减少返工次数 - 一次生成就能达到可用标准
✅ 知识沉淀 - 将最佳实践固化为可复用的模板
1.3 适用场景
| 场景 |
是否需要默认提示词 |
| 快速验证算法逻辑 |
❌ 不需要,简单即可 |
| 编写生产代码 |
✅ 强烈推荐 |
| 重构旧代码 |
✅ 推荐 |
| 学习新技术 |
⚠️ 可选,可简化版本 |
| Code Review |
✅ 推荐 |
二、如何设置默认提示词
2.1 在 ChatGPT 中设置
方式一:通过 Custom Instructions
- 点击右下角头像 →
Settings → Personalization
- 找到
Custom instructions
- 在
How would you like ChatGPT to respond? 中粘贴提示词
- 保存后对所有新对话生效
方式二:通过 GPTs 创建专属助手
- 点击左侧
Explore GPTs → Create
- 在
Instructions 中设置提示词
- 命名为 “Python 开发助手”
- 保存后可随时调用
2.2 在 Claude 中设置
通过 Project 功能
- 创建新的 Project(如 “Python Development”)
- 在
Project Instructions 中添加提示词
- 在该 Project 下的所有对话都会遵循此规范
2.3 在 GitHub Copilot 中设置
方式一:通过 .github/copilot-instructions.md
在项目根目录创建:
1 2 3 4 5 6
| <!-- .github/copilot-instructions.md --> 你是一个高级 Python 工程师,生成的代码必须: 1. 包含完整类型注解 2. 符合 PEP 8 规范 3. 添加详细 docstring ...
|
方式二:通过 VS Code 设置
- 打开 VS Code 设置(
Ctrl + ,)
- 搜索
github.copilot.chat.codeGeneration.instructions
- 添加自定义指令
2.4 在 Cursor 中设置
通过 .cursorrules 文件
在项目根目录创建 .cursorrules 文件:
1
| 你是一个高级 Python 工程师,专注于编写生产级代码...
|
三、生产级 Python 开发提示词模板
3.1 完整版(适用于生产代码)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| 你是一个高级 Python 工程师,专注于编写生产级、可维护的代码。回答时使用简洁、分步骤的方式,必要时提供代码和注意事项。所有代码必须严格遵循以下规范:
### 核心规范
1. **代码结构**: 使用函数或类进行模块化设计,遵循单一职责原则(SRP),模块间解耦良好
2. **类型标注**: 所有函数/方法的参数和返回值必须添加类型注解(使用 typing 模块)
3. **命名规范**: - 类名使用 PascalCase - 函数/变量使用 snake_case - 常量使用 UPPER_SNAKE_CASE - 私有成员以单下划线 _ 开头
4. **文档字符串**: 使用 Google 风格,必须包含以下四部分: ```python def example_method(param1: str, param2: int) -> bool: """方法功能的简要描述。
Args: param1: 参数1的说明 param2: 参数2的说明
Returns: 返回值的说明
Raises: ValueError: 当参数无效时抛出
Note: 如果某部分无内容,写 None 而不是省略 """ ```
5. **错误处理**: - 使用 try/except 覆盖潜在异常 - 优先使用具体异常类型(避免裸 except) - 关键操作添加日志记录
6. **代码规范**: 严格遵循 PEP 8 和 PEP 257
7. **避免硬编码**: 配置项提取为常量/配置文件/环境变量
8. **设计模式**: 根据场景合理使用(工厂、策略、单例等),提升扩展性
9. **性能优化**: 适当使用生成器、缓存、异步(asyncio)、并发等手段
10. **Pythonic 风格**: - 使用列表/字典推导式 - 使用上下文管理器(with 语句) - 合理使用装饰器、dataclass、Enum 等特性 - 优先使用标准库和成熟的第三方库
11. **可测试性**: 代码无全局副作用,便于编写单元测试
### 输出要求
- 代码必须可直接运行 - 复杂逻辑需提供使用示例 - 说明关键设计决策和注意事项
### 常见错误示例(禁止)
❌ 缺少类型注解 ❌ docstring 只有一行 ❌ 使用裸 except ❌ 硬编码魔法数 ❌ 函数职责不单一
|
3.2 简化版(适用于快速开发)
1 2 3 4 5 6 7 8 9
| 你是一个 Python 开发专家。生成的代码必须:
1. **添加类型注解** - 所有函数参数和返回值 2. **编写 docstring** - 说明功能、参数、返回值 3. **遵循 PEP 8** - 代码格式规范 4. **错误处理** - 使用 try/except 处理异常 5. **代码可运行** - 提供完整可执行的示例
输出简洁、清晰,重点突出。
|
3.3 算法题版(适用于 LeetCode)
1 2 3 4 5 6 7 8
| 你是一个算法专家。解答算法题时:
1. **思路分析** - 先说明解题思路和时间/空间复杂度 2. **代码实现** - 提供清晰注释的 Python 实现 3. **类型注解** - 添加函数签名的类型标注 4. **测试用例** - 提供 2-3 个测试案例验证
优先考虑时间复杂度,其次是代码可读性。
|
四、实战案例对比
4.1 场景:实现用户注册功能
未使用提示词的输出:
1 2 3 4 5 6 7 8 9 10 11 12
| def register(username, password): if not username: return False if len(password) < 6: return False users[username] = password return True
|
❌ 问题:
- 缺少类型注解
- 没有文档注释
- 错误处理不规范
- 使用全局变量
- 返回值语义不明确
使用提示词后的输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
| from typing import Optional, Dict from dataclasses import dataclass import hashlib import logging
logger = logging.getLogger(__name__)
MIN_PASSWORD_LENGTH = 6 MAX_USERNAME_LENGTH = 50
class RegistrationError(Exception): """用户注册异常基类。""" pass
class InvalidUsernameError(RegistrationError): """用户名不合法异常。""" pass
class InvalidPasswordError(RegistrationError): """密码不合法异常。""" pass
class UsernameExistsError(RegistrationError): """用户名已存在异常。""" pass
@dataclass class User: """用户数据模型。 Attributes: username: 用户名 password_hash: 密码哈希值 """ username: str password_hash: str
class UserRegistry: """用户注册管理器。""" def __init__(self) -> None: """初始化用户注册管理器。 Args: None Returns: None Raises: None """ self._users: Dict[str, User] = {} def _validate_username(self, username: str) -> None: """验证用户名合法性。 Args: username: 待验证的用户名 Returns: None Raises: InvalidUsernameError: 用户名为空或长度超限 UsernameExistsError: 用户名已存在 """ if not username or not username.strip(): raise InvalidUsernameError("用户名不能为空") if len(username) > MAX_USERNAME_LENGTH: raise InvalidUsernameError( f"用户名长度不能超过 {MAX_USERNAME_LENGTH} 字符" ) if username in self._users: raise UsernameExistsError(f"用户名 '{username}' 已存在") def _validate_password(self, password: str) -> None: """验证密码合法性。 Args: password: 待验证的密码 Returns: None Raises: InvalidPasswordError: 密码长度不足 """ if len(password) < MIN_PASSWORD_LENGTH: raise InvalidPasswordError( f"密码长度不能少于 {MIN_PASSWORD_LENGTH} 字符" ) def _hash_password(self, password: str) -> str: """对密码进行哈希处理。 Args: password: 明文密码 Returns: 密码的 SHA-256 哈希值 Raises: None """ return hashlib.sha256(password.encode()).hexdigest() def register(self, username: str, password: str) -> User: """注册新用户。 Args: username: 用户名 password: 密码(明文) Returns: 创建的用户对象 Raises: InvalidUsernameError: 用户名不合法 InvalidPasswordError: 密码不合法 UsernameExistsError: 用户名已存在 Examples: >>> registry = UserRegistry() >>> user = registry.register("john_doe", "secure123") >>> print(user.username) john_doe """ try: self._validate_username(username) self._validate_password(password) user = User( username=username, password_hash=self._hash_password(password) ) self._users[username] = user logger.info(f"用户 '{username}' 注册成功") return user except RegistrationError as e: logger.warning(f"用户注册失败: {e}") raise except Exception as e: logger.error(f"用户注册过程中发生未知错误: {e}") raise RegistrationError(f"注册失败: {e}") from e
if __name__ == "__main__": logging.basicConfig(level=logging.INFO) registry = UserRegistry() try: user = registry.register("john_doe", "secure123") print(f"✓ 用户 {user.username} 注册成功") except RegistrationError as e: print(f"✗ 注册失败: {e}")
|
✅ 改进:
- 完整的类型注解
- 详细的 docstring(Google 风格)
- 自定义异常类
- 职责分离(验证、哈希、存储)
- 使用 dataclass
- 日志记录
- 常量提取
- 提供使用示例
五、最佳实践建议
5.1 针对不同项目定制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| """ 你是数据分析专家。代码要求: 1. 使用 pandas/numpy 进行数据处理 2. 添加数据验证和异常处理 3. 提供数据可视化示例 4. 注重性能优化(向量化操作) """
""" 你是 FastAPI/Django 专家。代码要求: 1. 使用 Pydantic 进行数据验证 2. 添加完整的 API 文档 3. 实现请求/响应模型 4. 考虑并发和缓存 """
""" 你是机器学习工程师。代码要求: 1. 使用 scikit-learn/PyTorch 2. 添加模型评估指标 3. 实现可复现的训练流程 4. 提供模型保存/加载功能 """
|
5.2 版本管理
将提示词纳入版本控制:
1 2 3 4 5 6 7 8
| project/ ├── .cursorrules ├── .github/ │ └── copilot-instructions.md ├── docs/ │ └── ai-prompts.md └── README.md
|
5.3 团队协作
- 统一规范 - 团队成员使用相同的提示词
- 定期审查 - 每月回顾并优化提示词
- 记录问题 - 收集大模型经常出错的地方
- 持续迭代 - 根据实际效果调整
5.4 配合工具链
提示词 + 自动化工具效果最佳:
1 2 3 4 5 6 7 8 9 10 11 12
| black your_code.py ruff check --fix your_code.py
mypy your_code.py
pydocstyle your_code.py
pylint your_code.py
|
在 pyproject.toml 中配置:
1 2 3 4 5 6 7 8 9 10 11
| [tool.black] line-length = 88 target-version = ['py310']
[tool.mypy] python_version = "3.10" strict = true
[tool.ruff] line-length = 88 select = ["E", "F", "I", "N", "W"]
|
六、常见问题 FAQ
Q1: 提示词太长会影响效果吗?
A: 会有一定影响。建议控制在 500-800 tokens 以内。对于 GPT-4/Claude 3.5 等强模型,可以适当增加长度。
Q2: 大模型不完全遵循提示词怎么办?
A: 尝试以下方法:
- 将最重要的规则加粗或放在开头
- 提供正反示例
- 在对话中再次强调
- 使用更强大的模型
Q3: 不同大模型需要不同的提示词吗?
A: 大体框架可以通用,但可以针对特点微调:
- ChatGPT: 擅长结构化输出,可以详细描述
- Claude: 擅长长文本理解,可以给出更多上下文
- Copilot: 更依赖代码库上下文,提示词可简化
Q4: 如何测试提示词效果?
A: 建议准备 5-10 个典型场景:
1 2 3 4 5 6 7
| 1. 实现一个简单 CRUD 接口 2. 编写数据处理脚本 3. 实现缓存装饰器 4. 编写异步任务队列 5. 实现单元测试 ...
|
使用新旧提示词分别测试,对比代码质量。
Q5: 提示词需要多久更新一次?
A: 建议:
- 初期(1-2 周): 每周根据实际效果调整
- 稳定期(1-2 月): 每月小幅优化
- 成熟期: 每季度审查一次
七、进阶技巧
7.1 动态上下文注入
根据当前文件类型自动调整:
1 2 3 4 5
| if file.endswith('.py'): inject_python_rules() elif file.endswith('.ts'): inject_typescript_rules()
|
7.2 角色切换
为不同任务创建不同角色:
1 2 3 4 5 6 7 8
| # 角色1: 代码编写者 专注于实现功能,遵循规范
# 角色2: 代码审查者 专注于发现问题,提出改进建议
# 角色3: 性能优化者 专注于性能瓶颈分析和优化
|
7.3 few-shot 示例
在提示词中加入示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| ### 示例:优秀的函数实现
✅ 正确示例: ```python from typing import List
def calculate_average(numbers: List[float]) -> float: """计算数字列表的平均值。 Args: numbers: 数字列表 Returns: 平均值 Raises: ValueError: 当列表为空时抛出 """ if not numbers: raise ValueError("列表不能为空") return sum(numbers) / len(numbers) ```
❌ 错误示例: ```python def calc_avg(nums): return sum(nums) / len(nums) ```
|
八、总结
设置默认提示词是提升大模型辅助开发效率的最简单且最有效的方法之一。通过:
- ✅ 明确规范要求 - 让大模型知道你的标准
- ✅ 提供清晰示例 - 让大模型理解正确做法
- ✅ 持续迭代优化 - 根据实际效果调整
- ✅ 配合工具验证 - 自动化检查代码质量
可以将大模型生成代码的可用率从 40% 提升到 80% 以上,大幅减少返工时间。
建议立即行动:
- 选择适合你的提示词模板
- 根据项目特点定制
- 在实际开发中测试
- 收集问题并持续优化
祝你用好大模型,写出更高质量的 Python 代码! 🚀
参考资源