AI应用开发进阶(一):提示工程从入门到精通
一、开场:提示词才是核心竞争力
大家好,我是老金。
很多人以为AI应用的核心是模型。
错了,提示词才是核心。
同样的模型,好的提示词能让效果提升50%。
今天聊聊提示工程的进阶技巧。
二、提示工程基础
2.1 提示结构
┌─────────────────────────────────────────────────────────┐
│ 提示词基本结构 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ System Prompt(系统提示) │ │
│ │ 定义角色、能力、规则 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Context(上下文) │ │
│ │ 背景信息、参考资料、数据 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ User Input(用户输入) │ │
│ │ 具体问题或任务 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
2.2 基础模板
def create_prompt(system: str, context: str, user_input: str) -> str:
"""创建提示模板"""
return f"""
{system}
# 上下文
{context}
# 任务
{user_input}
"""
# 使用示例
system = """你是一个资深Python开发工程师。
回答要简洁、专业,带有代码示例。"""
context = """
当前代码:
def hello():
print("Hello World")
"""
user = "解释这段代码的作用"
prompt = create_prompt(system, context, user)
三、进阶技巧
3.1 Few-Shot提示
# Few-Shot:给例子让AI学习模式
FEW_SHOT_PROMPT = """
任务:根据评论判断情感(正面/负面/中性)
示例:
评论:"这个产品太棒了,必须推荐!"
情感:正面
评论:"还行吧,一般般"
情感:中性
评论:"垃圾产品,完全是浪费钱"
情感:负面
评论:"{new_review}"
情感:
"""
def classify_sentiment(review: str) -> str:
"""情感分类"""
prompt = FEW_SHOT_PROMPT.format(new_review=review)
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content.strip()
3.2 Chain-of-Thought(思维链)
# CoT:让AI一步步思考
COT_PROMPT = """
问题:小明有10个苹果,送给小红3个,又买了5个,现在有几个?
让我们一步步思考:
1. 小明开始有10个苹果
2. 送给小红3个:10 - 3 = 7个
3. 又买了5个:7 + 5 = 12个
答案:12个
---
问题:{question}
让我们一步步思考:
"""
def solve_with_cot(question: str) -> str:
"""带思维链的问题解答"""
prompt = COT_PROMPT.format(question=question)
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
3.3 角色扮演
# 角色扮演提示
ROLE_PLAY_PROMPT = """
# 角色设定
你是一个面试官,名叫老王。
背景:
- 10年技术面试经验
- 面试过500+候选人
- 擅长考察算法和系统设计
- 说话直接,但会给出建设性反馈
性格特点:
- 严谨、专业
- 喜欢追问细节
- 会给候选人思考时间
- 最后的反馈很有价值
面试风格:
- 从简单问题开始
- 根据回答调整难度
- 注重思路而非结果
- 会问"有什么想问我的吗"
---
现在开始面试:
候选人:{candidate_intro}
请开始你的第一个问题。
"""
def start_interview(candidate_intro: str) -> str:
"""开始面试"""
prompt = ROLE_PLAY_PROMPT.format(candidate_intro=candidate_intro)
# ... 调用API
四、复杂提示模式
4.1 XML标签分隔
# 使用XML标签清晰分隔
XML_PROMPT = """
你是一个数据分析师。
回答要基于提供的数据,有理有据。
用户数据:
- 日活:10000
- 付费率:5%
- 客单价:100元
商品数据:
- 爆款:手机壳
- 滞销:平板电脑
请分析:
1. 用户付费转化漏斗
2. 商品结构问题
3. 优化建议
按以下格式输出:
## 分析结论
[内容]
## 数据支撑
[数据]
## 行动建议
[具体建议]
"""
def analyze_data(data: dict, task: str) -> str:
"""数据分析提示"""
prompt = XML_PROMPT.replace("{data}", str(data))
prompt = prompt.replace("{task}", task)
return prompt
4.2 渐进式提示
# 渐进式:先大纲后细节
PROGRESSIVE_PROMPT = """
# 阶段1:确定框架
任务:{task}
首先,列出回答的主要框架(3-5个要点)。
---
[AI输出框架]
# 阶段2:详细展开
基于上面的框架,请详细展开每个部分。
---
[AI详细输出]
# 阶段3:补充案例
请为每个要点补充一个具体案例。
---
[AI完整输出]
"""
def progressive_write(task: str) -> str:
"""渐进式写作"""
# 三个阶段逐步深入
pass
4.3 对比分析框架
# 对比分析提示
COMPARISON_PROMPT = """
# 对比分析框架
对比对象:{item_a} vs {item_b}
## 对比维度
请从以下维度对比:
| 维度 | {item_a} | {item_b} | 优劣 |
|------|----------|----------|------|
| 性能 | ? | ? | ? |
| 成本 | ? | ? | ? |
| 易用性 | ? | ? | ? |
| 生态 | ? | ? | ? |
| 适用场景 | ? | ? | ? |
## 综合评价
基于以上对比,给出:
1. 各维度得分(1-10分)
2. 最终推荐
3. 适用人群
---
请开始对比分析:
"""
def compare_items(item_a: str, item_b: str) -> str:
"""对比分析"""
prompt = COMPARISON_PROMPT.format(item_a=item_a, item_b=item_b)
return prompt
五、提示优化实战
5.1 优化流程
def optimize_prompt(
original_prompt: str,
test_cases: List[dict],
metric: str = "accuracy"
) -> str:
"""
提示词优化流程:
1. 设定评估指标
2. 测试当前提示
3. 分析错误案例
4. 修改提示
5. 重复直到收敛
"""
best_prompt = original_prompt
best_score = 0
for iteration in range(10):
# 测试当前提示
scores = []
for case in test_cases:
response = call_llm(best_prompt, case["input"])
score = evaluate_response(response, case["expected"])
scores.append(score)
current_score = sum(scores) / len(scores)
if current_score > best_score:
best_score = current_score
best_prompt = current_prompt
# 分析失败案例
failed_cases = [
case for case, score in zip(test_cases, scores)
if score str:
"""根据失败案例改进提示"""
improvement_prompt = f"""
当前提示:
{prompt}
失败案例:
{failed_cases}
请分析失败原因,并提出改进建议。
输出改进后的提示词。
"""
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": improvement_prompt}]
)
return extract_improved_prompt(response)
5.2 提示版本管理
from pydantic import BaseModel
from typing import List, Optional
from datetime import datetime
class PromptVersion(BaseModel):
"""提示词版本"""
version: str
prompt: str
created_at: datetime
test_score: float
notes: str = ""
class PromptManager:
"""提示词管理器"""
def __init__(self):
self.versions: List[PromptVersion] = []
def add_version(self, prompt: str, score: float, notes: str = ""):
"""添加新版本"""
version = PromptVersion(
version=f"v{len(self.versions) + 1}",
prompt=prompt,
created_at=datetime.now(),
test_score=score,
notes=notes
)
self.versions.append(version)
def get_best(self) -> PromptVersion:
"""获取最佳版本"""
return max(self.versions, key=lambda x: x.test_score)
def rollback(self, version: str) -> str:
"""回滚到指定版本"""
for v in self.versions:
if v.version == version:
return v.prompt
raise ValueError(f"Version {version} not found")
六、高级技巧
6.1 元提示(Meta-Prompting)
# 让AI帮你写提示
META_PROMPT = """
任务:帮我为"{task}"设计一个提示词
请按以下结构设计:
1. 角色定义
- 谁是执行者?
- 具备什么能力?
2. 任务描述
- 具体要做什么?
- 输入是什么?
- 输出是什么?
3. 约束条件
- 有什么限制?
- 避免什么?
4. 输出格式
- 怎么格式化输出?
- 有什么模板?
5. 示例
- 提供1-3个输入输出示例
输出格式:
```prompt
[你的提示词]
请开始设计:
“””
def design_prompt(task: str) -> str:
“””让AI帮你设计提示词”””
prompt = META_PROMPT.format(task=task)
response = openai.ChatCompletion.create(
model=”gpt-4″,
messages=[{“role”: “user”, “content”: prompt}]
)
return extract_code_block(response)
### 6.2 自我一致性
```python
# 自我一致性:多次采样,选择最一致的答案
def self_consistency(
prompt: str,
n_samples: int = 5
) -> str:
"""自我一致性提示"""
# 生成多个答案
answers = []
for _ in range(n_samples):
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=0.7 # 较高温度增加多样性
)
answers.append(response.choices[0].message.content)
# 投票选择最一致的答案
# 简化实现:选择第一个答案
# 实际应该用更复杂的对齐算法
return majority_vote(answers)
6.3 知识生成提示
# 让AI生成知识,再用于回答
KNOWLEDGE_GENERATION = """
任务:针对"{topic}",生成一份知识问答对
要求:
1. 覆盖核心概念
2. 包含实际案例
3. 设置陷阱问题
4. 提供详细解释
格式:
Q1: [问题]
A1: [答案]
---
Q2: [问题]
A2: [答案]
"""
def generate_knowledge_qa(topic: str) -> List[dict]:
"""生成知识问答对"""
prompt = KNOWLEDGE_GENERATION.format(topic=topic)
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
return parse_qa_pairs(response)
七、提示工程最佳实践
7.1 实用建议
# 提示工程最佳实践
✅ DO:
1. 明确角色和任务
2. 提供具体示例
3. 分解复杂任务
4. 指定输出格式
5. 限制回答长度
6. 测试和迭代
7. 版本管理
❌ DON'T:
1. 模糊的指令
2. 过长提示
3. 矛盾的要求
4. 假设AI"理解"
5. 不测试就上线
7.2 常用模板库
TEMPLATES = {
"summarizer": """
角色:你是一个专业的文字编辑。
任务:总结以下文本的核心观点。
要求:
1. 不超过200字
2. 保留关键信息
3. 语言简洁
4. 格式:要点1n要点2n要点3
文本:
{text}
""",
"code_reviewer": """
角色:你是一个资深代码审查员。
任务:审查以下代码的问题。
检查维度:
1. 代码规范
2. 潜在bug
3. 性能问题
4. 安全漏洞
5. 可维护性
格式:
## 问题列表
[问题1] (严重程度: 高/中/低)
[问题2]
## 改进建议
[建议]
代码:
{code}
""",
"translator": """
角色:你是一个专业翻译。
任务:翻译以下{源语言}文本到{目标语言}
要求:
1. 保持原意
2. 符合目标语言习惯
3. 专业术语准确
文本:
{text}
"""
}
八、总结
核心要点
- 提示结构化:系统提示+上下文+任务
- Few-Shot学习:给例子比描述更有效
- 思维链:复杂问题一步步思考
- 迭代优化:测试-分析-改进
- 版本管理:记录每一次改进
进阶路线
Level 1:基础提示
- 清晰指令
- 结构化输出
Level 2:Few-Shot + CoT
- 示例学习
- 分解思考
Level 3:复杂模式
- 渐进式
- 对比分析
Level 4:自动优化
- 提示测试
- 版本管理
相关阅读
正文完