共计 2304 个字符,预计需要花费 6 分钟才能阅读完成。
为什么需要提示词工程?
最近在用 GPT- 3 这样的 AI 大模型时,发现同一个问题换种问法,得到的回答质量可能天差地别。有时候模型会答非所问,有时候又表现得像完全没记住之前的对话内容。这些问题其实都跟提示词 (Prompt) 的设计密切相关。

基础提示词构造
1. 清晰的任务描述
最基本的提示词要包含三个要素:
- 角色定义(Role):告诉 AI 它要扮演什么角色
- 任务说明(Task):明确具体要做什么
- 输出格式(Format):指定回答的结构
def basic_prompt(task: str, role: str = "AI 助手") -> str:
"""
构造基础提示词模板
:param task: 具体任务描述
:param role: AI 角色定义
:return: 完整提示词
"""
try:
return f""" 你是一个专业的{role}。请按照以下要求完成任务:任务:{task}
请用清晰、专业的方式回答。"""
except Exception as e:
print(f"提示词构造出错: {e}")
return ""
2. 示例引导(Few-shot Learning)
给模型提供几个输入输出的例子,能显著提升回答质量:
def few_shot_prompt(examples: list[dict], new_query: str) -> str:
"""
少样本学习提示词构造
:param examples: 示例列表,每个示例包含 "input" 和 "output"
:param new_query: 新查询
:return: 完整提示词
"""prompt =" 以下是几个示例:\n"
for idx, example in enumerate(examples, 1):
prompt += f"示例{idx}:\n 输入:{example['input']}\n 输出:{example['output']}\n\n"
prompt += f"现在请回答:\n 输入:{new_query}\n 输出:"
return prompt
高级提示策略
3. 思维链 (Chain-of-Thought) 提示
让模型展示推理过程,可以提高复杂问题的准确性:
def cot_prompt(question: str) -> str:
"""
思维链提示词模板
:param question: 需要推理的问题
:return: 完整提示词
"""return f""" 请逐步思考并回答以下问题:问题:{question}
请按照以下步骤回答:1. 理解题目要求
2. 分析关键信息
3. 分步骤推导
4. 验证结果合理性
5. 给出最终答案 """
4. 自洽性校验
对于重要回答,可以让模型自我验证:
def self_consistency_check(response: str) -> str:
"""
生成自洽性检查提示
:param response: 需要检查的回答
:return: 检查提示
"""return f""" 你刚刚给出了以下回答:{response}
请检查这个回答是否满足以下条件:1. 事实准确
2. 逻辑自洽
3. 符合问题要求
如果发现任何问题,请修正回答。"""
性能优化技巧
5. Token 使用优化
大模型按 token 计费,需要平衡效果和成本:
- 精简不必要的描述
- 复用对话历史
- 设置合理的 max_tokens 参数
def optimize_token_usage(prompt: str, max_tokens: int = 1000) -> str:
"""
优化提示词长度
:param prompt: 原始提示词
:param max_tokens: 最大 token 限制
:return: 优化后的提示词
"""
# 简单的长度优化策略
if len(prompt) > max_tokens * 3: # 粗略估算(1token≈3- 4 字符)
import re
prompt = re.sub(r'\s+', ' ', prompt) # 去除多余空格
prompt = prompt[:max_tokens * 3]
return prompt
常见避坑指南
6. 提示注入防护
防止用户输入破坏你的提示结构:
def sanitize_input(user_input: str) -> str:
"""
清理用户输入防止提示注入
:param user_input: 用户原始输入
:return: 安全处理后的输入
"""injection_keywords = [" 忽略之前指令 "," 扮演其他角色 "," 输出以下内容 "]
for keyword in injection_keywords:
if keyword in user_input:
user_input = user_input.replace(keyword, "[已过滤]")
return user_input
7. 长上下文处理
超过模型窗口长度时,可以这样做:
- 摘要之前的对话
- 选择性保留关键信息
- 使用向量检索最相关内容
参数调优实验
不同参数组合会产生截然不同的效果:
- temperature(温度参数):控制输出的随机性
- top_p(核采样):影响输出的多样性
- frequency_penalty(频率惩罚):减少重复内容
建议尝试以下组合:
params = {"creative": {"temperature": 0.9, "top_p": 0.9}, # 创意写作
"precise": {"temperature": 0.3, "top_p": 0.5}, # 事实性回答
"balanced": {"temperature": 0.6, "top_p": 0.7} # 平衡模式
}
实践建议
- 从简单提示开始,逐步增加复杂度
- 记录不同提示的效果差异
- 建立自己的提示词库
- 定期回顾和优化常用提示
最后留个思考题:当你需要模型生成既有创意又要准确的内容时,temperature 和 top_p 应该如何搭配?试试调整这两个参数,观察对输出多样性和准确性的影响。
正文完
