【Agent从入门到实践】21 Prompt工程基础:为Agent设计“思考指令”,简单有效即可

文章目录

目前国内还是很缺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具备三个特点:

  1. 简单:不用复杂术语,分点列出核心信息;
  2. 明确:角色、指令、格式没有模糊地带;
  3. 可执行:LLM能根据Prompt一步步完成任务,不需要额外猜测。

记住:Prompt不是"写得越复杂越好",而是"写得越清晰越好" 。先用三要素和模板搞定基础需求,再用优化技巧解决细节问题,就能快速设计出有效的Agent思考指令。


如果你觉得这篇够通俗、模板够实用,欢迎点赞!

相关推荐
2501_941322032 小时前
铆钉表面缺陷检测:YOLO13-BiFPN模型实现与性能优化_1
python
式5162 小时前
大模型学习基础(九)LoRA微调原理
人工智能·深度学习·学习
CCPC不拿奖不改名2 小时前
python基础面试编程题汇总+个人练习(入门+结构+函数+面向对象编程)--需要自取
开发语言·人工智能·python·学习·自然语言处理·面试·职场和发展
菜鸟‍2 小时前
【论文学习】一种用于医学图像分割单源域泛化的混合双增强约束框架 || 视觉 Transformer 在通用图像分割中的 “缺失环节”
人工智能·深度学习·计算机视觉
五度易链-区域产业数字化管理平台2 小时前
数观丨2026年半导体集成电路产业融资分析
大数据·人工智能
应用市场2 小时前
机器学习中的正向反馈循环:从原理到实战应用
人工智能·深度学习·机器学习
我送炭你添花2 小时前
Pelco KBD300A 模拟器:10.报警联动规则编辑与执行
python·自动化·运维开发
Allen正心正念20252 小时前
GGUF/GPTQ/AWQ模型对比
人工智能
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-知识点管理模块完整优化方案
java·前端·人工智能·spring boot