你有没有过这种感觉:同一个 AI 工具,别人输入一小段提示词,几十秒后拿到的是结构完整、逻辑清晰、可以直接使用的方案;你也输入了一段提示词,模型回复了一大堆,仔细一看全是正确的废话。
不是模型的问题,也不是你运气差。真正拉开差距的,是 prompt 本身的写法、颗粒度和约束条件。
本文会围绕 prompt 工程这个主题,把“AI 高手写 prompt”的方式拆开来讲。你会看到普通写法和高手写法在真实场景中的对比,也会拿到一套可以直接套用的高质量 prompt 编写框架,以及日常使用过程中的常见问题与排查思路。这篇文章适合所有想让大模型真正提升效率的开发者,无论你是刚接触 AI 编程,还是已经在用各类大模型辅助开发,都值得从头到尾读一遍。
1. 为什么 prompt 水平会决定 AI 输出质量
1.1 大模型不是搜索引擎,而是“预测下一句话”的系统
很多人使用大模型时,习惯像百度搜索一样输入关键词,比如“Python 读取 Excel 文件”。如果把它当成搜索词,模型确实会给你一段相关答案;但如果把它当成一个工程需求来表达,你会得到一份更精确、更可执行的代码。
这里的关键在于理解大模型的工作原理。无论是 GPT 系列、Claude、还是国产的开源模型,底层都是基于海量语料训练的神经网络。当你输入 prompt 时,模型做的事情本质上是“根据你已经给出的文字,预测最可能接续的内容”。也就是说,你的 prompt 越清晰、越具体、越有约束,模型越容易预测到你想要的内容;你的 prompt 越模糊、越宽泛,模型就只能在最“安全”的方向上输出。
这也是为什么同一个问题,两个不同的人会得到完全不同的结果。高手写 prompt 时,会不自觉地把自己变成“项目经理”,从背景、角色、目标、格式、约束、示例等多个维度把需求描述清楚。普通人写 prompt 时,常常只给出一个目标,甚至只给出几个关键词。
1.2 普通人和 AI 高手在 prompt 上的核心差距
观察过很多同学使用大模型后,会发现普通人和 AI 高手之间的差距集中体现在以下几个方面:
| 对比维度 | 普通用户写 prompt | AI 高手写 prompt |
|---|---|---|
| 需求描述 | “帮我写个爬虫” | “帮我写一个 Python 爬虫,抓取目标网站的新闻标题和发布时间,使用 requests+BeautifulSoup,要求异常处理完整,输出为 CSV 文件” |
| 上下文提供 | 不给背景,直接问 | 主动交代任务背景、数据规模、运行环境、可选方案 |
| 角色设定 | 不用角色 | 根据任务设定“资深后端工程师”“数据分析师”“Oracle DBA”等角色 |
| 输出格式 | 不作要求 | 明确要求输出 JSON、Markdown 表格、代码块、进阶方案等 |
| 边界与约束 | 不提限制条件 | 明确说明不要使用某库、不要超出某版本、代码需要兼容 Windows |
| 示例参考 | 从不给示例 | 会给一个期望输入的示例和期望输出,引导模型模仿 |
| 错误纠正 | 输出不对就重开对话 | 直接指出错误点,让模型重新分析再修改 |
这张表基本可以概括核心差距:高手不是在“提问”,而是在“写需求文档”。当你能把 prompt 当需求文档来写的时候,AI 的输出质量会有一个质的提升。
1.3 什么是 prompt engineering,为什么现在值得系统学
Prompt engineering 被称为提示工程,是指通过设计和优化输入文本,让大模型更稳定、更准确地完成特定任务的一整套方法。它不是简单的“怎么问问题”,而是包含任务拆解、上下文组织、示例设计、格式约束、多轮修正、模型能力边界判断等系统性工程。
在 AI 编程工具、AI Agent、RAG(检索增强生成)等应用越来越普遍的背景下,prompt 已经不只是聊天窗口中的一句话,而是应用系统中的一个关键组件。比如你用 LangChain 搭建一个文档问答机器人,系统提示词直接决定回答的专业性和准确性;你用 Cursor 辅助编程,prompt 决定它生成的代码是符合项目结构还是天马行空。可以说,prompt 水平已经变成了 AI 时代的一项基础能力,类似十年前用搜索引擎查资料的能力。
2. 普通 prompt 与高手 prompt 的实战对比
下面通过五个开发过程中出现频率很高的场景,来直观感受一下 prompt 写法的差异。
2.1 场景一:写一个 Python 函数
先来看普通写法:
帮我写一个 Python 函数,用来判断一个字符串是不是合法的 IP 地址。这个 prompt 不够差,但也不够好。模型可能会给你一个简单的 split 逻辑,但不会考虑 IPv4 和 IPv6 的区别,不会考虑前导零、端口号、CIDR 表示法,也不会考虑空字符串和 None 的边界情况。如果你是在生产项目里用,这个函数大概率要返工。
高手会这样写:
你是一个拥有 10 年经验的 Python 后端工程师。请帮我实现一个函数,用于校验字符串是否为合法的 IPv4 地址。 需求如下: 1. 函数签名:def is_valid_ipv4(ip_str: str) -> bool 2. 只校验 IPv4,不校验 IPv6 3. 每段取值范围 0-255,不允许有前导零(如 "01.2.3.4" 应返回 False) 4. 输入可能是 None、空字符串、含空格字符串,都要返回 False 5. 不需要处理端口号和 CIDR 后缀 请先给出完整的函数实现,然后给出 5 组测试用例,包含正常地址、非法地址、前导零地址、空字符串和 None。 输出格式: - 代码使用 ```python 代码块 - 测试用例使用表格,列名为:输入 | 期望输出 | 说明看出差别了吗?高手把需求文档中的验收标准写进了 prompt,函数签名、边界条件、输入类型、输出格式全部明确。模型不再需要猜,它的输出自然就更精准、更贴近真实项目要求。
2.2 场景二:编写并优化一条 SQL 查询
普通写法:
写一条 SQL,查询每个部门的平均工资。这个写法在表结构不明确的情况下,模型只能编造字段名,你拿到手还得改半天。
高手会先把表和业务背景交代清楚:
你是一位熟悉 Oracle 的数据库开发工程师。现有两张表: - employees 表:字段包括 emp_id(员工ID)、emp_name(员工姓名)、dept_id(部门ID)、salary(工资,NUMBER(10,2)) - departments 表:字段包括 dept_id(部门ID)、dept_name(部门名称) 请写一条 SQL,查询每个部门的平均工资,要求: 1. 输出 dept_name 和 avg_salary 两列,avg_salary 保留两位小数 2. 只需要统计有员工的部门,没有员工的部门不需要出现在结果中 3. 使用表别名,可读性要强 4. 如果部门下有多个员工,按平均工资从高到低排序 先给出 SQL,再用一句话解释这条 SQL 的执行逻辑。如果在真实业务中,你还可以要求它用分析函数、要求它评估索引方案、要求它对比 GROUP BY 和窗口函数的性能差异。信息给得越齐全,模型的回答越接近一个团队资深 DBA 的水平。
2.3 场景三:让 AI 帮你总结技术文档
普通写法是:
总结一下这篇文章的内容。如果你只把一段文档原文粘贴进去,然后给出这样一个 prompt,模型会返回一个泛泛的摘要,抓不住重点。如果你是做汇报、写周报、写技术方案,这种结果基本没法用。
高手会这样写:
你是一位技术文档分析师。下面是我提供的一篇关于微服务架构中分布式事务方案的技术文章。 请完成以下任务: 1. 提取文章的核心观点,控制在 5 条以内 2. 对比文章提到的各种方案,指出各自的使用场景和优缺点 3. 最后给出一段 100 字左右的总结,适合写入技术周报 要求: - 使用中文回答 - 每个核心观点用加粗标题开头 - 不要添加文章中没有提到的信息 - 如果文章内容存在模糊或矛盾之处,请明确指出 以下是文章内容: 【粘贴文章原文】这种写法最关键的一点,是给了模型明确的“输出任务清单”。它不是让模型自由发挥,而是让它像完成三项工作一样逐项执行,这样生成的内容结构完整,还能直接拿去用。
2.4 场景四:生成一段正则表达式
正则表达式是很多开发者觉得头疼的内容,也是 AI 很擅长生成的内容。但普通写法同样容易翻车。
普通写法:
给我一个匹配邮箱的正则。这样的结果,往往忽略了下划线、域名层级、中文字符等边界情况。而且你没有告诉模型你用的是 Python 还是 JavaScript,不同语言的转义和正则引擎行为是有差异的。
高手会这样写:
你是一位正则表达式专家。请帮我写一个用于匹配电子邮件地址的正则表达式,运行环境是 Python 3,使用 re 模块。 要求: 1. 支持常见的邮箱格式:用户名@域名,例如 zhangsan@example.com、zhang.san@sub.example.com.cn 2. 用户名部分允许字母、数字、点、下划线和短横线 3. 域名部分至少包含一个点,不允许以点开头或结尾 4. 不需要匹配显示名称,不需要匹配带注释的复杂格式 请按以下格式输出: 1. 正则表达式本体,放在 Python 代码块中 2. 一段简短的说明,解释这个正则的每一个组成部分 3. 给出 5 个匹配成功和 5 个匹配失败的示例 注意,我需要的是完整可运行的 Python 代码,不是简化示意。这样写出来的结果,不仅能用,还能帮你理解每一个字符的含义。下次再遇到类似需求,你甚至可以自己修改一部分规则。
2.5 场景五:用 AI 排查代码报错
普通写法:
代码报错,帮我看看: File "test.py", line 10, in <module> result = divide(a, b) ZeroDivisionError: division by zero模型当然能看出来是除以零,但它不知道你的意图,也不知道这段代码在什么场景下运行,最后给的建议多半只是“加一个 if 判断”。
高手会这样写:
我遇到一个 ZeroDivisionError,这是相关代码: 【代码片段】 触发场景:用户上传订单金额后,系统计算折扣率时出现异常。 我已经尝试在计算前判断分母是否为 0,但问题仍然出现。 请按下面步骤帮我排查: 1. 分析这段代码的逻辑,指出除数为 0 的几种可能触发路径 2. 给出一个修复方案,要求不改变原有的业务逻辑 3. 如果使用防御式编程,请给出 try-except 和 if 判断两种写法,并对比它们的适用场景 4. 告诉我如何补充日志,方便以后定位类似问题 代码运行环境:Python 3.10,Django 4.2。带上场景、环境、已经尝试过的方法,模型给出的建议会更有针对性,不会从头开始教你写 if 判断。这里面的核心思路是:把模型当成团队里一位刚接手你代码的同事,你描述得越完整,它给出的建议越靠谱。
3. 高质量 Prompt 的六个核心要素
通过上面的对比,可以总结出一个高质量 prompt 的通用框架。熟练掌握这六个要素,你就能丢掉网上那些“万能模板”,自己根据任务组合出合适的 prompt。
3.1 角色(Role)
给模型设定角色,相当于告诉它用哪套知识体系和表达习惯来回答。
举例:
- “你是一位熟悉 Spring Security 的 Java 架构师”
- “你是一位有 10 年经验的数据分析师”
- “你是一位 Oracle 数据库性能优化专家”
角色设定不是万能的,但它可以明显改变模型的输出风格。设置角色后,模型的输出会更加偏向该领域的术语、行文习惯和关注重点,对于需要专业性的任务特别有效。
3.2 任务(Task)
任务要使用明确的动词,比如“实现”“对比”“排查”“解释”“重构”。不要用含糊的“帮我看看”“说一下”这类表达。模糊的任务会得到模糊的结果,这是最简单但也最重要的一条原则。
判断任务是否清晰的方法很简单:把 prompt 中描述任务的句子读出来,如果换一个人也能准确完成,说明描述足够清晰;如果听完之后还一头雾水,那就需要继续拆解。
3.3 上下文(Context)
上下文是任务之外的背景信息,包括运行环境、数据规模、项目架构、技术栈、调用方是谁、最终用户是谁等。对于开发任务,建议至少包含:
- 编程语言和版本
- 使用的框架和版本
- 操作系统或部署环境
- 涉及的数据表结构或接口定义
- 目前已有的代码逻辑
上下文越丰富,模型给出的答案越接近你项目的真实情况。但也要注意不要塞入无关信息,上下文太长会干扰模型注意力,还可能导致 token 超限。
3.4 示例(Example)
在 prompt 中给出示例,这种技术在提示工程里称为 few-shot learning,是提升模型输出稳定性最有效的手段之一。
举个例子,如果你想让模型把一段产品需求改写成技术任务清单,可以在 prompt 中先给出一个“输入:…… 输出:……”的示例。模型会模仿你给的格式和思路来生成后续内容。对格式一致性要求高的任务,示例几乎是必须的。
3.5 格式(Format)
明确输出格式,是提升 prompt 可用性的关键一步。比如:
- 用 Markdown 表格输出对比结果
- 用 JSON 格式输出,并给出字段说明
- 用 Python 代码块输出代码
- 用有序列表输出步骤
- 用代码块加注释的方式输出配置文件
模型本身非常擅长格式化输出,但如果你不告诉它你想要的格式,它就会默认选择自己最熟悉的输出方式。对于后续要程序化处理的内容,建议在 prompt 中直接定义一个 JSON 结构,并说明每个字段的含义。
3.6 约束(Constraint)
约束是告诉模型“不要做什么”。常见的约束包括:
- 不要使用某个第三方库
- 不要修改现有接口签名
- 不要输出与问题无关的背景知识
- 代码需要兼容 Python 3.8 以下版本,不要使用新语法特性
- 回答控制在 500 字以内
- 如果信息不足,直接说不知道,不要编造
约束还有一个重要作用:降低大模型的幻觉(Hallucination)风险。大模型在信息不确定时倾向于生成看起来合理的内容,如果你明确要求“不要编造数据”“没有的信息要说明”,它会更谨慎地回答问题。
4. 一个可以直接套用的 Prompt 模板
结合上面六要素,下面给出一个适合大多数开发场景的通用模板。你可以把它保存在笔记软件中,用时替换占位符。
# 角色 你是一位【填写角色,如:精通 Python 的资深后端工程师】 # 任务 请帮助我【填写具体任务,如:实现一个带超时控制的重试机制】 # 背景 【这里填写任务背景、使用场景、相关代码、数据结构等】 # 约束 1. 环境:Python 3.10,Windows 11 2. 不要额外引入第三方依赖 3. 需要处理边界条件,包括【填写边界情况】 4. 代码需要添加详细的注释 # 输出格式 1. 完整代码,放在 Python 代码块中 2. 使用要点说明,使用无序列表 3. 针对边界条件的测试用例,使用表格 # 参考示例 输入:【示例输入】 输出:【示例输出】使用这个模板时,不需要每次都填满所有项。简单任务可以省略角色和参考示例,复杂任务可以把上下文补充得更详实。关键是养成结构化表达的习惯,而不是每次都复制模板却不知道每项的意义。
5. 常见问题与排查思路
5.1 模型输出太泛泛而谈,不够深入
这是最常见的现象。可能的原因有两种:一是任务描述太宽泛,二是没有添加角色和约束。排查时先给模型补充背景信息,再把任务拆细。
比如“帮我想想怎么优化接口性能”,可以改成“我们有一个查询订单列表的接口,平均耗时 800ms,数据库是 MySQL 8.0,单表数据量约 100 万,已经加了索引但效果不明显。请从 SQL 优化、缓存策略、分页方式三个角度给出优化方案,每个方案要说明原理和适用场景。”
5.2 模型给出错误信息或编造内容
这就是前面提到的幻觉问题。最直接的处理方式,是在 prompt 中明确声明“如果你不确定,请直接回答‘信息不足’,不要编造数据”。对于重要技术细节,还可以要求模型在回答中标注“这部分需要实测确认”或“以官方文档为准”。养成核实关键信息的习惯比任何 prompt 技巧都重要。
5.3 提示词太长导致报错或截断
大模型的上下文窗口是有限制的。当你粘贴大量文档然后提问时,如果超出模型支持的 token 数,会出现“conversation too long”“the number of tokens is greater than”之类报错。
解决方案有几种:先让模型分段总结再合并;只粘贴关键段落而不是全文;如果使用 API,可以利用向量数据库做检索再拼接上下文;也可以使用支持超长上下文的模型。另外,精简 prompt 本身也能节省 token,减少成本。
5.4 输出格式不稳定,有时 JSON 解析失败
这个问题在使用 API 开发应用时特别常见。模型虽然能输出 JSON,但偶尔会带上多余的解释文字,或者使用不合法转义。解决办法是在 prompt 中给出一个 JSON 示例,强制模型只输出 JSON 内容,不要输出其他文字。如果问题频繁,还可以在代码中加一层解析容错逻辑,先提取代码块内容再解析。
5.5 多轮对话后模型“忘”了之前的任务
多轮对话中,模型实际上需要依赖整段上下文。随着对话变长,早期的信息权重会降低。如果模型出现“忘记”情况,可以在后续 prompt 中重新简述一下任务。对于复杂的长期任务,更推荐开启新对话并一次性写好完整 prompt,而不是在长对话里一直追加。
5.6 Prompt 被安全策略拦截
有时候输入的 prompt 因为包含某些敏感词或疑似恶意内容,会被模型自身的策略拦截,返回类似“your prompt was flagged as potentially violating our usage policy”的提示。这种时候先检查自己的输入是否涉及恶意行为、违法信息、暴力内容等。如果确认没有违规,可以改写表达方式,把意图描述得更规范再提交。
6. 把 Prompt 当代码来管理:工程化最佳实践
6.1 用版本管理工具保存 Prompt
在工作中,我发现很多开发者会把好的代码片段保存在 Git 仓库里,却把精心调试过的 prompt 随手丢在聊天记录中。等到下次要用时,只能重新在对话历史里翻找。
更好的做法,是把重要 prompt 以文件形式保存下来,纳入版本管理。文件格式可以用 Markdown,也可以根据使用场景用 JSON、YAML。一个提示词工程项目的目录结构可以参考:
prompts/ ├── code-review/ │ ├── v1.md │ ├── v2.md │ └── README.md ├── sql-optimization/ │ └── prompt.md ├── doc-summary/ │ └── prompt.json └── templates/ └── common-template.md每次调整 prompt 时,保留新旧版本,并在 README 中记录调整原因和效果差异。这种做法会在长期使用中带来非常大的收益。
6.2 给 Prompt 建立测试集
Prompt 和代码一样,也可能出现“改了一处,影响全局”的问题。如果你正在开发依赖 prompt 的应用,建议建一个固定的测试集。测试集包含多组输入和期望输出,每次修改 prompt 后,都跑一遍测试集,观察稳定性和正确率。
测试集记录格式可以是这样的 Excel 表格或 JSON:
[ { "id": "case_001", "task": "根据订单数据生成周报", "input": "订单数据:本周销售额 120 万元,环比增长 15%,客单价 230 元", "expected": "包含销售额、环比增速、客单价三个核心指标,并给出趋势判断" }, { "id": "case_002", "task": "解析用户地址", "input": "北京市海淀区中关村大街 1 号", "expected": "输出结构化 JSON,省份、城市、区县、详细地址字段正确" } ]6.3 把变量和 Prompt 分离
在开发 AI 应用时,建议把 prompt 模板和具体参数变量分开维护。例如使用 Python 开发时,可以这样组织:
# 文件路径:prompts/summary_prompt.py SUMMARY_PROMPT_TEMPLATE = """ 你是一位产品经理。请根据以下内容生成一份项目周报。 输入内容: {document} 要求: 1. 总结本周完成的工作 2. 输出风险与待协调事项 3. 全部内容不超过 {max_words} 字 输出格式: ## 本周进展 …… ## 风险与待办 …… """这样设计之后,当你需要改变语气、调整输出字段时,只需要改模板文件,不需要修改业务调用逻辑。如果使用 LangChain 这类编排框架,还可以方便地与 RAG、Agent 等模块结合。
6.4 记录使用效果,持续优化
每次使用 Prompt 时记录一下效果,比如“代码是否可直接运行”“是否还需要人工大改”“格式是否稳定”。一周下来你就能发现哪些任务的 prompt 需要优化,哪些场景的 prompt 已经可以固化复用。持续迭代的重要性,甚至比“第一次写好”更重要。
6.5 注意隐私与成本边界
在使用 prompt 的过程中,需要注意数据安全。不要将内部敏感数据、未公开的业务信息、客户隐私数据直接粘贴到线上模型中,尤其是通过公网工具聊天窗口使用时。企业开发时如果涉及敏感数据,应优先使用私有化部署的模型或通过合规渠道调用。
另外,长 prompt 会消耗更多 token,直接增加 API 调用成本。在实际开发中,可以用选择关键上下文代替全文粘贴,用精简指令代替啰嗦描述,这部分节省下来的成本在规模化调用时非常可观。
7. 总结与下一步行动
回到最开始的问题:你跟 AI 高手的 prompt 水平,差距到底有多大?
答案也许没有你想象中那么大。只要你开始把 prompt 当需求文档来写,把角色、任务、上下文、示例、格式、约束六个要素记在脑子里,用实战对比中的思路去组织每一次提问,你很快就能发现自己拿到的输出质量明显提升。
建议你从今天开始做三件小事:第一,把你最近使用大模型时效果最差的三个问题找出来,按本文的框架重写一遍,对比前后输出差异;第二,为自己高频使用的任务编写一个固定的 prompt 模板,例如代码审查模板、SQL 优化模板、技术方案模板;第三,用一段时间积累自己的 prompt 库,像整理代码一样整理它们。等你能随手写出信息密度高、约束清晰的 prompt 时,你会发现自己使用 AI 的方式已经和以前完全不同了。
如果以后写代码、写文档、做数据分析时再遇到大模型输出不符合预期,先别急着换工具,回到 prompt 本身找原因。绝大多数时候,差的不是模型,而是我们表达需求的方式。