1. 项目概述:从“会说话”到“会办事”的Prompt工程

如果你最近在折腾大语言模型,不管是调用API还是本地部署,大概率都经历过这样的场景:你满怀期待地向模型抛出一个问题,结果它要么答非所问,要么给你一堆正确的废话,要么干脆开始一本正经地胡说八道。这时候,你可能会怀疑模型的能力,或者觉得自己的问题不够清晰。但问题的核心,往往不在于模型本身,而在于你与它沟通的方式——这就是Prompt提示工程的价值所在。

Prompt工程,简单说就是“如何向大模型提问,才能让它给出你想要的答案”。它不是什么高深莫测的玄学,而是一套结合了语言学、心理学和计算机科学的实践技巧。一个好的Prompt,就像给一位极其聪明但缺乏常识和背景知识的专家下达一份清晰、无歧义的工作指令。这份指令的质量,直接决定了专家产出的成果是惊艳四座还是令人啼笑皆非。

随着LLM应用开发、RAG(检索增强生成)和Agent(智能体)架构的兴起,Prompt工程已经从“锦上添花”变成了“核心基建”。无论是构建一个能自动分析财报的Agent,还是开发一个基于私有知识库的智能客服,抑或是用大模型辅助量化策略的生成与回测,其效果的上限,很大程度上被Prompt的设计水平所锁定。因此,掌握Prompt工程的策略与技巧,是每一位希望将大模型能力真正落地到业务中的开发者、产品经理乃至业务专家的必修课。本文旨在系统性地梳理和总结这些实战策略,让你不仅能“会说话”,更能让模型“会办事”。

2. Prompt工程的核心思想与设计原则

在深入具体技巧之前,我们必须先建立正确的认知框架。Prompt工程不是简单的“话术”,其背后有一套核心的设计哲学。

2.1 核心思想:将模型视为一个“超级实习生”

一个非常有效的思维模型是:将大语言模型想象成一个能力超强、知识渊博,但缺乏具体任务上下文、不懂潜规则、且偶尔会“想当然”的实习生。你的Prompt,就是给他的任务说明书。

基于这个比喻,我们可以推导出几个核心原则:

  1. 明确性高于一切 :你不能对实习生说“把那个东西处理一下”。你必须明确告诉他:“请从‘销售数据.xlsx’文件的‘Q3’工作表中,提取‘产品A’的月度销售额数据,计算其季度环比增长率,并将结果以百分比形式,保留两位小数,总结在一段话里。”
  2. 提供充足的上下文 :实习生不知道你们部门的暗语“QBR”指的是季度业务回顾。在你的Prompt里,需要定义关键术语,提供必要的背景信息。例如:“在本任务中,‘客户画像’特指包含年龄、地域、消费频次和偏好品类这四个维度的描述。”
  3. 设定清晰的输出格式与边界 :你需要告诉实习生,报告是要PPT摘要还是Word文档,有没有字数限制,是否需要避免提及某些敏感信息。对模型亦然,明确格式(JSON、Markdown、纯文本)、长度、风格(专业、口语化)和禁忌。
  4. 任务分解与链式思考 :对于一个复杂任务,优秀的经理会将其分解为几个清晰的步骤,让实习生一步步执行。对于大模型,我们可以通过Prompt设计,引导它进行“链式思考”(Chain-of-Thought),先拆解问题,再逐步推理,最后得出结论,这能显著提升复杂逻辑和数学问题的正确率。

2.2 设计原则:从目标反推Prompt结构

一个高质量的Prompt通常包含以下几个结构化部分,我习惯称之为“Prompt配方”:

  • 角色(Role) :定义模型在本次对话中扮演的身份。例如:“你是一位经验丰富的金融分析师”、“你是一个严谨的代码审查助手”。这能激活模型内部与该角色相关的知识模式和语言风格。
  • 任务(Task) :清晰、无歧义地陈述你希望模型完成的具体工作。使用动词开头,如“总结以下文章”、“将Python代码转换为Go语言”、“对比方案A和方案B的优缺点”。
  • 上下文(Context) :提供完成任务所必需的所有信息。这包括输入文本、相关数据、背景知识、定义等。这是Prompt的主体部分。
  • 指令(Instructions) :详细说明模型应该如何执行任务。包括步骤、方法、注意事项等。例如:“请先列出文章的三个核心论点,然后为每个论点提供一个论据支持。”
  • 输出格式(Output Format) :明确规定模型输出的形式。例如:“请以JSON格式输出,包含 summary keywords 两个字段。”“用Markdown表格呈现,列名为‘优势’和‘劣势’。”
  • 示例(Examples) :提供一两个输入-输出对的例子。这是最强大的技巧之一,即“少样本学习”(Few-Shot Learning)。通过示例,你可以非常直观地展示你期望的格式、风格和深度。

注意 :不是每个Prompt都需要包含所有部分。对于简单任务,可能只需要“任务”和“上下文”。但对于复杂或关键任务,遵循这个结构能极大提高成功率。一个常见的误区是认为Prompt越短越好,实际上,在大多数情况下,更详细、结构化的Prompt效果远优于简短模糊的Prompt。

3. 基础到进阶的Prompt策略详解

掌握了核心思想,我们就可以进入实战环节。下面我将从基础到高级,逐一拆解常用的Prompt策略。

3.1 基础策略:清晰指令与角色扮演

这是Prompt工程的基石,适用于绝大多数场景。

1. 使用分隔符清晰界定输入 永远不要假设模型能自动区分你的指令和待处理的内容。使用明确的分隔符(如 """ , ````, --- <> 等)将指令和上下文分开。

不佳示例

总结一下这篇关于深度学习的文章:深度学习是机器学习的分支...(很长一段文章)

模型可能分不清哪里是指令,哪里是文章。

优化示例

请总结以下用三引号括起来的文章。
文章:"""
深度学习是机器学习的一个分支,它试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象。
...
"""

这样,指令和内容的边界就非常清晰了。

2. 指定步骤与输出格式 将复杂任务分解,并明确要求模型按步骤执行。同时,强制指定输出格式,便于后续程序化处理。

示例

你是一位产品经理。请分析以下用户反馈,并按照以下步骤输出:
1.  情感判断:判断用户情绪是正面、负面还是中性。
2.  问题归类:将反馈归类到“功能需求”、“Bug报告”、“体验优化”或“其他”。
3.  要点总结:用一句话总结用户的核心诉求。

用户反馈:"""
这个新版本的搜索功能反应太慢了,每次都要等好几秒。而且筛选条件不能多选,非常不方便。希望尽快优化。
"""

请严格按照以下JSON格式输出:
{
  "sentiment": "",
  "category": "",
  "summary": ""
}

3. 角色扮演(Persona) 通过赋予模型一个特定的角色,可以引导其采用相应的知识领域、思维方式和语言风格。这在创意写作、专业咨询、模拟对话等场景下效果显著。

示例

假设你是一位有10年经验的SRE(站点可靠性工程师)。现在有一个线上服务在凌晨2点出现P95延迟飙升和错误率增加。请:
1.  列出你首先会检查的五个关键指标或日志源。
2.  提供一个初步的排查思路。
3.  用工程师之间的口吻,写一段向团队同步情况的简短消息。

3.2 进阶策略:思维链、少样本学习与系统Prompt

当基础策略无法满足复杂任务时,我们需要更高级的工具。

1. 思维链提示 对于需要逻辑推理、数学计算或分步决策的任务,直接问答案往往得到错误结果。思维链提示要求模型“展示其思考过程”。

经典示例(数学问题) 直接提问 :“小明有5个苹果,吃了2个,又买了3包,每包4个,他现在有多少苹果?” 模型可能直接输出一个错误答案。

思维链提示

请逐步推理以下问题:
小明有5个苹果,吃了2个,又买了3包,每包4个,他现在有多少苹果?
让我们一步步思考:
1. 最初有5个苹果。
2. 吃了2个,剩余 5 - 2 = 3个苹果。
3. 买了3包,每包4个,所以买了 3 * 4 = 12个苹果。
4. 现在总共有 3 + 12 = 15个苹果。
所以,小明现在有15个苹果。

通过先让模型学习这种“逐步推理”的模式,再提出新问题,其准确率会大幅提升。在实际API调用中,我们可以在系统消息或第一个用户消息中植入这种推理格式。

2. 少样本学习 这是目前最强大、最实用的Prompt技巧之一。通过提供少量(通常1-5个)高质量的输入-输出示例,让模型精准理解你的需求。它特别适用于格式固定、风格特定或逻辑复杂的任务。

示例(情感分析与实体提取)

请根据以下示例,完成对新评论的分析。

示例1:
输入:”这部电影的视觉效果震撼,但剧情太薄弱了,看得我昏昏欲睡。“
输出:{"sentiment": "mixed", "entities": ["视觉效果", "剧情"]}

示例2:
输入:”餐厅环境优雅,服务员态度很好,招牌菜的味道堪称一绝,强烈推荐!“
输出:{"sentiment": "positive", "entities": ["环境", "服务员态度", "招牌菜"]}

现在请分析:
输入:”快递速度超快,包装也很结实,就是商品本身有点色差,跟图片不太一样。“
输出:

模型通过示例,学会了如何判断复杂情感(混合情绪)以及如何提取核心实体,并能很好地泛化到新的输入上。

3. 系统Prompt与对话持久化 在构建聊天应用或Agent时,我们通常使用“系统消息”来设定对话的全局背景、角色和行为准则,这个系统消息就是“系统Prompt”。它与单次查询的用户Prompt不同,为整个对话会话定下了基调。

系统Prompt设计要点

  • 身份与边界 :明确你是谁,你能做什么,不能做什么。例如:“你是一个乐于助人的AI助手,知识截止日期为2024年7月。你可以回答问题、提供建议,但无法进行实时网络搜索或预测未来。”
  • 行为规范 :规定回答风格。例如:“请用中文回答,保持专业、简洁。如果遇到不确定的信息,请明确说明‘我不确定’,而不是编造答案。”
  • 输出格式 :如果对话需要结构化输出,可以在系统Prompt中提前约定。
  • 安全与合规 :嵌入必要的安全指令,例如拒绝回答某些类型的问题。

一个设计良好的系统Prompt,能让后续的用户交互事半功倍,确保AI行为的一致性和可控性。在 llama.cpp vLLM 部署或 Ollama 运行本地模型时,系统Prompt的配置是关键一环。

3.3 高级策略:自洽性、投票与动态Few-Shot

在追求极高可靠性的场景(如代码生成、事实问答)中,我们会采用一些更复杂的策略。

1. 自洽性 对于同一个问题,让模型在相同Prompt下,独立生成多个(例如3-5个)不同的答案。然后,从这些答案中选择出现频率最高、或者通过某种规则判定最一致的那个作为最终答案。这能有效降低模型随机“胡言乱语”带来的风险。

2. 投票机制 这是自洽性的升级版。生成多个答案后,可以设计一个“评判Prompt”,让模型自己或另一个模型实例对这些答案进行质量评估和投票,选出最佳答案。例如,在生成一段代码后,可以要求模型“检查以下哪段代码最符合要求、最简洁且没有语法错误”。

3. 动态Few-Shot 传统的Few-Shot示例是静态写在Prompt里的。动态Few-Shot则更智能:根据用户当前的问题,实时地从向量数据库中检索出最相关的几个示例,然后动态地插入到Prompt中。这是RAG架构的核心能力之一,它使得模型能基于最新的、最相关的“记忆”来回答问题,极大地提升了在专业领域或私有知识库上的表现。

4. 针对不同场景的Prompt实战技巧

理论需要结合实践。下面我们看几个典型应用场景下的Prompt设计。

4.1 代码生成与审查

代码生成是LLM的核心能力,但也是容易出错的领域。好的Prompt能极大提升代码质量。

代码生成Prompt要点

  • 明确技术栈 :指定编程语言、框架、版本。
  • 定义输入输出 :清晰说明函数签名、参数类型、返回值。
  • 提供上下文 :如果是修改现有代码,提供相关代码片段。
  • 指定约束 :性能要求、不能使用的库、代码风格(如PEP 8)。
  • 要求添加注释 :特别是复杂逻辑处。

示例

你是一个资深的Python开发助手。请编写一个函数,用于安全地解析用户输入的字符串形式的JSON数据。
- 函数名:`safe_parse_json`
- 输入:一个字符串 `json_str`,可能包含有效的JSON,也可能是无效的、空字符串或`None`。
- 输出:如果解析成功,返回解析后的Python对象(字典或列表);如果失败,返回一个空字典 `{}`。
- 要求:使用标准库`json`。必须包含完整的异常处理(`try-except`)。在函数开头用三引号文档字符串说明函数用途。
- 请只输出函数代码,不要有其他解释。

代码审查Prompt要点

  • 聚焦重点 :要求模型关注安全性、性能、可读性、潜在Bug中的某一项或几项。
  • 分级反馈 :要求按“关键问题”、“警告”、“建议”分类列出。
  • 提供修改建议 :最好能直接给出修改后的代码片段。

4.2 内容创作与润色

从写邮件、写报告到创作营销文案,Prompt能成为你的得力助手。

创作Prompt :使用“角色+任务+风格+示例”的组合拳。

你是一位顶尖的科技产品发布会主讲人。请为即将发布的“智能办公笔记本”撰写一段开场白。
- 目标受众:企业CIO和IT管理者。
- 核心卖点:无缝同步手写笔记与数字文档、AI自动整理要点、支持团队协作。
- 风格:专业、有激情、能引发共鸣,避免过于技术化的 jargon。
- 长度:大约200字。

润色Prompt :不仅要让它改,还要告诉它怎么改。

请将以下段落润色得更专业、更简洁有力。请专注于:
1.  将被动语态改为主动语态。
2.  去除冗余的副词和短语(如“非常”、“基本上”)。
3.  确保句子结构多样,避免单调。
4.  提升整体逻辑流畅度。

原文:"""
我们这个系统基本上是为了非常有效地处理大量的用户数据而设计的,它能够非常快速地进行数据的分析,并且还能给出一些非常有用的洞察。
"""

4.3 复杂分析与决策支持

对于需要从长文档中提取信息、对比分析或做出判断的任务,结构化Prompt至关重要。

信息提取与总结

你是一位投资分析师。请阅读以下上市公司年报摘要,并提取关键信息。
年报摘要:"""
[此处粘贴很长一段年报文本]
"""
请以Markdown表格形式输出,包含以下列:
| 指标类别 | 具体指标 | 本年数据 | 去年同期数据 | 变化率 | 简要分析 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| 财务业绩 | 营业收入 | | | | |
| 财务业绩 | 净利润 | | | | |
| 运营数据 | 用户规模 | | | | |
| ... | ... | | | | |

注意 :对于超长文本,直接输入可能超出模型上下文窗口(即出现 context overflow: prompt too large 错误)。此时必须结合RAG技术,先对文档进行分块、索引和检索,只将最相关的片段放入Prompt。

方案对比

请从技术可行性、实施成本、长期维护性和团队适配度四个维度,对比“采用微服务架构重构单体应用”和“在单体应用内进行模块化优化”两个方案。
- 为每个维度打分(1-5分,5分最优)。
- 为每个方案列出最突出的两个优势和两个风险。
- 最后,给出一个基于初创公司资源有限背景的倾向性建议。
请用清晰的标题和列表呈现。

5. 常见陷阱、问题排查与优化心得

即使掌握了策略,在实际操作中依然会踩坑。下面分享一些我积累的实战经验和排查技巧。

5.1 典型陷阱与避坑指南

  1. 模糊指令 :这是最常见的问题。避免使用“更好”、“优化一下”这种主观词汇。必须量化或具体化,如“将响应时间从2秒降低到500毫秒以内”、“将这段文字压缩到100字以内”。
  2. 信息过载与冲突 :在Prompt中提供了过多或相互矛盾的指令。模型可能会困惑,选择忽略部分指令或产生混乱输出。保持Prompt的简洁和一致性,一次聚焦一个主要任务。
  3. 忽略模型的局限性 :要求模型进行需要实时信息、精确计算或个人主观判断的任务。记住,模型是基于训练数据生成文本,它不会“思考”或“查询”。对于事实性问题,务必结合RAG(检索)来提供准确信息。
  4. Prompt注入风险 :在构建对外服务时,如果直接将用户输入拼接到你的系统Prompt之后,恶意用户可能通过精心构造的输入来“劫持”你的指令,让模型执行非预期操作。解决方法是:严格区分“系统指令”、“用户输入”和“上下文”,对用户输入进行清洗或使用更安全的API调用模式。

5.2 问题排查清单

当模型输出不理想时,可以按以下清单排查:

问题现象 可能原因 排查与优化方向
输出完全无关 Prompt指令与上下文混淆;任务描述极度模糊。 使用分隔符清晰划分指令和输入。重写任务描述,使其具体、可执行。
输出格式不符 未明确指定格式,或指定了模型不熟悉的复杂格式。 在Prompt中明确指定格式(如JSON、列表、表格)。提供输出格式的示例(Few-Shot)。
输出内容肤浅、笼统 Prompt过于宽泛;缺乏深度或细节要求。 增加具体指令,如“请分三点论述,每点至少包含一个实例”。“请从正反两方面分析,并各给出两个理由。”
输出包含事实错误 模型知识截止或幻觉;任务超出其知识范围。 对于需要最新或私有知识的问题, 必须采用RAG架构 ,通过检索提供准确来源。在Prompt中要求模型“基于以下提供的信息回答”,并明确指出“如果信息不足,请说明无法回答”。
输出风格不符 未指定角色或风格。 使用角色扮演(Persona)指令。提供风格示例(Few-Shot)。
复杂任务推理错误 模型直接跳向答案,缺乏中间推理步骤。 采用 思维链提示 ,明确要求“让我们一步步思考”。在Few-Shot示例中展示推理过程。
在长对话中遗忘早期指令 上下文窗口限制;多轮对话后焦点分散。 对于超长对话,定期在用户消息中温和地重述关键指令和约束。在系统Prompt中强调核心规则。对于超长文本处理,使用RAG而非将全文输入。

5.3 高级优化心得:温度与Top-p参数

除了Prompt本身,调用模型时的参数也至关重要,最主要的是 temperature top_p

  • 温度 :控制输出的随机性。值越低(如0.1),输出越确定、保守,倾向于选择概率最高的词,适合事实问答、代码生成。值越高(如0.8),输出越随机、有创意,适合创意写作、头脑风暴。 对于需要可靠性的任务,通常建议设置在0.1到0.3之间
  • Top-p :另一种控制随机性的方式,称为“核采样”。它从累积概率超过p的最小词集合中采样。 top_p=0.9 意味着只考虑概率质量占前90%的词。通常 temperature top_p 不要同时调整,建议只改动其中一个(通常调 temperature 即可),另一个保持默认(如 top_p=1.0 )。

实操建议 :在开发调试阶段,使用较低的 temperature (如0.1)来获得稳定、可复现的输出,以便评估Prompt本身的质量。在产品化或需要多样性的场景,再适当调高。

5.4 工具链与生态结合

Prompt工程不是孤立的。在现代LLM应用开发中,它需要与一系列工具和模式结合:

  • 与RAG结合 :这是解决模型知识陈旧和幻觉问题的银弹。Prompt负责“指挥”,RAG负责提供“弹药”(精准检索到的知识片段)。你的Prompt模板需要包含一个“上下文”占位符,由RAG系统动态填充。
  • 与Agent框架结合 :在 LangChain LlamaIndex AutoGen 等Agent框架中,Prompt被用来定义Agent的角色、能力和规划逻辑。一个复杂的任务会被分解成多个子任务,由不同的Agent或工具通过精心设计的Prompt协作完成。
  • Prompt版本管理与测试 :像管理代码一样管理你的Prompt。使用文本文件、Notion或专门的Prompt管理工具(如 Promptfoo )来保存、版本化和测试不同的Prompt变体。通过A/B测试来衡量不同Prompt对实际业务指标的影响。
  • 针对微调模型的Prompt :如果你对基座模型进行了领域微调,其最优Prompt策略可能与原始模型不同。微调后的模型可能更理解你领域的术语和任务格式,因此可以尝试更简洁、更专业的Prompt,并需要通过实验找到最佳点。

Prompt工程的终极目标,是构建稳定、可靠、高效的“人机协作界面”。它没有一成不变的公式,但有其核心的方法论。最好的学习方式就是动手实践:从一个具体任务开始,设计你的Prompt,观察输出,分析不足,迭代优化。在这个过程中,你会逐渐培养出对模型“性格”和“能力边界”的直觉,从而真正驾驭大模型的强大能力,将其转化为实实在在的生产力。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐