
干这行这几年我最大的感触是很多人对Prompt Engineering提示工程的理解还停留在会打字就行的层面。直到自己亲手把AI从玩具用到生产环境才发现提示词写得怎么样直接决定模型是帮你干活还是给你添乱。最近prompt engineering提示词工程和ai写代码规则设定提示词工程几乎同时冲上热搜说明大家都开始意识到AI写代码这事真正的门槛不在模型而在你怎么描述需求。这篇内容就顺着这条线把提示工程从原理到实操完整拆一遍新手能照着入门老手也能从里面捡几条排查思路。1. 先认清提示工程的本质把需求翻译成模型能执行的语言1.1 提示工程不是会聊天而是一套需求翻译方法很多人第一次接触提示工程是在聊天框里随手输入一句帮我写个爬虫。模型给了代码能跑就觉得自己已经掌握了。等真正把这段代码放进正式项目里才发现问题一大堆没有超时处理、没有重试逻辑、边界条件全没考虑、甚至用了一个本来不该用的重型库。这时候回头研究才明白之前那个叫碰运气不叫提示工程。提示工程的本质是用自然语言去控制一个概率模型的输出行为。大模型内部是一个巨大的参数空间它同时知道很多可能性但你的上下文、指令、示例决定了它在这些可能性里往哪个方向偏移。模型不是你肚子里的蛔虫它只能根据你写出来的文字去猜你真正想要什么。猜得准不准一半靠模型能力另一半就靠提示词的质量。用给程序员提需求来类比特别合适。你写做一个用户登录功能交给开发他能做出来但大概率不是你要的要不要验证码密码规则是什么忘记密码怎么处理有没有第三方登录这些不写清楚他就按自己的理解来。面对大模型更极端你哪怕只漏一个小条件它就可能给你一个平均意义上的答案这个平均答案在真实场景里往往没法直接用。所以提示工程的第一课是把自己从使用者转成需求方。你不是在跟模型聊天你是在给它写需求文档。文档写得越严谨产出就越可控。这也解释了为什么同一个模型有人用起来像神器有人用起来像人工智障——差别往往不在模型版本而在那一串看似不起眼的文字里。1.2 翻译的两大难点模糊需求和隐性假设既然说是翻译就涉及两套语言的差异。人的需求天然是模糊的、依赖上下文的、带着大量默认假设的而模型能稳定执行的指令需要明确的角色、具体的任务、清晰的边界和可检验的输出格式。提示工程要做的就是把这套人话翻译成模型话。第一个难点是模糊需求。人说的处理一下这份数据在模型眼里有至少十种理解方式是清洗是统计是可视化还是转换成另一种格式你没说它只能挑一个训练数据里最常见的理解来执行。这个最常见理解往往不是你要的。所以高质量的提示词第一步就是消灭歧义把每个动词、每个对象都落到具体可操作的层面。第二个难点是隐性假设。人脑中很多不用说的常识模型不知道。比如你说写一个排序算法你默认的是用Python、输入是列表、按数值大小升序、原地排序还是返回新列表、要不要处理空列表。这些假设你不写出来模型就按它的统计偏好来猜。实操里我经常用个土办法自检把写好的提示词拿给一个完全不了解项目背景的同事看看他不问任何问题能不能直接执行。不能说明你的隐性假设还太多提示词还得补。2. 高质量Prompt的四个核心成分角色、指令、约束、格式2.1 角色设定三行字决定模型调用哪套知识角色设定的作用是让模型在生成答案时调用某类专门的知识域和表达习惯。你让它以资深Python工程师的身份写代码和以刚入门的前端实习生的身份写代码输出的注释密度、异常处理程度、代码组织方式会有肉眼可见的差异。因为不同角色在训练语料里对应的文本风格和技能分布是不一样的角色词会把这些先验拉向你想要的方向。但角色设定不是越长越好。我见过有人把角色写成小说人设你是一位拥有二十年经验、精通各种语言、并且非常耐心友好的AI助手——这种形容词堆砌对模型几乎没有正向作用反而可能让它把注意力放在表现人设上而不是完成任务上。有效的角色设定应该点出任务相关的能力域和判断标准比如你是一名负责后端服务运维的SRE工程师审查代码时优先关注稳定性、错误处理和可观测性。一句话把能力域和价值观都框住比十句赞美词管用。2.2 任务指令把目标拆到模型无法自由发挥任务指令是提示词的骨架。很多人写指令喜欢用宏观描述比如帮我分析一下这段日志。这句话的问题在于分析这个词太宽了——是要找异常是要统计趋势是要提取关键事件模型只能随机挑一个方向。正确的做法是把任务拆成模型能一步步执行的子步骤每个子步骤都是一条清晰的下一步指令。拿日志分析举例如果你写1. 提取所有包含ERROR的行2. 按错误类型统计出现次数3. 按次数降序排列并输出为Markdown表格输出质量会比一句分析日志稳定非常多。原理很简单每个子步骤都在压缩模型的选择空间它的自由度越小跑偏的概率就越低。拆解任务的过程本质上也是你自己把需求想清楚的过程一举两得。2.3 约束条件堵路开门才能让模型不越界约束条件回答的是不要做什么、做到什么程度、什么情况算完成。代码场景里特别典型不要引入新的第三方依赖不要修改现有函数签名只输出代码不要解释。这些约束能显著减少模型的自由发挥空间但也需要技巧。关键技巧是用否定句替代方案的结构。比如只写不要用pandas不够要加一句如果标准库无法优雅实现请说明理由并给出变通方案。为什么因为模型面对一条硬性禁令时可能直接卡住也可能绕个弯子用更蹩脚的方式实现。你给它一条合规的出路它就更愿意遵守规则而不是阳奉阴违。这种堵路开门的思路我在实践中反复验证比单纯下禁令有效得多。2.4 输出格式让结果能直接被下游程序消费提示工程最终的目标不是让模型回答得好而是让结果能用。输出格式就是能用的关键。在提示词里明确指定Markdown、JSON、CSV或者纯代码块并给出字段名、字段类型、是否允许为空等细节能让结果直接喂给下游代码处理。这里有个容易被忽略的点格式要求的详细程度必须和下游程序的解析严格度匹配。如果下游用json.loads解析最好在提示词里给出完整的JSON schema示例而不是写一句输出JSON就完事。模型不知道你后端要的是data字段还是result字段你写清楚了它就照做你不写它按自己的偏好来你后端的解析就得跟着它的偏好改这就本末倒置了。3. AI写代码实战从一句帮我写个函数到完整可用的提示词3.1 一句话需求的两大翻车现场AI写代码是提示工程最热门的落地场景。ai写代码规则设定提示词工程这个热搜组合恰好点破了真相写代码只是结果前面的规则设定和提示词设计才是决定结果质量的部分。我见过最典型的翻车案例是让模型写一个从URL下载文件的函数模型给出了能用但问题很多的代码——没超时、没重试、没校验文件名大文件直接用内存堆。这些问题的根源不是模型能力差而是需求描述里根本没有这些要求。另一个翻车现场是需求看着很具体其实全是坑。比如写一个读取CSV并计算平均值的函数听起来很清楚吧但模型不知道你的CSV有多少列、列名是什么、有没有非数值列、文件可能不存在、可能为空。它只能按语料里最常见的写法来——最常见的写法往往就是不考虑边界条件的写法。所以真实项目里的提问建议至少包含输入参数及类型、返回值约定、异常处理策略、性能要求、依赖限制、代码风格。这些要素缺一个模型就可能替你做一次不那么合适的决定。3.2 规则设定把团队规范直接写进提示词在正式项目里规则设定的价值会被放大。很多团队的代码规范、命名习惯、已有的工具函数库模型根本不知道你要通过提示词告诉它。比如要求模型必须用项目的日志模块而不是print、必须遵循PEP8、所有对外接口必须带类型注解、必须兼容历史版本调用方式。这些规则写进提示词后模型的配合度非常高。如果有现成的基础类或者工具函数更应该在提示词里贴出它们的签名。一来能避免模型重复造轮子二来能让生成的代码和既有工程结构对齐减少后续集成成本。我在团队里推广过一个做法把常用任务沉淀成一套提示词模板库新增接口、写单测、修bug、代码评审各准备一份标准提示词新成员直接套用再按项目场景微调。这比每个人每次从零开始写提示词省太多事输出质量也稳定得多。3.3 完整迭代案例从粗糙Prompt到工程级Prompt放一个我实际用过的例子。最初的提示词是帮我写一个读取CSV文件并计算每列平均值的Python函数。这个提示词能跑但输出很粗糙没有类型注解、没有异常处理、函数名随意整体只能算demo级别。迭代后的版本长这样角色你是一名Python后端工程师编写代码时严格遵循PEP8优先使用标准库对所有异常场景做防御性处理。 任务实现一个函数 read_csv_and_calc_mean(file_path: str) - dict[str, float] 读取CSV文件计算数值型列的平均值非数值型列跳过。 约束 1. 只使用csv和statistics等标准库 2. 文件不存在或格式错误时抛出带有明确信息的异常 3. 空文件返回空字典 4. 禁止使用pandas 输出要求只输出完整代码不要输出任何解释文字。代码必须包含类型注解和docstring。从这版开始模型输出的代码质量稳定了很多。不是因为模型的能力变强了而是因为提示词把它的自由度压缩到了一个合理的范围。每追加一个约束都是把模型往你想要的方向拉一步。需要说明的是这版提示词也不是终点实际项目里我还会往里补充测试用例要求、性能基线、与既有模块的兼容性说明。提示词的迭代过程本质上就是你对需求的思考过程。4. 三个进阶技巧思维链、Few-shot和模型自我校验4.1 思维链先推理后结论复杂任务准确率明显提升思维链Chain of Thought是目前性价比最高的提示词技巧之一。它的核心做法很朴素在提示词里明确要求模型先分解问题、逐步推理再给出结论。听起来简单但对复杂任务的效果提升非常明显。原理上大模型在生成答案时是逐token预测的。如果直接让它输出结果它可能跳过关键推理步骤直接跳到一个概率上像答案的结论。而当你要求它先写推理过程每一步中间结果都会成为后续预测的锚点相当于给模型搭了一条通往正确答案的台阶。具体写法可以直接说在给出结论前先分步骤列出推理过程。更精细的做法是给定推理框架比如要求模型按定义问题—列出已知条件—枚举可能方案—分析取舍—给出结论及理由五步来分析。这个技巧在代码调试场景尤其好用让模型先解释代码逻辑、定位可疑点再给出修复方案比直接让它修复bug靠谱得多。4.2 Few-shot示例给模型抄作业的样板Few-shot是指在提示词里给出几组完整的示例输入正确输出让模型模仿示例的模式来处理新输入。这个技巧的本质是把告诉模型要做什么升级为做给模型看。对于格式性强、模式固定的任务Few-shot的效果往往比大段文字描述更好。举个例子你想用模型把非标准日期统一成YYYY-MM-DD格式。光用文字描述规则模型难免漏掉某些边缘情况。但如果在提示词里给出三个示例——2024年1月5日 - 2024-01-05Jan 5th, 2024 - 2024-01-0524/05/2024 - 2024-05-24——模型就能非常准确地推断出规律甚至能处理你没列举到的其他格式。给示例时要注意多样性。两三个重复的示例不如一正一邪两个对比示例管用。我习惯每个任务给三到五个示例正常情况、边缘情况、反例各一个覆盖完整比数量多重要得多。4.3 自我校验生成之后再审查一遍能捞回不少瑕疵另一个很实用的技巧是让模型在完成任务后再对自己的答案做一次审查。你可以在提示词里加一句回答完成后请以独立审查者的身份检查答案是否符合所有约束条件发现不足后修正再输出。这相当于把模型从生成模式切换到审查模式用它的第二遍思考来弥补第一遍生成的失误。这个技巧在代码任务里尤其好用。模型生成代码后你再让它以代码评审者的身份检查这段代码重点看边界条件、异常处理和并发安全列出问题清单并给出修改建议往往能找出第一轮生成时忽略的bug。但要注意自我校验不是万能的模型偶尔会自信地犯错把错误的答案重新确认一遍。所以校验的重点应该放在客观可检查的点上——格式对不对、有没有用禁用的库、边界条件有没有覆盖——而不是放在主观判断上主观判断只会被它糊弄过去。5. 实战中遇到的典型问题和排查思路实录5.1 模型不听话约束被忽略怎么办这是被问得最多的问题明明写了不要输出解释文字模型还是废话一堆写了只用标准库它还是import了第三方包。遇到这种情况先别急着怀疑模型按顺序排查。第一约束放的位置对不对。大模型对文本不同位置的注意力权重不同实操中靠后的指令往往更容易被遵循。如果你把约束塞在长篇背景描述中间模型可能记不住。建议把关键约束单独拆出来放在任务描述之后甚至可以在提示词末尾再强调一遍。第二约束之间有没有冲突。如果你要求只输出JSON又同时要求解释每一步思路这两个要求天然打架模型只能取舍。检查约束之间的逻辑一致性能解决一半的问题。第三有没有给模型留逃逸通道。比如你写了不要用第三方库但没说做不到怎么办模型可能选择违反约束来完成任务。用前面说的堵路开门策略给出一条合规的替代路径它就不需要冒险违规了。5.2 输出忽好忽坏怎么提升稳定性同一提示词在不同会话里输出结果不一样这是大模型的固有特性因为生成过程带随机采样。如果要在正式场景里稳定复现最直接的办法是固定温度参数调到0或接近0让输出更确定。但即便调到0也不能保证百分百一致采样算法和并行计算仍然会带来随机性。另一个更重要的观察是如果提示词足够清晰、约束足够明确模型的输出即使有波动也应该是同一方案的细微差异而不是完全不同的方案。如果你发现结果差异大到离谱说明提示词的约束还不够模型仍在多个方向上自由发挥。这时候应该回头收紧任务定义和约束条件而不是寄希望于多试几次碰运气。稳定性是设计出来的不是祈祷出来的。5.3 长对话模型失忆怎么保住关键设定大模型有上下文窗口限制超出窗口的内容会被截断或遗忘。实际使用中长对话到后半段模型经常忘记开头设定的角色和约束。这个问题的根源是早期信息被大量新内容挤出了有效注意力范围。应对策略有三层。第一把最关键约束写成固定开场白每轮新会话都重新粘贴不要指望模型跨会话记忆。第二对话过程中每隔几轮用一个保持指令重申关键约束比如请记住你仍然是SRE角色继续遵守上述全部规则——这句话看着多余但确实能减少跑偏。第三对于复杂任务与其在一个超长对话里反复纠缠不如拆成多个短对话每个对话负责一个子任务最后再汇总各阶段产物。这种任务分片思路既绕开了上下文限制又让每个阶段的提示词保持精简效果比一次超长对话好得多。5.4 一套通用的排查思路清单把自己调试提示词的通用流程整理成清单按步骤排查比盲目改词有效得多。下面这张表是我平时排查问题的速查表也分享给你。问题现象可能原因优先排查方向明确约束被忽略约束位置靠后、被其他内容淹没把约束移到任务描述之后末尾再强调输出格式不符格式要求过于笼统给出字段级schema和一条示例输出回答内容跑偏角色和任务定义不清晰重写角色域把任务拆成子步骤结果忽好忽坏温度偏高、约束不充分调低温度继续收紧约束长对话后失忆早期信息被挤出注意力范围关键约束每轮重申任务分片这张表的思路是把问题分成两类格式问题和内容问题。格式问题结构不对、字段缺失优先检查输出格式约束内容问题逻辑不对、跑偏优先检查角色和任务定义。先分类再动手能省下很多来回试错的成本。6. 把提示词当代码管理版本化与测试集实践6.1 像管代码一样管提示词版本记录与场景库提示词是个活的东西需要持续迭代和维护。我强烈建议把重要的提示词当作代码来管理用版本号记录每次改动写明改动原因附上一个最小可复现的测试输入和对应的输出示例。这么做的直接好处是当你改了某个词导致输出大面积变化时能迅速回退到之前的版本而不是翻聊天记录去猜原来写的是什么。我自己的习惯是维护一个纯文本提示词库按场景分类代码生成、代码评审、数据清洗、日志分析、文档撰写等。每个条目包括用途、提示词全文、适用模型、注意事项。团队成员遇到同类任务直接复用再按自己的场景微调。坚持几个月之后这个提示词库就是团队最有价值的AI资产之一——因为它沉淀的是团队对AI使用的共同理解而不是某个人脑子里的经验。6.2 用小测试集评估提示词告别凭感觉和代码一样提示词也需要测试和回归。不要因为一次输出效果好就觉得提示词写好了也不要因为一次输出差就全盘推翻。正确的做法是准备一个小测试集——三到五个典型输入覆盖正常场景和边界场景——每次修改提示词后都在这个测试集上完整跑一遍观察输出是否全部达标。这个习惯最大的价值是让你能客观判断哪次修改是有效的。只凭感觉改提示词很容易陷入这次好像好了、下次又坏了的循环。有了测试集你可以记录每次修改前后的通过率用数据说话。这也是提示工程从玄学走向工程的关键一步。我个人在实际操作中的体会是提示工程的技术技巧学起来很快真正的分水岭在于你有没有像写代码一样写提示词的工程意识明确输入输出、定义边界条件、准备测试用例、持续版本迭代。做到这几点哪怕模型的版本不变你的输出质量也能稳步提升。如果你现在还停留在随手写提示词、靠运气看结果的状态就从今天开始给每个重要任务建一份提示词文档配一个小测试集。迭代几轮之后回头看你能明显感受到这套流程和随手提问之间的本质差别。