提示工程:从基础概念到实战技巧,掌握与大模型高效协作的核心方法
1. 项目概述当“提示工程”成为一门显学最近在GitHub上闲逛发现一个名为“SKY-lv/prompt-engineer”的项目热度不低。点进去一看果然又是一个关于“提示工程”的资源集合库。这让我想起几年前当深度学习模型刚开始在特定任务上超越人类时我们讨论的还是如何调参、如何设计网络结构。而现在随着大语言模型的普及讨论的焦点已经悄然转向了如何与模型“对话”——也就是所谓的“提示工程”。这个项目本身就是一个典型的“提示工程”学习资源库。它可能包含了从基础概念、最佳实践、到针对不同场景的提示模板等一系列内容。但我想聊的远不止是这个仓库里具体有什么文件。我更想探讨的是为什么“提示工程”会从一个模糊的概念迅速演变成一门被广泛讨论甚至追捧的“显学”它背后反映的其实是人机交互范式的一次深刻变革。过去我们通过代码、命令行、图形界面来指挥机器现在我们开始尝试用更接近人类交流的自然语言来“引导”一个拥有庞杂知识的模型为我们完成从写作、编程到分析、创意的各种任务。这个过程充满了技巧、艺术甚至一些“玄学”。对于任何想要高效利用大语言模型的人来说无论是开发者、产品经理、内容创作者还是学生理解并掌握提示工程的基本原理和高级技巧都已成为一项必备技能。它不再是少数研究者的专利而是正在下沉为一种普惠的“生产力工具”使用能力。接下来我就结合自己大量的实操经验拆解一下提示工程的核心脉络、实用技巧以及那些容易踩坑的细节。2. 核心思路拆解从“命令”到“协作”的范式转移要理解提示工程首先要跳出“编程”或“检索”的思维定式。传统编程是确定性的你写下一行代码机器就严格执行一行指令输入确定输出就确定。而与大语言模型交互更像是与一个知识渊博但有时会“自由发挥”的专家进行协作。你的提示词不是命令而是为这次协作设定的“上下文”、“角色”和“任务蓝图”。2.1 目标导向的提示设计一个高效的提示其核心目标是约束模型的输出空间并引导其思维过程使其生成的内容最大程度符合我们的预期。这通常通过几个关键要素的组合来实现角色设定这是最常用也最有效的技巧之一。通过告诉模型“你现在是某某领域的资深专家”你实际上是在激活模型内部与该角色相关的知识结构和表达风格。例如“作为一名有十年经验的网络安全工程师”与“作为一名小学科学老师”对于同一个“解释防火墙原理”的请求给出的答案在深度、术语使用和受众适配性上会有天壤之别。任务指令必须清晰、具体、无歧义。避免使用“帮我写点东西”这种模糊表述。应该拆解为“撰写一篇面向初学者的技术博客引言主题是‘什么是HTTP协议’要求语言生动包含一个类比字数在300字左右。” 指令越具体模型“跑偏”的概率就越低。上下文信息提供必要的背景知识、输入数据或格式要求。如果你想让模型分析一段代码就把代码贴进去如果你想让它以特定格式回复就明确说明例如“请用JSON格式输出包含issue,root_cause,solution三个字段”。输出格式与规范明确说明你期望的答案形式。是列表、表格、文章、代码片段还是分步骤的指南是否需要避免使用某些术语是否需要包含示例实操心得我习惯把构造提示词的过程想象成给一位新来的、能力极强的实习生布置工作。你不会只说“做个市场分析”而是会说“小王你现在扮演我们公司的市场分析师这是上一季度的销售数据附上数据请你重点分析一下华东区A产品销量下滑的原因并在今天下午5点前给我一份不超过一页PPT的总结要包含三个最主要的原因和两条后续行动建议。” 这个过程中角色、任务、上下文、输出要求全都涵盖了。2.2 迭代优化提示不是一蹴而就的很少有人能第一次就写出完美的提示词。提示工程本质上是一个迭代优化的过程。通常的流程是编写 - 测试 - 分析 - 修正。编写初始提示基于上述要素组合出一个你认为可行的提示。进行测试将提示输入模型观察输出结果。分析差距将模型的输出与你理想中的输出进行对比。是风格不对信息不全还是完全跑题了修正提示根据差距有针对性地修改提示词。可能是补充约束条件可能是调整角色设定也可能是将一个大任务拆解成几个顺序执行的小提示。例如第一次提示“写一首关于春天的诗”模型可能给出一个很泛泛的作品。第二次你可以优化为“假设你是唐代诗人杜甫以沉郁顿挫的风格创作一首七言律诗描绘安史之乱后长安城春天的景象需体现‘国破山河在’的意境。” 这样输出的指向性和质量就会大幅提升。3. 核心技巧与进阶策略解析掌握了基本思路后一些进阶技巧能让你事半功倍。这些技巧往往是区分“能用”和“好用”的关键。3.1 思维链提示这是应对复杂推理任务的神器。核心思想是引导模型展示其推理步骤而不是直接给出最终答案。对于数学问题、逻辑判断、因果分析等任务尤其有效。基础用法在提示中直接要求“让我们一步步思考”。原始提示“如果小明每秒跑5米他跑完100米需要多久”优化提示“如果小明每秒跑5米他跑完100米需要多久请一步步推理。”后者更可能促使模型输出“第一步计算时间需要用到公式时间 距离 / 速度。第二步距离是100米速度是每秒5米。第三步时间 100 / 5 20秒。所以他需要20秒。” 这个过程不仅答案更可靠也便于我们检查模型的逻辑是否正确。进阶用法 - 零样本思维链对于更复杂的任务可以示范推理结构。提示示例“分析以下句子是否包含讽刺‘这真是个好主意让服务器在停电时继续工作。’ 请按以下步骤分析1. 识别字面意思。2. 分析语境与常识的矛盾点。3. 判断是否使用讽刺。”通过结构化步骤引导模型能进行更深层次的文本分析。3.2 少样本提示当任务非常特定或格式要求严格时提供几个输入-输出的例子能让模型快速“理解”你的意图。这相当于给了模型一个微型的“训练样本”。场景你想让模型始终以固定的格式从邮件正文中提取会议信息。提示示例请从以下邮件正文中提取会议信息并以JSON格式输出包含 meeting_topic, time, location, attendees 四个字段。 示例1 输入邮件“各位同事定于本周五3月15日下午2点在301会议室召开项目月度复盘会请项目组全体成员张三、李四、王五准时参加。” 输出{meeting_topic: 项目月度复盘会, time: 3月15日下午2点, location: 301会议室, attendees: [张三, 李四, 王五]} 示例2 输入邮件“技术部通知明天3月10日早上9点半线上腾讯会议会议号123 456 789讨论新架构设计方案后端组参加。” 输出{meeting_topic: 新架构设计方案讨论, time: 3月10日早上9点半, location: 线上腾讯会议会议号123 456 789, attendees: [后端组]} 现在请处理以下邮件 输入邮件“[待处理的邮件正文]”通过两个例子模型就能很好地把握你需要提取哪些信息以及JSON的格式规范。3.3 系统提示与用户提示的分离在具有API调用的开发场景中提示通常被分为“系统提示”和“用户提示”。理解它们的区别对构建稳定应用至关重要。系统提示用于设定模型的长期行为、身份和全局规则。它通常在对话开始时设定一次并贯穿整个会话上下文。例如在开发一个客服机器人时系统提示可能是“你是一个友好且专业的在线客服助手代表‘XX科技公司’。你的主要职责是解答产品使用问题处理简单的故障排查。你无法处理退款、投诉等复杂问题遇到时应引导用户联系人工客服。你的回答应简洁明了使用中文。”用户提示代表用户本次的具体问题或请求。例如“我的手机无法连接Wi-Fi了显示已保存但无法上网怎么办”这种分离使得模型的行为具有一致性和可控性。系统提示像公司的员工手册而用户提示则是客户当前的具体咨询。3.4 控制生成参数温度与Top-p除了提示词本身模型生成时的参数设置也极大地影响输出结果。两个最关键参数是“温度”和“Top-p”。参数名含义影响适用场景温度控制输出的随机性。值越高如0.8-1.0生成的内容越多样、有创意但也可能更不连贯值越低如0.1-0.3生成的内容越确定、保守、连贯。类似于“想象力”的开关。低温像严谨的学者高温像奔放的诗人。创意写作故事、诗歌使用较高温度0.7-1.0。事实性问答、代码生成使用较低温度0.1-0.3。Top-p核采样。从累积概率超过阈值p的最小候选词集合中随机选择。与温度配合使用能更有效地控制随机性。动态调整候选词范围。高Top-p如0.9允许更多样化选择低Top-p如0.5则限制在概率最高的少数词中。通常与温度一起调整。追求稳定可重复时用低温低Top-p追求多样性和惊喜时用高温高Top-p。注意事项不要盲目追求“创意”而把温度调得太高。对于技术性任务过高的温度会导致模型“胡言乱语”生成不存在的事实或错误的代码。我的经验是对于绝大多数需要可靠性的任务温度设置在0.2-0.5之间是一个安全的起点。Top-p通常可以设为0.9与温度配合微调。4. 分场景实战提示词编写演练理论说再多不如实际操练。我们针对几个常见场景来编写和优化提示词。4.1 场景一技术方案设计与评审需求你正在设计一个用户登录系统需要模型帮你评审一下安全风险并给出加固建议。初始提示较差“看看这个登录系统设计有没有问题。”问题过于模糊没有提供设计细节模型无法评审。优化提示较好角色你是一名资深应用安全专家擅长识别Web系统安全漏洞。 任务请对我设计的用户登录方案进行安全评审指出潜在风险并提供具体的加固建议。 方案详情 1. 前端用户输入用户名和密码通过HTTPS POST请求发送到 /api/login。 2. 后端用SHA-256对密码进行哈希然后与数据库存储的哈希值比对。 3. 登录成功则生成一个JWT令牌返回给前端令牌有效期为24小时。 4. 数据库中的用户表包含 id, username, password_hash, email 字段。 请以以下格式输出 【风险清单】 - 风险1[风险描述] 等级[高/中/低] - 原因[简要说明] - 建议加固措施[具体可操作建议] - 风险2... 【总体评价与优先级建议】优化点设定了明确的角色聚焦安全领域。提供了具体的方案详情作为上下文。给出了结构化的输出格式要求分风险描述、等级、原因、措施便于阅读和后续处理。要求总体评价有助于从宏观把握。4.2 场景二从零生成复杂内容需求为公司的新一代智能手表撰写一份产品发布新闻稿。初始提示一般“写一篇关于我们新智能手表的新闻稿。”问题缺乏产品卖点、受众、风格等关键信息产出内容会非常泛泛。优化提示优秀角色你是科技媒体“极客公园”的资深编辑擅长撰写富有洞察力和传播力的产品报道。 任务为“星辰科技”即将发布的旗舰智能手表“Galaxy Pulse”撰写一篇新闻稿用于向科技爱好者、潜在消费者和投资界发布。 产品核心信息 - 产品名Galaxy Pulse - 核心卖点全球首款搭载“无感健康监测系统”的智能手表可连续、精准监测血压和血糖趋势非医疗级诊断续航长达21天采用蓝宝石玻璃与钛合金机身。 - 目标人群注重健康管理的都市白领、运动爱好者、科技先锋。 - 发布口号感知于无形。 稿件要求 1. 标题吸引人能突出核心创新点。 2. 结构包含引人入胜的引言、产品详细介绍分功能阐述、技术突破解读、市场意义与展望、官方发布信息价格、上市时间等。 3. 语言风格专业、犀利、略带前瞻性能引发读者共鸣和讨论。 4. 字数800-1000字。 请现在开始撰写。优化点角色更具体“极客公园”编辑暗示了风格和立场。任务对象和目的非常清晰。核心信息详细提供了充足的“弹药”。稿件要求结构化从标题到风格到字数约束明确确保产出高度可用。4.3 场景三代码生成与解释需求用Python写一个函数从给定的URL列表中异步下载所有图片并保存到指定文件夹。初始提示有基础“用Python异步下载一堆图片。”问题缺少关键细节库的选择、错误处理、命名规范生成的代码可能不完整或不符合工程标准。优化提示专业角色你是一名注重代码质量和健壮性的高级Python工程师。 任务编写一个可复用的Python函数用于异步下载一批图片。 具体要求 1. 函数签名async def download_images(url_list: List[str], save_dir: str, max_concurrent: int 5) - Dict[str, str] 2. 使用 aiohttp 进行异步HTTP请求使用 aiofiles 进行异步文件写入。 3. 实现并发控制同时下载的任务数不超过 max_concurrent。 4. 完善的错误处理网络超时、状态码非200、URL无效、磁盘写入失败等情况应被捕获并将失败的URL及原因记录在返回的字典中。 5. 成功下载的图片以其URL的MD5值命名文件避免重复和特殊字符。 6. 返回一个字典格式为 {url: “success” 或 “error: reason”}。 7. 在代码中添加必要的注释并写一个简单的 __main__ 部分演示用法。 请输出完整的代码。优化点角色强调“质量”和“健壮性”。函数签名明确包括类型提示。技术栈指定aiohttp, aiofiles避免模型使用陈旧的urllib或同步库。功能细节全面并发控制、错误处理、命名规则、返回值格式。要求注释和演示代码开箱即用。5. 高级模式与框架应用当任务变得极其复杂单个提示难以承载时就需要用到一些高级模式或框架。这些模式本质上是提示工程的“设计模式”。5.1 链式调用将一个复杂任务分解为多个顺序执行的子任务每个子任务由一个专门的提示来完成前一个提示的输出作为后一个提示的输入。场景分析一篇技术文章并生成一份面向不同受众的摘要。链条设计提示A分析“请详细分析以下技术文章的核心论点、关键论据和主要结论。[附上文章]”提示B生成高管摘要“基于以下技术分析[插入提示A的输出]生成一份给公司高管看的摘要突出技术趋势、市场机会和潜在风险字数不超过300字。”提示C生成工程师摘要“基于以下技术分析[插入提示A的输出]生成一份给研发工程师看的摘要聚焦技术实现细节、关键难点和可借鉴点字数不超过500字。” 通过链式调用确保了分析的一致性并能基于同一份分析产出不同视角的内容。5.2 自治代理模式这是更高级的模式通过一个“主控提示”来让模型自己规划、执行和检查任务。通常需要模型具备调用外部工具如计算器、搜索引擎API、代码解释器的能力。核心思想给模型一个目标并允许它“思考”如何一步步达成必要时决定调用什么工具。简化示例提示你是一个自主任务解决助手。你可以通过“思考”来规划步骤通过“行动”来执行具体操作目前可用的操作有计算[数学表达式]搜索[查询词] - 模拟。你的最终目标是回答用户的问题。 用户问题“珠穆朗玛峰的高度是8848米如果我用一张0.1毫米厚的纸对折42次其厚度能超过珠峰高度吗” 请开始你的思考和工作。模型可能会输出“思考我需要计算纸张对折42次后的厚度。已知初始厚度0.1毫米对折n次后厚度为初始厚度乘以2的n次方。这是一个指数增长计算。我先计算2的42次方。行动计算 2**42。” 然后模拟或调用工具得到结果“思考得到2^42 4398046511104。现在计算厚度0.1毫米 * 4398046511104 439804651110.4毫米。换算成米除以1000得439804651.1104米。与珠峰8848米比较。行动计算 439804651.1104 8848 结果应为True。所以厚度远超珠峰高度。” 最终给出答案。这种模式对提示设计和模型能力要求很高是当前AI应用的前沿探索方向。6. 常见“翻车”现场与避坑指南即使掌握了所有技巧在实际操作中依然会频频“翻车”。下面是一些最常见的坑和我的避坑经验。6.1 幻觉问题模型可能会生成看似合理但完全错误或虚构的信息包括不存在的概念、编造的引用、错误的代码API等。这是大语言模型固有的缺陷。应对策略关键事实核查对于任何重要的名称、日期、数据、引用、API用法必须通过权威来源进行二次核实。不要完全信任模型的“信誓旦旦”。要求提供来源在提示中要求“如果你引用具体数据或案例请注明可公开查证的来源”。虽然模型可能依然编造但有时会降低幻觉概率。领域知识把关在专业领域内必须由具备该领域知识的人来审核输出结果。模型是“通才”不是“专家”。6.2 提示过长导致上下文丢失模型的上下文窗口有限如4K、8K、16K、32K tokens。当提示本身很长或者对话轮次很多时模型可能会“忘记”最早的信息。应对策略精简提示移除所有不必要的修饰语和重复信息。使用更简洁的表达。关键信息重述在长对话或多轮交互中适时地以总结的方式重述核心目标和约束条件。分段处理对于超长文档分析不要一次性全部输入。可以分段总结或者让模型先建立大纲再逐部分处理。6.3 指令遵循失败模型有时会“选择性失明”忽略你提示中的某些具体要求尤其是关于格式、禁忌或特定步骤的指令。应对策略指令前置与强调把最重要的格式要求、禁止事项放在提示的开头或结尾并用加粗、分隔符等方式强调。例如“必须使用JSON格式输出且只包含以下三个键name,age,city”。结构化与编号将复杂指令用1.2.3.的编号列表列出比写在一个长段落里更容易被遵循。示例的力量对于复杂的格式要求提供一个清晰的“少样本示例”比用文字描述一百遍都管用。6.4 性能与成本考量高质量的提示往往较长、较复杂这意味着每次调用都会消耗更多的tokens。在API付费使用的场景下这会直接增加成本。同时复杂的提示可能需要更长的模型响应时间。应对策略提示模板化将经过验证的有效提示保存为模板避免每次重新编写。缓存结果对于常见、确定性的查询如产品功能说明、公司介绍可以缓存模型的输出结果直接使用而不是每次都调用API。评估性价比思考是否真的需要最强大的模型如GPT-4来处理简单任务对于一些格式化提取、简单分类任务较小的模型如Claude Haiku, GPT-3.5-Turbo可能以更低的成本和更快的速度提供足够好的结果。7. 工具、评估与未来展望工欲善其事必先利其器。除了手动编写现在也有不少工具可以帮助我们进行提示工程。7.1 提示管理与测试工具Prompt IDE一些集成的开发环境如Cursor编辑器内置的AI功能可以方便地管理、测试和迭代不同的提示。专用平台像PromptLayer, Humanloop这样的平台提供了提示版本管理、A/B测试、效果评估和协作功能。本地笔记软件对于个人使用用Notion、Obsidian等建立自己的提示词库分门别类地保存成功的提示模板是非常有效的习惯。7.2 如何评估提示的好坏没有一个绝对的标准但可以从以下几个维度衡量相关性输出是否紧扣主题没有跑偏完整性是否覆盖了任务要求的所有要点准确性信息是否真实、正确针对事实性任务格式符合度是否严格遵守了指定的输出格式风格一致性语言风格是否符合角色设定效率提示本身是否简洁没有冗余信息建立一个自己的“提示测试集”包含各种类型的任务和期望输出是系统化提升提示编写能力的好方法。7.3 不只是“工程”更是“设计”随着模型能力的持续进化特别是多模态和复杂推理能力的提升我认为“提示工程”这个词可能会逐渐演变为“提示设计”或“交互设计”。未来的重点可能不再是绞尽脑汁地“操控”模型说出特定的话而是如何更自然、更高效地与AI进行协作如何设计出能让AI充分发挥其潜力的任务流程和交互界面。它将成为一种基础素养就像今天我们会用搜索引擎、会用办公软件一样。理解AI的“思维”方式学会如何清晰、准确地表达你的需求并能够批判性地评估和优化AI的产出这将是未来许多岗位的核心竞争力之一。从这个角度看像“SKY-lv/prompt-engineer”这样的项目其价值不仅在于收集了哪些技巧更在于它标志着一个新时代协作方式的启蒙。