Claude 3 提示词工程指南:如何发挥大语言模型的全部潜力

我由于一直在密切跟进大模型领域的发展,因此每次看到有新的大模型发布号称“超越GPT4”的时候都会去试一下,但是基本都是以失望告终(包括寄予了厚望的Gemini Ultra) - 直到使用了上周的Claude 3 Opus。虽然依然不能说Opus全面超越GPT4,但是从个人的实际试用上发现确实在不少方面体现了不弱于甚至超过GPT4的智商。

那么,我们能如何更好地使用Claude 3呢?Anthropic编写了一本非常详尽的Prompt操作指南(依然,我查了一下目前网上现有的少量翻译,感觉质量还不够高,因此重新翻译整理了下面的内容)。如果你仍旧采用与GPT4相同的prompt技巧,那么你可能还没能充分发挥Claude3的全部潜力!

快速阅读tips:

  • 如果是重度的AI使用者,可以从头阅读全文,能得到更系统性的提示词工程的理解;
  • 如果是刚开始使用AI的轻度用户,可以直接看具体的提示词编写技巧部分;
  • 如果是已经很熟悉GPT4提示词工程的用户,可以直接看编写技巧中的一些特色部分,例如使用XML标签这段;

TL;DR版:Claude 3 提示词编写技巧:

  • 清晰和直接:给出清晰的指令和背景信息,引导Claude给出恰当的回应;
  • 运用范例:在你的提示词中包含范例,以展现你希望得到的输出格式或者风格;
  • 设定角色:给Claude设定一个特定角色(比如专家),这样做可以增强在你的使用案例中的表现;
  • 使用XML标签:使用XML标签来构建提示词和回应,让信息传达更加清晰;
  • 分步提示:将复杂任务分解成小的、可管理的步骤,从而获得更好的效果;
  • 引导思考:鼓励Claude分步骤思考,以提升输出内容的质量;
  • 预设开头:用几个关键词开始Claude的回答,引导它朝着你希望的方向发展;
  • 规范输出格式:明确你想要的输出格式,以确保内容的一致性和易读性;
  • 请求改写:根据评分标准提出改写要求,让Claude不断迭代并优化输出结果;
  • 利用长上下文窗口:针对可以利用Claude的长上下文窗口的提示词进行优化;

什么是Prompt Engineering(提示词工程)

提示工程是一门以实践为导向的科学,它旨在通过不断实验和优化提示词(prompt),来提升大语言模型(LLM)生成回答的质量。在整个提示词工程的流程中,编写提示词本身往往并非最耗时的部分。相反,更多的时间通常被用于建立一套有效的评估标准(eval),并围绕这些标准进行反复测试和迭代优化。

Prompt开发的生命周期

我们建议采用一种基于测试来驱动的开发原则,以确保prompt能发挥出最佳效能。具体如下图:

  1. 定义要解决的任务及其成功指标首先,也是最重要的一步,是明确界定你想要让Claude完成的具体任务。任务的范围可以很广泛,从实体识别、问答、文摘,到更为复杂的代码生成或者创意写作等。当任务定义明确后,就需要设定一系列成功指标,这些将作为评估和优化过程的指导;

    在设定成功指标时,需要考虑以下几个关键点:
    a. 性能和准确性:模型完成任务的能力需要达到什么水平?
    b. 响应速度:能接受多长的模型响应时间?这取决于你的应用场景对实时性的要求以及用户的期望;
    c. 成本效益:在预算限制下,如何权衡模型性能和调用费用?需要考虑的因素包括每次API调用的费用、模型的规模,以及实际的使用频率等;

    从一开始就设定清晰、可量化的成功指标,将帮助你在整个应用过程中做出有根据的决策,并确保你的优化目标是正确的。

  2. 制定测试案例:确定了任务和成功指标后,下一步是创建一系列多样化的测试案例,这些案例应涵盖实际应用预期的所有使用情景。测试案例应包括常见的例子和极端情况,以确保你的提示词足够强大。事先准备好明确的测试案例,可以让你客观地评估提示词对于成功指标的符合度;

  3. 编写初步提示词:接下来,编写一段简要的提示词,这个提示词需要阐述任务的定义、良好回答应该具备的特点以及Claude执行任务所需的任何相关背景信息。理想情况下,你应该提供一些标准的输入和输出范例以供Claude参照。这段初步的提示词将作为后续改进的基础;

  4. 对测试案例进行提示词测试:用你的初步提示词将测试案例输入到Claude,并仔细对照你的预期输出和成功指标来评估模型的回答。不管是采用人工评估、对照标准答案,还是让另一个Claude实例来做自动化评分,重要的是要有一个系统性的评估性能的方法

  5. 优化提示词:根据第四步的测试结果,不断迭代优化你的提示词,以期在测试案例上提高回答质量,更好地达成你的成功指标。这可能包括增加解释、范例或限制,以指导Claude的行为。但要注意,不要为了优化特定的少数输入而过度调整,因为这可能会导致过拟合和泛化能力弱;

  6. 部署优化后的提示词:当你得到一个在测试案例上表现良好并且满足成功指标的提示词后,就可以将它部署到你的应用中了。在应用中监控模型的表现,并为根据需要进行下一步的优化做好准备,例如可能会出现你最初的测试集中没有预见到的边缘情况;

在这个过程中,最好是从最强大的模型和最长的提示词长度开始尝试,以确定性能的最高标准。在达到了理想的输出质量之后,你可以尝试进行优化,例如使用更短的提示词或更小的模型来根据需要减少延迟和降低成本。

通过这种以测试为驱动的方法,并且提前明确定义了任务和成功指标,你就能有效利用Claude来为你的应用场景带来优势。如果你花时间精心设计了测试案例和提示词,那么在模型的性能和可维护性方面,你会看到显著的成效。

提示词编写技巧

在你构建提示词的整个流程中,有一些技巧可以帮助你提升Claude的表现:

清晰和直接

在与Claude交互时,给出清晰直白的指令是至关重要的,这样才能得到最好的结果。你可以把Claude想象成一个聪明但缺乏背景信息的新员工,他只能根据你明确提供的信息来行动。就像你首次向一个人详细说明任务一样,你的说明越清晰明确,Claude给出的回答就越准确无误

请看下面这个例子,我们在这里指示Claude去除文本中的个人可识别信息(PII):

1
2
User	:
Please remove all personally identifiable information from this text: {{TEXT}}

尽管上面这个提示在一些简单场景下可能适用,但它没有包含足够的细节来确保Claude能够稳定地输出我们想要的结果。下面是一个更详细且描述更为清楚的版本。

1
2
3
4
5
6
7
8
9
10
User	:
We want to anonymize some text by removing all personally identifiable information (PII).

Please follow these steps:
1. Replace all instances of names, phone numbers, and home and email addresses with 'XXX'.
2. If the text contains no PII, copy it word-for-word without replacing anything.
3. Output only the processed text, without any additional commentary.

Here is the text to process:
{{TEXT}}

在这个改进后的提示中做了如下优化:

  1. 提前提供有关任务性质的背景信息;
  2. 定义了什么构成个人可识别信息(PII)(姓名、电话号码、地址);
  3. 给出了具体、编号的逐步指令,说明Claude应如何执行其任务;
  4. 给出了Claude应如何格式化其输出的指导方针;

最佳实践

  • 提供背景和详细信息:为Claude提供丰富的背景知识和详细步骤,这样可以确保它准确无误地完成你布置的任务;
  • 明确具体最有效:清楚地界定你期望的结果和你希望Claude表达的观点,避免含糊其辞。例如“历史上最伟大的篮球运动员是谁?” vs “历史上最伟大的篮球运动员是谁?当然,大家的看法不尽相同,但如果你真的必须选择一位,你会选谁?”
  • 使用编号或项目符号:把复杂的任务分解成条理清晰的小步骤,以保持内容的明晰度;
  • 黄金法则:如果你的提示词会让人类迷惑,那么Claude也同样会。请朋友阅读你的提示词,确保它们是易于理解的;

运用范例

范例是增强Claude性能和引导它输出你所期望结果的强大工具之一。通过在你的提示中加入几个精心设计的范例,可以显著提高Claude回答的准确性、连贯性和整体质量。这种方法对于需要高度细节描述、结构化输出或遵循特定格式的任务尤其有效。

这种技术也被称作少范例提示(few-shot prompting),如果只提供一个范例,那么称之为单范例提示(one-shot prompting)。

为什么要使用范例?

  • 提升准确度:范例能够消除不确定性,让Claude清楚地理解你所期望的输出结果;
  • 确保一致性:范例相当于一个模板,确保Claude的回答符合所需的风格和格式;
  • 增强性能:恰当选择的范例能够教会Claude如何处理复杂性和微妙之处;

如何创建有效的范例?

  • 相关性:确保你给出的范例能够非常贴近你希望Claude处理的输入和输出类型。范例与实际应用场景的相似度越高,Claude的表现也会越出色;
  • 多样性:涵盖不同情况、极端情景和可能遇到的挑战,提供多样化的范例。这样可以帮助Claude更好地进行归纳总结,应对更多样的输入情况;
  • 清晰性:范例要清楚、简洁且易懂。可以使用像<example>”具体范例”</example>这样的格式化标签来组织你的范例,并使它们与提示的其他内容区分开来。尽可能地在范例前给出一些背景信息,让Claude知道它将要处理的例子类型,例如,“以下是一些正确的APA引用格式范例”或“以下是一些我写过的电子邮件范例”;
  • 数量:虽然没有确切的最佳范例数量规则,但建议最初至少提供3到5个范例,为Claude打下良好的基础。如果Claude的表现未能达到你的期望,你可以随时增加更多针对性的范例;

要提供范例,只需将它们包含在你的提示中,并清晰地将它们与实际任务区分开来。我们建议使用<example></example>标签来包裹你的范例,这样可以方便Claude区分范例和其余的提示。

以下是一个范例提示,展示了如何使用范例来指导Claude的回应:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
User	:
I will give you some quotes. Please extract the author from the quote block.

Here is an example:
<example>
Quote:
"When the reasoning mind is forced to confront the impossible again and again, it has no choice but to adapt."
― N.K. Jemisin, The Fifth Season
Author: N.K. Jemisin
</example>

Quote:
"Some humans theorize that intelligent species go extinct before they can expand into outer space. If they're correct, then the hush of the night sky is the silence of the graveyard."
― Ted Chiang, Exhalation
Author:

Assistant(Claude's response):
Ted Chiang

格式化输出

范例在需要结构化或特定格式输出的任务中效果显著。有时候,与其提供详细的格式设置步骤,不如直接展示几个期望输出格式的范例(当然,指令和范例结合使用通常会更有效,比单独使用其中一种要好)。

指定角色给Claude

Claude是一个非常强大的AI助手,但有时候它需要更多的背景信息来理解在某个对话中应该扮演什么样的角色。通过给Claude指定一个角色,你能够使它按照特定的方式进行回应,这不仅能提升其准确性和工作效率,还能使其语调和行为更贴合预期的场景。这个方法也称为角色提示。

角色提示的工作原理

角色提示是一个有效的策略,它主要通过以下两种方式提升Claude的工作表现:

  • 提高准确度和效率:在处理一些复杂的场景时,比如解复杂数学题或编程,给Claude指派一个合适的角色能够大幅提升它完成任务的能力和理解深度;
  • 量身定制语调和风格:通过设定特定的角色,你可以引导Claude的语调、态度和交流方式,使其更加符合你的需求。比如,如果你让Claude扮演一位幼儿园老师,它的反应就会与担任研究生导师时大相径庭;

角色提示的适用场景

虽然并非每次交互都需要角色提示,但在以下几种场景中,它可以发挥出色的作用:

  • 高技术性任务:当你希望Claude处理一些涉及逻辑、数学或编程的复杂任务时,指派一个合适的角色能够帮助它更好地完成任务,哪怕没有角色提示,它也可能会遇到一些挑战。即使Claude表现得不错,角色提示也可能帮助它的性能达到新的高度;
  • 特定的交流风格:如果你需要Claude在回答中使用特定的语调、风格或复杂程度,角色提示是实现这些要求的有效方法;
  • 提高基本性能:除非token数量的限制非常严格,否则如果你想尝试提升Claude的性能,超越其基本水平,那么几乎没有理由不使用角色提示。

角色提示范例

  • 解决一个逻辑谜题 – “你是一个逻辑大师机器人,专门设计来解决复杂的逻辑难题。现在请解开这个逻辑谜题:一只鸭子前面有两只鸭子,后面有两只鸭子,中间还有一只鸭子。请问总共有几只鸭子?”;
  • 向不同的听众阐释一个概念 – “你是一位研究生物理学教授。请简明扼要地向学生解释天空为何呈蓝色”;

使用XML标签

XML标签是用来构建指令并引导Claude回答的强有力工具。Claude对带有XML标签的指令特别敏感,因为在训练阶段它就经常接触这种指令。如果在关键部分使用XML标签来包围你的指令(比如操作步骤、范例或者输入数据),可以协助Claude更准确地把握上下文,进而产生更精确的回答。在处理那些结构复杂或者输入变量多样的指令时,这个技巧显得尤为有效。

XML标签是什么?

XML标签是类似于<tag></tag>这样的尖括号包围的标签。它们成对出现,包含一个开放标签,例如<tag>,和一个带有斜线的闭合标签,例如</tag>。XML标签的作用是围绕内容进行标记,例如:<tag>内容</tag>。

开放标签和闭合标签应该完全同名。标签的名字可以随意取,只要它被尖括号包围;不过我们建议你根据标签包围的内容,给它们起一个具有上下文相关性的名字。

提到XML标签时应该总是成对地引用它们,而不是只提其一半(例如,用<doc></doc>标签包裹文档内容来回答问题。)。

XML标签的命名

并不存在一套被认为是最佳的、能让Claude特别高效工作的XML标签命名规范。比如,<doc> 和 <document> 的效果是一样的。只有在进行函数调用的时候,你才需要使用非常具体的XML标签名。

为什么要使用XML标签?

使用XML标签构建你的指令有几个好处:

  • 提升准确度:XML标签能帮助Claude区分指令中的不同部分,比如操作步骤、范例和输入数据。这种区分能让指令解析更加精确,从而使得回答更加相关和准确,这在数学或编程代码生成等领域尤其明显;
  • 结构更加清晰:正如标题和分节可以让文档更易于人类阅读一样,XML标签也能帮助Claude理解指令中的层次结构和内在联系;
  • 方便后续处理:你还可以让Claude在它的答复中使用XML标签,这样就可以更容易地用程序提取重要信息。

如何使用XML标签

你可以利用XML标签来组织你的指令内容,并且清晰区分不同的部分,例如区别操作指南和内容,或者把范例和操作步骤分开。例如:

1
2
3
4
5
6
7
8
9
10
11
12
请仔细分析这份文件,并按照以下指示撰写一份详尽的摘要备忘录,格式需参照提供的范例:
<document>
{{DOCUMENT}}
</document>

<instructions>
{{DETAILED_INSTRUCTIONS}}
</instructions>

<example>
{{EXAMPLE}}
</example>”

处理可变的输入内容

当你在操作包含有可变输入内容的提示模板时,应该使用XML标签来标示变量内容的插入位置,例如像下面这样:

1
2
我将告诉你一个动物的名称,请你回答这种动物会发出什么声音。
<animal>{{ANIMAL}}</animal>

一个基本的原则是,你应当始终用XML标签来区隔变量输入和其他提示信息。这样做能清楚地指示给Claude哪里是范例或数据的起止,从而使得得到的回答更加精确。

请求带结构的输出

你可以让Claude在它的回答中使用XML标签,这样可以使输出内容更易于解析和处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
请从下面这封电子邮件中提取出关键信息,并将其用XML标签形式返回:

- 发件人姓名请放在 <sender></sender> 标签中
- 邮件主题请放在 <topic></topic> 标签中
- 提到的任何截止日期或具体日期请放在 <deadline></deadline> 标签中

<email>
发件人:John Smith
收件人:Jane Doe
主题:项目X更新

你好Jane,

我想给你简单汇报一下项目X的最新进展。这周我们进展顺利,初步里程碑的目标有望实现。但是,我们可能需要额外的资源,才能在8月15日的最后期限之前完成最终阶段的工作。

我们可以下周安排一个会议来更详细地讨论预算和时间安排吗?

谢谢,
John
</email>

XML标签的使用使得我们可以通过编程手段,轻松地从特定标签之间提取Claude回答的具体内容,从而更方便地获取所需的详细信息。

XML使用的最佳实践

想要最大限度地发挥XML标签的作用,记住这些小贴士:

  • 使用能够反映其包含内容的描述性标签名(如:<instructions>、<example>、<input>);
  • 在你的提示信息中,确保始终使用一致的标签名;
  • 始终要包括开放标签(<tag>)和闭合标签(</tag>),即使是在提及它们的时候,例如“使用<doc></doc>标签中的文件回答下面的问题”;
  • 你可以并且应当嵌套使用XML标签,但是需要注意,如果嵌套超过五层,可能会因为用例的复杂性而导致性能下降;

链式指令

将大语言模型的使用比作玩杂耍是个不错的类比。在一个指令中让Claude同时处理越多的任务,它出错或者在某个任务上的表现不尽如人意的可能性就越大。因此,对于那些需要多步骤或许多子任务完成的复杂任务,我们推荐将其拆分成若干子任务,并通过链式指令来进行,这样可以确保每一个环节都能达到最优的执行效果。

提示链是什么?

提示链是指利用一个指令的输出作为另一个指令输入的过程。通过将指令串连起来,你能够引导Claude逐步完成一系列更加小型且容易管理的任务,从而达成一个复杂的目标。

提示链的好处包括:

  • 在每一个独立步骤上,生成的输出更加准确和一致;
  • 更容易对故障进行排查,因为它能够隔离出那些可能特别容易发生错误或处理起来比较棘手的子任务;

何时使用提示链

在以下几种情况下,你可以考虑使用提示链:

  • 多步骤任务:对于需要分成多个明确步骤的任务,比如先对一个话题进行研究,接着编写论文大纲,然后是写作,最后是论文格式调整,使用提示链可以确保Claude在每一步都能专注并维持高效的执行水平;
  • 复杂指令:当一个指令包含了过多的指示或细节,Claude可能难以持续跟进。把任务分解成一系列的链式子任务可以提高每一子任务的执行效果;
  • 校验输出:你可以通过提示链让Claude使用特定的评估标准自检其输出,必要时对回答进行改进,以此确保结果的高质量。例如,在生成一个列表之后,你可以将列表返回给Claude,让它核实列表的准确性或完整性;
  • 并行处理:如果你的任务包含多个互不依赖的子任务,你可以为每个子任务创建独立的指令,并同时运行它们,这样可以节省时间;

提示链的有效技巧

  • 保持子任务简洁清晰:确保每个子任务都有明确的目标和简单的指示。这样能让Claude更轻松地理解并执行任务;
  • 运用XML标签:使用XML标签来包裹输入和输出,可以使数据结构化,便于在进行提示链操作时提取数据并传递至下个步骤;

提示链范例

在这个并行处理的提示链例子中,我们的任务是帮助Claude向不同年级的读者(分别是一年级学生、八年级学生和大学新生)解释一个概念。我们要做的是先制作一个概要,然后再发展成一个完整的说明。

Prompt 1(针对三种不同的阅读能力水平,各创建一个版本)制作一个提纲:

1
2
3
4
5
这是一个概念:{{概念}}

我想请你为对应年级的读者写一个有关这个概念的简短大纲,每个大纲由三句话组成:{{年级}}

请只用<outline></outline> XML标签来回答你的大纲内容,每行写一句话。除此之外不要添加其他内容。

Prompt 2(利用提示 1 中得到的提纲/OUTLINE,为每个阅读水平制作一个)根据提纲撰写完整的说明:

1
2
3
4
5
6
这是一份大纲:
<outline>
{{大纲}}
</outline>

请把大纲里的每一句都发展成一个段落。保证每段的开头就是大纲中的那句话,字字不差。并且要确保段落的内容适合这个年级的读者:{{年级}}。

让Claude深思

在遇到复杂的问题或任务时,让Claude一步一步地思考问题是非常有帮助的,这可以在给出最终答案前做好充分的准备。这种方法,也就是所谓的“思维链提示”(chain of thought prompting),能显著提高Claude回答的精确性和细致程度。

为什么要引导Claude思考?

试想一下,如果你刚睡醒就立刻要回答一连串复杂的问题,你可能需要一些时间来整理思路对吧?Claude也需要同样的考虑时间!

在回答前让Claude有机会推理分析,可以帮助它提供更准确、更智能的答案,特别是对于那些复杂或难以应对的问题。通过明确指导Claude一步步地思考,我们促使它以更系统、更细致的方式来解决问题。而且,观察Claude的思考过程对于我们排查问题和发现可能存在的指令不明确或容易被误解的地方极其有价值。

需要特别注意的是,没有输出的话,思考是不会发生的!Claude必须展示它的思考过程,这样才算是真正的“思考”。

如何引导逐步思考

要引导逐步思考的最简单方式,就是在你的问题中加上“逐步思考/think step by step”这个指示。例如:

“《大白鲨》和《皇家赌场》的导演是同一个国家的人吗?请逐步思考。”

一些需要注意的点

虽然鼓励逐步思考能显著提升Claude的回答效果,但请注意以下几点:

  • 只有当我们允许Claude展示其思考过程时,思考才能真正发生。我们无法让Claude在内部进行”隐性”思考,然后只呈现最终答案;
  • 引导Claude进行逐步推理会让它的回答变得更长,这可能会导致反应时间延长。在决定是否采用这种方法时,请权衡这个因素;

预设Claude的回应内容

在使用Claude时,你可以通过预设助手消息来引导它的回答,这是一个非常有用的功能。这项强大的技巧使你能够引导Claude的行为,控制其回答的格式,甚至在模拟角色扮演的情境中帮助Claude保持其角色的一致性。如果Claude的表现不符合预期,预先填写几句话可以极大地提升Claude的性能。

为什么要预设Claude的回应内容?

预设Claude的回应内容有几个显著的好处:

  • 提高引导性:通过预设一些初始文本作为起点,你能够引导Claude的回答朝着你想要的方向发展。这在你需要Claude专注于特定主题、创作特定类型的内容或者以特定方式行动时格外有用;
  • 控制输出格式:预设功能让你能够明确指定你希望Claude采用的输出格式,这在处理JSON或XML这类结构化数据格式时特别实用。有关更多信息,请参阅我们关于控制输出格式的指南;
  • 保持角色的连贯性:在角色扮演的场景下,预设Claude的回应能够帮助其在长时间的对话中保持角色的一致性。通过在助手消息中不断提醒Claude它的角色,你可以更好地确保Claude维持期望的角色形象;

如何预设Claude的回应内容

要预设Claude的回应内容,只需要在发送API请求时,在助手消息中添加你希望的初始文本。这里有一个范例提示:

1
2
3
4
5
6
7
8
{
"role": "user",
"content": "Please extract the name, size, price, and color from this product description and output it within a JSON object.\n\n<description>The SmartHome Mini is a compact smart home assistant available in black or white for only $49.99. At just 5 inches wide, it lets you control lights, thermostats, and other connected devices via voice or app—no matter where you place it in your home. This affordable little hub brings convenient hands-free control to your smart devices.\n</description>"
}
{
"role": "assistant",
"content": "{"
}

在这个范例中,通过在助手消息的开头使用 {,我们就将Claude的输出限定为要求的JSON架构的剩余部分。

最后Claude的回复就会是你想要的JSON格式:

1
2
3
4
5
6
7
8
name": "SmartHome Mini",
"size": "5 inches wide",
"price": "$49.99",
"colors": [
"black",
"white"
]
}

控制输出格式

Claude能够以多种多样的格式创建输出内容。只要提供明确的指导、范例和预设的回应,你就能够引导Claude产生符合你所期望的结构和格式风格的回答。

指定所需的格式

控制Claude输出的最简单方法之一就是直接说明你需要的格式。Claude能理解关于格式的指令,并按照指令生成多种输出格式,包括:

  • JSON
  • XML
  • HTML
  • Markdown
  • CSV
  • 自定义格式

比如,如果你想要Claude生成一个俳句,并且用JSON格式输出,你可以像这样来设置提示:

1
请创作一首关于猫的俳句,并用JSON格式输出,其中包括“first_line”、“second_line”和“third_line”这三个键值。

另外两个有效地控制Claude输出格式的方法在上文都提到过:

  • 提前在助手字段中填写你所需格式的开头部分。当你需要处理结构化的格式,比如JSON或HTML时,这种方法尤其实用;
  • 提供期望的输出格式范例能够帮助Claude更准确地理解你的需求。在提供范例时,要明确指出Claude需要按照范例中的格式进行输出(否则Claude可能会模仿范例中的其他元素,比如内容或者文体)。

提升输出控制的小贴士

  • 在给出的指令中越具体越好;
  • 确保你的提示具有清晰且一致的格式;
  • 在可能的情况下提供多个范例,以巩固所需的格式;
  • 尝试不同的技巧组合,找出最适合你需求的方式;

向Claude请求修改建议

有时候,即便是精心准备的提示,Claude给出的回应也可能不够准确或未能完全达到预期。在这种情况下,你可以利用Claude自我修正的能力,通过要求其进行重写。只要提供清楚的指导和对期望输出的详细要求,你就能引导Claude产生更符合你愿景的内容。

何时考虑要求重写

在以下情况下,你应该考虑要求进行重写:

  • 回答基本符合你的需求,但缺乏某些特定的细节或格式;
  • 输出结果并未完全符合你最初提示中的所有要求;
  • 如果你不确定结果是否准确,你可以要求Claude再核查一遍(可以视为一次小型、单次的大语言模型评估);

当你的提示包含多重要求时,比如需要特定的格式(如诗歌或列表)及特定的内容主题,重写尤其有用。有时候,Claude可能会优先考虑某些要求而忽视了其他的,特别是当遵循的步骤非常复杂时。通过请求重写,你可以重申Claude最初未能注意到的那些重要要求。

如何发起重写请求

在通过API发送请求时,你必须总是在你的请求中附上之前生成的文本。这里有一个范例请求模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
User	:
Here's a paragraph:
<paragraph>
{{PARAGRAPH}}
</paragraph>

I'd like you to rewrite it using the following instructions:
<instructions>
{{INSTRUCTIONS}}
</instructions>

Please put your rewrite in <rewrite></rewrite> tags.

Assistant (prefill):
<rewrite>

编写有效的修改建议指令

为了最大限度地发挥Claude的修改能力,你应该提供明确和具体的指令,明确你对修订内容的期望。你可以考虑包括以下内容:

  • 想要的格式(如段落、列表、对话);
  • 希望的语调或风格(如正式、口语化、幽默);
  • 需要添加的任何额外信息或背景;
  • 原始回答中需要特别关注或修改的具体部分;
  • 为Claude设定一个评分标准,让它能评估自己之前回答的质量和准确性,并理解什么是高质量的结果;

关于核实事实的提示

如果你要求Claude重写答案以确保信息的准确性,可以考虑采用”我不知道”这一策略,以避免生成错误或虚假的信息。这种做法可以鼓励Claude在缺乏足够信息进行正确修改时,勇于承认自己的局限性,而不是凭空捏造一个可能不符合事实的”解决方案”。

例如在system prompt中这样写 – “请根据你的能力尽可能回答下面的问题。如果你不确定答案,或者没有充分的信息来给出一个确信的答案,请直接说“我不知道”或者“我不太确定”。”

迭代式重写

有时候,一次重写可能达不到你想要的完美效果。在这种情况下,你可以考虑进行一个迭代过程,根据不断更新的标准来多次修改。每一轮的反馈都能让Claude更好地理解你的偏好,并据此优化它的回答。

请记住,成功的重写关键在于提供清楚且具体的指引。你的指令越明确,Claude就越有可能创造出符合你预期的内容。

长上下文窗口的技巧

Claude的扩展上下文窗口(Claude 3模型高达200K词元)让它有能力处理那些需要处理海量信息的复杂任务。这个扩展的上下文窗口也使得你可以简化那些原需将输入拆分以适应较短上下文窗口的工作流程。通过将多个输入合并成一个请求,你可以简化操作流程,更充分地发挥Claude的性能。

比如说,如果你以前的应用需要将一篇长文档分成多个部分,然后分别处理每一部分,现在你可以直接在一个请求中提供整篇文档给Claude。这不仅让你的编码工作变得更简单,而且还让Claude能够更全面地理解上下文,这可能会导致更好的处理结果。

长文档的结构化

当你处理较长的文档(特别是超过30K词元的)时,至关重要的一点是要以一种清晰地区分输入数据和指令的方式来构造你的请求。我们推荐使用XML标签来包裹每一个文档部分。这样的结构是Claude在处理长文档时所训练的,因此Claude对此也最为熟悉,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Here are some documents for you to reference for your task:

<documents>
<document index="1">
<source>
(a unique identifying source for this item - could be a URL, file name, hash, etc)
</source>
<document_content>
(the text content of the document - could be a passage, web page, article, etc)
</document_content>
</document>
<document index="2">
<source>
(a unique identifying source for this item - could be a URL, file name, hash, etc)
</source>
<document_content>
(the text content of the document - could be a passage, web page, article, etc)
</document_content>
</document>
...
</documents>

[Rest of prompt]

这样的结构清晰地指示了Claude哪部分是输入数据,哪部分是操作指令,这提高了其准确处理信息的能力。你还可以添加额外的标签来存放其他元数据,比如<title>(标题)或<author>(作者)。

文档与查询的摆放顺序

在上述长文档提示结构的例子中,你会注意到文档是首先展示的,接下来才是其它部分的提示。在处理含有长文档或许多额外背景内容的情况时,如果你把文档和附加信息放在最前面,位于详细指令或用户提问之上,通常可以明显提高Claude的性能。

文档问答的小窍门

当你利用Claude来处理文档问答任务时,记得这些小技巧:

  • 把问题放在整个请求的最后,也就是在输入数据之后。正如前面提到的,这样做已经证明能显著提升Claude回答的品质;
  • 让Claude在给出答案之前,先找到与问题相关的引述,并且只在找到相关引述时给出答案。这样做可以促使Claude的回答基于所提供的上下文,并降低产生虚假信息的风险;
  • 告诉Claude要仔细阅读文档,因为后面会根据文档内容提问。这样可以使Claude更加专注于输入的数据,并为即将到来的任务做好准备;

例如下面这段提示词就融合了上面提到的三点技巧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
User	:
I'm going to give you a document. Read the document carefully, because I'm going to ask you a question about it. Here is the document: <document>{{TEXT}}</document>

First, find the quotes from the document that are most relevant to answering the question, and then print them in numbered order in <quotes></quotes> tags. Quotes should be relatively short. If there are no relevant quotes, write "No relevant quotes" instead.

Then, answer the question in <answer></answer> tags. Do not include or reference quoted content verbatim in the answer. Don't say "According to Quote [1]" when answering. Instead make references to quotes relevant to each section of the answer solely by adding their bracketed numbers at the end of relevant sentences.

Thus, the format of your overall response should look like what's shown between the <examples></examples> tags. Make sure to follow the formatting and spacing exactly.

<examples>
[Examples of question + answer pairs, with answers written exactly like how Claude's output should be structured]
</examples>

If the question cannot be answered by the document, say so.

Here is the first question: {{QUESTION}}

多项选择题的生成

在使用Claude根据某个特定文本生成多项选择题时(例如老师希望针对特定教学内容生成给学生的测试题),提供该文本其他部分的范例问题和答案对可以大幅提升所生成问题的质量。值得注意的是,基于外部知识或来自不相关文档的通用多选题范例似乎效果不佳。

这里有一个生成多选题的范例请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
User	:
Your task is to generate multiple choice questions based on content from the following document:
<document>
{{DOCUMENT}}
</document>

Here are some example multiple choice questions and answers based on other parts of the text:

<examples>
Q1: [Example question 1, created from information within the document]
A. [Answer option A]
B. [Answer option B]
C. [Answer option C]
D. [Answer option D]
Answer: [Correct answer letter]

Q2: [Example question 2, created from information within the document]
A. [Answer option A]
B. [Answer option B]
C. [Answer option C]
D. [Answer option D]
Answer: [Correct answer letter]
</examples>

Instructions:
1. Generate 5 multiple choice questions based on the provided text.
2. Each question should have 4 answer options (A, B, C, D).
3. Indicate the correct answer for each question.
4. Make sure the questions are relevant to the text and the answer options are all plausible.

通过提供同一篇文章中的问题和答案范例,你帮助Claude更准确地把握你希望得到的输出格式,以及能够从所给内容中生成哪些类型的问题。

参考文档:https://docs.anthropic.com/claude/docs/prompt-engineering