写AI应用到现在,我一直有个尴尬的发现:代码写得再好,Prompt写得烂,AI一样输出垃圾。
第3篇RAG,知识库检索到了正确内容,但AI回答还是偏------因为Prompt没告诉它"只基于检索结果回答"。第6篇Agent,AI调错了工具------因为Prompt没说清楚什么问题用什么工具。第10篇多Agent协作,写作Agent只会复制粘贴------因为Prompt没规定输出格式。
Prompt是AI应用的"接口文档"。 你给AI的指令越清楚,AI的输出越靠谱。但写好Prompt不是靠灵感,是有套路的。
我把自己踩过的Prompt坑整理成4个实战技巧,每个技巧都有"烂写法"和"好写法"的对比。同一个需求,换种写法,效果能差10倍。
先说结论
| 技巧 | 核心思路 | 效果提升 |
|---|---|---|
| 角色设定 | 让AI知道"你是谁" | 输出专业度提升3倍 |
| 示例驱动 | 给AI看1-2个正确输出样例 | 格式正确率从60%→95% |
| 约束边界 | 明确告诉AI"不要做什么" | 减少幻觉和跑题50%+ |
| 思维链 | 让AI"先想后答" | 复杂推理准确率提升5倍 |
用Java人的理解:Prompt ≈ 给一个新来的实习生布置任务。你不会只说"帮我处理一下订单"------你会说角色(你是客服)、格式(用这个模板)、约束(不能透露价格)、思路(先查库再回复)。AI也一样。
坑1:没有角色设定,AI像一个没有岗位说明的实习生
翻车现场
python
ini
# 烂写法:没有角色
prompt = "请分析一下新能源汽车行业的竞争格局。"
result = llm.invoke(prompt)
输出:
新能源汽车行业竞争格局分析
随着全球对环境保护意识的不断增强......(200字宏观背景)
主要竞争对手包括特斯拉、比亚迪等......(300字泛泛介绍)
未来展望:行业将朝着智能化方向发展......(100字空话)
像百度百科------什么都说了一点,但没有深度、没有观点、没有数据支撑。 因为AI不知道你是要写给谁看的、什么深度、什么角度。
正确写法:给角色+受众+风格
python
ini
# 好写法:角色设定
prompt = """你是一位有10年经验的证券分析师,擅长新能源汽车赛道。
受众:投资决策委员会(资深投资人,不需要基础概念科普)
要求:
- 用数据说话,引用具体市占率、增长率
- 给出明确的投资建议,不要"既要又要"
- 控制在500字以内
请分析新能源汽车行业的竞争格局。"""
输出:
erlang
新能源车竞争格局(2025年)
头部集中:比亚迪(市占率28%)+特斯拉(18%)合计占46%,二线品牌(蔚来、小鹏、理想)合计仅15%,行业马太效应显著。
关键变量:智能化。L3渗透率从8%→25%是未来2年最大增量,比亚迪自研芯片+特斯拉FSD是核心壁垒,二线品牌依赖供应商方案,差异化不足。
投资建议:超配比亚迪,标配特斯拉供应链,回避二线品牌。
风险:价格战持续,比亚迪2025年单车利润同比-12%,若L3渗透不及预期,估值承压。
同一个问题,输出质量天差地别。 关键差异:
| 要素 | 烂写法 | 好写法 |
|---|---|---|
| 角色 | 无 | "10年经验证券分析师" |
| 受众 | 无(默认大众) | "投资决策委员会" |
| 深度 | 浅层科普 | 数据+观点+建议 |
| 格式约束 | 无 | "500字以内" |
| 风格 | 百科体 | 投资研报体 |
角色设定模板:
你是一位{角色描述},{经验/特长}。
你的受众是{目标读者},{他们的背景}。
你的风格:{写作风格要求}。
坑2:光描述要求不给示例,AI自由发挥跑偏
翻车现场
需求:让AI从用户评论中提取情感标签。
python
ini
# 烂写法:只描述要求,不给示例
prompt = """请从以下用户评论中提取情感标签。
用户评论:这个耳机音质不错,但戴久了耳朵疼,降噪效果一般。
请提取情感标签,包含维度和极性。"""
result = llm.invoke(prompt)
输出(3次运行3种格式):
bash
# 第1次
情感标签:
- 音质:正面
- 舒适度:负面
- 降噪:中性
# 第2次
{
"sentiments": [
{"aspect": "sound quality", "polarity": "positive"},
{"aspect": "comfort", "polarity": "negative"},
{"aspect": "noise cancellation", "polarity": "neutral"}
]
}
# 第3次
该用户对音质表示满意,对舒适度不满意,对降噪效果持中性态度。
3次输出3种格式。 因为我只说了"提取情感标签",但没说用什么格式输出。
正确写法:给1-2个示例(Few-shot)
python
makefile
# 好写法:给示例
prompt = """请从用户评论中提取情感标签,输出JSON数组格式。
示例1:
评论:手机拍照很清晰,续航也给力,就是屏幕有点小。
输出:
```json
[
{"aspect": "拍照", "polarity": "正面"},
{"aspect": "续航", "polarity": "正面"},
{"aspect": "屏幕", "polarity": "负面"}
]
示例2: 评论:物流快,包装好,产品一般。 输出:
json
css
[ {"aspect": "物流", "polarity": "正面"}, {"aspect": "包装", "polarity": "正面"}, {"aspect": "产品", "polarity": "负面"}]
现在请处理: 评论:这个耳机音质不错,但戴久了耳朵疼,降噪效果一般。 输出:"""
result = llm.invoke(prompt)
css
输出(10次运行全部一致):
```json
[ {"aspect": "音质", "polarity": "正面"}, {"aspect": "舒适度", "polarity": "负面"}, {"aspect": "降噪", "polarity": "中性"}]
Few-shot的威力:
| 方式 | 格式一致率 | 字段准确率 | 适用场景 |
|---|---|---|---|
| Zero-shot(不给示例) | 30-60% | 70% | 简单任务,输出格式不敏感 |
| 1-shot(给1个示例) | 85%+ | 90% | 大多数场景推荐 |
| 2-3 shot(给2-3个示例) | 95%+ | 95% | 格式要求严格的场景 |
| 5+ shot | 97%+ | 95% | 边际收益递减,Token浪费 |
用Java人的理解:Few-shot ≈ 给实习生看一个完成的案例。"照着这个格式做"比"你自由发挥"靠谱100倍。
示例选择原则:
| 原则 | 说明 |
|---|---|
| 示例要有代表性 | 覆盖最常见的输入模式 |
| 示例要有差异性 | 两个示例不要太像,覆盖不同情况 |
| 示例要简短 | 每个示例5-10行,别写太多浪费Token |
| 输出格式和示例一致 | 示例用什么格式,AI就会用什么格式 |
坑3:只说"要做什么"不说"不要做什么",AI疯狂幻觉
翻车现场
需求:做一个客服AI,只回答公司产品相关的问题。
python
ini
# 烂写法:只说了要做什么
prompt = """你是XX公司的客服助手,请回答用户的问题。"""
result = llm.invoke("今天北京天气怎么样?")
# "今天北京晴转多云,最高温度32度......"(瞎编的,还回答了)
result = llm.invoke("你们公司的退货政策是什么?")
# "退货政策:7天无理由退货,15天换货......"(编造的政策,不是公司的)
AI不知道"不该做什么",就会什么都答------包括编造答案。
正确写法:加约束边界
python
ini
# 好写法:要做什么 + 不要做什么
prompt = """你是XX公司的客服助手。
## 你的职责
- 回答用户关于公司产品功能、价格、使用方法的问题
- 处理退货、换货等售后问题
## 你必须遵守的规则
- 只回答与公司产品和服务相关的问题
- 不确定的信息,说"我需要帮您确认,请稍等"
- 不要编造任何产品信息、价格、政策
- 不在知识库中的信息,说"抱歉,我暂时无法回答该问题"
## 遇到以下情况的处理方式
- 非公司相关问题 → "抱歉,我只能回答与公司产品和服务相关的问题"
- 你不知道答案 → "我需要帮您确认,请稍等"或"建议您联系人工客服"
- 用户情绪激动 → 语气更温和,优先安抚,然后解决问题"""
result = llm.invoke("今天北京天气怎么样?")
# "抱歉,我只能回答与公司产品和服务相关的问题。"
result = llm.invoke("你们公司的退货政策是什么?")
# 根据知识库回答准确的退货政策
约束边界的4个维度:
| 维度 | 对应的"不要" | 示例 |
|---|---|---|
| 范围约束 | 不要回答范围外的问题 | "只回答公司产品相关问题" |
| 事实约束 | 不要编造不确定的信息 | "不确定时说'我帮您确认'" |
| 格式约束 | 不要用错误格式输出 | "输出JSON,不要输出Markdown" |
| 语气约束 | 不要用不当语气 | "不要使用绝对性表述" |
约束模板:
markdown
## 你必须遵守的规则
- {规则1:范围}
- {规则2:事实}
- {规则3:格式}
## 遇到以下情况的处理方式
- {异常情况1} → {处理方式}
- {异常情况2} → {处理方式}
用Java人的理解:这和异常处理一个道理------不仅要写正常流程(try),还要写异常流程(catch)。Prompt里只写正常流程不给异常处理,AI遇到边界情况就会乱来。
坑4:复杂推理题AI直接给答案,错得离谱
翻车现场
需求:AI判断订单是否可以退货(需要多步推理)。
python
ini
# 烂写法:直接问结果
prompt = """退货规则:
1. 收货后7天内可退货
2. 定制商品不可退货
3. 已使用商品不可退货(拆封不等于使用)
4. 会员可延长至15天
订单信息:用户张三,非会员,6月1日收货,购买的是标准款耳机(非定制),已拆封未使用,今天6月10日。
该订单可以退货吗?请回答可以或不可以。"""
result = llm.invoke(prompt)
# "不可以"(错误!拆封≠使用,且6月10日-6月1日=9天,但等等......让我再算算)
AI直接跳到结论,中间的推理步骤跳过了。 结果经常出错------因为复杂推理需要一步步判断,AI一步想太多就容易漏。
正确写法:思维链(Chain of Thought)------让AI先想后答
python
ini
# 好写法:要求AI展示推理过程
prompt = """退货规则:
1. 收货后7天内可退货
2. 定制商品不可退货
3. 已使用商品不可退货(拆封不等于使用)
4. 会员可延长至15天
订单信息:用户张三,非会员,6月1日收货,购买的是标准款耳机(非定制),已拆封未使用,今天6月10日。
请按以下步骤推理,最后给出结论:
步骤1:判断是否在退货时限内
- 用户是否会员?
- 退货时限是多少天?
- 收货至今多少天?
- 是否在时限内?
步骤2:判断商品是否符合退货条件
- 是否定制商品?
- 是否已使用?
- 拆封是否等于使用?
步骤3:综合判断
- 时限条件是否满足?
- 商品条件是否满足?
- 最终结论:可以/不可以退货"""
result = llm.invoke(prompt)
输出:
diff
步骤1:判断是否在退货时限内
- 用户是否会员?非会员
- 退货时限是多少天?7天(非会员)
- 收货至今多少天?6月10日 - 6月1日 = 9天
- 是否在时限内?否,9天 > 7天
步骤2:判断商品是否符合退货条件
- 是否定制商品?否,标准款耳机
- 是否已使用?否,已拆封未使用
- 拆封是否等于使用?否,规则3明确说明拆封≠使用
步骤3:综合判断
- 时限条件:不满足(9天超过7天时限)
- 商品条件:满足(非定制、未使用)
- 最终结论:不可以退货(时限已过)
一步步推理,结论正确且可验证。 如果AI跳步直接给结论,9天>7天这种计算很容易搞错。
思维链的3种用法:
| 用法 | 怎么做 | 适用场景 |
|---|---|---|
| 显式要求 | Prompt里写"请一步步推理" | 复杂推理题 |
| 步骤模板 | Prompt里给出推理步骤框架 | 推荐,效果最稳定 |
| 自发CoT | 让AI自己想,不加约束 | 简单问题,别浪费Token |
步骤模板就是上面用的方法------你在Prompt里写好推理步骤,AI按步骤填空。 这比"请一步步想"可靠10倍,因为你控制了推理的方向。
用Java人的理解:思维链 ≈ 断点调试。AI直接给答案 ≈ 不调试直接运行,对了也不知道为什么对,错了也不知道错在哪。思维链 ≈ 逐步执行+打印中间变量,每一步都能检查。
4个技巧的完整Prompt模板
python
ini
# 综合运用4个技巧的Prompt模板
SYSTEM_PROMPT = """你是一位{角色},{经验/特长描述}。
你的受众是{目标读者}。
## 你的职责
- {职责1}
- {职责2}
## 你必须遵守的规则
- {规则1:范围约束}
- {规则2:事实约束}
- {规则3:格式约束}
## 遇到以下情况的处理方式
- {异常情况1} → {处理方式}
- {异常情况2} → {处理方式}
## 输出格式
{给出1-2个示例}
## 推理步骤(适用于复杂判断)
步骤1:{第一步要判断什么}
步骤2:{第二步要判断什么}
步骤3:{综合判断}
先按步骤推理,再给出最终结论。"""
这个模板覆盖了4个技巧:
| 技巧 | 在模板中的位置 |
|---|---|
| 角色设定 | 第1-2行 |
| 约束边界 | "遵守的规则"+"异常处理" |
| 示例驱动 | "输出格式" |
| 思维链 | "推理步骤" |
不同场景的Prompt速查表
| 场景 | 角色设定 | 关键约束 | 示例要求 | 是否需要CoT |
|---|---|---|---|---|
| 客服AI | "XX公司客服" | 只回答公司相关 | 对话格式示例 | ❌ |
| 知识库问答 | "文档分析专家" | 只基于检索结果 | Q&A格式示例 | ❌ |
| 数据提取 | "数据分析师" | 输出JSON,不编造 | 输入→JSON示例 | ❌ |
| 意图判断 | "意图识别引擎" | 只返回预定义意图 | 5种意图示例 | ❌ |
| 订单判断 | "退货审核员" | 按规则逐步判断 | 判断流程示例 | ✅ 必须 |
| 投资分析 | "证券分析师" | 用数据说话,给明确建议 | 研报格式示例 | ✅ 必须 |
| 多Agent调度 | "项目经理" | 先分解再分配 | 任务分配示例 | ✅ 必须 |
4个技巧的总结
| # | 技巧 | 核心思路 | 一句话 |
|---|---|---|---|
| 1 | 角色设定 | 告诉AI"你是谁" | 没角色的AI = 没岗位的实习生 |
| 2 | 示例驱动 | 给1-2个正确输出样例 | 示例 > 描述,1个示例胜过100字说明 |
| 3 | 约束边界 | 明确"不要做什么" | 只说"要做什么"= 给AI开空白支票 |
| 4 | 思维链 | 让AI先想后答 | 复杂推理必须拆步骤,别让AI一步到位 |
你写Prompt踩过什么坑?有什么独门技巧?评论区聊聊 👇
点赞关注「荣码」,大模型转型系列持续更新~