前言

在使用 ChatGPT、Claude、Copilot 等大模型辅助 Python 开发时,我们经常会发现生成的代码质量参差不齐:有时缺少类型注解,有时文档注释不完整,有时错误处理不规范。通过设置默认提示词(System Prompt),可以让大模型按照你的编码规范生成高质量代码,大幅提升开发效率。

本文将介绍默认提示词的作用、如何设置,以及提供一份生产级的 Python 开发提示词模板。

一、什么是默认提示词?

1.1 定义

默认提示词(System Prompt/Custom Instructions)是在对话开始前预设的系统级指令,用于定义大模型的角色、行为规范和输出格式。

1.2 作用

统一代码风格 - 确保生成的代码符合团队规范
提高代码质量 - 强制添加类型注解、文档、错误处理
节省沟通成本 - 无需每次都重复说明要求
减少返工次数 - 一次生成就能达到可用标准
知识沉淀 - 将最佳实践固化为可复用的模板

1.3 适用场景

场景 是否需要默认提示词
快速验证算法逻辑 ❌ 不需要,简单即可
编写生产代码 ✅ 强烈推荐
重构旧代码 ✅ 推荐
学习新技术 ⚠️ 可选,可简化版本
Code Review ✅ 推荐

二、如何设置默认提示词

2.1 在 ChatGPT 中设置

方式一:通过 Custom Instructions

  1. 点击右下角头像 → SettingsPersonalization
  2. 找到 Custom instructions
  3. How would you like ChatGPT to respond? 中粘贴提示词
  4. 保存后对所有新对话生效

方式二:通过 GPTs 创建专属助手

  1. 点击左侧 Explore GPTsCreate
  2. Instructions 中设置提示词
  3. 命名为 “Python 开发助手”
  4. 保存后可随时调用

2.2 在 Claude 中设置

通过 Project 功能

  1. 创建新的 Project(如 “Python Development”)
  2. Project Instructions 中添加提示词
  3. 在该 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 设置

  1. 打开 VS Code 设置(Ctrl + ,)
  2. 搜索 github.copilot.chat.codeGeneration.instructions
  3. 添加自定义指令

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
# 项目 A: 数据分析项目
"""
你是数据分析专家。代码要求:
1. 使用 pandas/numpy 进行数据处理
2. 添加数据验证和异常处理
3. 提供数据可视化示例
4. 注重性能优化(向量化操作)
"""

# 项目 B: Web API 项目
"""
你是 FastAPI/Django 专家。代码要求:
1. 使用 Pydantic 进行数据验证
2. 添加完整的 API 文档
3. 实现请求/响应模型
4. 考虑并发和缓存
"""

# 项目 C: 机器学习项目
"""
你是机器学习工程师。代码要求:
1. 使用 scikit-learn/PyTorch
2. 添加模型评估指标
3. 实现可复现的训练流程
4. 提供模型保存/加载功能
"""

5.2 版本管理

将提示词纳入版本控制:

1
2
3
4
5
6
7
8
# 项目结构
project/
├── .cursorrules # Cursor 提示词
├── .github/
│ └── copilot-instructions.md # Copilot 提示词
├── docs/
│ └── ai-prompts.md # 提示词文档
└── README.md

5.3 团队协作

  1. 统一规范 - 团队成员使用相同的提示词
  2. 定期审查 - 每月回顾并优化提示词
  3. 记录问题 - 收集大模型经常出错的地方
  4. 持续迭代 - 根据实际效果调整

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: 尝试以下方法:

  1. 将最重要的规则加粗或放在开头
  2. 提供正反示例
  3. 在对话中再次强调
  4. 使用更强大的模型

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
# 在 VS Code 中,可以根据文件扩展名动态注入
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)
```

八、总结

设置默认提示词是提升大模型辅助开发效率的最简单且最有效的方法之一。通过:

  1. 明确规范要求 - 让大模型知道你的标准
  2. 提供清晰示例 - 让大模型理解正确做法
  3. 持续迭代优化 - 根据实际效果调整
  4. 配合工具验证 - 自动化检查代码质量

可以将大模型生成代码的可用率从 40% 提升到 80% 以上,大幅减少返工时间。

建议立即行动:

  1. 选择适合你的提示词模板
  2. 根据项目特点定制
  3. 在实际开发中测试
  4. 收集问题并持续优化

祝你用好大模型,写出更高质量的 Python 代码! 🚀


参考资源