整理自 2026-07-20 学习记录。
一、W2 套路全景(复习用,大白话)
W2 学"怎么跟 AI 说话它才答得对"(Prompt 工程),从简单到高级:
|---------------|------------------------|----------------|
| 套路 | 干啥 | 类比 |
| ① 身份锁 | 先告诉模型你是谁、按啥格式答,防乱答/防注入 | 发岗位说明书 |
| ② few-shot 示范 | 给几个"示例对"让它照葫芦画瓢 | 照葫芦画瓢 |
| ③ CoT 一步步思考 | 命令它"请一步步思考",过程写出来才对 | 考试写步骤 |
| ④ 自我批判/一致性 | 写完了自己验算 / 问5次取多数冲掉错误 | 自己检查 / 找5人投票 |
| ⑤ ReAct 边想边做 | 思考→行动→观察循环 | 先想查啥→去查→看结果→再想 |
| ⑥ 模板库 | 把每套提示词存成命名变量,换任务只改一处 | 常用话术存快捷回复 |
import requests
API_KEY = "你的key"
url = "https://open.bigmodel.cn/api/paas/v4/chat/completions"
headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
system_prompt = """【Role】... """
data = {
"model": "glm-4-flash",
"messages": [
{"role": "system", "content": system_prompt},
{"role": "user", "content": "..."},
]
}
resp = requests.post(url, headers=headers, json=data)
print(resp.json()["choices"][0]["message"]["content"])
few-shot 范例就放在 system 之后、真实 user 之前,交替 user/assistant(占位空壳填好后的样子)。
三、模板库 = 把 system_prompt 拆成多份变量(平铺版,不封装也行)
system_classify = """【Role】分类器
【Task】判断评论情感
【Format】只输出 正面/负面/中性"""
system_cot = """【Role】数学助教
【Task】解应用题
【Format】思考:...
答案:...(一步一步写)"""
system_prompt = system_classify # 换场景就改这一行
# 下面发送骨架一字不变 ...
模板库对你 = 几个
system_xxx变量 + 切换时改一行。没有函数、没有字典也能用。
四、函数封装 ask(分三层)
层 1:只封装"发送并取回复"
def ask(question):
data = {
"model": "glm-4-flash",
"messages": [
{"role": "system", "content": system_prompt},
{"role": "user", "content": question},
]
}
resp = requests.post(url, headers=headers, json=data)
return resp.json()["choices"][0]["message"]["content"]
print(ask("味道不错")) # "味道不错"作为 question 传进去
def定义函数;question是形参,接收外部传入的值;return把结果交出来。- ⚠️
ask("味道不错")双引号里是传进去的问题 ,不是输出;真正输出是return回来的模型回答,靠print显示。
层 2:模板也变成参数
def ask(question, sys_prompt):
data = {
"model": "glm-4-flash",
"messages": [
{"role": "system", "content": sys_prompt}, # 用传进来的模板
{"role": "user", "content": question},
]
}
resp = requests.post(url, headers=headers, json=data)
return resp.json()["choices"][0]["message"]["content"]
print(ask("味道不错", system_classify))
print(ask("小明爸38岁,小明比爸小30岁,小明几岁?", system_cot))
sys_prompt是空槽 ,从外部system_classify/system_cot递进去,函数内部不写死任何模板、没有字典。
层 3:few-shot 范例做成可选参数
def ask(question, sys_prompt, shots=None):
messages = [{"role": "system", "content": sys_prompt}]
if shots: # 只有传了范例才拼
for role, txt in shots:
messages.append({"role": role, "content": txt})
messages.append({"role": "user", "content": question})
data = {"model": "glm-4-flash", "messages": messages}
resp = requests.post(url, headers=headers, json=data)
return resp.json()["choices"][0]["message"]["content"]
# 不用范例
print(ask("小明爸38岁,小明比爸小30岁,小明几岁?", system_cot))
# 用范例:shots 里放示例对(user 问 / assistant 答 交替)
shots = [("user", "苹果是水果吗"), ("assistant", "是,水果")]
print(ask("橘子是水果吗", system_cot, shots))
shots=None:默认没范例;if shots:只有传了才拼;shots每项(role, txt)循环变成{"role":角色,"content":文本}。- 不传 shots 写
ask(问题, 模板)即可,因为 shots 有默认值 None。
五、今日错误(复盘用)
- 传进去 vs 输出 :调用括号里的是"传入的问题",
return+print才是"输出答案"。 - sys_prompt 不是写死/不是字典 :是空槽,从外部递进去;早期 D6 用过
TEMPLATES字典,后为好记已改回平铺变量。 - 模板库不强制函数 :平铺
system_xxx变量 + 改一行system_prompt也能用,函数只是省重复。