文章目录
-
- 前言
- 一、先搞懂:Prompt为什么对Agent这么重要?(场景对比)
- 二、Prompt工程核心三要素:简单有效不复杂
-
- [1. 明确角色:告诉Agent"你是谁"](#1. 明确角色:告诉Agent“你是谁”)
- [2. 明确指令:告诉Agent"要做什么"](#2. 明确指令:告诉Agent“要做什么”)
- [3. 明确格式:告诉Agent"输出什么样子"](#3. 明确格式:告诉Agent“输出什么样子”)
- 三要素组合示例(完整Prompt):
- 三、Agent开发常用Prompt模板(拿来就用)
- 四、Prompt优化小技巧:让Agent更"听话"
-
- [1. 用"肯定句"代替"否定句"](#1. 用“肯定句”代替“否定句”)
- [2. 限制输出长度,避免"啰嗦"](#2. 限制输出长度,避免“啰嗦”)
- [3. 提供"示例",降低理解成本](#3. 提供“示例”,降低理解成本)
- [4. 处理"异常情况",让Agent更稳健](#4. 处理“异常情况”,让Agent更稳健)
- 五、实战:用Prompt驱动Agent完成完整任务
-
- [1. 完整代码(结合LLM API调用)](#1. 完整代码(结合LLM API调用))
- [2. 运行结果(符合预期)](#2. 运行结果(符合预期))
- 六、常见问题&避坑指南
-
- [1. Agent答非所问?](#1. Agent答非所问?)
- [2. Agent输出格式不对?](#2. Agent输出格式不对?)
- [3. Agent太啰嗦?](#3. Agent太啰嗦?)
- [4. Agent处理异常情况能力差?](#4. Agent处理异常情况能力差?)
- [5. 国产模型(通义千问、文心一言)不兼容?](#5. 国产模型(通义千问、文心一言)不兼容?)
- 七、总结:Prompt工程的核心是"清晰沟通"
目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步。想要系统学习AI知识的朋友可以看看我的教程http://blog.csdn.net/jiangjunshow,教程通俗易懂,风趣幽默,从深度学习基础原理到各领域实战应用都有讲解。
前言
各位小伙伴,上一节咱们搞定了LLM的API调用------现在能让"大脑"说话了,但新问题来了:同样调用GPT-4o,为什么有的时候Agent听话又高效,有的时候却答非所问、漏洞百出?
关键就在于"Prompt(提示词)"------它相当于给Agent的"思考指令",直接决定了LLM大脑的思考方向和输出质量。就像给别人派活,你说得越清楚,对方做得越到位;指令模糊,结果自然一言难尽。
今天咱们就用大白话,把Prompt工程的核心技巧讲透,不用复杂术语,只给"拿来就能用"的方法和模板,结合Agent开发场景,让你快速设计出简单又有效的思考指令!
一、先搞懂:Prompt为什么对Agent这么重要?(场景对比)
咱们用"奶茶订单Agent"的例子,看看不同Prompt的效果差异,你就明白Prompt的作用了:
反面例子(模糊Prompt):
用户说要喝奶茶,帮他处理一下。
- LLM可能的输出: "请问你想喝什么口味的奶茶?甜度和冰量有要求吗?"
- 问题:只让Agent"处理",没说清楚角色、要做的动作、输出格式------Agent只能被动反问,没法主动完成订单。
正面例子(清晰Prompt):
你是专业的奶茶订单处理Agent,职责如下:
1. 理解用户需求(口味、甜度、冰量、数量、配送地址);
2. 若信息不全,按"口味→甜度→冰量→数量→地址"的顺序追问;
3. 信息齐全后,生成结构化订单(JSON格式,包含flavor、sugar、ice、quantity、address字段);
4. 回复用户时,先确认订单信息,再询问是否下单。
用户输入:我要2杯清爽的奶茶,送到XX路123号。
- LLM可能的输出: "请问你想要什么具体口味的清爽奶茶?甜度(全糖/半糖/少糖/无糖)有什么要求?"
- 优势:角色明确、步骤清晰、格式固定------Agent知道自己是谁、要做什么、怎么做,输出更可控。
一句话总结:Prompt是Agent的"操作手册",好的Prompt能让LLM大脑"有章可循",坏的Prompt会让它"随心所欲" 。
二、Prompt工程核心三要素:简单有效不复杂
设计Prompt不用搞花里胡哨的技巧,抓住三个核心要素,就能满足80%的Agent开发需求:明确角色、明确指令、明确格式 。
1. 明确角色:告诉Agent"你是谁"
给Agent一个清晰的身份定位,LLM会根据角色调整说话语气和思考方式。比如:
- 角色可以是"专业的订单处理员""友好的个人助理""严谨的数据分析师""调皮的儿童故事大王";
- 角色决定了Agent的"人设"------比如订单处理员要专业高效,儿童故事大王要活泼有趣。
示例(Agent角色定义):
你是一个高效的库存管理Agent,负责监控奶茶店原料库存,语言简洁、逻辑清晰,只关注库存相关事务,不回答无关问题。
2. 明确指令:告诉Agent"要做什么"
用具体、可执行的语言,列出Agent需要完成的任务,避免模糊表述。比如:
- 不好的指令:"帮我处理一下库存"(太模糊);
- 好的指令:"当原料库存低于阈值时,生成补货清单,包含原料名称、当前库存、阈值、需补货量"(具体可执行)。
关键技巧:
- 用动词开头(生成、检查、分析、推荐、追问);
- 分点列出步骤(1、2、3...),LLM更容易理解;
- 明确边界(比如"不回答无关问题""只处理北京地区订单")。
示例(Agent指令定义):
你的任务:
1. 读取库存数据(原料名称、当前库存);
2. 对比库存阈值(珍珠20、椰果15、芋圆10、脆波波12);
3. 筛选出"当前库存 < 阈值"的原料;
4. 计算需补货量(补货量 = 阈值 × 2 - 当前库存);
5. 不处理库存充足的原料,不回答库存无关问题。
3. 明确格式:告诉Agent"输出什么样子"
指定输出格式,让Agent的回复结构化、可解析,方便后续执行模块处理(比如JSON、表格、分点列表)。比如:
- 输出JSON:方便程序解析;
- 输出分点列表:方便用户阅读;
- 输出表格:方便数据统计。
示例(Agent输出格式定义):
输出格式要求:
1. 以JSON格式输出补货清单,字段包括:material(原料名称)、current_stock(当前库存)、threshold(阈值)、replenish_quantity(需补货量);
2. 不要额外添加解释文字,只输出JSON字符串。
三要素组合示例(完整Prompt):
# 角色
你是一个高效的库存管理Agent,负责监控奶茶店原料库存,语言简洁、逻辑清晰,只关注库存相关事务,不回答无关问题。
# 任务指令
1. 读取用户提供的库存数据(原料名称、当前库存);
2. 对比库存阈值(珍珠20、椰果15、芋圆10、脆波波12);
3. 筛选出"当前库存 < 阈值"的原料;
4. 计算需补货量(补货量 = 阈值 × 2 - 当前库存);
5. 忽略库存充足的原料,不处理无关信息。
# 输出格式
以JSON格式输出补货清单,字段包括:material、current_stock、threshold、replenish_quantity,不要额外添加解释文字。
用户提供的库存数据:珍珠15、椰果20、芋圆8、脆波波15
LLM输出结果(符合预期):
json
[
{"material": "珍珠", "current_stock": 15, "threshold": 20, "replenish_quantity": 25},
{"material": "芋圆", "current_stock": 8, "threshold": 10, "replenish_quantity": 12}
]
三、Agent开发常用Prompt模板(拿来就用)
结合前面的三要素,整理了5个Agent开发高频场景的Prompt模板,直接替换括号中的内容即可使用:
模板1:订单处理Agent
# 角色
你是专业的奶茶订单处理Agent,语气友好、高效,专注于订单处理,不回答无关问题。
# 任务指令
1. 理解用户需求:提取口味、甜度(全糖/半糖/少糖/无糖)、冰量(多冰/少冰/去冰/常温)、数量、配送地址;
2. 若信息不全,按"口味→甜度→冰量→数量→地址"的顺序逐一追问,每次只问一个问题;
3. 信息齐全后,生成订单确认话术;
4. 拒绝处理无配送地址、无数量的订单。
# 输出格式
1. 信息不全时:输出追问的问题(简洁明了);
2. 信息齐全时:先输出确认话术,再输出JSON格式订单(字段:flavor、sugar、ice、quantity、address)。
用户输入:{用户的消息}
模板2:用户偏好推荐Agent
# 角色
你是友好的奶茶推荐Agent,熟悉各种奶茶口味特点,能根据用户偏好和场景推荐合适的饮品。
# 任务指令
1. 提取用户需求:场景(如运动后、下午茶、早餐)、口味偏好(清爽/浓郁/香甜)、甜度要求、冰量要求、忌口配料;
2. 结合场景推荐:运动后推荐清爽解渴款,下午茶推荐浓郁香甜款,早餐推荐温和不腻款;
3. 推荐时说明理由(贴合用户需求),推荐1-2款即可,不推荐忌口配料的饮品。
# 输出格式
分点输出:
- 推荐饮品:XXX(甜度+冰量)
- 推荐理由:XXX
- 温馨提示:XXX(可选,如"运动后建议少糖少冰")
用户输入:{用户的消息}
模板3:库存监控Agent
# 角色
你是严谨的库存监控Agent,负责奶茶店原料库存预警,只输出库存相关结果,不添加额外闲聊内容。
# 任务指令
1. 接收库存数据(原料名称:当前库存);
2. 对比预设阈值:{阈值配置,如珍珠:20、椰果:15};
3. 标记"当前库存 < 阈值"的原料为"需补货",其余为"库存充足";
4. 计算补货量:补货量 = 阈值 × 2 - 当前库存(确保补货后能满足一段时间需求)。
# 输出格式
以表格形式输出,列名:原料名称、当前库存、阈值、状态、需补货量(库存充足时填0):
| 原料名称 | 当前库存 | 阈值 | 状态 | 需补货量 |
|----------|----------|------|------|----------|
| XXX | XXX | XXX | XXX | XXX |
库存数据:{库存信息}
模板4:工具调用决策Agent
# 角色
你是Agent的决策大脑,负责判断是否需要调用外部工具,逻辑清晰、决策果断。
# 任务指令
1. 理解用户问题:判断用户需要的信息是否是你能直接回答的;
2. 工具能力:天气查询(查实时温度、降雨概率)、订单查询(查订单状态、配送时间)、库存查询(查原料库存);
3. 决策规则:
- 能直接回答(如"奶茶有哪些口味")→ 不调用工具,直接回复;
- 需要外部信息(如"今天北京天气怎么样""我的订单到哪了")→ 调用对应工具;
- 无对应工具 → 回复"无法提供该信息,请换个问题"。
# 输出格式
JSON格式,字段:
- need_tool: true/false(是否需要调用工具)
- tool_name: 工具名(weather/order/stock/none)
- thought: 决策理由(简洁明了)
- reply: 给用户的回复(若不需要工具则填,需要工具则填"正在查询相关信息,请稍候...")
用户问题:{用户的问题}
模板5:儿童互动Agent(亲子场景)
# 角色
你是活泼可爱的儿童故事Agent,面向5-8岁小朋友,语言简单、语气亲切,充满童趣,多用拟声词和简单句子。
# 任务指令
1. 根据小朋友提供的关键词(如"小猫""城堡""魔法"),编一个简短的故事(5-8句话);
2. 故事要有积极的结局(如"小猫找到了回家的路""大家一起开心地玩耍");
3. 避免复杂词汇和恐怖情节;
4. 故事结尾加一个小提问,引导小朋友互动。
# 输出格式
1. 故事开头用"从前呀~";
2. 每句话不超过10个字;
3. 结尾用问句(如"你觉得小猫接下来会做什么呀?")。
小朋友的关键词:{小朋友提供的关键词}
四、Prompt优化小技巧:让Agent更"听话"
掌握了三要素和模板后,再用这4个小技巧,能让Prompt效果翻倍,解决大部分"Agent不听话"的问题:
1. 用"肯定句"代替"否定句"
LLM对肯定句的理解更准确,否定句容易被忽略。比如:
- 不好:"不要推荐全糖的奶茶";
- 好:"优先推荐少糖、无糖的奶茶,不推荐全糖奶茶"。
2. 限制输出长度,避免"啰嗦"
Agent不需要长篇大论,限制输出长度能让回复更精炼。比如:
- 在Prompt中加入:"回复不超过3句话""生成的订单信息不超过50字""JSON字符串不超过200字符";
- 也可以用
max_tokens参数辅助限制(但Prompt中明确说明效果更好)。
3. 提供"示例",降低理解成本
如果任务比较复杂,给Agent一个示例,它会更快掌握要求。比如:
# 示例
用户输入:我要1杯少糖去冰的珍珠奶茶,送到XX路456号。
正确输出:
"确认订单:1杯少糖去冰珍珠奶茶,配送地址XX路456号。请问是否确认下单?"
{
"flavor": "珍珠奶茶",
"sugar": "少糖",
"ice": "去冰",
"quantity": 1,
"address": "XX路456号"
}
4. 处理"异常情况",让Agent更稳健
提前考虑Agent可能遇到的异常,在Prompt中明确处理方式。比如:
# 异常处理
1. 用户输入无关内容(如"今天天气真好")→ 回复"我是订单处理Agent,只处理奶茶订单,请问你需要点奶茶吗?";
2. 用户重复提问 → 直接回复最新结果,不重复追问;
3. 库存数据格式错误 → 回复"库存数据格式不正确,请重新提供(示例:珍珠15、椰果20)"。
五、实战:用Prompt驱动Agent完成完整任务
咱们把前面的Prompt模板和技巧结合起来,用Python实现一个"库存监控Agent",看看Prompt是怎么驱动Agent工作的:
1. 完整代码(结合LLM API调用)
python
import os
import json
from dotenv import load_dotenv
from openai import OpenAI
# 加载环境变量
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"), timeout=30)
def inventory_agent(stock_data: str) -> dict:
"""
库存监控Agent:根据库存数据生成补货清单
:param stock_data: 库存数据(格式:原料名称:库存,多个用、分隔)
:return: 补货清单(JSON格式)
"""
# 设计Prompt(三要素+优化技巧)
prompt = f"""
# 角色
你是严谨的库存监控Agent,负责奶茶店原料库存预警,只输出库存相关结果,不添加额外闲聊内容。
# 任务指令
1. 解析库存数据:按"原料名称:库存"的格式提取原料和对应库存(忽略无关字符);
2. 对比预设阈值:珍珠20、椰果15、芋圆10、脆波波12;
3. 筛选"当前库存 < 阈值"的原料,库存充足的原料不显示;
4. 计算补货量:补货量 = 阈值 × 2 - 当前库存(结果取整数);
5. 异常处理:若库存数据格式错误,返回{"error": "库存数据格式错误,请提供类似'珍珠15、椰果20'的格式"}。
# 输出格式
严格以JSON格式输出,字段:material(原料名称)、current_stock(当前库存,整数)、threshold(阈值)、replenish_quantity(补货量);
无需要补货的原料时,返回{"status": "所有原料库存充足"};
不要添加任何额外文字,只输出JSON字符串。
# 示例
输入库存数据:珍珠15、椰果20、芋圆8、脆波波15
输出:
[{"material": "珍珠", "current_stock": 15, "threshold": 20, "replenish_quantity": 25}, {"material": "芋圆", "current_stock": 8, "threshold": 10, "replenish_quantity": 12}]
库存数据:{stock_data}
"""
# 调用LLM
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=0.1, # 低温度,保证输出稳定
max_tokens=300
)
# 解析响应
try:
result = json.loads(response.choices[0].message.content.strip())
return result
except json.JSONDecodeError:
return {"error": "Agent输出格式错误,请重试"}
# 测试不同场景
if __name__ == "__main__":
# 场景1:有需要补货的原料
print("=== 场景1:有需补货原料 ===")
stock1 = "珍珠12、椰果18、芋圆5、脆波波10"
print(f"输入库存:{stock1}")
print(f"Agent输出:{inventory_agent(stock1)}\n")
# 场景2:所有原料库存充足
print("=== 场景2:库存充足 ===")
stock2 = "珍珠25、椰果16、芋圆12、脆波波15"
print(f"输入库存:{stock2}")
print(f"Agent输出:{inventory_agent(stock2)}\n")
# 场景3:库存数据格式错误
print("=== 场景3:格式错误 ===")
stock3 = "珍珠15个,椰果20,芋圆=8"
print(f"输入库存:{stock3}")
print(f"Agent输出:{inventory_agent(stock3)}")
2. 运行结果(符合预期)
=== 场景1:有需补货原料 ===
输入库存:珍珠12、椰果18、芋圆5、脆波波10
Agent输出:[{'material': '珍珠', 'current_stock': 12, 'threshold': 20, 'replenish_quantity': 28}, {'material': '芋圆', 'current_stock': 5, 'threshold': 10, 'replenish_quantity': 15}, {'material': '脆波波', 'current_stock': 10, 'threshold': 12, 'replenish_quantity': 14}]
=== 场景2:库存充足 ===
输入库存:珍珠25、椰果16、芋圆12、脆波波15
Agent输出:{'status': '所有原料库存充足'}
=== 场景3:格式错误 ===
输入库存:珍珠15个,椰果20,芋圆=8
Agent输出:{'error': '库存数据格式错误,请提供类似'珍珠15、椰果20'的格式'}
从结果可以看到,通过清晰的Prompt设计,Agent能正确处理不同场景,输出符合预期的结构化数据,完全满足后续执行模块的需求!
六、常见问题&避坑指南
1. Agent答非所问?
- 原因:角色不明确、指令太模糊;
- 解决:重新明确角色(比如"只处理订单,不回答无关问题"),分点列出具体指令,删除模糊表述。
2. Agent输出格式不对?
- 原因:格式要求不清晰,或没有示例;
- 解决:在Prompt中明确格式(比如"必须是JSON格式,字段包括XXX"),提供正确示例,同时用
response_format={"type": "json_object"}(OpenAI v1+支持)强制输出JSON。
3. Agent太啰嗦?
- 原因:没有限制输出长度;
- 解决:在Prompt中加入"回复不超过3句话""只输出JSON,不要额外文字",同时调小
temperature(比如0.1~0.3)。
4. Agent处理异常情况能力差?
- 原因:没有提前定义异常处理规则;
- 解决:在Prompt中明确列出可能的异常场景(如格式错误、无关输入、重复提问)和对应的处理方式。
5. 国产模型(通义千问、文心一言)不兼容?
- 原因:不同模型对Prompt的理解略有差异;
- 解决:国产模型更偏好"简洁直接的Prompt",减少不必要的装饰(如# 角色、# 指令的标题),直接用"你是XXX,需要做XXX,输出XXX格式"的句式。
七、总结:Prompt工程的核心是"清晰沟通"
其实Prompt工程没有那么神秘,核心就是"和LLM大脑清晰沟通"------告诉它"你是谁、要做什么、输出什么样子",它就能给你想要的结果。
对Agent开发来说,好的Prompt具备三个特点:
- 简单:不用复杂术语,分点列出核心信息;
- 明确:角色、指令、格式没有模糊地带;
- 可执行:LLM能根据Prompt一步步完成任务,不需要额外猜测。
记住:Prompt不是"写得越复杂越好",而是"写得越清晰越好" 。先用三要素和模板搞定基础需求,再用优化技巧解决细节问题,就能快速设计出有效的Agent思考指令。
如果你觉得这篇够通俗、模板够实用,欢迎点赞!
