3.Claude 提示实用编写技巧
以下这些技巧基本都附有特定场景下的示例,可以直接使用或修改后使用。
1,允许 AI 说“不知道”
ChatGPT 有两项短处被人诟病:
- 对不太擅长的领域总是产生幻觉,编程不真实的细节和事实,俗话讲就是胡说八道;
- 在到达临近字数前,总是急于完成指令,而罔顾一些提示中的要求,例如字数上的要求。
ChatGPT 推出了 Code interpreter,用于在编程领域解决其第一个问题,因为代码是实际地,只有完全没有问题才能够运行,这样它就从虚幻走进了现实,像有一根铁索牢牢地将空中之城拴在了大地上。Claude 素有 3H 的骄傲,号称自己是诚实的,但其实它具有与 ChatGPT 一样的胡编乱造的毛病。
怎么避免呢?
一条有用的技巧是,允许 AI 说不知道:
只有在你知道答案或能做出充分猜测的情况下才回答以下问题;否则请告诉我你不知道。
{{你的问题}}
只有在你知道答案或能做出充分猜测的情况下才回答以下问题;否则请告诉我你不知道。
{{你的问题}}
2,在 AI 回复前让它先完成前置步骤
先看一个提示:
{{为简洁起见,前面的部分被删减}}
当你回复时,首先在 FAQ 中找到与用户问题相关的确切引语,并在<thinking></thinking>XML 标签内标记。这是一个空间,让你写下相关的内容,不会显示给用户。一旦你提取了相关的引语,就回答这个问题。把你的答案放在<answer></answer>XML 标签内标记。
{{为简洁起见,前面的部分被删减}}
当你回复时,首先在 FAQ 中找到与用户问题相关的确切引语,并在<thinking></thinking>XML 标签内标记。这是一个空间,让你写下相关的内容,不会显示给用户。一旦你提取了相关的引语,就回答这个问题。把你的答案放在<answer></answer>XML 标签内标记。
提示的要求既可以放在前面,也可以放在后面,这是灵活的。在这个提示中,规定了 AI 在回复答案之前,先做了另外一件相关的、前置的事。大语言模型 AI 是通过序列预测工作的,规定前置事项可以让结果更接近理想结果。
3,指引方向,和 AI 一步一步完成交互
这是上一个技巧的升华版本。如果你要求 Claude 执行一项包含许多子任务的复杂任务,那么单独列出子任务会很有帮助。即使当我们自己不太了解子任务时,我们也可以通过明确告诉 Claude 逐步思考,来显式提高响应的推理性和准确性。
举个例子:
我有两只宠物猫,其中一个少了一条腿,另一只的腿数与正常的猫相当,问我的猫总共有几条腿?请一步一步思考。
针对这个提示,运用当前的实用技巧,修改后如下:
Human:我有两只宠物猫,其中一个少了一条腿,另一只的腿数与正常的猫相当,问我的猫总共有几条腿?
Assistant:我可以一步一步地思考吗?
Human:是的,请说。
看一下这个提示的表现:
虽然是在 Web 对话中,不是 API 调用,我们仍然可以使用 Human 与 Assistant 标记。
当我们在提示中代替 AI 写了 Assistant 角色的反馈时,其实是已经替 AI 规划好了它的序列扮演的方向,这有利于我们得到理想的输出结果。
4,将复杂的任务拆分为简单的小任务:“请遵循以下步骤”
Claude 在由多个子任务组成的“复杂”任务上表现较差,如果你已经知道这些子任务是什么,你可以通过将提示分解为步骤来帮助 Claude。
下面举例,这是一个提示:
我想让你写一篇关于命题的文章,用三个主题句来支持这个命题,三个主题句来反对这个命题,最后有一个结论。
这个提示至少让 AI 干了三个步骤,更好的写法是把任务拆分,下面是一个更好的写法:
请遵循以下步骤:
1. 写三个主题句来论证{{STATEMENT}}。
2. 写出三个反对{{STATEMENT}}的主题句。
3. 通过扩展步骤 1 和步骤 2 中的每个主题句,并添加结论来综合论点,写一篇文章。请将文章附在<essay></essay>标签内。
请遵循以下步骤:
1. 写三个主题句来论证{{STATEMENT}}。
2. 写出三个反对{{STATEMENT}}的主题句。
3. 通过扩展步骤 1 和步骤 2 中的每个主题句,并添加结论来综合论点,写一篇文章。请将文章附在<essay></essay>标签内。
essay 是文章的意思。改进版本的提示,更好地向 AI 描述了它需要做的事情。
5,首尾相连,使用提示链接技巧
完成具有已知且明确定义的子任务的复杂任务的另一种方法,是将 Claude 对提示的响应结果,输入到另一个提示的输入中。这种技术称为提示链接。
提示链接可以让你通过向 Claude 传递多个更小、更简单的提示——而不是非常长且详细的提示,来完成一项复杂的任务。有时,它比将任务的所有子任务放在一个提示中效果更好。
这种首尾相连的技巧至少有以下优点:
- 可以编写不太复杂的指令。没有人喜欢复杂的东西,简单的东西更容易理解和操作。
- 可以隔离 Claude 遇到问题的部分问题,以集中精力进行故障排除。这在提示开发中特别有用。
- 可以分阶段检查Claude的输出,而不仅仅是在最后检查。
这些优点都是显而易见的。
下面是一个提示,我们向 AI 提供一个文档,然后让 AI 针对一个问题寻找相关内容:
这是一个文档,在<document></document>XML 标记中:
<document>
{{DOCUMENT}}
</document>
请逐字摘录与问题{{question}}有关的任何引语。请在<quotes></quotes>XML 标记。如果在这个文档中没有与这个问题相关的引用,请说“我找不到任何相关的引用”。
这是一个文档,在<document></document>XML 标记中:
<document>
{{DOCUMENT}}
</document>
请逐字摘录与问题{{question}}有关的任何引语。请在<quotes></quotes>XML 标记。如果在这个文档中没有与这个问题相关的引用,请说“我找不到任何相关的引用”。
下面是一个改进的提示版本:
我希望你用一份文档和文档中的相关引语来回答问题"{{question}}"
这是文档,在<document></document>XML 标记中:
<document>
{{DOCUMENT}}
</document>
以下是与问题“{{question}}”最相关的文档直接引用:{{quotes}}
请用这些词来构造问题“{{question}}”的答案,就好像你在直接回答这个问题一样。确保你的回答是准确的,不包含任何没有被文档或引用直接支持的信息。
我希望你用一份文档和文档中的相关引语来回答问题"{{question}}"
这是文档,在<document></document>XML 标记中:
<document>
{{DOCUMENT}}
</document>
以下是与问题“{{question}}”最相关的文档直接引用:{{quotes}}
请用这些词来构造问题“{{question}}”的答案,就好像你在直接回答这个问题一样。确保你的回答是准确的,不包含任何没有被文档或引用直接支持的信息。
在这个提示中,“以下是与问题。..”这一句包含问题和引用,它是 AI 下一步行动的输入。以花括号包裹的变量,只要名称相同,在一个提示中就表示相同的内容,这是使用变量的优点。
6,在后面要求 AI 对前面的响应进行验证
先看一个示例:
这是一篇文章,包含在<article>标签中:
<article>
{{ARTICLE}}
</article>
请指出文章中的语法错误。请只回复错误列表,而不是其他。如果没有语法错误,就说“there are no errors”。
这是一篇文章,包含在<article>标签中:
<article>
{{ARTICLE}}
</article>
请指出文章中的语法错误。请只回复错误列表,而不是其他。如果没有语法错误,就说“there are no errors”。
下面是改进后的提示:
这是一篇文章,包含在<article>标签中:
<article>
{{ARTICLE}}
</article>
请在以下列表中验证文章中遗漏的语法错误:
<list>
{{ERRORS}}
</list>
如果文章中没有列表中遗漏的错误,就说“没有额外的错误”。
这是一篇文章,包含在<article>标签中:
<article>
{{ARTICLE}}
</article>
请在以下列表中验证文章中遗漏的语法错误:
<list>
{{ERRORS}}
</list>
如果文章中没有列表中遗漏的错误,就说“没有额外的错误”。
在改进的版本中,“请在以下列表中验证。..”这一句既指明了输出的格式,又描述了验证要求。先检查与输出,然后针对列表进行验证。既是前一步输出,又是后一步输入的这种写法,可以节省 Token。Token 有限,节约是一种美德,就像上世纪 90 年代程序员编写代码,都以字节为单位想方设法节省内容。
7,并发执行任务
多步骤提示可以并行、串行或组合运行。
下面看一个串行的示例,先看第一个提示:
这里有一个概念:{{concept}}
我希望你们写一篇关于这个概念的三句话的文章大纲,适合这个层次的读者:{{level}}
请只回复你的提纲,每行一句话,放在<outline></outline>XML 标记中。别再说别的了。
这里有一个概念:{{concept}}
我希望你们写一篇关于这个概念的三句话的文章大纲,适合这个层次的读者:{{level}}
请只回复你的提纲,每行一句话,放在<outline></outline>XML 标记中。别再说别的了。
第二个提示:
下面是一个提纲:
{{OUTLINE}}
请把提纲中的每个句子展开成一个段落。将每个句子逐字逐句地作为相应段落的第一句。请确保在适合此类型读取器的级别上编写:{{type}}
下面是一个提纲:
{{OUTLINE}}
请把提纲中的每个句子展开成一个段落。将每个句子逐字逐句地作为相应段落的第一句。请确保在适合此类型读取器的级别上编写:{{type}}
这里的是上一个提示的输出,我们在拿到第一个提示的输出结果后,再来串行调用第二个提示。
8,问 AI 听懂没有:你明白了吗?
【提示】
你明白指令了吗?
可以这样直白地问 AI 听懂了没有,它是一个不需要情商照顾的家伙,直白对它没有任何伤害。
它一般不会说听懂或没有听懂,通常会通过向你解释任务来做出回应。如果你觉得它的解释欠妥,就再修改一下提示。
9,用 Claude 的解释反过来扩展提示
如果感觉 Claude 给出了正确的任务解释,你可以使用该响应来扩展你的提示。我多次使用过这种方法,很多时候感觉 AI 对问题的描述更加精准,它的解释也值得采纳或借鉴。
10,要求 AI 重写:rewrite
如果 Claude 给出的答案接近但不完全是你想要的,你可以要求 Claude 重写,一般在要求重写时会提出更多要求,例如:请重写以包含更多详细信息。
重写(rewrite)是一个重要的基础指令。在 API 调用时,如果要求 AI 重写,必须确保有需要被重写的内容。例如下面是一个模板示例:
这里有一段话:
<paragraph>
{{PARAGRAPH}}
</paragraph>
我希望你用下面的说明重写它:
<instructions>
{{INSTRUCTIONS}}
</instructions>
请放结果于<rewrite></rewrite>标签内。
这里有一段话:
<paragraph>
{{PARAGRAPH}}
</paragraph>
我希望你用下面的说明重写它:
<instructions>
{{INSTRUCTIONS}}
</instructions>
请放结果于<rewrite></rewrite>标签内。