大模型学习【提示词工程】—— 初识提示词工程
什么是提示词工程
提示词工程(Prompt Engineering)是设计和完善提供给 ChatGPT 等语言模型的初始文本或输入(提示)以生成响应的过程。它涉及设计提示,以指导模型生成特定的语气、样式或内容类型。
- 提示工程 vs. 微调
|
|
| |
|---|---|---|
| 资源效率 | 需要高端 GPU 和大内存。 | 只需要文本输入。 |
| 成本效益 | 对于基于云的 AI 服务, 微调会产生巨大的成本。 | 使用基础模型,通常更便宜。 |
| 维护模型 | 受模型版本限制, 可能需要重新训练模型。 | 更新提示可以在不同版本间 正常工作,通常无需更改。 |
| 时间效率 | 可能需要数小时甚至数天。 | 几乎能立即提供结果。 |
| 数据需求 | 需要大量特定任务的标记数据。 | 可以使用少样本甚至零样本学习。 |
| 灵活性 | 很难实现快速迭代。 | 可以快速尝试各种方法,调整提示, 并立即看到结果。 |
| 领域适应 | 需要重新训练。 | 通过在提示中提供特定领域的上下文, 可以轻松地使模型适应新领域, 无需重新训练。 |
| 理解力 | 帮助模型更好地理解和利用外部内容 (如检索文档)。 | |
| 保留通用知识 | 存在灾难性遗忘的风险, 即模型可能会失去通用知识。 | 保持了模型的泛化能力。 |
| 透明度 | 提示是人类可读的, 准确显示模型接收到的信息。 这种透明度有助于理解和调试。 |
- 何时不使用提示工程
- 当您需要 100% 的可靠性时
- 当您无法评估模型输出的准确性时
- 当您需要生成不在模型训练数据中的内容时
如何进行提示工程
下面将从 OpenAI 和 Claude 官方提示工程指南中的建议策略来初步感受如何进行提示工程。
Claude 官方提示工程指南
提示生成器
解决如何有效地编写提示词。引导Claude生成针对您特定任务的高质量提示词模板。
-
使用提示模板将固定和变量部分结合在一起,为动态内容使用占位符。
API调用通常包含两种类型的内容:
- 固定内容: 在多次交互中保持不变的静态指令或上下文
- 变量内容: 随每个请求或对话而变化的动态元素,例如:
- 用户输入
- 用于检索增强生成(RAG)的检索内容
- 对话上下文,如用户账户历史
- 系统生成的数据,如来自其他独立Claude调用的工具使用结果
-
提示改进器通过4个步骤增强您的提示:
- 示例识别:定位并提取提示模板中的示例
- 初始草稿:创建具有清晰部分和XML标签的结构化模板
- 思维链精炼:添加和完善详细的推理说明
- 示例增强:更新示例以展示新的推理过程
% 原始提示
从以下Wikipedia文章标题列表中,识别这个句子来自哪篇文章。
只需回答文章标题,不要添加其他内容。
文章标题:
{{titles}}
要分类的句子:
{{sentence}}
% 改进后提示
您是一个专门将句子与Wikipedia文章标题匹配的智能文本分类系统。您的任务是根据提供的文章标题列表,确定给定句子最可能属于哪篇Wikipedia文章。
首先,查看以下Wikipedia文章标题列表:
<article_titles>
{{titles}}
</article_titles>
现在,考虑需要分类的这个句子:
<sentence_to_classify>
{{sentence}}
</sentence_to_classify>
您的目标是确定提供的列表中哪个文章标题最匹配给定的句子。请按照以下步骤操作:
1. 列出句子中的关键概念
2. 将每个关键概念与文章标题进行比较
3. 对最相关的前3个标题进行排名并解释其相关性
4. 选择最适合包含或关联句子内容的文章标题
将您的分析包含在<analysis>标签中。包括以下内容:
- 句子中的关键概念列表
- 每个关键概念与文章标题的比较
- 前3个最相关标题的排名及解释
- 您的最终选择和理由
在分析之后,提供您的最终答案:从列表中选择单个最适合的Wikipedia文章标题。
仅输出所选的文章标题,不要添加任何额外的文本或解释。
保持清晰直接
- 给 Claude 提供上下文信息: 就像你在了解更多上下文的情况下可能会更好地完成任务一样,Claude 在有更多上下文信息的情况下也会表现得更好。
- 具体说明你想要 Claude 做什么: 例如,如果你只想要 Claude 输出代码而不要其他内容,就要明确说明。
- 按顺序提供指示: 使用编号列表或项目符号,以更好地确保 Claude 按照你想要的方式执行任务。
| 角色 |
|
|
|---|---|---|
| 用户 | 分析这份 AcmeCloud 停机报告并总结关键点。 {{REPORT}} | 分析这份 AcmeCloud 停机报告。跳过前言。保持回应简洁,只写最基本的必要信息。仅列出: 1) 原因 2) 持续时间 3) 受影响的服务 4) 受影响用户数 5) 预计收入损失。 以下是报告:{{REPORT}} |
使用示例(多示例)
为什么使用示例?
准确性: 示例减少对指令的误解。
一致性: 示例确保统一的结构和风格。
性能: 精心选择的示例可以提升Claude处理复杂任务的能力。
| 角色 |
|
|
|---|---|---|
| 用户 | 分析这个客户反馈并对问题进行分类。使用这些类别:UI/UX、性能、功能请求、集成、定价和其他。同时评估情感(积极/中性/消极)和优先级(高/中/低)。 以下是反馈:{{FEEDBACK}} | 我们的客服团队被非结构化反馈淹没了。你的任务是为我们的产品和工程团队分析反馈并对问题进行分类。使用这些类别:UI/UX、性能、功能请求、集成、定价和其他。同时评估情感(积极/中性/消极)和优先级(高/中/低)。这里有一个示例: 输入:新仪表盘一团糟!加载太慢了,而且我找不到导出按钮。请尽快修复! 类别:UI/UX、性能 情感:消极 优先级:高 现在,分析这个反馈:{{FEEDBACK}} |
让 Claude 思考(思维链)
为什么要让 Claude 思考?
准确性: 逐步解决问题可以减少错误,尤其是在数学、逻辑、分析或一般复杂任务中。
连贯性: 结构化思维可以产生更连贯、组织更完善的回答。
调试: 查看 Claude 的思维过程有助于你找出提示可能不清晰的地方。
为什么不让 Claude 思考?
增加输出长度可能影响延迟。
并非所有任务都需要深入思考。明智地使用思维链,以确保性能和延迟之间的适当平衡。
1. 基本提示:在提示中包含”逐步思考”。
起草个性化邮件,向捐赠者请求为今年的关爱儿童计划捐款。
项目信息:
<program>{{PROGRAM_DETAILS}}
</program>
捐赠者信息:
<donor>{{DONOR_DETAILS}}
</donor>
在写邮件之前逐步思考。
2. 引导式提示:为 Claude 的思维过程列出具体步骤。
起草个性化邮件,向捐赠者请求为今年的关爱儿童计划捐款。
项目信息:
<program>{{PROGRAM_DETAILS}}
</program>
捐赠者信息:
<donor>{{DONOR_DETAILS}}
</donor>
在写邮件之前先思考。首先,根据这位捐赠者的捐赠历史和他们过去支持过的活动,思考什么信息可能会吸引他们。然后,根据他们的历史,思考关爱儿童计划的哪些方面会吸引他们。最后,使用你的分析写出个性化的捐赠者邮件。
3. 结构化提示: 使用像 和 这样的 XML 标签来分离推理和最终答案。
起草个性化邮件,向捐赠者请求为今年的关爱儿童计划捐款。
项目信息:
<program>{{PROGRAM_DETAILS}}
</program>
捐赠者信息:
<donor>{{DONOR_DETAILS}}
</donor>
在写邮件之前,在 <thinking> 标签中思考。首先,根据这位捐赠者的捐赠历史和他们过去支持过的活动,思考什么信息可能会吸引他们。然后,根据他们的历史,思考关爱儿童计划的哪些方面会吸引他们。最后,在 <email> 标签中使用你的分析写出个性化的捐赠者邮件。
使用 XML 标签
为什么使用XML标签?
清晰度: 清晰地分隔提示的不同部分,确保提示结构良好。
准确性: 减少因Claude误解提示部分而导致的错误。
灵活性: 无需重写所有内容即可轻松查找、添加、删除或修改提示的部分。
可解析性: 让Claude在输出中使用XML标签,使得通过后处理更容易提取其响应的特定部分。
| 角色 |
|
|
|---|---|---|
| 用户 | 你是AcmeCorp的财务分析师。为我们的投资者生成Q2财务报告。包括收入增长、利润率和现金流部分,就像去年的这个示例:{{Q1_REPORT}}。使用这个电子表格中的数据点:{{SPREADSHEET_DATA}}。报告应该非常简洁、切中要点、专业,并采用列表格式。它应该突出优势和需要改进的领域。 | 你是AcmeCorp的财务分析师。为我们的投资者生成Q2财务报告。 AcmeCorp是一家B2B SaaS公司。我们的投资者重视透明度和可行的见解。 使用这些数据生成报告:{{SPREADSHEET_DATA}} 1. 包括以下部分:收入增长、利润率、现金流。 2. 突出优势和需要改进的领域。 使用简洁专业的语气。遵循这个结构: <formatting_example>{{Q1_REPORT}}</formatting_example> |
给 Claude 分配角色(系统提示)
为什么要使用角色提示?
提高准确性:在法律分析或财务建模等复杂场景中,角色提示可以显著提升Claude的表现。
定制语气:无论您需要CFO的简洁还是文案撰写人的文采,角色提示都可以调整Claude的沟通风格。
提升专注度:通过设置角色背景,Claude能更好地保持在您任务特定要求的范围内。
在使用Claude时,可以通过使用system参数给它分配角色来显著提升其表现。这种技术被称为角色提示,是使用系统提示与Claude交互的最有效方式。
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=2048,
system="You are a seasoned data scientist at a Fortune 500 company.", # <-- 角色提示
messages=[
{"role": "user", "content": "Analyze this dataset for anomalies: <dataset>{{DATASET}}</dataset>"}
]
)
print(response.content)
预填充 Claude 的响应
在使用Claude时,可以通过预填充
Assistant消息来引导其回复。预填充在Assistant消息中包含所需的初始文本(Claude的回复将从Assistant消息结束的地方继续)。这种强大的技术允许您指导Claude的行为,跳过前言,强制使用特定格式如JSON或XML,甚至帮助Claude在角色扮演场景中保持角色一致性。
示例1:控制输出格式并跳过前言
预填充{强制Claude跳过前言并直接输出JSON对象。这样更简洁、更清晰,也更容易被程序解析而无需额外处理。
|
|
|
|---|---|
| User | 从这个产品描述中提取名称、尺寸、价格和颜色作为JSON对象: SmartHome Mini是一款紧凑型智能家居助手,有黑色和白色可选,售价仅为$49.99。宽度仅5英寸,无论您将其放在家中何处,都可以通过语音或应用程序控制灯光、恒温器和其他连接设备。这款价格实惠的小型集线器为您的智能设备带来便捷的免提控制。 |
| Assistant (预填充) | { |
| Assistant (Claude的回复) | “name”: “SmartHome Mini”, “size”: “5 inches wide”, “price”: “$49.99”, “colors”: [ “black”, “white” ] } |
示例2:在角色扮演场景中保持提示
预填充一个方括号中的[角色名称]可以提醒Claude保持角色,即使在更长和更复杂的对话中也是如此。当与system参数中的角色提示结合使用时,这种方法特别有效。
|
|
|
|---|---|
| User | 你能从这只鞋子推断出什么关于它的主人? muddy_shoe.jpg |
| Assistant (预填充) | [夏洛克·福尔摩斯] |
| Assistant (Claude的回复) | 啊,这里有什么?华生,这是一个非常有趣的样本!让我们用敏锐的眼光来检查这只鞋子。你看,这泥土不是普通的伦敦粘土,而是具有汉普斯特德希思特有的富含铁的土壤的独特红色色调。然而,鞋底的磨损痕迹表明,这种步态更适合白教堂的鹅卵石路面,而不是希思公园的缓坡。 现在,观察鞋带!它们打的是医疗专业人员常用的特殊结——毫无疑问是在多年系手术服的过程中养成的习惯。但鞋尖的擦痕讲述了另一个故事:这些痕迹与武术中的踢腿动作一致,特别是巴里兹术。 因此,我们可以得出结论,这只鞋子的主人是一位医生,可能是外科医生,住在白教堂但经常去汉普斯特德希思——也许是为了秘密练习巴里兹术,远离窥探的目光。华生,这是一个非常有趣的案例!我们必须抓紧时间;游戏开始了! |
链接复杂提示
何时链接提示?
在处理复杂任务时,如果你试图在单个提示中处理所有内容,Claude有时可能会出现失误。思维链(CoT)提示很好,但如果你的任务有多个需要深入思考的不同步骤怎么办?
这就需要提示链接:将复杂任务分解成更小、可管理的子任务。
对于研究综合、文档分析或迭代内容创建等多步骤任务,使用提示链接。当任务涉及多个转换、引用或指令时,链接可以防止Claude遗漏或处理错误步骤。
- 如何链接提示
- 识别子任务:将任务分解为不同的、连续的步骤。
- 使用XML构建清晰的交接:使用XML标签在提示之间传递输出。
- 设定单一任务目标:每个子任务应该有一个明确的单一目标。
- 迭代:根据Claude的表现改进子任务。
- 链式工作流程示例
- 内容创建流程:研究 → 大纲 → 草稿 → 编辑 → 格式化。
- 数据处理:提取 → 转换 → 分析 → 可视化。
- 决策制定:收集信息 → 列出选项 → 分析每个选项 → 推荐。
- 验证循环:生成内容 → 审查 → 改进 → 重新审查。
多租户策略审查示例:
提示1:审查分析策略
作为高级解决方案架构师,审查和分析这个针对我们新企业SaaS产品的多租户策略。
<strategy>
{{STRATEGY}}
</strategy>
重点关注可扩展性、安全性和成本效益。
提示2:起草策略审查文档
基于这个多租户策略分析为工程领导层起草一份策略审查文档。
<strategy>
{{STRATEGY}}
</strategy>
<analysis>
{{ANALYSIS}}
</analysis>
包括执行摘要、详细分析和建议。
提示3:对策略审查文档评分
就清晰度、可操作性和与企业优先级的一致性对这份策略审查文档评分。
<priorities>
{{PRIORITIES}}
</priorities>
<strategy_doc>
{{STRATEGY_DOC}}
</strategy_doc>
长上下文提示
- 将长文本数据放在顶部:将长文档和输入(约20K+ tokens)放在提示的顶部,位于查询、指令和示例之上。这可以显著提高Claude在所有模型中的表现。
- 使用XML标签构建文档内容和元数据:在使用多个文档时,用
<document>标签包装每个文档,并使用<document_content>和<source>(以及其他元数据)子标签来提高清晰度。 - 使用引用作为响应依据:对于长文档任务,请要求Claude在执行任务之前先引用文档中的相关部分。这有助于Claude从文档内容的”噪音”中找到重点。
OpenAI 官方提示工程指南
编写清晰的说明
-
在prompt中包含详细信息一获取更相关的答案

-
要求模型采用角色

-
使用分隔符清楚地指示输入的不同部分

-
指定完成任务所需的步骤

-
提供示例

-
指定所需的输出长度

提供参考文本
- 指示模型使用参考文本回答

- 指示模型使用参考文本中的引用来回答

将复杂任务拆分为更简单的子任务
-
使用意向分类来识别与用户查询最相关的说明

-
对于需要很长对话的对话应用程序,汇总或筛选以前的对话
由于模型具有固定的上下文长度,因此用户和助手之间的对话(其中整个对话都包含在上下文窗口中)不能无限期地继续。此问题有多种解决方法,其中之一是总结对话中的前几个回合。一旦输入的大小达到预先确定的阈值长度,这可能会触发一个查询,该查询汇总了对话的一部分,并且先前对话的摘要可以作为系统消息的一部分包含在内。或者,可以在整个对话的后台异步总结之前的对话。另一种解决方案是动态选择与当前查询最相关的对话的先前部分。
- 分段汇总长文档并递归构建完整摘要
由于模型具有固定的上下文长度,因此它们不能用于汇总长度超过上下文长度减去单个查询中生成的摘要长度的文本。要总结一个很长的文档,比如一本书,我们可以使用一系列查询来总结文档的每个部分。章节摘要可以连接和汇总,从而生成摘要的摘要。此过程可以递归进行,直到总结出整个文档。如果有必要使用有关前面部分的信息来理解后面的部分,那么另一个有用的技巧是在总结该点的内容时,在本书中任何给定点之前包含文本的运行摘要。
给模型时间 “思考”
- 指示模型在匆忙得出结论之前找出自己的解决方案

- 使用内心独白或一系列查询来隐藏模型的推理过程

- 询问模型是否在之前的路径中遗漏了任何内容

使用外部工具
-
使用基于嵌入的搜索实现高效的知识检索
使用知识检索来最大程度地降低模型编造错误事实的可能性。如果模型作为其输入的一部分提供,则模型可以利用外部信息源。这可以帮助模型生成更明智和最新的响应。例如,如果用户询问有关特定电影的问题,则向模型的输入中添加有关该电影的高质量信息(例如演员、导演等)可能会很有用。嵌入可用于实现高效的知识检索,以便可以在运行时将相关信息动态添加到模型输入中。
-
使用代码执行来执行更准确的计算或调用外部 API

-
为模型提供对特定函数的访问权限
Chat Completions API 允许在请求中传递函数描述列表。这使模型能够根据提供的架构生成函数参数。生成的函数参数由 API 以 JSON 格式返回,可用于执行函数调用。然后,函数调用提供的输出可以在以下请求中反馈到模型中,以结束循环。
系统地测试更改
- 参考黄金标准答案评估模型输出
有时很难判断更改(例如,新指令或新设计)是否使您的系统变得更好或更差。输出的评估可以由计算机、人工或混合完成。计算机可以使用客观标准(例如,具有单个正确答案的问题)以及一些主观或模糊标准自动执行评估,其中模型输出由其他模型查询评估。
假设已知问题的正确答案应该引用一组特定的已知事实。然后,我们可以使用 model 查询来计算答案中包含多少个必需的事实。例如,使用以下系统消息:
下面是一个示例输入,其中只满足一个点:
总结
通过前面官方文档的学习,对于提示词工程有了初步的了解,那么给定一个初始的提示词如何根据指南一步一步地得到完善地提示词呢?
- 系统地测试更改
- 编写清晰的说明(补充上下文、步骤顺序指示、分配角色、分隔符/XML标签、提供示例、指定长度)
- 提供参考文本
- 给模型时间“思考”(基本/引导式/结构化提示、自己的解决方案、内心独白、是否遗漏)
- 使用外部工具(代码执行、RAG)
- 链接复杂提示(将复杂任务拆分为更简单的子任务)
- 长上下文提示(长文本置顶、XML标签、先引用后响应)



浙公网安备 33010602011771号