共计 2885 个字符,预计需要花费 8 分钟才能阅读完成。
为什么提示工程越来越重要?
随着大语言模型(LLM)的普及,我们逐渐意识到:模型本身的能力固然重要,但如何与它「对话」同样关键。这就好比给一位博学的顾问提问——问题的质量直接决定了答案的价值。在实际开发中,常见困扰包括:

- 同一套提示词在不同时间调用效果差异明显
- 复杂任务需要反复调整提示结构却难以系统化
- 生产环境中突发的低质量响应可能引发连锁问题
提示策略的武器库选择
1. 零样本(Zero-shot)提示
适用场景:简单明确的分类或生成任务
特点:
– 只提供任务描述,不包含示例
– 依赖模型的预训练知识
– 计算成本最低
示例:
def zero_shot_classify(text, categories):
prompt = f""" 将以下文本分类到指定类别中,仅输出类别名称。可选类别:{','.join(categories)}
文本:{text}"""
return generate_response(prompt)
2. 少样本(Few-shot)提示
适用场景:需要特定格式或风格的输出
特点:
– 提供 3 - 5 个输入输出示例
– 显著提升复杂任务的稳定性
– 注意示例的多样性
示例:
examples = [{"input": "会议改到下午 3 点", "output": "{\"action\":\"reschedule\",\"time\":\"15:00\"}"},
{"input": "取消与张经理的约谈", "output": "{\"action\":\"cancel\",\"target\":\" 张经理 \"}"}
]
def few_shot_parser(user_input):
prompt = "将自然语言转换为 JSON 格式,参照以下示例:\n"
for ex in examples:
prompt += f"输入:{ex['input']}\n 输出:{ex['output']}\n\n"
prompt += f"输入:{user_input}\n 输出:"
return generate_response(prompt)
3. 思维链(Chain-of-Thought)提示
适用场景:需要逻辑推理的复杂问题
特点:
– 要求模型展示推理步骤
– 通过「让我们逐步思考」等触发词激活
– 可结合少样本使用
构建工业级提示系统
可复用模板设计(含异常处理)
from typing import List, Dict
import openai
import backoff
@backoff.on_exception(backoff.expo, openai.error.RateLimitError)
def generate_response(
prompt: str,
model: str = "gpt-3.5-turbo",
temperature: float = 0.7,
max_tokens: int = 500
) -> str:
try:
response = openai.ChatCompletion.create(
model=model,
messages=[{"role": "user", "content": prompt}],
temperature=temperature,
max_tokens=max_tokens
)
return response.choices[0].message.content
except openai.error.InvalidRequestError as e:
print(f"提示词过长或参数错误: {e}")
return ""
except Exception as e:
print(f"未知错误: {e}")
raise
class PromptTemplate:
def __init__(self, template: str, variables: List[str]):
self.template = template
self.variables = variables
def render(self, **kwargs) -> str:
missing_vars = set(self.variables) - set(kwargs.keys())
if missing_vars:
raise ValueError(f"缺少必要变量: {missing_vars}")
return self.template.format(**kwargs)
# 使用示例
email_template = PromptTemplate(
template=""" 根据以下信息撰写专业邮件:收件人:{recipient}
主题:关于 {subject} 的沟通
主要事项:{content}
要求语气:{tone}""",
variables=["recipient", "subject", "content", "tone"]
)
版本控制方案
推荐实践:
1. 采用 Git 管理提示词模板
2. 每个模板添加元数据:
– 创建日期
– 最后修改人
– 关联的模型版本
– 测试通过率
3. 使用语义化版本号(如 v1.2.0)
效果评估指标体系
建议组合以下指标:
- 基础质量(0- 5 分):
- 完整性:是否回答完全
- 相关性:是否跑题
-
流畅度:语言是否自然
-
业务指标(根据场景定制):
- 客服场景:问题解决率
- 生成场景:用户留存率
- 分类场景:准确率 / 召回率
生产环境特别考量
性能优化技巧
- 延迟优化:
- 对实时性要求高的场景降低 temperature
- 设置合理的 max_tokens 上限
-
实现客户端缓存(相同提示词缓存 5 分钟)
-
吞吐量提升:
- 批量处理请求(BATCH_SIZE=10)
- 异步非阻塞调用
- 考虑模型蒸馏(小模型处理简单请求)
安全防护层
def safety_check(text: str) -> bool:
blacklist = ["暴力", "色情", "政治敏感词示例"] # 实际使用需完善词库
return not any(bad_word in text for bad_word in blacklist)
def get_safe_response(prompt: str) -> str:
response = generate_response(prompt)
if not safety_check(response):
return "内容不符合安全规范,已过滤"
return response
成本控制策略
- 监控每个提示词的 token 消耗
- 对非关键任务使用较小模型
- 设置每月预算警报(通过 CloudWatch 等工具)
- 实施请求限流(如用户级 QPS 控制)
开发者避坑指南
- 陷阱:过度依赖单一模板
- 现象:初期效果很好,随时间推移质量下降
-
解法:维护 A / B 测试的多个模板版本
-
陷阱:忽视 temperature 的影响
- 现象:创意场景用低 temperature 导致回答呆板
-
解法:建立参数配置表,不同场景预设不同值
-
陷阱:缺少 fallback 机制
- 现象:API 异常时整个系统崩溃
- 解法:实现分级降级策略(示例→规则→人工)
延伸思考
尝试为你的业务领域设计特色提示技巧:
1. 法律行业:如何利用法条编号增强引用准确性?
2. 电商场景:怎样通过提示词实现多轮商品对比?
3. 医疗咨询:如何构建症状 - 诊断的推理链条?
记住,好的提示工程不是一次性工作,而需要持续:观察→实验→度量→优化的循环。建议建立专门的提示词知识库,记录每次迭代的学习成果。
正文完
