复习总结:把之前的所有 prompt 套路封装成可切换模板的 ask 函数

整理自 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

五、今日错误(复盘用)

  1. 传进去 vs 输出 :调用括号里的是"传入的问题",return+print 才是"输出答案"。
  2. sys_prompt 不是写死/不是字典 :是空槽,从外部递进去;早期 D6 用过 TEMPLATES 字典,后为好记已改回平铺变量。
  3. 模板库不强制函数 :平铺 system_xxx 变量 + 改一行 system_prompt 也能用,函数只是省重复。
相关推荐
BUG研究员_3 分钟前
工具绑定与调用
python·agent
苏灿烤鱼4 分钟前
AI Agent 深拆 | 图能让 AI 决策可追责吗?Semantica 登顶拆解
python·github·agent
Sirius.z8 小时前
第R6周:LSTM实现糖尿病探索与预测
python
名字还没想好☜8 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
·薯条大王9 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
Dxy123931021610 小时前
Python 如何使用 MySQL 的事务
python·mysql
今儿敲了吗14 小时前
Python ——第三方包
笔记·python
麒麟水手14 小时前
国产银河麒麟系统开发实录:跑通Streamlit,我踩过的6个坑
python
麒麟水手14 小时前
麒麟系统部署检查清单:上线前30分钟,逐项自查这4类问题
python
用户03321266636715 小时前
使用 Python 在 PDF 中添加或删除数字签名
python