Prompt 工程实战:写出好提示词的艺术
什么是 Prompt Engineering
Prompt Engineering(提示词工程)是指设计和优化与 LLM 交互的提示词,以获得更准确、更有用的输出。它不是简单地提问,而是是一门结合了理解模型行为、设计有效沟通的实践艺术。
Prompt 的基本结构
一个完整的 Prompt 通常包含以下部分:
1 2 3 4 5 6 7 8
| prompt = """ [角色定义] # 让模型扮演特定角色 [任务描述] # 清晰说明要做什么 [上下文信息] # 提供必要的背景知识 [输出格式] # 指定期望的输出形式 [约束条件] # 明确限制和要求 [示例] # Few-shot 示例 """
|
各部分作用
| 部分 |
作用 |
重要性 |
| 角色定义 |
激活模型的相关知识 |
⭐⭐⭐ |
| 任务描述 |
明确目标和动作 |
⭐⭐⭐ |
| 上下文 |
提供必要信息 |
⭐⭐⭐ |
| 输出格式 |
控制输出结构 |
⭐⭐ |
| 约束条件 |
限制输出范围 |
⭐⭐ |
| 示例 |
展示期望格式 |
⭐⭐ |
核心原则
1. 清晰具体(Be Specific)
1 2 3 4 5 6 7 8 9 10 11 12
| prompt1 = "帮我写点东西"
prompt2 = """ 帮我写一封求职邮件: - 职位:Python 后端工程师 - 公司:字节跳动 - 我的优势:3年 FastAPI 经验,熟悉微服务架构 - 语气:专业、自信但不傲慢 - 字数:200字左右 """
|
2. 结构化输出(Structure Output)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| prompt = """ 请提取以下文本中的关键信息,用 JSON 格式输出:
文本:苹果公司成立于1976年,总部位于加州库比蒂诺,是全球市值最高的科技公司之一。
输出格式: ```json { "公司名称": "", "成立年份": "", "总部": "", "简介": "" }
|
“””
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| ### 3. 分解复杂任务(Decompose)
```python # ❌ 一次性要求太多 prompt1 = """ 分析这100条用户评论,给出: 1. 情感分类 2. 主要问题归纳 3. 产品改进建议 4. 营销策略优化 """
# ✅ 分解步骤 prompts = [ "将这100条评论按情感分为正面/负面/中性三类", "负面评论中归纳出TOP5投诉问题", "针对这些问题,给出产品改进建议", "基于分析结果,提出营销优化策略" ]
|
高级技巧
1. Few-shot Learning
通过示例让模型理解任务模式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| prompt = """ 任务:判断文本情感是正面还是负面
示例: 文本:"这家餐厅的服务太差了,等了1小时才上菜" 情感:负面
文本:"物流很快,两天就到了,好评!" 情感:正面
文本:"耳机音质一般,没有描述的那么好" 情感:
请判断: """
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| prompt = """ 任务:判断一句话是否符合逻辑
示例: 句子:"他是个医生,所以能给人看病" 推理:医生的工作就是给人看病,所以这个推断是符合逻辑的 结论:符合逻辑
句子:"天下雨了,所以太阳很亮" 推理:下雨和太阳亮度没有因果关系 结论:不符合逻辑
句子:"他每天都跑步,所以身体很健康" 推理:
请判断: """
|
2. 思维链提示(Chain of Thought)
引导模型逐步推理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| prompt1 = """ 甲买了3本书,每本20元,又买了1支笔5元,总共花了多少? """
prompt2 = """ 请一步步推理,最后给出答案。
甲买了3本书,每本20元 → 3 × 20 = 60元 又买了1支笔5元 总共:60 + 5 = 65元
答案:65元 """
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| prompt3 = """ 在回答问题时,请先写出你的推理过程,再给出最终答案。
问题:某个数先加5,再乘以2,得到30,这个数是多少?
推理过程: 1. 最终结果是30 2. 逆向思考:30 ÷ 2 = 15 3. 15 - 5 = 10 4. 所以原数是10
最终答案:10
问题:小明有50元,买了2个笔记本,每个15元,还剩多少元? """
|
3. 角色扮演(Role Prompting)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| prompt = """ # 角色设定 你是一位资深技术面试官,具有10年互联网面试经验。
# 面试规则 1. 考察候选人的算法能力和系统设计思维 2. 问题由浅入深,逐步增加难度 3. 每次回答后给予简短反馈 4. 友好但专业的态度
# 面试流程 1. 先让候选人自我介绍 2. 根据简历定制问题 3. 每道题给候选人思考时间 4. 最后给出评价和建议
现在开始面试,请候选人自我介绍。 """
|
4. 上下文学习(In-Context Learning)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| prompt = """ # 背景知识 在本公司,用户等级分为: - VIP会员:年消费10万以上,享受专属客服 - 银卡会员:年消费3万-10万,9折优惠 - 普通会员:年消费3万以下,无折扣
# 任务 判断以下用户的会员等级和可享受的优惠:
用户A:年消费15万 用户B:年消费8万 用户C:年消费2万
请按以下格式输出: | 用户 | 会员等级 | 优惠内容 | |------|---------|---------| """
|
5. 约束条件(Constraints)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| prompt = """ # 任务 解释"回调函数"的概念
# 约束条件 1. 用初学者能理解的语言解释 2. 必须包含代码示例 3. 代码必须使用 Python 4. 字数控制在200字以内 5. 最后用一句话总结
# 禁止 - 使用过于专业的术语而不解释 - 输出与编程无关的内容 """
|
常见模式
1. 问答模式
1 2 3 4 5 6 7 8 9 10 11
| prompt = """ 请基于以下背景信息回答问题。如果信息不足以回答,请说明"根据提供的信息无法回答"。
背景: 我们的产品是一款面向中小企业的CRM系统,主要功能包括客户管理、销售跟踪、数据分析。
问题: 1. 这个产品的主要目标用户是谁? 2. 产品的核心功能有哪些? 3. 适合大型企业使用吗? """
|
2. 翻译模式
1 2 3 4 5 6 7 8 9 10 11
| prompt = """ 你是一位中英翻译专家。请将以下中文翻译成英文,注意: 1. 保持专业商务语气 2. 符合英文表达习惯 3. 专业术语使用标准翻译
原文: "在过去的季度中,我们的营收同比增长了25%,其中新客户贡献了40%的增长,老客户复购率达到了60%。"
译文: """
|
3. 总结模式
1 2 3 4 5 6 7 8 9 10 11
| prompt = """ 请将以下文章压缩成100字以内的摘要,要求: 1. 包含文章的核心观点 2. 使用简洁的语言 3. 保留关键数据
原文: [长篇文章内容...]
摘要: """
|
4. 分类模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| prompt = """ 请将以下新闻标题按类别分类。
类别选项:科技、娱乐、体育、财经、国际
标题列表: 1. "苹果发布新款iPhone" 2. "皇马夺得欧冠冠军" 3. "A股今日大涨2%" 4. "Netflix新剧收视破纪录" 5. "中美贸易谈判进展"
请输出JSON格式: { "科技": ["..."], "体育": ["..."], "财经": ["..."], "娱乐": ["..."], "国际": ["..."] } """
|
5. 改写模式
1 2 3 4 5 6 7 8 9 10 11 12 13
| prompt = """ # 原始文本 产品质量非常好,物流也很快,就是客服态度有点差。
# 改写要求 请将以上文本改写成4种不同风格: 1. 正式商务风格 2. 口语化轻松风格 3. 投诉反馈风格 4. 朋友圈推荐风格
每种风格控制在50字以内。 """
|
调试技巧
1. 迭代优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| prompt_v1 = "写一篇关于AI的文章"
prompt_v2 = """ 写一篇关于AI在医疗领域应用的文章,要求: - 包含3个具体应用场景 - 每个场景有实例 - 字数800字 - 结尾有展望 """
|
2. 温度调节
1 2 3 4 5 6 7 8 9 10 11 12 13
| response = openai.ChatCompletion.create( model="gpt-4", messages=[{"role": "user", "content": "2+3等于几?"}], temperature=0.0 )
response = openai.ChatCompletion.create( model="gpt-4", messages=[{"role": "user", "content": "写一首关于春天的诗"}], temperature=0.9 )
|
3. 检查输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| def validate_output(prompt, output): """验证输出是否符合要求""" checks = []
if "字数控制在200字" in prompt: if len(output) > 250: checks.append("⚠️ 字数可能超标")
if "必须包含代码示例" in prompt: if "```" not in output: checks.append("⚠️ 缺少代码示例")
if "JSON格式" in prompt: if not output.strip().startswith("{"): checks.append("⚠️ 输出格式不符")
return checks
|
常见错误
1. 信息不足
1 2 3 4 5 6 7 8 9 10 11
| prompt1 = "这个功能怎么实现?"
prompt2 = """ 在 Django 中,如何实现用户登录功能? 要求: - 使用 Django 内置的认证系统 - 需要 username 和 password - 登录成功后重定向到首页 """
|
2. 指令冲突
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| prompt1 = """ 写一篇短文,要求: - 内容积极向上 - 禁止使用任何积极词汇 """
prompt2 = """ 写一篇短文,要求: - 风格客观中立 - 不使用极端化表达 - 字数100字 """
|
3. 期望不明确
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| prompt1 = "帮我看看这段代码有什么问题"
prompt2 = """ 请检查以下 Python 代码的: 1. 潜在的bug 2. 性能问题 3. 安全漏洞 4. 代码规范问题
代码: [code...]
请逐条列出问题及修复建议。 """
|
实战案例
案例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
| system_prompt = """ # 角色 你是电商平台的智能客服小助手"小e"。
# 能力 - 回答商品相关问题 - 处理退换货申请 - 提供物流查询 - 介绍促销活动
# 限制 - 不能承诺具体发货时间 - 不能泄露用户隐私信息 - 不确定的问题转人工
# 回复风格 - 友好、耐心、专业 - 使用"您"称呼用户 - 适当使用emoji增加亲和力
# 对话示例 用户:这件衣服有几种颜色? 小e:亲,这件衣服有白色、黑色、蓝色三种颜色可选哦~请问您喜欢什么颜色呢?😊
用户:[当前问题] """
response = chat([{"role": "system", "content": system_prompt}, {"role": "user", "content": user_message}])
|
案例2:代码审查助手
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
| code_review_prompt = """ # 角色 你是一位资深代码审查工程师,负责检查代码质量和安全问题。
# 审查维度 1. **功能正确性**:逻辑是否正确实现需求 2. **性能**:是否有性能隐患 3. **安全**:是否有安全漏洞 4. **可维护性**:代码是否清晰易懂 5. **最佳实践**:是否符合语言/框架规范
# 输出格式 ```json { "summary": "总体评价", "issues": [ { "severity": "高/中/低", "type": "功能/性能/安全/可维护性/最佳实践", "location": "文件:行号", "description": "问题描述", "suggestion": "修复建议" } ], "praise": ["做得好的地方"] }
|
待审查代码
{code}
“””
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
| ### 案例3:数据分析师
```python analysis_prompt = """ # 角色 你是一位专业数据分析师,擅长从数据中发现洞察和规律。
# 分析流程 1. 首先理解数据结构 2. 进行描述性统计 3. 识别异常值 4. 发现相关性 5. 提出假设和建议
# 输出要求 - 每个分析步骤都要有数据支撑 - 图表用文字描述(如果是代码则生成代码) - 结论要明确,不要模糊表达
# 数据 {data}
请开始分析。 """
|
总结
好的 Prompt = 清晰的目标 + 充分的上下文 + 合适的约束 + 恰当的示例
最佳实践:
- 角色 → 明确要什么
- Context → 提供足够信息
- Examples → 展示期望格式
- Output format → 指定输出结构
- Constraints → 明确边界限制
- Iterate → 不断优化迭代
掌握这些技巧,你就能更好地驾驭 LLM,获得更准确、更有用的输出。
更多实战技巧,欢迎留言交流!