
generative-ai-for-beginners 提示工程基础:从分词、指令调优到 Prompt 设计最佳实践【免费下载链接】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课程第 4 课「Prompt Engineering Fundamentals」(爱沙尼亚语版译本,英文原版见 04-prompt-engineering-fundamentals/README.md) 整理扩充。你将系统理解 LLM 是如何看见提示词的(分词)、基础模型与指令调优模型的行为差异,以及 zero-shot / few-shot、cues、模板等 Prompt 构造技术,并掌握 OpenAI 与 Azure OpenAI 官方推荐的最佳实践清单。读完本文并配合仓库自带的 Jupyter Notebook 沙箱,你就能独立完成设计—实验—验证式的提示工程闭环。课程定位与学习目标生成式 AI 能够响应用户请求创建新内容(文本、图片、音频、代码等),其底层依赖经过自然语言与代码训练的大语言模型(LLM),例如 OpenAI 的 GPT 系列。用户如今可以通过熟悉的对话范式与模型交互:发送一段文本输入(prompt),收到 AI 的输出(completion),再在多轮对话中不断修正 prompt,直到结果符合预期。Prompt 正在成为生成式 AI 应用的主要编程接口——它告诉模型该做什么,并直接影响返回结果的质量。提示工程(Prompt Engineering)作为一个快速增长的研究领域,聚焦于 prompt 的设计与优化,以在规模化场景下交付稳定、高质量的回答。本课的核心术语定义:术语定义提示工程(Prompt Engineering)设计与打磨输入(prompt),引导 AI 模型产生期望输出的实践分词(Tokenization)将文本转换为更小的单元(token)的过程,模型以 token 为单位理解和处理文本指令调优 LLM(Instruction-Tuned LLMs)在特定指令上进一步微调的大语言模型,用于提升回答的准确性与相关性课程结束时,你应当能够:解释什么是提示工程以及它为何重要;描述 prompt 的各个组成部分及其用法;掌握提示工程的最佳原则与技术;使用 OpenAI 端点将所学技术应用到真实示例中。学习沙箱:动手实验环境提示工程目前三分科学,七分艺术。提升直觉最好的方式是多练习,采用试验-错误(trial-and-error)方法,把应用领域专业知识与推荐技术、模型特定优化结合起来。本仓库为第 4 课配套了 Jupyter Notebook 沙箱环境,可在课程对应目录下找到三个提供商版本的练习本:translations/et/04-prompt-engineering-fundamentals/python/aoai-assignment.ipynb(Azure OpenAI 版)translations/et/04-prompt-engineering-fundamentals/python/oai-assignment.ipynb(OpenAI 直连版)translations/et/04-prompt-engineering-fundamentals/python/githubmodels-assignment.ipynb运行练习需要三个前置条件:Azure OpenAI API 密钥—— 指向已部署 LLM 的服务端点;Python 运行环境—— 用于执行 Notebook(课程要求 Python 3.10);本地环境变量—— 完成 本地设置指南 中的准备步骤。Notebook 自带一组起步练习,同时鼓励你自行添加 Markdown(描述)与 Code(prompt 请求)单元格,尝试更多示例与想法,逐步建立 prompt 设计的直觉。环境变量配置(结合仓库实际文件)课程要求从仓库根目录的.env.copy复制出.env并填写字段。查看 .env.copy 可知,与本课直接相关的变量为:# Azure OpenAI(现已并入 Microsoft Foundry,变量名保持不变) AZURE_OPENAI_API_VERSION2024-10-21 # 默认已设置,当前稳定 GA API 版本 AZURE_OPENAI_API_KEY你的 Foundry 资源密钥 AZURE_OPENAI_ENDPOINT你的资源端点,如 https://resource-name.openai.azure.com AZURE_OPENAI_DEPLOYMENTchat 补全模型部署名,如 gpt-4o-mini另外还可选配OPENAI_API_KEY(OpenAI 直连)、AZURE_INFERENCE_ENDPOINT/AZURE_INFERENCE_CREDENTIAL(Microsoft Foundry 多模型目录)与HUGGING_FACE_API_KEY。依赖方面,根目录 requirements.txt 中与本课相关的核心包为openai1.12.0、tiktoken(分词实验)、python-dotenv(加载 .env)与azure-ai-inference。仓库还提供了共享工具代码,用于安全地读取与校验环境变量:shared/python/env_utils.py:提供get_required_env()(缺失时抛出带提示的ValueError)与validate_env_vars()(批量校验多个变量),避免把密钥硬编码进代码;shared/python/api_utils.py:create_azure_openai_client()会读取AZURE_OPENAI_ENDPOINT与AZURE_OPENAI_API_KEY,并把客户端指向endpoint/openai/v1/端点;create_openai_client()则读取OPENAI_API_KEY。这些工具配有单元测试(见 tests/test_env_utils.py 等),体现了密钥不入库、缺配置早失败的工程约束——这正是提示工程从课堂走向生产的必要基础。什么是提示工程?本课将提示工程定义为:针对给定应用目标与模型,对文本输入(prompt)进行设计与优化,以稳定交付高质量回答(completions)的过程。它可分为两步:针对给定模型与目标设计初始 prompt;迭代打磨prompt,持续提升回答质量。这本质上是一个试验-错误过程,需要用户直觉与持续努力。要理解它为何重要,必须先弄清三个概念:分词(Tokenization) 模型如何看见 prompt;基础模型(Base LLM) 基础语言模型如何处理 prompt;指令调优 LLM 模型如何开始看见任务。分词:模型眼中的 promptLLM 把 prompt 看作一串token 序列;不同的模型(或同一模型的不同版本)对同一 prompt 的分词方式可能不同。由于 LLM 是在 token(而非原始文本)上训练的,prompt 的分词方式会直接影响生成质量。想直观感受分词过程,可以使用 OpenAI 官方的 Tokenizer 网页工具:粘贴你的 prompt,观察它如何被切分成 token,特别注意空格与标点符号的处理方式(注意:示例工具展示的是较老的 GPT-3 分词器,换成新模型结果可能不同)。仓库的 Notebook 练习 1 就是让你本地验证这一点:在 oai-assignment.ipynb 中使用tiktoken(OpenAI 的开源快速分词器)对一段Jupiter is the fifth planet from the Sun...文本分词,然后再替换成你自己的 prompt 观察 token 变化。基础模型:预测下一个 tokenprompt 被分词之后,基础模型(基础语言模型)的核心任务就是:预测该序列中的下一个 token。由于 LLM 在海量文本上训练,它对 token 间的统计关系有良好的把握,能以一定置信度做出预测。注意:它们并不理解prompt 中词语或 token 的含义,只是看到一个可以用下一次预测续写的模式。它们会持续预测,直到用户打断或满足某个预设终止条件。可以在 Azure OpenAI Studio 的对话 Playground 中以默认设置输入上文 prompt:系统会把 prompt 当作信息请求处理,你会得到一个满足该上下文预期的补全——这正是基础预测行为的直观体现。指令调优 LLM:让模型学会做任务但如果用户想要满足特定标准或任务目标的输出呢?这时指令调优 LLM登场。它在基础模型之上,用包含明确指令的示例或输入-输出对(例如多轮消息)进行微调;AI 的回答会尝试遵循指令。这一过程采用如基于人类反馈的强化学习(RLHF)的技术,训练模型遵循指令并从反馈中学习,使输出更贴合实际应用、更贴合用户目标。试着做这个实验:保持上文的 prompt 不变,只修改系统消息(system message),给出如下指令作为上下文:将提供给你的内容总结为二年级学生能读懂的版本。结果限定为一段话加 3–5 个要点。可以看到结果已按期望的目标与格式生成——教师可以直接把这段回答用到课件里。为什么需要提示工程?了解了 LLM 如何处理 prompt 后,可以回答为什么需要提示工程。根源在于:当前 LLM 存在若干挑战,使得不投入 prompt 构造与优化就难以获得可靠、一致的回答:模型响应是随机的(stochastic)。相同的 prompt 在不同模型或不同模型版本上往往产生不同回答;即使在同一模型上不同时刻运行,结果也可能不同。提示工程技术可以通过提供更强的约束来最小化这些差异。模型可能编造回答(fabrication)。模型在庞大但有限的数据集上预训练,训练范围之外的概念它们并不知晓,因此可能产出不准确、虚构或与已知事实直接矛盾的补全。提示工程技术可帮助用户识别并缓解此类编造,例如要求 AI 给出引用或推理依据。模型能力各不相同。新模型或新一代模型能力更丰富,但各自有独特癖性与成本/复杂度权衡。提示工程帮助建立能抽象掉这些差异、以可扩展且平滑的方式适配模型特定需求的最佳实践与工作流。可以在 OpenAI 或 Azure OpenAI Playground 中亲手验证:用同一 prompt 请求不同的 LLM 部署(如 OpenAI、Azure OpenAI、Hugging Face)——是否观察到差异?在同一 LLM 部署上重复使用同一 prompt——这些差异又有何不同?关于编造(fabrication)的术语本课程使用fabrication(编造)来指代 LLM 因训练限制等因素生成事实性错误信息的现象。你可能在科普文章或论文中也听过hallucination(幻觉)一词,但课程强烈建议使用 fabrication:避免把机器驱动的结果误读为人格化行为(拟人化),也符合负责任的 AI 指南在术语上的取向——剔除在某些语境下可能被视为冒犯或非包容的措辞。编造示例:2076 年火星战争想感受编造如何发生,就构造一个要求 AI 围绕不存在主题生成内容的 prompt(确保它不在训练数据中)。例如:Prompt:为2076 年火星战争生成一份课程计划。联网检索可以发现,关于火星战争存在虚构作品(电视剧或小说)——但没有发生在 2076 年的;常识也告诉我们 2076 年尚未到来,不可能与真实事件挂钩。把这条指令分别发给不同 LLM 提供商,会得到三份回答(课程原文用三张 Playground 截图展示):OpenAI Playground(GPT-35)、Azure OpenAI Playground(GPT-35)、Hugging Face Chat Playground(LLama-2)。不出所料,每个模型(或版本)都因随机行为与能力差异产出了略有不同的回答——有的面向 8 年级读者,有的默认用户是高中生——但三者都生成了足以让不了解情况的用户相信该事件真实存在的回答。提示工程技术如元提示(metaprompting)、温度(temperature)配置等,可以在一定程度上减少模型编造;新的提示工程架构还会把新工具与新方法无缝整合进 prompt 流程,以缓解或降低这些效应。案例研究:GitHub Copilot提示工程如何被用于真实世界方案?以GitHub Copilot为例:它是你的AI 结对编程伙伴,把文本 prompt 转换为代码补全,并集成到开发环境(如 Visual Studio Code)中。Copilot 最早的版本基于 OpenAI Codex 模型;团队很快意识到需要微调模型、开发更好的提示工程技术来提升代码质量,并在 2023 年 7 月上线了超越 Codex 的改进 AI 模型以获得更快的建议。GitHub 工程博客按时间线记录了这段学习历程(建议按顺序阅读):2023 年 5 月| GitHub Copilot is Getting Better at Understanding Your Code2023 年 5 月| Inside GitHub: Working with the LLMs behind GitHub Copilot2023 年 6 月| How to write better prompts for GitHub Copilot2023 年 7 月| GitHub Copilot goes beyond Codex with improved AI model2023 年 7 月| A Developers Guide to Prompt Engineering and LLMs2023 年 9 月| How to build an enterprise LLM application: lessons from GitHub Copilot这条案例印证了本课的核心论断:即便拥有强大的基础模型,产品级质量仍要靠持续的 prompt 设计与工程化来实现。Prompt 构造(Prompt Construction)理解了为什么,再看 prompt 是如何构造的,以便评估不同的有效设计方法。简单 prompt最简单的 prompt 是发往模型的纯文本输入,不带其他上下文。例如把美国国歌开头几个词发给 OpenAI Completion API,它会立刻用接下来的歌词补全——展示了基础预测行为:Prompt(输入)Completion(输出)Oh say can you seeIt sounds like youre starting the lyrics to The Star-Spangled Banner, the national anthem of the United States. The full lyrics are ...复杂 prompt在简单 prompt 上叠加上下文与指令。Chat Completion API 允许把复杂 prompt 组织为一组messages:反映用户输入与助手应答的输入/输出对;设定助手行为或人格上下文的系统消息。此时请求形如:response openai.chat.completions.create( modelgpt-3.5-turbo, messages[ {role: system, content: You are a helpful assistant.}, {role: user, content: Who won the world series in 2020?}, {role: assistant, content: The Los Angeles Dodgers won the World Series in 2020.}, {role: user, content: Where was it played?} ] )其中分词会同时捕获上下文与对话中的相关信息——因此改动系统上下文对补全质量的影响,可能不亚于用户输入本身。值得对照:仓库英文原版 04-prompt-engineering-fundamentals/README.md 已将该示例更新为 Responses API 形式(client.responses.create(modelgpt-4o-mini, input[...])),消息结构(role: system/user/assistant)保持一致;而本课 Notebook 中 Exercise 5 仍使用client.chat.completions.create,并把 system 人格换成 You are a sarcastic assistant. 来观察人格对多轮对话的影响——两种写法值得都动手试一遍。指令 prompt在以上示例中,用户 prompt 只是可被理解为信息请求的简单文本查询。指令 prompt用文本把任务描述得更精确,给 AI 更好的指引:Prompt(输入)Completion(输出)指令类型Write a description of the Civil War返回一个简单段落简单Write a description of the Civil War. Provide key dates and events and describe their significance返回一段话,随后是关键事件日期及说明的列表复杂Write a description of the Civil War in 1 paragraph. Provide 3 bullet points with key dates and their significance. Provide 3 more bullet points with key historical figures and their contributions. Return the output as a JSON file在文本框中返回更详尽的内容,格式为 JSON,可复制粘贴到文件并按需校验复杂。带格式主内容(Prompt 中的 Primary Content)上述示例的 prompt 仍然比较开放,允许 LLM 自行决定预训练数据中哪部分相关。主内容(primary content)设计模式把输入文本分成两部分:一条指令(动作);相关的内容(影响该动作)。例如指令为用两句话总结以下文本:Prompt(输入)Completion(输出)Jupiter is the fifth planet from the Sun and the largest in the Solar System. It is a gas giant with a mass one-thousandth that of the Sun, but two-and-a-half times that of all the other planets in the Solar System combined. …Summarize this in 2 short sentencesJupiter, the fifth planet from the Sun, is the largest in the Solar System and is known for being one of the brightest objects in the night sky. Named after the Roman god Jupiter, its a gas giant whose mass is two-and-a-half times that of all other planets in the Solar System combined.主内容片段可以通过多种方式驱动更有效的指令:示例(Examples)—— 不显式告诉模型做什么,而是给出该怎么做的示例,让它自行归纳模式;线索(Cues)—— 在指令后附加一段引导语,为补全定调,把模型引向更相关的回答;模板(Templates)—— 带有占位符(变量)的可复用 prompt 配方,可用具体场景的数据填充。用示例驱动:zero-shot / one-shot / few-shot用主内容喂给模型若干期望输出的示例,让它归纳模式。按提供示例的多少,可分为zero-shot、one-shot、few-shot提示。此时 prompt 由三部分组成:任务描述、若干期望输出示例、一个新示例的开头(它隐含成为任务描述)。学习类型Prompt(输入)Completion(输出)Zero-shotThe Sun is Shining. Translate to SpanishEl Sol está brillando.One-shotThe Sun is Shining El Sol está brillando.Its a Cold and Windy Day Es un día frío y ventoso.Few-shotThe player ran the bases BaseballThe player hit an ace TennisThe player hit a six CricketThe player made a slam-dunk Basketball注意:zero-shot 必须给出显式指令(翻译成西班牙语),而 one-shot 中该指令已被隐含推断;few-shot 则说明,更多示例能让模型在不添加指令的情况下做出更准确的归纳。用线索(cue)启动补全主内容的另一种用法是提供线索而非示例:用一段反映期望回答格式的片段帮模型起个头,模型便接住线索沿该风格续写:线索数Prompt(输入)Completion(输出)0Jupiter is the fifth planet from the Sun …Summarize ThisJupiter 是太阳系最大、距太阳第五的行星。它是质量约为太阳 1/1000 的气态巨行星,比其余行星总和更重。古文明早已知晓它,夜空中很容易看见。1同上Summarize ThisWhat we learned is that Jupiter是距太阳第五、太阳系最大的行星。它是质量约为太阳 1/1000 的气态巨行星……肉眼易见,自古已知。2同上Summarize ThisTop 3 Facts We Learned:1. Jupiter 是距太阳第五、太阳系最大的行星。2. 它是质量约为太阳 1/1000 的气态巨行星……3. 自古以来肉眼即可见 Jupiter……(表中为英文原文示例的中文释义;对照 英文原版 可看到逐行原文。)线索数量从 0 增加到 2,输出格式从自由段落被逐步牵引为Top 3列表结构——这就是 cue 技术的效果。Prompt 模板Prompt 模板是一个预定义的 prompt 配方,可存储并随需复用,以在规模化场景下驱动一致的用户体验:最简形式:一组 prompt 示例的集合(如 OpenAI Cookbook 提供的模板),同时给出交互式 prompt 组件(user/system 消息)与 API 请求格式,支持复用;更复杂的形式(如 LangChain 的 PromptTemplate):包含占位符,可用来自多种来源的数据(用户输入、系统上下文、外部数据源等)动态填充,从而构建可复用 prompt 库,以编程方式在规模化场景驱动一致体验;最终价值:面向垂直应用领域创建并发布prompt 库——模板经过优化,反映应用特定上下文与示例,使回答对目标用户群更相关、更准确。微软的 Prompts For Education 仓库就是典型案例:一个由教育专家维护的教育领域 prompt 库,覆盖课程规划、教学大纲设计、学生辅导等关键目标。课程我们的创业公司设定也呼应了这一点:面向教育做个性化学习应用时,管理员可以请 AI 分析课程数据找出覆盖缺口,教师可以请 AI 为目标群体与主题生成教学计划,学生可以请 AI 辅导困难科目——三类用户都在设计不同用途的 prompt。辅助内容(Prompt 中的 Secondary Content)如果把 prompt 构造理解为指令(任务) 目标(主内容),那么辅助内容(secondary content)就是额外提供的上下文,用来以某种方式影响输出——调优参数、格式指令、主题分类体系等等,帮助模型按用户目标定制回答。举例:给定一份秋季课程目录,附带完整元数据(名称、描述、难度级别、元数据标签、讲师等):可以用指令定义总结 2023 秋季课程目录;可以用主内容给出若干期望输出的示例;可以用辅助内容指明 5 个最感兴趣的标签。此时模型会按示例格式给出摘要;当某条结果带有多个标签时,它会优先呈现辅助内容中指定的 5 个标签。提示工程的最佳实践理解了 prompt 如何被构造,就可以思考如何设计它。这包含两部分:拥有正确的思维框架,以及应用合适的技术。提示工程的思维框架提示工程是试验-错误过程,牢记三条总纲:理解领域很重要。回答的准确性与相关性取决于应用或用户所处的领域。用直觉与领域专长进一步定制技术:在系统 prompt 中定义领域特定人格,在用户 prompt 中使用领域特定模板,提供反映领域上下文的辅助内容,或用领域特定的线索与示例引导模型走向熟悉的用法模式。理解模型很重要。模型天生是随机的,而且不同实现在训练数据(预训练知识)、提供的能力(API/SDK)与优化的内容类型(代码 vs 图片 vs 文本)上都可能不同。了解你所用模型的强项与局限,用它来排定任务优先级或构建针对模型能力优化的定制模板。迭代与验证很重要。模型快速演进,提示工程技术亦然。作为领域专家,你可能有特定于自己应用、未必适用于更大社区的其他上下文与标准。先用提示工程工具快速启动prompt 构造,再用自己的直觉与领域知识迭代验证;把洞察沉淀为知识库(如 prompt 库),供他人作为新基线,加速未来的迭代。官方推荐的最佳实践清单综合 OpenAI 与 Azure OpenAI 实践者的通用建议:做法(What)原因(Why)评估最新模型新一代模型往往特性与质量更好,但成本也可能更高。先评估影响,再做迁移决策分离指令与上下文检查你的模型/提供商是否定义了分隔符(delimiters),更清晰地区分指令、主内容与辅助内容。这有助于模型对 token 分配更准确的权重具体而明确给出更多细节:期望的上下文、结果、长度、格式、风格等。这同时提升质量与一致性;把配方沉淀为可复用模板描述性表达,使用示例模型往往对边演示边讲解的方式响应更好。先用zero-shot(只给指令不给示例),再尝试few-shot精化(给出若干期望输出示例);善用类比用线索(cues)启动补全给模型一些引导词或短语作为回答起点,把它推向期望的结果加倍强化(Double Down)有时需要向模型重复自己:在主内容前后都放指令,指令与线索并用等。迭代并验证哪种方式有效顺序很重要信息呈现顺序可能影响输出(即使在示例学习中,也存在近因偏好)。尝试不同排布,找出效果最好的给模型一条退路给模型一个兜底补全当它在任何原因下无法完成任务时可用,降低生成虚假信息或编造回答的概率如同任何最佳实践一样,具体效果因模型、任务与领域而异。把它们当作起点,持续迭代;随着新模型与新工具出现,不断重新评估你的提示工程流程,聚焦流程的可扩展性与回答质量。课后作业:在 Notebook 沙箱中验证本仓库的 aoai-assignment.ipynb 将上述概念组织为 5 个可交互练习:练习 1:分词—— 用tiktoken对 Jupiter 段落分词,再替换成任意 prompt 重新运行观察 token;练习 2:验证 API 配置—— 加载.env(load_dotenv()),发起简单请求;输入oh say can you see应补全为类似by the dawns early light..;练习 3:编造—— 运行generate a lesson plan on the Martian War of 2076.,观察不存在主题上的输出,并换问题/换模型对比;练习 4:指令式—— 用text变量设定主内容、prompt变量给指令,把 Jupiter 段落总结给二年级学生;练习 5:复杂请求—— 组合 system/user/assistant 多轮消息(system 设为讽刺人格),体会系统上下文对输出的塑造。工作流建议:fork 仓库后,推荐启动 GitHub Codespaces;或者克隆到本地配合 Docker Desktop;也可以在任意你喜欢的 Notebook 运行环境中打开。配置环境变量时,从根目录复制.env.copy为.env并填入AZURE_OPENAI_API_KEY、AZURE_OPENAI_ENDPOINT、AZURE_OPENAI_DEPLOYMENT(版本变量AZURE_OPENAI_API_VERSION已预置2024-10-21)。注意:这里没有对与错——本课刻意不提供代码解答区,Notebook 中的 My Solution: Markdown 单元格只给出一种参考输出,目的就是让你通过试验-错误积累哪个 prompt 对哪个模型与领域有效的直觉。知识检验与进阶挑战知识检验:下列哪个是遵循了合理最佳实践的好 prompt?Show me an image of red carShow me an image of red car of make Volvo and model XC90 parked by a cliff with the sun settingShow me an image of red car of make Volvo and model XC90答案:2。它既说明了要什么,又深入具体(不是一般汽车,而是明确的厂商与型号),还描述了整体场景(悬崖边、日落);3 次之,因为它也包含大量描述;1 则过于宽泛。挑战:尝试对以下 prompt 使用线索(cue)技术,补全句子:Show me an image of red car of make Volvo and 模型会响应什么?你会如何改进它?小结与下一步本课建立了提示工程的完整认知链:分词决定了模型如何看到你的输入 → 基础模型做 token 预测 → 指令调优让模型学会遵循任务 → 通过指令/主内容/辅助内容的结构化构造与八条最佳实践,把随机输出约束成可靠输出。课程第 5 课将进入高级提示技术(角色、分步、链式等);而 shared/python/ 下的客户端与环境变量工具,则是把课堂技巧落成工程代码的起点。【免费下载链接】generative-ai-for-beginners21 Lessons, Get Started Building with Generative AI项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai-for-beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考