AI Agent 学习笔记(一):Prompt 工程,让大模型听话

AI Agent 学习笔记(一):Prompt 工程,让大模型听话

上一篇我们认识了 Agent。这篇开始学第一块砖:Prompt(提示词)。学完你会明白:为什么同样一个模型,有人用得像个专家,有人用起来像个杠精。

一. Prompt 是什么

Prompt 就是你发给大模型的所有文字,包括指令、问题、背景信息、示例、格式要求等。

大模型的能力上限是固定的,但能不能发挥出来,全靠 Prompt。就像同一个员工,拿到一份写清楚的“工作说明书”和拿到一句“你看着办”,产出天差地别。

Prompt 工程(提示词工程)就是研究:怎么组织文字,让模型稳定、准确地输出我们想要的结果

二. 先搞懂 messages 的结构

调用大模型 API 时,消息是一个数组,最常见的三种角色:

role 含义 谁写的 例子
system 系统提示词:定义模型的身份、规则、能力边界 开发者 “你是一个严谨的数学老师”
user 用户消息:本轮要解决的问题 用户 “请解这道题:3x+2=11”
assistant 模型回复(历史对话) 模型 “x=3”
1
2
3
4
messages = [
{"role": "system", "content": "你是博客网站的写作助手,只输出简体中文。"},
{"role": "user", "content": "帮我写一段 50 字的文章简介。"},
]

初学者最容易犯的错:把所有要求全塞进 user 消息。正确做法是——身份和长期规则放 system,临时任务放 user

三. 写好 Prompt 的四条黄金法则

3.1 法则一:角色设定(Role)

先告诉模型“你是谁”,它就会按照这个角色的语言风格和知识范围来回答。

1
2
3
❌ 差:请帮我检查这段代码有没有问题。
✅ 好:你是一位有 10 年经验的 Python 代码审查专家,请审查下面的代码,
指出:1. 潜在的 bug;2. 安全隐患;3. 改进建议。用列表输出。

3.2 法则二:指令要具体、可执行

模糊的指令得到模糊的结果。把“好一点”“详细一点”翻译成可量化的要求。

模糊指令 具体指令
写个介绍 写 3 段、每段不超过 60 字、开头点明主题
解释一下 先给一句话定义,再举 1 个生活例子,最后总结要点
翻译一下 翻译成英文,保留 Markdown 格式,术语加粗

3.3 法则三:给示例(Few-shot)

模型是“模仿大师”。给它 1~3 个输入输出示例,它就知道你要什么格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
请把用户评论分类为:好评 / 中评 / 差评。只输出分类结果。

示例1:
评论:物流快得离谱,包装也结实!
输出:好评

示例2:
评论:一般般吧,没有惊喜也没有失望。
输出:中评

现在分类:
评论:客服态度差,等了两小时没人理。
输出:

3.4 法则四:规定输出格式

尤其是做 Agent 开发,模型输出要被程序解析,格式必须稳定。最常用的是 JSON

1
2
3
4
5
请把下面这段新闻提取成 JSON,字段如下:
{"title": "标题", "date": "日期(YYYY-MM-DD)", "keywords": ["关键词1", "关键词2"]}
只输出 JSON,不要输出其他任何文字。

新闻:2025年8月,某开源社区发布了新一代智能体开发框架……

四. 进阶技巧:思维链(CoT)

复杂问题直接问,模型容易“跳步出错”。思维链(Chain of Thought) 就是让模型把推理过程一步步写出来。

4.1 两种触发方式

1
2
3
4
5
6
7
8
9
10
方式一:直接要求(零样本 CoT)
请一步步思考,再给出答案。

方式二:给推理示例(Few-shot CoT)
示例:
问:小明有 3 个苹果,又买了 2 袋,每袋 4 个,一共几个?
答:先算买的:2×4=8;再加上原来的:3+8=11。所以一共 11 个。

问:一本书 240 页,每天看 30 页,看了 3 天后还剩多少页?
答:

4.2 在 Agent 里的用法:让模型“先想再说”

很多 Agent 框架在 Prompt 里会写这样的规则:

1
2
3
4
5
你的工作方式是:
1. 先分析用户需求,用 <thought> 标签写出你的思考;
2. 决定需要调用哪个工具(如果需要);
3. 根据工具结果继续思考;
4. 最后给出对用户的回答。

这样模型就不会一上来乱答,而是像人一样“想清楚再做”。(ReAct 论文中的经典模式,后面 Tool 篇还会细讲。)

五. 结构化输出:让程序能稳定解析

做 Agent 时,模型输出要给代码用,所以JSON 格式比 Markdown 更可靠

5.1 用 API 强制 JSON 输出

OpenAI 兼容接口支持 response_format

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from openai import OpenAI

client = OpenAI()

resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "你只输出 JSON。"},
{"role": "user", "content": "提取下面句子的地点和时间:明天下午3点在北京开会"},
],
response_format={"type": "json_object"},
)

import json
data = json.loads(resp.choices[0].message.content)
print(data) # {"地点": "北京", "时间": "明天下午3点"}

5.2 解析失败时的兜底

模型偶尔会多输出几个字,解析要容错:

1
2
3
4
5
6
7
8
9
10
11
12
13
import json
import re

def safe_json(text: str) -> dict:
"""从模型输出里尽可能提取出 JSON"""
text = text.strip()
# 去掉 ```json ... ``` 包裹
m = re.search(r"```json\s*([\s\S]*?)\s*```", text)
if m:
text = m.group(1)
# 找到第一个 { 到最后一个 }
start, end = text.find("{"), text.rfind("}")
return json.loads(text[start:end + 1])

六. 提示词模板化(工程化的关键)

真实项目中,Prompt 不是手打的,而是模板 + 变量拼出来的。

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
SYSTEM_PROMPT_TEMPLATE = """你是一位{role}。
你的风格:{style}
你的限制:{constraints}
"""

USER_PROMPT_TEMPLATE = """请完成以下任务:
任务:{task}
背景资料:{context}
输出格式:{output_format}
"""

def build_messages(role, task, context, output_format):
system = SYSTEM_PROMPT_TEMPLATE.format(
role=role, style="简洁专业", constraints="不要编造数据,不知道就说不知道"
)
user = USER_PROMPT_TEMPLATE.format(
task=task, context=context, output_format=output_format
)
return [
{"role": "system", "content": system},
{"role": "user", "content": user},
]

messages = build_messages(
role="数据分析师",
task="分析下面这段销售数据的趋势",
context="1月销量100,2月150,3月120",
output_format="用 3 句话总结,输出 JSON:{\"trend\": \"上升/下降/波动\", \"reason\": \"原因\"}",
)

注意:Python 的 .format() 遇到 Prompt 里的大括号(比如 JSON 示例)会报错,可以用 {{ 转义成字面大括号,或者改用 f-string / 占位符替换(replace),更省心的是用 string.Template 或 Jinja2。

七. 一套可以直接抄的 Agent 系统提示词模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 角色
你是一个 AI 助手,名字叫{name},服务于{scene}场景。

# 任务
你的任务是{task}。

# 工作流程
1. 理解用户意图;
2. 如果任务需要实时数据或外部操作,调用对应工具;
3. 如果信息不足,明确向用户提问,不要瞎猜;
4. 给出最终回答。

# 规则
- 始终使用{language}回答;
- 不知道的事情直接说“不知道”,禁止编造;
- 涉及{forbidden_topics}时拒绝回答并说明原因;
- 回答要简洁,优先使用列表。

# 输出格式
- 普通回答:Markdown;
- 结构化数据:只输出 JSON。

# 示例
(这里放 2~3 个典型问答示例)

八. 常见错误清单

错误 后果 正确做法
Prompt 太短太模糊 输出不可控 写清角色、任务、格式
要求互相矛盾 模型随机应变 规则去重、排序
一次问太多问题 回答漏项 拆成多轮或列出清单
没有给示例 格式跑偏 Few-shot 给 1~3 个例子
用词歧义 理解偏差 用具体数字、明确动词
格式要求写在最后一句 模型容易忽略 单独一段强调,或用 response_format
中文夹英文标点 解析出错 统一中文标点或显式说明

九. 小结与作业

小结

  1. Prompt 决定模型能力的发挥;身份放 system,任务放 user;
  2. 四条黄金法则:角色设定、指令具体、给示例、规定格式;
  3. 复杂问题用思维链(CoT)让模型逐步推理;
  4. Agent 项目里要用模板管理 Prompt,用 JSON 结构化输出。

作业

  1. 写一个“Python 导师”系统提示词,要求它:先给思路、再给代码、最后布置练习;
  2. 用 Few-shot 让模型把句子分成“事实 / 观点 / 行动”三类,并输出 JSON;
  3. 把 5.1 的模板改成用 replace 占位符实现,避免花括号冲突。

下一篇:Memory 记忆——让 Agent 记住聊过什么、知道什么。