你有没有过这样的时刻:兴致勃勃地打开一个AI对话窗口,憋了半天写出一段自认为描述得很清楚的指令,结果模型给你回了一堆正确的废话,或者一本正经地胡说八道?我太熟悉了。前两年我刚接触大模型时,一度觉得这东西就是个“人工智障”,让它写总结它写成了流水账,让它改代码它给你编出根本不存在的API函数,气得我差点把所有对话框都关掉。
后来我才慢慢意识到,问题多半不在模型身上,而在我递给它的“咒语”上。这个咒语,就是Prompt,而琢磨怎么写好Prompt的过程,就是所谓的Prompt工程。说白了,Prompt工程就是一套跟大模型沟通的方法论,核心目标是把一个模糊、口语化、充满歧义的想法,翻译成模型能够准确理解的指令结构。它解决的是“模型明明有这个能力,但你就是调不出来”这个痛点。
这篇文章我会把我这一年多踩过的坑、试出来的套路、以及几次从60分改成90分的完整案例,全部拆开讲清楚。适合所有用AI写东西、写代码、做数据分析或者做内容提取的人。不需要你有编程基础,只需要你愿意把原来随口问一句AI的习惯改掉,换成有章法的表达方式。你会发现,同一个模型,同一份能力,换个问法,输出的东西能差出好几条街。
1. 先搞明白:为什么AI总能听懂人话,又总办错事?
很多人在做Prompt工程之前,第一个困惑是:我明明说的是中国话,字面意思也很直白,为什么AI给出的结果不对?要回答这个问题,你得先理解大模型在工作时到底在干什么。
1.1 大语言模型不是“搜索引擎”,而是“接话大王”
搜索引擎是拿关键词去匹配网页,给你返回一堆链接。大语言模型完全不是这个逻辑。它本质上是一个“下一句预测”系统:你给它前面一段文字,它根据训练中学到的海量语料规律,算出接下来最可能出现的词。它不是在“查找”答案,而是在“续写”你的话。
这个概念听起来简单,但影响非常大。因为你输入的不只是“问题”,还是一种“风格暗示”。如果你只甩一句“帮我写个周报”,模型就开始续写“周报通常包括...”,因为它见过的类似文本大多是周报说明文。它不会自动理解你其实想要“一封给领导看的、语气谦逊的、本周重点突出的邮件”。
这就是“接话”和“回答问题”的区别。理解这一点后,你就知道Prompt工程的第一原则:不能只告诉它“做什么”,还要告诉它“以什么身份、什么风格、什么结构、为了什么目的去做”。
1.2 上下文窗口是你给“实习生”准备的所有资料
大模型处理文本时有一个窗口限制,专业术语叫上下文窗口。你可以把它理解成模型和你在一次对话中共用的“便签板”。你输入的内容、历史对话、相关资料,都在这块便签板上。模型只能根据便签板上写得下的东西来“续写”,超出便签板的内容它根本看不见。
所以当你说“我上次不是说过要根据用户反馈来改吗”时,如果那段用户反馈早就被挤出了窗口,模型就真的不知道你在说什么。它不是你记忆力差,是它的“工作台”只有那么大。
我刚开始用AI时,总喜欢在一条对话里不停地加背景:“另外再帮我看一下那段代码”“对,就是刚才那段,改成异步的”。结果模型越改越离谱,就是因为它在长对话里丢失了上下文。后来我学乖了:每次问新问题时,把必要背景用最精简的几句话重新描述一遍;如果要处理长文档,就按章节分段喂进去,而不是一次性把所有材料堆上去。
1.3 模型输出是概率采样,不是逻辑必然
同一个Prompt,多问几次,模型给出的结果可能略有不同,甚至有时候会蹦出一句二乎乎的答案。这是因为它每次生成时都在按概率“掷骰子”,尤其当生成参数里的随机性调得比较高时,输出就更不稳定。
这也解释了为什么很多人觉得“AI时好时坏”。坏消息是这种随机性没法完全消除,好消息是可以通过更精确的指令和更严格的结构约束,把模型可能跑偏的空间缩小。你给出清晰的边界,它就算随机采样也落不到边界外面去。
2. 核心干法:把“一句话需求”变成“一份可执行工单”
我见过太多人做AI项目失败,不是模型选错,而是需求描述太像“口述梦话”。要给大模型下达指令,不妨想象你在给一个知识渊博但完全没常识的实习生布置工作。你不会只说“去把那件事办了”,你会告诉他:你是谁、要做什么、边界是什么、产出长什么样、判定标准是什么。
2.1 角色设定是价格最便宜的“性能开关”
我试过同一个任务,不带角色时模型输出是一坨“说明书语言”,带上角色后瞬间变成“行业老手语气”。比如让AI整理一份会议纪要,如果你只写“整理一下这段会议记录”,它会给你逐条罗列谁说了什么。如果你改成“你现在是某科技公司的技术负责人,公司决定取消每周例会,需要你把这一个月的会议记录按风险、决策、行动项三类进行汇总”,输出的结构立刻就不一样了。
角色设定本质上是在告诉模型“调用哪一部分训练知识”。模型在训练时看过大量不同风格、不同身份的文字,角色就像钥匙,能打开对应的那个知识抽屉。你不用管模型在技术上是不是真的“扮演”什么角色,你只需要关注结果:设定角色后,输出的措辞、重点、专业度都会明显变化。
2.2 任务拆解:把宏大问题切成模型能消化的步骤
大模型不擅长一次性解决一个非常宏大的问题,比如“写一份公司年度战略计划”。你把这么大的需求丢给模型,它能给你写,但写出来的东西一定是空泛的套话,因为它在给你“编符合战略计划字样的文本”,而不是“真的帮你想战略”。
正确做法是拆成多个小任务,每个小任务单独写一个Prompt,或者用多轮对话一步步来。比如:
- 先让它列出年度战略需要包含哪些模块;
- 再让它针对“市场分析”这个模块,基于你提供的几条业务数据给出判断;
- 然后让它把判断写成了一段有逻辑关系的论述;
- 最后再让它调整语气或压缩字数。
每个环节的输出质量都会比一步到位好很多。你可以把这种思路叫做“流水线处理法”。在我实际用下来的感受里,拆解之后的效果提升非常明显,尤其是写长文和做复杂分析时,简直像换了个人。
2.3 给例子比给规则更管用
有一类优化Prompt的技巧,叫Few-shot示例,意思是在指令后附带一两个输入输出的例子。很多人在写Prompt时只知道疯狂加约束:“你要专业”“不能口语化”“要有条理”,但说了半天,模型还是不知道“专业”在你的场景里到底长什么样。
我后来发现,一个具体例子顶得上十句抽象描述。比如你想让AI整理一份用户投诉分类,与其写“请把下面的投诉内容按照物流、质量、服务三类进行归类”,不如在末尾增加一两个例子:“例如:‘发货太慢,一周了还没动静’应归类为‘物流’;‘包装破损东西变形’应归类为‘质量’。”模型看到这种示例后,输出的分类准确率会显著上升,因为它在模仿你给的样例风格,而不是凭空猜测。
2.4 输出格式一定要用“可强制约束”的方式表达
AI生成文本是自由的,但这自由常常让人头疼。你需要表格,它给你一段散文;你需要JSON,它给你一段带解释的JSON碎片。解决办法是把输出格式写死,并尽量让它“无法自由发挥”。
比如我经常写这类Prompt:“只输出一个JSON对象,包含以下字段:summary(不超过50字),items(字符串数组,每个元素不超过20字)。不要输出任何解释文字,不要使用Markdown代码块。”加了这些限制后,模型大部分时候都会乖乖听话。如果还不行,就在后面再加一句“直接从{开始输出,不要以任何其他内容开头”。
这种写法的原理很简单:大模型是续写预言家,你给了它一个“不得越界”的收尾句,它的续写方向就被锁死了。给它一个明确的开头标记,也能有效阻止它在前面加“好的,这是生成的内容:”之类的前缀。
2.5 思维链:让AI“边想边写”,而不是直接给结论
有个非常实用的高级技巧,叫Few-shot Chain-of-Thought,中文叫思维链,但你可能听过它更生活化的名字:“让我们一步一步地思考”。这句魔法咒语确实有效,但很多人会误以为只要加上它就行。实际上,更稳健的做法是在Prompt里明确要求模型“先列出推理步骤,再给出结论”。
比如你问:“某件商品原价280元,先降价20%,再涨价15%,现价多少?”如果你单纯问,它可能直接给你一个数字,甚至算错。但如果你写“请分步计算:先算降价后的价格,再算涨价后的价格,最后得出结果”,模型就会在输出中展示每一步的算式,而且错误率大幅降低。
原理上,这相当于把模型从“快思考”切换到“慢思考”模式。它每一步都基于上一步的文本继续续写,自然会沿着逻辑轨道走下去。对于数学、逻辑推理、代码调试这类任务,这个技巧是我最常用的保底手段。
3. 四个实战场景:从“人工智障”改写为“人工智能”
说了这么多理论,接下来我挑四个我经常用到的场景,给你完整演示一下同一个任务在Prompt优化前后的差别。你不需要照抄我的话术,但可以参考里面的优化思路。
3.1 场景一:把乱糟糟的工作记录变成结构化周报
我有一段时间特别烦写周报,于是随手把聊天记录往AI里一丢,写的是:“帮我写周报。”结果它给我生成了一篇古板的三段式:本周回顾、下周计划、遇到的困难。乍看可以,细看发现所有内容都在总结那些我已经不想再提的杂事,完全没有突出我真正想让领导看到的内容。
后来我把Prompt改成这样: “你是一名熟悉互联网行业的项目助理,请根据下面的原始工作记录,帮我写一份面向产品总监的周报。要求:
- 只提取与项目进度相关的信息,忽略会议寒暄和情绪化表达;
- 分成‘本周完成’‘风险与阻塞’‘下周计划’三个小节;
- 每条不超过两行,语言精炼,不写套话;
- 原始记录里有的内容才写,没有的内容不要编。 以下是原始记录:[粘贴内容]”
你看,这套指令补齐了角色、任务目标、输出结构、内容来源约束。模型输出的内容基本可以直接用,几乎无需修改。核心变化是我没有让它“写周报”,而是让它“从记录里提取信息并按指定结构重排”。这就像给实习生一根针,告诉他“把线穿进去,而不是让他自己找线”。
3.2 场景二:用Prompt帮我看代码、找bug
一开始我调试代码时,总喜欢直接把一大段代码塞进去,附一句“这段代码有bug吗?”模型有时候会一本正经指出一个根本不存在的错误,有时候又只给一句“看起来没有问题”。后来我意识到,是我没有给它足够的调试上下文。
我把代码调试的Prompt改成了这样: “你是一位资深的后端工程师,请阅读下面的代码,先对比预期行为与实际代码逻辑,再分析可能引起执行结果异常的原因,最后给出修复建议。注意:
- 代码运行环境是Python 3.11,主要依赖requests和flask;
- 期望行为是从API获取数据后写入本地SQLite数据库;
- 输出格式为:错误位置、错误原因、修复代码、验证方式。 以下是代码:[代码片段]”
经过这样的拆解,模型会在“错误位置”的引导下真实去检查每一行,而不只是给你一句敷衍的“可能这里有问题”。我还试过加上“请先告诉我你发现了什么线索,再给出建议”,效果也不错。关键是你把AI从一个“猜答案的人”变成了“按流程排查问题的工程师”。
3.3 场景三:从非结构化文本里提取字段
我做过一个模拟项目,需要从几十条杂乱的用户反馈中提取产品名、情绪倾向、问题类型、建议关键词。一开始我用一句“请帮我提取用户反馈中的关键信息”,结果它输出的是自然语言的段落,很难程序化处理。
后来我采用格式约束法,把Prompt写成这样: “系统需要从每条用户反馈中提取结构化信息。请将每条反馈处理为一个JSON对象,字段为:
- product_name:文本中出现的产品名,若无则为null;
- sentiment:取值为“正面”、“负面”或“中性”;
- issue_type:从“性能问题”、“界面问题”、“功能缺失”、“其他”中选择一个;
- quote:从原文中摘录一句最能代表用户态度的原话。 要求:不要输出任何解释,不要使用Markdown代码块,直接用JSON数组返回。 输入反馈如下:[多条原始反馈]”
这样做的结果非常稳定,几乎可以直接把模型输出粘贴到脚本里做后续处理。我后来还尝试在Prompt中增加困难示例,比如“这条反馈里既提到界面又提到速度,issue_type应该填‘性能问题’,因为抱怨的主体是加载速度”,模型在类似情况下就不再犯混了。
3.4 场景四:用AI做角色扮演式的写作助手
写作型任务最容易翻车。如果你说“帮我写一个分手后的重逢场景”,模型大概率写出一段矫情的偶像剧台词。但如果你把场景细节、人物关系、说话习惯都交代清楚,它就能写出很真实的文字。
我自己的习惯是分两步走。第一步先让模型做“世界设定”: “你是一位现实主义小说作家,请根据以下信息搭建一个场景素材库:时间(冬季夜晚,北方城市)、地点(便利店门口)、人物关系(多年未见的老同学,其中一人已结婚)、情感基调(克制、尴尬中带一点释然)。请输出场景中可能出现的道具、天气感受、人物动作和微表情,不要写对话。”
第二步再让它写具体对话,这时候Prompt可以变成: “接着场景素材库,写一段两人的对话。要求:对话要生活化,不要直白说出内心想法,通过谈论某件无关的小事来掩盖旧日恩怨,在结尾用一个动作来收束情绪。”
这样生成的文字,比直接让AI写“重逢”要高级得多。原因也很简单:你给了它可供调配的素材和明确的写作方向,而不是让它从一个空荡荡的题干里硬造一个完整的宇宙。
4. 常见问题与排查技巧:我踩过的那些坑
就算你掌握了上面所有套路,实际用起来还是会有各种幺蛾子。下面是我自己反复遇到并解决过的几个典型问题。
4.1 模型总是“嘴硬”,说错了还不承认怎么办?
大模型在被指出错误后,常常会道歉,但下一次输出可能继续错。它不是在“狡辩”,而是它的训练目标决定了它更倾向给出一个连贯、可信的回答,而不是准确验证过的答案。要解决这个问题,千万别跟它在同一轮对话里纠缠。正确的做法是让它“验证”自己的输出。
比如你怀疑它生成的数据有误,你可以追加一句:“请重新检查一遍,找出你刚才回答中可能与事实不符的地方,并列出依据。”这会促使模型重新扫描一遍自己刚输出的文本,而不是继续顺着原来的错误往下编。如果前面使用了思维链,错误率会低很多,因为模型每一步都有中间过程,最后还要验证,正确的概率就大多了。
4.2 模型不按指定格式输出,怎么纠正都无效
很多人遇到这种情况会一遍遍加“要JSON格式!”,但毫无用处。断掉这个循环的办法是“掐头去尾”:
- 头部拦截:在Prompt末尾明确写“不要输出任何引言或解释,直接以规定格式开始。”
- 尾部兜底:提供完整的示例输出,让模型参考。
- 结构锚点:比如要求“最外层使用[]括号,内部每条记录用{}包裹”,这样一来,模型即使跑偏,也会尽可能落回允许的结构内。
我甚至试过专门写一个“格式纠正”Prompt:“下面是一段不符合要求的输出,请你将其转换为规定的JSON格式,不要回答任何其他内容。”然后粘贴模型前一次的错误输出。这个方法在几次调参后特别好用。
4.3 上下文太长,模型记不住前面的内容
还是那句话,模型的工作台只有那么大。如果你的任务需要处理长文档,我推荐“三步走”策略:
- 摘要浓缩:先让模型把每部分内容分别按“要点”摘出来;
- 分段处理:把浓缩后的要点拼接起来,再让模型基于这些要点做整合分析;
- 增量补充:如果分析了几个部分后,需要加入新信息,就单独开一个任务,把旧结论和新信息一起作为输入,而不是继续在同一对话里追加。
这个方法在处理论文、产品文档、会议纪要时非常稳,有效解决了我早期“聊着聊着就失忆”的痛点。
4.4 越修改越差,Prompt版本无法管理
我早期调Prompt是“想到哪改到哪”,经常一个小时调出五个互相矛盾版本,最后也不知道哪个好。后来我学了一个笨办法:每个关键版本存一条独立对话,或者在同一对话中用不同的下划线分隔符“V1:”“V2:”标出。更系统一点,可以用表格记录版本号、修改点、测试结果。
比如我会建一张小表,列名是“版本特征、测试输入、模型输出质量、我给的评分”。把每个版本测三次,综合评估。这个方法很笨,但特别有效,它能帮你看到哪次改动真正提升了输出,哪次改动只是心理安慰。
4.5 玄学时刻:温度参数和随机性要不要调?
如果你在用API,除了Prompt本身,还有个叫temperature的参数(有的平台叫随机性),它决定模型输出时有多大程度“发散”。数值越高越有创造力,但也更容易胡说八道;数值越低越稳定,但可能显得机械。
我个人的经验是:做信息提取、代码生成、数据清洗这类需要准确性的任务,直接把temperature设到0或0.1;做文案创作、头脑风暴、起名这类需要发散的任务,设到0.7到0.9。如果你的平台只支持聊天界面没有这个参数,那你只能靠Prompt里的约束来控制,比如在创作时加上“尝试给出一种意想不到的视角”,在准确性任务中加上“不要输出你不确定的内容”。
5. 超越模板:怎么判断一个Prompt到底好不好
不少人学Prompt工程,最后变成收集模板。模板当然有用,但真正会写Prompt的人,都会去分析模板背后的结构,再结合自己的场景调整。我评价一个Prompt的好坏,通常会看四点。
5.1 指令清晰度:这条Prompt能否被一个“没有常识的人”执行
把你写的Prompt想象成任务书,发给一个刚入职的实习生。他会不会因为“写一份方案”这种泛泛而谈的词卡住?如果会,说明你的指令还不够具体。我在写的时候会反复问自己:任务目标是什么?实现步骤是什么?输出格式是什么?质量要求是什么?边界条件是什么?这四点都在,才算合格。
5.2 示例有效性:你的例子是“正面示范”还是“负面干扰”
示例务必与任务完全同构,不要加无关变量。我见过有人让AI提取投诉分类,给的例子却是一段正常的表扬,说明“这种应该归为正面”。这确实也是一种示例,但问题是它与任务的主类不一致,模型会学着把与例子结构相似但不相关的内容也归到那类去。
一个更稳的做法是给一组“难分界”例子,专门覆盖容易混淆的情况。比如“配送慢但客服态度好,这归物流还是服务?”你想让模型怎么处理,就明确示范。
5.3 格式可交付性:模型输出能不能直接被下游流程使用
如果你是为了写文案,可能无所谓格式。但如果是为了做自动化处理,输出格式几乎决定一切。好的Prompt写作者会设计出“机器可读、人可检查”的输出。我通常要求JSON数组、纯文本、无代码块标记。这样即使出问题,我也能用脚本快速检测到是哪个字段不符合要求,而不是肉眼在一大段散文里找数据。
5.4 可移植性:换一份相似任务时,Prompt还能不能用
有些Prompt写得很死,只能处理一种特殊场景。而好的Prompt像一套模板,改几个插入位就能复用。我的习惯是把任务中会变的参数,比如“输入内容”、“目标风格”、“字段名”抽出来,放到Prompt末尾统一标注,用占位符代替。这样下次换个需求,我只要替换占位符就行。
6. 最后再分享一点我的真实体会
写了这么多,我最想告诉你的一件事是:Prompt工程不光是“对付AI”的技巧,更是一种把需求想清楚的训练。你为了写好一段Prompt,得先把目标、步骤、边界、产出标准都过一遍,这个习惯本身就会让你变成思维更清晰的人。我现在写方案、布置工作,哪怕不用AI的时候,也会下意识地把模糊需求拆成可执行清单,工作效率反而上去了。
用我这个思路去练一段时间,你会发现自己跟AI协作的体验会发生质变。模型还是那个模型,能力边界还是那个边界,但你手里的“魔法咒语”越长越趁手,它能变出的东西自然就越来越接近你真正想要的。
如果你刚开始练手,我建议从明天起做一个动作:把你最常问AI的一类问题,用我上面讲的结构重写一遍,然后对比前后两次输出的差别。亲自试一次,比你看十篇文章都有用。等你自己调出几个顺手模板后,你会回来感谢这段从“人工智障”到“人工智能”的折腾过程的。