
1. 从零理解提示词工程到底在解决什么问题1.1 为什么同一个模型换个问法结果天差地别很多人第一次接触大语言模型时都有过这种体验同一个问题换个问法输出的质量能差出好几倍。比如你问“帮我写个爬虫”模型可能给你一段漏洞百出的代码但你换成“用Python写一个遵守robots.txt的网页爬虫要求处理超时重试和编码异常输出完整可运行代码”结果就完全不一样。这背后的核心原因在于大语言模型本质上是一个条件概率生成器它根据你给的上下文逐token预测下一个最可能出现的词。你输入的每一个字都在改变概率分布提示词工程做的就是通过精心设计输入把模型的输出概率引导到你期望的方向上。我刚开始接触这块的时候也觉得提示词工程是不是有点玄学后来自己动手做了大量实验才发现它其实有很强的工程规律可循。模型在预训练阶段见过海量文本这些文本里隐含了各种任务模式。当你给出的提示词足够清晰、约束足够明确时模型就更容易匹配到训练数据中类似的高质量模式从而生成更靠谱的结果。反过来模糊的提示词会让模型在多个可能的方向上摇摆输出自然就不稳定。从实际应用角度看提示词工程要解决的核心问题可以归纳为三个意图对齐让模型准确理解你要什么、格式控制让输出结构符合下游处理要求、质量约束让内容在准确性、完整性、安全性上达标。这三个问题不解决后面搭再复杂的RAG系统、再精细的微调流程效果都会打折扣。1.2 提示词工程和微调、RAG的关系经常有人问既然可以微调模型为什么还要费劲写提示词这个问题我在实际项目里反复验证过结论是它们解决的是不同层次的问题。微调改变的是模型的参数权重相当于让模型“重新学习”某个领域的知识和风格成本高、周期长而且一旦业务需求变化就得重新训练。提示词工程则是在不改变模型参数的前提下通过输入控制来引导输出灵活度极高改几个字就能切换任务。RAG检索增强生成则是另一条路线它解决的是模型知识截止和幻觉问题。模型本身不知道你公司内部的文档内容RAG的做法是先把相关文档检索出来拼接到提示词里让模型基于这些真实材料来回答。你会发现RAG的效果很大程度上取决于提示词怎么写——检索回来的内容怎么组织、怎么告诉模型“只根据以下材料回答”、怎么处理材料冲突这些都是提示词工程的范畴。我个人的经验是一个典型的LLM应用架构里提示词工程是贯穿始终的基础设施。微调负责让模型具备领域基础能力RAG负责注入实时知识而提示词工程负责把这两者的输出整合成最终用户看到的结果。三者不是替代关系而是协作关系。1.3 学习提示词工程的正确路径市面上很多教程一上来就列一堆“万能提示词模板”我觉得这种学法效率很低。模板是死的场景是活的不理解背后的原理换个场景就不会用了。我建议的学习路径是这样的先理解模型的基本工作原理token预测、上下文窗口、注意力机制的基本概念然后掌握提示词的核心构成要素角色设定、任务描述、约束条件、输出格式、示例再通过大量实验建立直觉最后针对具体场景做专项优化。实验环节特别重要。我自己的做法是准备一个测试集包含20到30个有代表性的输入每次调整提示词后都跑一遍对比输出质量。这样能快速判断改动是变好了还是变差了而不是凭感觉。很多人写提示词全靠“试一下看看”没有系统对比进步会很慢。2. 提示词的核心构成要素与设计原则2.1 角色设定给模型一个明确的身份锚点角色设定是提示词里最容易被低估的部分。你告诉模型“你是一个资深Python工程师”和什么都不说输出的代码风格、注释详细程度、边界处理意识都会有明显差异。原因在于模型在训练数据里见过大量不同身份的文本角色设定相当于在概率空间里划出了一个区域让模型优先从这个区域里采样。但角色设定不是越夸张越好。我见过有人写“你是全世界最顶尖的、获得过图灵奖的、有三十年经验的架构师”这种过度堆砌反而会让模型困惑因为它找不到对应的具体行为模式。有效的角色设定应该包含三个要素专业领域比如“后端开发”、经验水平比如“五年以上”、行为风格比如“注重代码可读性和异常处理”。举个例子你是一名有五年经验的Python后端工程师写代码时习惯先处理边界条件和异常情况注释简洁但关键逻辑必须有说明优先使用标准库而不是第三方依赖。这样的角色设定就比单纯说“你是Python专家”要有效得多因为它给出了具体的行为约束。2.2 任务描述把模糊需求翻译成可执行指令任务描述是提示词的主体也是最容易出问题的地方。很多人写提示词时脑子里想的是一个意思写出来的文字是另一个意思模型理解成第三个意思。要解决这个问题我总结了一个“三问法”做什么任务类型、对什么做输入对象、做到什么程度质量标准。举个例子假设你要让模型帮你审查代码。模糊的写法是“帮我看看这段代码有没有问题”。清晰的写法是审查以下Python代码重点检查1是否存在未处理的异常2是否有资源泄漏风险文件、连接未关闭3变量命名是否清晰4是否有性能瓶颈。对每个问题给出具体行号和修改建议如果某类问题不存在则明确说明“无此类问题”。后者的输出可以直接用于代码评审前者你还要反复追问。任务描述越具体模型的输出就越接近可用状态。这里有个技巧把你期望的输出结构直接写进任务描述里模型会倾向于遵循你给出的结构。2.3 约束条件用边界框住模型的发挥空间约束条件是提示词里最体现工程思维的部分。模型天生倾向于“自由发挥”如果你不告诉它边界在哪里它可能会输出你不需要的内容。常见的约束类型包括长度约束不超过500字、格式约束用JSON输出、内容约束只基于提供的材料回答、风格约束用通俗语言解释避免术语。我特别想强调内容约束在RAG场景下的重要性。当你把检索到的文档拼接到提示词里时必须明确告诉模型“只根据以下材料回答如果材料中没有相关信息直接说‘根据现有资料无法回答’不要编造”。不加这句话模型很可能会用自己预训练的知识来“补充”导致幻觉。这个坑我在早期项目里踩过很多次检索明明没找到相关内容模型却自信满满地编了一段看起来很像真的答案。约束条件还有一个作用是控制输出格式。如果你需要把模型输出直接喂给下游程序处理就必须用格式约束。比如要求“输出严格的JSON不要包含任何其他文字”然后在代码里做解析。这里要注意即使你要求了JSON模型偶尔还是会加一些解释性文字所以下游解析一定要做容错处理。2.4 示例少样本学习的力量在提示词里给示例Few-shot是提升输出质量最直接的手段之一。模型看到你给的输入输出对之后会模仿示例的模式来处理新输入。我做过对比测试同一个任务不给示例的准确率大概在60%左右给三个高质量示例后能提升到85%以上。但示例的质量比数量重要。我见过有人随便找几个例子贴进去结果模型学到了错误的模式。好的示例应该满足覆盖典型情况包括边界情况、格式完全一致输入输出结构统一、标注准确示例本身的答案是对的。一般来说三到五个示例就够了太多会占用宝贵的上下文窗口而且边际收益递减。示例的排列顺序也有讲究。模型对提示词末尾的内容注意力更强所以把最复杂或最关键的示例放在最后效果会更好。这个技巧在处理分类任务时特别明显把容易混淆的类别示例放在最后模型区分能力会提升。3. 进阶技巧思维链、RAG与提示词优化3.1 思维链提示让模型学会“先想后答”思维链Chain-of-Thought是我认为对实际效果提升最明显的技巧之一。核心思路很简单不要求模型直接给答案而是要求它先展示推理过程再给出结论。对于数学题、逻辑推理、多步决策这类任务思维链能把准确率提升一大截。为什么有效因为大语言模型是逐token生成的如果直接输出答案模型没有“中间计算”的机会相当于让人心算复杂题目。而思维链给了模型“打草稿”的空间每一步推理都成为下一步的条件最终答案建立在完整的推理链上自然更可靠。实际使用时有几种写法。最简单的是在提示词末尾加一句“让我们一步一步思考”。更可控的做法是给出推理步骤的模板请按以下步骤分析第一步提取问题中的关键信息第二步判断每个信息的含义第三步建立信息之间的关系第四步得出结论。请逐步输出。我实测下来对于需要多步推理的任务思维链能把准确率从50%左右提升到80%以上。但要注意思维链不是万能的。对于简单的信息提取、格式转换类任务加思维链反而会让输出变啰嗦甚至引入不必要的错误。判断标准是如果任务需要“想一下才能答”就用思维链如果任务是“看到就能答”就不用。3.2 RAG场景下的提示词设计要点RAG系统的提示词设计和普通对话有本质区别因为你要把检索到的文档片段作为上下文注入。这里有几个关键设计点。首先是材料组织方式。检索回来的文档片段不能随便堆在一起要给每个片段编号并标注来源。比如以下是与问题相关的资料 [资料1] 内容... [资料2] 内容... 请基于以上资料回答问题并在回答中标注引用了哪条资料。编号和来源标注有两个好处一是模型更容易定位信息二是方便你追溯答案的依据。其次是冲突处理。检索回来的资料之间可能有矛盾这时候要在提示词里明确优先级规则。比如“如果资料之间存在冲突以资料1为准”或者“如果资料冲突请指出冲突点并说明无法确定”。不处理冲突模型可能会随机选一个或者把矛盾的内容混在一起输出。第三是拒答机制。前面提过必须明确告诉模型“资料中没有的信息不要编造”。我还会加一句“如果资料不足以回答问题请直接说明‘根据现有资料无法回答该问题’”。这个拒答机制在客服、法律、医疗等场景下特别重要宁可说不知道也不能给错误信息。3.3 提示词优化器的使用思路提示词优化器Prompt Optimizer这类工具的核心思路是自动化地搜索更好的提示词。它的工作方式通常是你给一个任务描述和一组测试用例工具自动生成多个提示词变体分别跑测试根据评分选出最优的。这类工具适合在提示词已经基本可用、但想进一步提升效果的阶段使用。我自己的使用体会是优化器能发现一些人工想不到的表述方式但它依赖测试集的质量。如果测试集覆盖不全优化出来的提示词可能过拟合到测试集上换个场景就不好用了。所以我的做法是先用人工方法写出一个基线提示词确保核心逻辑正确然后用优化器做微调最后用独立的验证集确认效果。另外优化器生成的提示词有时候会变得很长很复杂可读性差。如果团队里其他人要维护这个提示词我建议在优化结果的基础上做一次人工精简把冗余的约束合并保持结构清晰。4. 实操中常见的坑与排查方法4.1 提示词被拦截或报错的排查思路在实际调用模型API时经常会遇到提示词被拦截的情况返回类似“invalid prompt”的错误。这类问题通常有几个原因提示词里包含了被判定为敏感的内容、提示词触发了安全策略、或者提示词格式不符合API要求。排查步骤我一般是这样的第一步把提示词拆成最小单元逐段测试定位是哪部分触发了拦截。第二步检查是否有特殊字符、编码问题或格式错误。第三步如果是内容安全策略触发尝试换一种表述方式把可能敏感的词替换成中性表达。第四步确认API版本和参数是否正确有些参数在不同版本里行为不一样。这里有个经验批量处理时一定要做错误捕获和重试机制。我见过有人写脚本批量调用中间有一条被拦截了整个脚本就崩了。正确的做法是每条请求独立try-catch记录失败原因对可重试的错误做退避重试对不可重试的错误记录到日志里人工处理。4.2 RAG效果不好的常见原因RAG系统效果差很多人第一反应是模型不行但实际上大部分问题出在检索环节和提示词环节。我整理了一个排查清单问题现象可能原因排查方法回答内容与问题无关检索结果不相关检查检索返回的文档片段看是否真的包含答案回答缺少关键信息检索片段被截断检查文档分块大小和重叠设置回答包含编造内容提示词未限制“只基于资料”在提示词中加强约束和拒答机制回答格式混乱提示词未指定输出格式添加格式约束和示例多个资料冲突时回答矛盾未定义冲突处理规则在提示词中明确优先级或要求指出冲突我特别想说的是文档分块这个环节。很多人直接把整篇文档塞进去结果要么超出上下文窗口要么关键信息被淹没。合理的做法是按语义分块每块300到500字块之间保留10%到20%的重叠确保跨块的信息不会被切断。分块之后还要给每块加上标题或摘要方便检索时匹配。4.3 提示词版本管理与迭代方法提示词不是写完就完了业务变化、模型升级、用户反馈都会要求你不断调整。如果没有版本管理改着改着就乱了出了问题也不知道是哪个版本导致的。我的做法是把提示词当成代码来管理用Git做版本控制每次修改写清楚改了什么、为什么改、测试结果如何。具体操作上我会维护一个提示词文件里面用注释标注每个版本的变化。同时维护一个测试集文件包含输入和期望输出。每次修改提示词后跑一遍测试集对比通过率。如果通过率下降就回滚到上一个版本。这套流程看起来麻烦但实际用起来能省很多排查时间。还有一个技巧是A/B测试。当你不确定两个提示词哪个更好时不要凭感觉选而是各跑一批真实请求对比关键指标准确率、用户满意度、响应长度等。数据说话比直觉靠谱。5. 不同场景下的提示词实战策略5.1 代码生成与审查场景代码场景对提示词的要求和其他场景不太一样因为代码有明确的正确性标准而且模型很容易生成“看起来对但跑不通”的代码。我的经验是代码生成的提示词必须包含运行环境Python版本、依赖库、输入输出示例、边界条件要求、错误处理要求。比如让模型写一个函数我会这样写提示词用Python 3.10写一个函数输入是一个包含用户信息的字典列表输出是按年龄分组后的字典。要求1处理空列表输入2处理缺少age字段的情况跳过该条记录并记录警告3年龄为负数时视为无效数据4使用类型注解5不要使用第三方库。这样写出来的代码基本可以直接用不需要反复修改。如果只写“写一个按年龄分组的函数”模型可能会用pandas可能会忽略异常情况你还得来回沟通好几轮。代码审查场景则要强调“具体”。不要只说“检查代码问题”而是列出检查维度安全性、性能、可读性、异常处理、资源管理。每个维度给出具体的检查点模型才能给出有针对性的意见。5.2 知识库问答场景知识库问答是RAG最典型的应用场景。这里的提示词设计核心是“忠实于原文”。我通常会用这样的结构你是一个知识库助手。请严格根据以下资料回答问题。资料中没有提到的信息不要自行补充。如果资料不足以回答请说“根据现有资料无法回答”。回答时请引用资料编号。资料 [1] ... [2] ...问题...这个结构里“严格根据”“不要自行补充”“无法回答”这三个约束缺一不可。我做过对比测试去掉任何一个幻觉率都会明显上升。另外知识库问答场景下检索质量比提示词更重要。如果检索回来的资料本身就不相关再好的提示词也救不了。所以我的建议是先把检索环节调好确保召回率和准确率达标再优化提示词。5.3 结构化数据提取场景从非结构化文本里提取结构化信息是另一个高频场景比如从简历里提取姓名、学历、工作经历从合同里提取甲乙方、金额、期限。这类场景的提示词设计要点是明确字段定义、给出格式示例、处理缺失值。字段定义要精确到边界。比如“工作经历”这个字段要说明是只包含公司名称和职位还是包含起止时间和工作内容。不定义清楚模型每次提取的粒度都不一样。格式示例最好用真实的JSON结构让模型直接模仿。缺失值的处理也要明确是输出null还是输出空字符串还是跳过该字段。我一般要求输出null这样下游处理逻辑统一。还有一个坑是日期格式。模型可能会输出“2020年3月”也可能输出“2020-03”还可能输出“March 2020”。必须在提示词里指定统一格式比如“日期统一用YYYY-MM格式”。6. 提示词工程的评估与持续优化6.1 怎么判断一个提示词好不好判断提示词质量不能靠感觉要有可量化的指标。我常用的评估维度有四个准确率输出是否正确、一致性同样输入多次运行结果是否稳定、完整性是否覆盖了所有要求、格式合规率输出格式是否符合要求。准确率需要人工标注或规则校验。一致性可以通过同一输入跑多次来测。完整性和格式合规率可以用自动化脚本检查。我一般会准备一个包含50到100个测试用例的评估集覆盖典型场景和边界情况每次修改提示词后跑一遍记录各项指标。这里有个经验不要追求单次输出的完美而要追求多次运行的稳定。模型有随机性偶尔一次输出很好不代表提示词好要多次运行都稳定才算好。我一般会跑三次取平均如果三次结果差异很大说明提示词还不够明确。6.2 提示词迭代的节奏控制提示词迭代最忌讳的是“改一点测一下改一点测一下”这样效率很低而且容易陷入局部最优。我的做法是分阶段迭代第一阶段解决“有没有”的问题确保提示词能完成基本任务第二阶段解决“准不准”的问题针对错误案例做定向优化第三阶段解决“稳不稳”的问题处理边界情况和异常输入。每个阶段之间要有明确的验收标准。比如第一阶段的标准是“80%的测试用例能输出可用结果”达到后再进入第二阶段。这样迭代有节奏不会东改一下西改一下。另外每次迭代只改一个变量。如果同时改了角色设定和输出格式效果变好了你也不知道是哪个改动起的作用。控制变量是实验的基本功提示词优化也一样。6.3 模型升级后的提示词适配模型版本升级后原来的提示词可能效果会变化。我遇到过好几次模型小版本更新后原本稳定的提示词开始出现格式错误。原因可能是新版本对某些表述的理解变了或者安全策略调整了。所以模型升级后第一件事就是跑一遍回归测试对比新旧版本的各项指标。如果指标下降先不要急着大改提示词而是定位是哪个环节出了问题。有时候只需要微调几个词就能恢复有时候需要重新设计。我的建议是在提示词里尽量避免依赖特定模型的“怪癖”。比如有些提示词靠特定的标点符号或格式来触发模型行为这种提示词在模型升级后最容易失效。尽量用自然、明确的表述让提示词在不同模型之间也有一定的可移植性。7. 本地部署场景下的提示词注意事项7.1 本地模型和云端模型的提示词差异本地部署大语言模型越来越普遍但很多人发现同样的提示词在云端模型上效果好换到本地模型就不行了。这主要是因为本地模型的参数量通常更小指令遵循能力和上下文理解能力相对弱一些。针对本地模型提示词需要更“直白”。云端模型能理解的隐含意图本地模型可能需要你明确写出来。比如云端模型看到“帮我优化一下”就知道是要改代码本地模型可能需要你写“请优化以下代码的性能和可读性”。另外本地模型的上下文窗口通常更小提示词不能太长。我一般会把本地模型的提示词控制在1000 token以内把最关键的约束放在最前面和最后面因为模型对首尾内容的注意力更强。7.2 本地RAG系统的搭建要点在本地搭建RAG系统提示词设计要考虑本地模型的特性。首先是检索片段的数量要控制本地模型处理长上下文的能力有限塞太多资料反而会降低效果。我一般只取Top 3到Top 5的相关片段。其次是提示词结构要更简单。云端模型能处理复杂的多级指令本地模型可能只能处理一层。所以本地RAG的提示词我通常写成“根据以下资料回答问题。资料[内容]。问题[问题]。如果资料中没有答案说不知道。”简单直接效果反而更好。还有一个实际问题是本地模型的推理速度。如果提示词太长生成时间会明显增加。所以在本地场景下提示词的简洁性不仅影响效果还影响用户体验。7.3 资源受限环境下的提示词压缩技巧在资源受限的环境下比如显存有限、推理速度要求高提示词需要做压缩。我的做法是去掉所有修饰性语言只保留核心指令用符号代替文字比如用“”代替“请输出以下内容”把示例精简到最少必要数量。但压缩不能牺牲关键约束。安全约束、格式约束、拒答机制这三类内容不能省。我见过有人为了省token把“不要编造”删了结果模型开始胡说八道反而要花更多时间处理错误输出。一个实用的技巧是把固定不变的提示词部分做成模板只把变量部分动态替换。这样既能保证提示词结构完整又能减少每次输入的token数量。很多框架都支持这种模板机制用起来很方便。8. 我踩过的坑和总结的经验8.1 那些年我写过的无效提示词回顾自己写过的提示词无效的案例比有效的还多。最常见的错误是“假设模型知道我不知道的东西”。比如我写“按照最佳实践处理”我以为模型知道最佳实践是什么但实际上它可能理解成另一个领域的最佳实践。后来我学乖了所有要求都写具体“最佳实践”这种词一律替换成具体的检查项。第二个错误是“一次要求太多”。我曾经在一个提示词里塞了十几个要求结果模型顾此失彼满足了前面几个就忘了后面几个。后来我把复杂任务拆成多个步骤每个步骤一个提示词串联起来用效果反而更好。第三个错误是“不给示例”。早期我觉得示例占地方能省就省。后来发现对于格式要求高的任务给一个示例比写十句约束都管用。现在我的习惯是只要输出格式有要求必给示例。8.2 提示词工程中最值得投入时间的三件事如果只能做三件事来提升提示词效果我会选建立测试集、做对比实验、维护版本记录。测试集让你有客观标准对比实验让你知道改动是否有效版本记录让你能回溯和复现。这三件事看起来都是“慢功夫”但长期来看节省的时间远超投入。我见过太多人写提示词全靠“感觉”改来改去最后自己都忘了哪个版本最好。有测试集和版本记录这个问题就不存在了。而且当团队协作时这些记录能让其他人快速理解你的思路减少沟通成本。8.3 对刚入门的朋友的几句实在话提示词工程不是玄学但也不是背几个模板就能掌握的。它需要你理解模型的工作原理需要大量实验积累直觉需要工程化的方法来管理和优化。刚开始的时候不要追求写出“完美提示词”先写出“能用的提示词”然后在实际使用中不断迭代。另外不要忽视基础。很多人一上来就研究各种高级技巧但连清晰表达需求都做不到。我建议先把“把话说清楚”这件事练好再学思维链、RAG这些进阶内容。基础扎实了进阶技巧才能发挥出效果。最后保持实验心态。提示词工程领域变化很快新模型、新方法层出不穷。今天有效的技巧明天可能就过时了。保持动手实验的习惯用数据说话比记住任何具体技巧都重要。