基础提示和高级提示:微软生成式 AI 入门课第 4、5 课的边界
把 generative-ai-for-beginners 的第 4 课和第 5 课连着看一遍,很容易生出一个疑问:这两章讲的东西为什么这么像?04-prompt-engineering-fundamentals/README.md 里有 zero-shot、one-shot、few-shot,05-advanced-prompts/README.md 的技法清单里又出现了一遍 zero-shot prompting 和 few-shot prompting。既然技法名字都撞了,“基础”和”高级”的界到底划在哪?
我的答案不是从两章的文字里找的,而是从两章的目录结构里看出来的——这一层差异比正文里的技法清单诚实得多。
先看两章交付了什么代码
第 4 课的代码目录 04-prompt-engineering-fundamentals/python/ 下是三个 notebook:aoai-assignment.ipynb、oai-assignment.ipynb、githubmodels-assignment.ipynb。三个文件对应课程的三条 provider 路线,内容是同一套练习的三种接法。第 4 课 README 的 Learning Sandbox 一节写明,要跑这些练习需要 Azure OpenAI API key、Python 运行时和本地环境变量三样东西,Assignment 一节让你把仓库根目录的 .env.copy 复制成 .env,填 AZURE_OPENAI_API_KEY、AZURE_OPENAI_ENDPOINT、AZURE_OPENAI_DEPLOYMENT。
第 5 课的代码目录长得完全不一样。05-advanced-prompts/python/ 下只有 aoai-assignment.py 和 aoai-solution.py,另有一个 05-advanced-prompts/javascript/ 放着 assignment.js 和 solution.js。更值得注意的是:这两个 aoai- 开头的 Python 文件里没有任何 Azure OpenAI 客户端代码,aoai-assignment.py 从头到尾就是一个 Flask 应用,hello() 用 request.args.get('name', 'World') 取参数返回问候语。第 5 课 README 的 Assignment 写的是:用 GitHub Copilot 或 ChatGPT 这类 AI 助手,对这段代码施加 self-refine 技法。
也就是说,第 4 课的落点是你自己写代码调 API,第 5 课的落点是你在对话框里跟模型来回磨。前者需要一个真实 endpoint 和一份 .env,后者只需要你手边有个聊天助手。这是两课最硬的分工线,比”基础/高级”这组形容词有用得多。
技法为什么会撞名
回到重叠的问题。第 4 课把 zero-shot / one-shot / few-shot 放在 Primary Content 这一章下的 “Using Examples” 一节,跟它并列的是 Prompt Cues(用半句话把补全”带”到想要的格式上)和 Prompt Templates(带 {{variable}} 占位、可复用的提示配方),这一章之外还有一整节 Supporting Content 讲次要内容怎么影响输出。这些东西有一个共同点:全部作用在一次请求的输入里。你把示例、线索、模板、次要内容拼进那一段文本,请求发出去,就结束了。
第 5 课的技法清单是 zero-shot prompting、few-shot prompting、chain-of-thought、generated knowledge、least-to-most、self-refine、maieutic prompting。前几项仍然是单轮的:chain-of-thought 是在同一段提示里塞一个算好的相似例子(README 里那个例子是先给”Lisa has 7 apples…”的分步计算,再问 Alice 的那道题);generated knowledge 是把公司数据按模板填进提示;least-to-most 是让模型先把大问题拆成子步骤。但 self-refine 和 maieutic prompting 不是——它们的定义本身就是多个回合:self-refine 的流程是”提问 → 模型回答 → 你批评并要求改进 → 模型再答”,maieutic prompting 是”回答 → 逐部分追问解释 → 丢掉不一致的部分”,README 明说这两步可以反复重复。
所以这条边界可以这么用:技法名撞了不要紧,看它需不需要第二个回合。 你的场景如果是批处理、是一次 API 调用出结果、是没人在旁边看着的自动化管线,那第 4 课那一整套加上第 5 课的单轮部分就是你的全部工具;self-refine 和 maieutic 那两项要落地,你得自己把”批评—重答”这个循环写成代码,课程仓里这两课都没有给出对应的实现文件。
什么时候必须往上走
第 5 课 generated knowledge 那一节给了一个可以回源核对的失败例子,我觉得它比任何抽象论述都说明问题。README 先给出一版保险推荐的模板提示:先是 {{company}}、{{products_list}} 这样的占位模板,再给出一份变量被替换后的实例——公司名、一份按月计费的产品清单、外加 Budget: 与 Requirements: 两行;清单里每一项是”险种、档次、金额”的自由文本。结果模型把要求里的三个险种全推荐了,合计超出那一行写明的预算。README 直接承认这是提示需要优化的信号,改法是给每一项加上 type: 和 cost: 的字段名,并把最后一行改成:
Budget: $1000 restrict choice to types: Car, Home
这一行连同其中的数值原样来自课程正文的虚构示例,只是示例值,别当成什么参考基准。README 说明了这里起作用的是加上 type、cost 以及 restrict 这个关键词。
把这个例子和第 4 课 Best Practices 一节的那张表格放在一起看,会发现两章说的其实是同一件事的两个粒度。第 4 课那张表里有 “Be specific and clear”(把上下文、结果、长度、格式、风格都说细)和 “Separate instructions & context”(看你的模型或 provider 有没有定义分隔符,好让指令、主要内容、次要内容区分得更清楚)。第 5 课那个 type:/cost: 的改法,正是这两条建议落到一个具体模板上的样子。
于是升级的判据就有了:当你的提示已经是一个带变量的模板、而且填进去的数据本身有结构(字段、约束、可选项集合)的时候,第 4 课”写清楚一点”这个层次的建议就不够用了,你需要第 5 课那种把结构显式写进提示的做法——给字段命名、把可选范围用 restrict 这类词框死。反过来,如果你的提示还是一句自然语言问句,先老老实实把第 4 课的 cue、few-shot 例子、模板用完,跳过去做 maieutic 追问是浪费回合。
还有一条分工是关于错误类型的。第 4 课用 fabrication 这个词指代模型生成事实错误内容的现象,README 特意说明推荐用 fabrication 而不是”幻觉”,理由是后者容易把机器行为拟人化。它给的缓解手段偏输入侧:Best Practices 表里的 “Give the model an out”,即给模型一个”做不到时可以这么回”的兜底回答。第 5 课处理的是另一类问题——答案内部前后不一致,手段是 maieutic prompting 那套逐部分追问、发现矛盾就丢弃。你遇到的是”编了个不存在的东西”,往第 4 课找;遇到的是”每一段单看都对、合起来自相矛盾”,往第 5 课找。
采样参数:这条分岔最容易踩空
第 5 课的 Vary your output 一节讲 temperature,正文写的是取值在 0 到 1 之间、0 最确定 1 最多变、默认值 0.7。这是课程文档当前写下的默认值,随版本与所用模型可能变动,而且这一节还有一句限定:top-k、top-p、repetition penalty 等参数不在本课程范围内。
问题在于,第 4 课的 notebook 里你找不到这个参数。aoai-assignment.ipynb 里的 get_completion 是这样的:
def get_completion(prompt):
response = client.responses.create(
model=deployment,
input=prompt,
max_output_tokens=1024,
store=False,
)
return response.output_text
它走的是 client.responses.create,只有 max_output_tokens 和 store,没有 temperature(1024 是仓库示例里的取值)。oai-assignment.ipynb 的写法同样如此,区别只在客户端构造:前者用 OpenAI(api_key=..., base_url=...) 指向 Azure OpenAI 的 v1 端点,后者直接 OpenAI() 并把 deployment 写成 "gpt-5-mini"(示例值)。
三个 notebook 里唯一带采样参数的是 githubmodels-assignment.ipynb,它用的是 azure.ai.inference 的 ChatCompletionsClient,helper 的签名是 get_completion(prompt, client, model_name, temperature=1.0, max_tokens=1000, top_p=1.0),内部调 client.complete(...)。签名里这几个数是仓库当前代码写下的默认参数,随版本可能变动,也不代表你调用时会得到什么样的输出。文件里那行注释把原因写得很直白:temperature/top_p 需要非 reasoning 模型,gpt-5 会拒收,所以这里改用 Llama 模型。
这条路线还有个必须交代的状态:githubmodels- 这个前缀已经名不副实。 仓库多处写明 GitHub Models(连同它的 GITHUB_TOKEN 变量)在 2026 年 7 月底退役,直接替代者是 Microsoft Foundry Models——00-course-setup/02-setup-local.md 与 00-course-setup/03-providers.md 都有这句话。今天这个时间点已经过去了。.env.copy 里也确实看不到 GITHUB_TOKEN,这一栏现在是 AZURE_INFERENCE_ENDPOINT、AZURE_INFERENCE_CREDENTIAL,外加一个专门为 temperature 例子准备的 AZURE_INFERENCE_CHAT_MODEL,注释写明要填一个支持 temperature/top_p 的非 reasoning 模型。所以要跑第 4 课那个带采样参数的版本,你配的是 Foundry 项目的 endpoint 与 key,文件名只是历史残留。
06-text-generation-apps/README.md 把这层说得更完整:当前 Microsoft Foundry 上未废弃的是 reasoning 模型(GPT-5 家族、o 系列),它们不支持 temperature / top_p,也不支持 max_tokens,要改用 max_output_tokens,传了会收到参数不支持的报错。
把这几处放在一起,第 5 课那一节的适用范围就清楚了:它成立的前提是你用的模型还吃采样参数。 如果你手上是 reasoning 模型,“调低 temperature 让输出更确定”这条路径直接不通,你只能回到提示层——用第 4 课的模板、cue、显式格式约束,用第 5 课的 chain-of-thought 和 least-to-most 把过程钉死。这不是哪一章讲错了,是课程正文和 .env.copy 注释处在不同的时间切面上,读的时候要自己对齐。
环境这一层的差别
第 4 课的练习必须有一个能收请求的 endpoint 才能执行,.env 得填对;第 5 课的作业不需要。如果你不想接云端,00-course-setup/03-providers.md 列了 Foundry Local 这条完全离线的路线,安装命令 Windows 侧是 winget install Microsoft.FoundryLocal,macOS 侧是 brew install microsoft/foundrylocal/foundrylocal,文档说明它暴露的是 OpenAI 兼容端点。需要提醒的是,第 4 课的练习会把你的提示文本发到云端服务,涉及计费与数据出站,密钥和数据边界得自己评估。
有一个维度我不打算比:这两课都没有给出把提示改动纳入回归验证的方法。第 5 课只写了”不该盲目相信模型,应该始终验证输出”,第 4 课 Prompt Engineering Mindset 里也只说要迭代与验证、把心得沉淀成 prompt library。怎么把这件事做成可重复的流程,我们在这两章里没有找到对应说明,所以不比。
一条可以照着走的决策路径
- 提示还是一句自然语言问句:留在第 4 课,先把 primary content、few-shot 例子、cue、模板依次试完。
- 提示已经是带
{{variable}}的模板、填进去的是结构化数据:往第 5 课的 generated knowledge 走,给字段命名、用restrict这类词把可选范围框死。 - 问题是”编造了不存在的东西”:第 4 课的 “Give the model an out”。
- 问题是”答案自相矛盾”:第 5 课的 maieutic prompting,但要接受多回合成本。
- 场景是一次调用出结果、没有人在环:self-refine 和 maieutic 需要你自己实现循环,这两课没有给实现文件。
- 想靠 temperature 稳住输出:先确认模型吃不吃这个参数,reasoning 模型不吃。
上面涉及的代码片段均原样来自仓库文件,未经实测,以仓库最新代码为准。课程持续更新,文件路径与接口写法都可能变。
本文依据 github.com/microsoft/generative-ai-for-beginners 仓库于 2026-08-18 的公开内容整理,
事实来自仓库内的课程正文与代码示例。我们没有跑过文中涉及的代码,
因此不涉及运行结果、耗时与生成质量的任何描述。
该课程持续更新,文中涉及的文件路径、依赖与接口写法随版本变动,请以仓库最新内容为准。
文中涉及的云端服务调用会产生费用并可能上传数据,请自行评估密钥与数据边界。
本文对照的是同一项目内的两种用法,依据均为上述仓库内容,不对两种用法做优劣排名, 选型结论只在仓库文档写明的能力边界内成立。 安全与合规相关做法请结合自身环境评估,本文不构成安全方案建议。