共计 3469 个字符,预计需要花费 9 分钟才能阅读完成。
背景与痛点
大语言模型(LLM)的爆发式发展带来了前所未有的可能性,但同时也暴露了 Prompt 设计中的诸多问题。对于刚接触提示工程的新手开发者而言,最常遇到的痛点包括:

- Prompt 设计随意性:缺乏系统方法论指导,导致模型输出不稳定
- 结果不可控:相同 Prompt 在不同场景下可能产生截然不同的结果
- 幻觉问题:模型容易生成看似合理但实际错误的内容
- 效率低下:需要反复试错才能得到理想输出
这些问题在 2023 年的多项研究中得到了重点关注,研究者们提出了多种创新方法来解决这些挑战。
2023 年关键 Prompt 工程技术对比
1. Chain-of-Thought (CoT) 提示
出自论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》(Wei et al., 2022 NeurIPS):
- 核心思想:通过分步推理的 Prompt 设计,引导模型展示思考过程
- 优势:显著提升复杂推理任务的准确性
- 适用场景:数学问题求解、逻辑推理等需要多步思考的任务
2. Least-to-Most 提示
出自论文《Least-to-Most Prompting Enables Complex Reasoning in Large Language Models》(Zhou et al., 2023 ICLR):
- 核心思想:将复杂问题分解为逐步解决的子问题序列
- 优势:相比 CoT 进一步降低错误积累,提高最终答案准确性
- 适用场景:超长复杂问题、多约束条件的问题求解
3. AutoPrompt
出自论文《AutoPrompt: Eliciting Knowledge from Language Models with Automatically Generated Prompts》(Shin et al., 2023 ACL):
- 核心思想:自动搜索最优 Prompt 模板
- 优势:减少人工设计 Prompt 的负担
- 适用场景:需要快速适配新任务的场景
4. Active Prompt
出自论文《Active Prompting with Chain-of-Thought for Large Language Models》(Diao et al., 2023 EMNLP):
- 核心思想:基于少量示例动态选择最有价值的 Prompt
- 优势:提升 few-shot learning 的效率
- 适用场景:数据标注成本高的领域
核心实现:动态 Few-shot Prompt 生成
以下 Python 示例展示了如何实现论文中的动态 Few-shot Prompt 生成方法:
from typing import List, Dict
import random
class FewShotPromptGenerator:
"""
动态 Few-shot Prompt 生成器
实现 Active Prompt 论文中的核心算法
"""def __init__(self, examples: List[Dict[str, str]], n_shots: int = 3):"""
初始化生成器
参数:
examples: 示例列表,每个示例应包含 "input" 和 "output" 字段
n_shots: 每次生成 Prompt 使用的示例数量
"""
self.examples = examples
self.n_shots = n_shots
def _calculate_diversity(self, selected_indices: List[int]) -> float:
"""计算当前选择示例的多样性分数"""
# 实现多样性计算逻辑
# 此处简化实现,实际应用中可能需要更复杂的度量
unique_words = set()
for idx in selected_indices:
words = self.examples[idx]["input"].split()
unique_words.update(words)
return len(unique_words)
def generate_prompt(self, query: str) -> str:
"""
为给定查询生成 Few-shot Prompt
参数:
query: 用户查询
返回:
构造好的 Prompt 字符串
"""
try:
if len(self.examples) < self.n_shots:
raise ValueError(f"需要至少 {self.n_shots} 个示例,但只提供了 {len(self.examples)} 个")
# 基于多样性和相关性选择最佳示例组合
best_score = -1
best_indices = []
# 简单实现:随机采样若干组合并选择最佳
# 实际应用中可能需要更高效的搜索算法
for _ in range(10): # 尝试 10 种随机组合
candidates = random.sample(range(len(self.examples)), self.n_shots)
current_score = self._calculate_diversity(candidates)
if current_score > best_score:
best_score = current_score
best_indices = candidates
# 构造 Prompt
prompt_parts = []
for idx in best_indices:
example = self.examples[idx]
prompt_parts.append(f"输入: {example['input']}\n 输出: {example['output']}")
prompt_parts.append(f"输入: {query}\n 输出:")
return "\n\n".join(prompt_parts)
except Exception as e:
print(f"生成 Prompt 时出错: {str(e)}")
# 回退策略:使用前 n_shots 个示例
return "\n\n".join(f"输入: {ex['input']}\n 输出: {ex['output']}"
for ex in self.examples[:self.n_shots]
) + f"\n\n 输入: {query}\n 输出:"
# 使用示例
examples = [{"input": "法国的首都是哪里?", "output": "法国的首都是巴黎。"},
{"input": "日本有多少人口?", "output": "截至 2023 年,日本人口约为 1.25 亿。"},
{"input": "水的化学式是什么?", "output": "水的化学式是 H₂O。"},
{"input": "谁写了《哈姆雷特》?", "output": "《哈姆雷特》是威廉·莎士比亚写的。"},
]
generator = FewShotPromptGenerator(examples, n_shots=2)
prompt = generator.generate_prompt("德国使用什么货币?")
print(prompt)
评估指标与阈值建议
评估 Prompt 工程效果需要结合定量和定性指标:
1. BLEU-4
- 用途:衡量生成文本与参考文本的 n -gram 重叠率
- 阈值建议:
-
0.3 可接受
-
0.5 良好
-
0.7 优秀
2. ROUGE-L
- 用途:评估最长公共子序列匹配,反映答案关键信息覆盖率
- 阈值建议:
-
0.4 可接受
-
0.6 良好
-
0.8 优秀
3. 人工评估指标
- 准确性:答案事实正确性
- 完整性:是否全面回答问题
- 流畅性:生成文本的自然程度
生产环境避坑指南
- 温度系数 (Temperature) 设置不当
- 问题:过高导致输出随机性大,过低导致缺乏创造性
-
建议:根据任务类型调整,事实性问题用 0.1-0.3,创意任务用 0.7-1.0
-
Prompt 注入攻击
- 问题:用户输入可能包含恶意指令覆盖原有 Prompt
-
建议:严格过滤用户输入,使用分隔符明确区分指令和内容
-
长上下文遗忘
- 问题:模型在处理长 Prompt 时可能遗忘前文信息
- 建议:关键信息在 Prompt 中重复出现,或使用外部记忆机制
Prompt 优化挑战
题目:为以下任务设计最优 Prompt:
任务:给定一段产品描述,生成 3 个吸引人的广告标语
当前 Prompt:” 为这个产品写广告标语 ”
优化要求:
1. 加入具体指令约束(如长度、风格要求)
2. 使用 few-shot 示例
3. 加入 Chain-of-Thought 元素引导思考过程
请分享你的优化方案和测试结果!
总结
2023 年的 Prompt 工程研究为实际应用提供了丰富的方法论支持。从理论到实践,开发者现在可以基于这些研究成果构建更可靠的大模型应用。关键是要理解不同技术的适用场景,并结合具体需求选择合适的方法。随着研究的深入,Prompt 工程正从一门 ” 玄学 ” 逐渐转变为系统化的工程学科。
