generative-ai-for-beginners 高级提示词工程实战:七大核心技术、温度调参与自优化工作流
【免费下载链接】generative-ai-for-beginners21 Lessons, Get Started Building with Generative AI项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai-for-beginners
本篇文章基于 generative-ai-for-beginners 课程第 5 课《Creating Advanced Prompts》编写,深入讲解从"会写提示词"到"理解提示词为什么更优"的进阶路径,覆盖 zero-shot、few-shot、chain-of-thought、generated knowledge、least-to-most、self-refine、maieutic 七大提示词技术,以及如何通过 temperature 等参数控制输出的确定性与多样性。读者学完后,将能够针对任意 LLM 构造高质量提示词,并掌握一套可复用的"构造—验证—优化"迭代方法论。
1. 从基础提示词到工程化思维
上一课(第 4 课 04-prompt-engineering-fundamentals)给出了提示词工程的核心定义:
提示词工程(Prompt Engineering)是通过提供更有用的指令或上下文,引导模型产生更相关回答的过程。
在此基础上,写提示词包含两个步骤:构造(constructing)——提供相关上下文搭好提示词骨架;优化(optimization)——逐步改进提示词以获得期望结果。本课不再停留在"能写出提示词",而是回答"为什么一个提示词优于另一个",并给出可套用到任何 LLM 的基础技术集合。
1.1 一个看似简单实则丰富的例子
生成 10 道地理题。
这个单行提示词其实已经隐式应用了两类技术:
- 上下文(Context):限定了主题是"地理";
- 限制输出(Limiting the output):明确要求不超过 10 道题。
1.2 简单提示词的局限
即使如此,你可能仍得不到想要的结果,原因有两个:
- 主题过大:你无法确定生成的是国家、首都还是河流相关的问题;
- 格式不可控:如果你希望问题按特定格式呈现,单靠这句话无从约束。
这正是提示词工程的价值所在——好的提示词需要在上下文、格式、范围等多个维度上精确表达意图。
2. 七大提示词核心技术
首先需要建立一个认知:提示词能力是 LLM 的涌现属性(emergent property),它不是模型内置的功能特性,而是我们在使用模型过程中"发现"出来并加以利用的能力。下面按从基础到进阶的顺序逐一展开。
2.1 Zero-shot prompting(零样本提示)
这是最基础的提示形式:单个提示词,完全依赖 LLM 的训练数据作答,不提供任何示例。
- 提示词:"什么是代数?"
- 回答:"代数是数学的一个分支,研究数学符号及操作这些符号的规则。"
适合开放式问答、概念解释等场景,是入门 LLM 时最常使用的技巧。
2.2 Few-shot prompting(少样本提示)
在请求之外附带 1 个或多个示例,用示例给 LLM 提供期望输出的上下文、格式或风格:
- 提示词:"用莎士比亚的风格写一首诗。以下是几首莎士比亚体十四行诗示例: 第 18 首:'我可否将你比作夏日?你比它更可爱也更温婉……' 第 116 首:'让我承认,两颗真心的结合,容不得任何阻碍……' 第 132 首:'我爱你的眼睛,它们怜悯着我……' 现在,写一首关于月亮之美的十四行诗。"
- 回答:"月亮在天空柔柔地发光,银色的光芒洒下温婉的恩泽……"
示例的作用是让模型理解具体任务,从而生成更准确、更相关的响应——尤其适合风格模仿、格式固定类任务。
2.3 Chain-of-thought(思维链)
思维链的核心是带着 LLM 走一系列步骤,教会它"怎么做"。先看一个反例:
- 提示词:"爱丽丝有 5 个苹果,扔掉 3 个,给鲍勃 2 个,鲍勃又还回 1 个,爱丽丝还剩几个苹果?"
- 回答:5(错误)
正确答案是 1(5 − 3 − 2 + 1 = 1),但 LLM 直接"跳步"给出了错误结果。应用思维链需要三步:
- 给 LLM 一个相似示例;
- 展示计算过程,教它如何正确计算;
- 再给出原始问题。
- 提示词:"丽莎有 7 个苹果,扔掉 1 个,给巴特 4 个,巴特还回 1 个: 7 − 1 = 6 6 − 4 = 2 2 + 1 = 3 爱丽丝有 5 个苹果,扔掉 3 个,给鲍勃 2 个,鲍勃还回 1 个,爱丽丝还剩几个苹果?"
- 回答:1
注意提示词显著变长——多了一个示例、一段计算过程,再加原始问题,最终得到正确结果。思维链适用于需要多步推理的任务(算术、逻辑、规划等),是提升准确率非常有效的技术。
2.4 Generated knowledge(生成知识注入)
很多时候我们希望提示词的一部分来自公司数据、另一部分是具体诉求。典型做法是使用模板 + 变量占位符:
{{company}}: {{company_name}} {{products}}: {{products_list}} Please suggest an insurance given the following budget and requirements: Budget: {{budget}} Requirements: {{requirements}}模板中的{{variable}}由公司 API 提供的真实数据替换。例如填入保险业务数据后:
Insurance company: ACME Insurance Insurance products (cost per month): - Car, cheap, 500 USD - Car, expensive, 1100 USD - Home, cheap, 600 USD - Home, expensive, 1200 USD - Life, cheap, 100 USD Please suggest an insurance given the following budget and requirements: Budget: $1000 Requirements: Car, Home, and Life insurance模型输出:
Given the budget and requirements, we suggest the following insurance package from ACME Insurance: - Car, cheap, 500 USD - Home, cheap, 600 USD - Life, cheap, 100 USD Total cost: $1,200 USD问题来了:它把不需要的 Life 保险也推荐进来了。经过反复试错(trial and error),优化后的提示词为:
Insurance company: ACME Insurance Insurance products (cost per month): - type: Car, cheap, cost: 500 USD - type: Car, expensive, cost: 1100 USD - type: Home, cheap, cost: 600 USD - type: Home, expensive, cost: 1200 USD - type: Life, cheap, cost: 100 USD Please suggest an insurance given the following budget and requirements: Budget: $1000 restrict choice to types: Car, Home这次输出:
Given the budget and requirements, we suggest the Car, Cheap insurance product which costs 500 USD per month.关键改动有两处:一是为每个条目显式标注type与cost字段,二是使用restrict关键字明确约束可选范围。这个例子的核心启示是:即使使用了基础技术,多数情况下仍要持续优化提示词才能得到期望结果。
2.5 Least-to-most(由易到难分解)
思路与思维链类似但更偏"分治":把大问题拆成一系列子问题,再按顺序逐一求解,帮助 LLM "征服"大问题。数据科学场景示例:
提示词:如何用 5 个步骤完成数据科学?
回答:
- 收集数据
- 清洗数据
- 分析数据
- 绘制数据
- 呈现数据
适合复杂任务拆分、多阶段流水线等场景。
2.6 Self-refine(自我精炼:批判式迭代)
对生成式 AI 的输出不能盲目信任——LLM 只是输出"下一个最可能说的词",不代表"正确"。因此让 LLM 自我批判是很好的实践。流程:
- 初始提示词,要求 LLM 解决问题;
- LLM 作答;
- 你对答案提出批评,要求 AI 改进;
- LLM 参考批评再次作答,给出改进后的方案。
该过程可按需反复循环。示例:
提示词:"创建一个包含 products 和 customers 路由的 Python Web API"
AI 初版回答:
import flask app = Flask(__name__) @app.route('/products') def products(): return 'Products' @app.route('/customers') def customers(): return 'Customers'提示词:"针对上述代码提出 3 处改进建议"
AI 的批评意见:
Sure, here are three suggestions to improve the code: Import the correct module: The first line should import Flask instead of flask. The correct import statement should be from flask import Flask. Add a main function: Add a if __name__ == '__main__': block to the end of the file to run the application when the file is executed. Use f-strings: Use f-strings to format the return statements in the route functions. For example, return 'Products' can be changed to return f'This is the {request.path} page'.改进后的代码:
from flask import Flask, request app = Flask(__name__) @app.route('/products') def products(): return f'This is the {request.path} page' @app.route('/customers') def customers(): return f'This is the {request.path} page' if __name__ == '__main__': app.run()可以看到,正是"批判第一次回答"这一步,让第二轮输出质量显著提升。
2.7 Maieutic prompting(产婆术式提问)
与 self-refine 相似,但更强调"让 LLM 解释自己",通过逐层追问消除输出中的不一致,确保它抵达正确结论。工作流:
- 请 LLM 回答一个问题;
- 对答案的每一部分,要求 LLM 更深入地解释;
- 若发现不一致,丢弃不一致的部分;
- 重复第 2、3 步,直到遍历所有部分且对答案满意。
示例:
提示词:如何用 5 个步骤制定缓解疫情的危机预案?
1. Identify the risks 1. Identify the stakeholders 1. Identify the resources 1. Identify the actions 1. Identify the communication channels5 个步骤已给出,但我们无法确定是否正确,于是要求逐项深挖:
提示词:详细解释第一步,疫情中具体有哪些风险?
The risks are the following: - Loss of life - Loss of business - Loss of reputation - Loss of customers - Loss of employees提示词:疫情中最大的风险是什么,为什么?
The biggest risk is loss of life because it's the most important thing to protect.提示词:疫情中最大的两个风险是什么?
The two biggest risks are loss of life and loss of business.此时 LLM 的回答保持一致,始终把"生命"和"业务"列为前两大风险,我们可以带着较高信心进入下一步。但务必牢记:不要盲目信任 LLM,任何输出都应经过验证。
3. 控制输出的确定性与多样性
LLM 天然是非确定性的(nondeterministic):同一提示词反复运行会得到不同结果。例如反复运行提示词"为 Python Web API 生成代码",两次输出可能差异巨大——第一次生成一个简单的/api接口,第二次则生成了一个带书籍数据列表、多路由的完整 Books API。
那么输出多样化是问题吗?取决于目标:如果你需要特定响应,它是问题;如果你只想要"生成任意 3 道地理题"这类多样化结果,则完全不是问题。
3.1 temperature:确定性与多样性的调节旋钮
temperature 是介于 0 与 1 之间的数值:0 最确定(deterministic),1 最多样(varied),默认值为 0.7。文档用"生成 Python Web API 代码"做了对照实验:
- temperature = 0.1时两次运行,输出仅在函数命名、注释措辞上有细微差异,结构几乎一致;
- temperature = 0.9时两次运行,输出从极简接口到完整的 Books API(含数据列表、
/api/v1/resources/books/all、/api/v1/resources/books多路由),结果千差万别。
在仓库中可以找到实际调用 temperature 参数的示例:例如 06-text-generation-apps/python/aoai-app-recipe.py 中,首轮生成菜谱使用temperature=0.1控制质量,第二轮生成购物清单时进一步降到temperature=0以获得更确定的输出;而 06-text-generation-apps/python/githubmodels-app.py 展示了temperature=1.、top_p=1.等参数与max_tokens=1000的完整组合用法。这印证了课程的核心观点:在需要稳定、可复现输出的生产场景(如购物清单、格式化结果)应压低 temperature,而在创意生成场景可调高。
注:除 temperature 外,还有 top-k、top-p、repetition penalty(重复惩罚)、length penalty(长度惩罚)、diversity penalty(多样性惩罚)等参数可以调整输出,但超出本课程范围。
4. 提示词良好实践清单
除了上述技术,编写提示词时还应遵循以下实践:
- 指定上下文(Specify context):上下文至关重要,能多具体就多具体(领域、主题等),信息越多效果越好;
- 限制输出(Limit the output):若需要特定数量的条目或特定长度,务必显式说明;
- 同时指定"做什么"和"怎么做":例如"创建一个包含 products 和 customers 路由的 Python Web API,拆分为 3 个文件";
- 使用模板(Use templates):当需要用公司数据丰富提示词时,用
{{variable}}占位符模板再以真实数据替换,这也是 generated knowledge 技术的工程化落地方式; - 拼写正确(Spell correctly):LLM 可能给出正确回答,但输入拼写正确往往能得到更好的响应。
5. 动手实践:Assignment 与源码级参考
本课的实战任务是把 self-refine 技术应用到一段真实的 Flask 代码上。课程给出的初始代码如下:
from flask import Flask, request app = Flask(__name__) @app.route('/') def hello(): name = request.args.get('name', 'World') return f'Hello, {name}!' if __name__ == '__main__': app.run()任务要求:使用 GitHub Copilot 或 ChatGPT 之类的 AI 助手,运用 self-refine 技术改进这段代码。建议先把改进方向(如架构、性能、安全性)和数量(如"3 处改进")写进提示词,效果通常更好——这正是 05-advanced-prompts/README.md 中的 TIP 提示。
仓库提供了可对照的参考实现:
- 05-advanced-prompts/python/aoai-assignment.py 是任务初始代码;05-advanced-prompts/python/aoai-solution.py 是应用 self-refine 后的示例解答,可以看到它围绕"安全性"这一明确方向迭代:从环境变量加载
SECRET_KEY取代硬编码、引入 Flask-WTF 表单做输入校验、用markupsafe.escape防 XSS、用@app.errorhandler(400)处理异常——完美展示了"限定改进方向 + 限定数量"的提示策略如何产出高质量代码; - 05-advanced-prompts/javascript/assignment.js 与 05-advanced-prompts/javascript/solution.js 则展示了 JS/Express 版本的完整 self-refine 过程:从"CommonJS 转 ES module、去掉未用参数、优化日志文案"到"环境变量管理密钥、express-validator 输入校验、HTTPS 加密传输"两轮迭代,其中自签名证书还可用
openssl req -nodes -new -x509 -keyout server.key -out server.cert生成。
知识自测
为什么使用 chain-of-thought 提示词?(1 个正确、2 个错误选项)
- 教会 LLM 如何解决问题。✅
- 教会 LLM 在代码中找错误。
- 指导 LLM 提出不同解决方案。
正确答案是 1:思维链的本质是向 LLM 展示"如何通过一系列步骤解决问题",并附上同类问题的解法示例。
延伸挑战
完成 Assignment 后,把你构建的任何程序拿出来,想清楚希望应用哪些改进,再使用 self-refine 技术落地这些改动,并对比改进前后结果的好坏。这个循环本身就是在训练你"构造—批判—再构造"的提示词肌肉记忆。
6. 本章小结与下一步
本课把提示词工程从"经验直觉"提升为"技术体系":seven 大技术各有适用场景——零样本适合开放问答、少样本适合风格与格式固定、思维链适合多步推理、生成知识适合企业数据注入、由易到难适合复杂任务拆分、自我精炼与产婆术式提问则承担"验证与纠错"职责;temperature 则让我们在确定性与多样性之间自由调节。下一课将把这些提示词知识落地到真实应用中——在 06-text-generation-apps 中构建文本生成应用。
【免费下载链接】generative-ai-for-beginners21 Lessons, Get Started Building with Generative AI项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai-for-beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考