提示词模板就是一个带空白的提示词。固定的文字承载着你在某类任务上摸索出的、得到好答案的全部经验:角色、格式、限制。空白承载的是每次都会变的东西:主题、语言、要处理的文字。填三个空比写一个提示词快,而且得到的答案在质量和形式上都更稳定。
下面这个模板可以按你的水平解释任何编程概念。在输入框里填上你自己的内容,关掉某一部分看看它起了什么作用,然后复制它,或者在聊天应用中打开。
概念: 闭包是一个函数,它能记住自己被创建时所在位置的变量,即使外层函数已经运行结束。
示例:
function makeCounter() {
let count = 0;
return function () {
count += 1; // still sees count from makeCounter
return count;
};
}
const next = makeCounter();
console.log(next()); // 1
console.log(next()); // 2
常见错误: 以为两个计数器会共享同一个总数。每次调用 makeCounter() 都会创建一个新的 count,所以每个计数器都保有自己的计数。
好模板的标准
模板的好坏取决于它来源的提示词,所以固定的文字应该是一个你已经运行过、并且满意的提示词。有三个选择决定了它是一个有用的模板,还是一张只会更快地产出平庸答案的表格。
只把会变的部分留空。 如果你总是希望答案在 150 字以内,就把 150 写进固定文字里。每个空白都是你每次使用时要重新做的决定,一个有十个空白的模板,填起来比重新写提示词还慢。
给每个空白起一个清楚的名字,并设一个合理的默认值。 {{known}} 告诉你该填什么;{{x}} 则不能。默认值展示了预期的取值类型,还让你不用输入任何东西就能先运行一次模板。
一项工作一个模板。 一个靠某个空白来决定是解释概念、审查代码还是出测验题的模板,三件事都会做得比三个独立的模板差。固定的文字越具体,它能对格式和标准说得就越多。
怎么写提示词中的六个组成部分是检查固定文字的好清单:角色、任务、背景、输入、格式、限制。空白通常出现在任务、背景和输入中。
提示词模板示例
下面三个模板覆盖了常见的日常工作,每个都有带名字的字段可以填写。想要更多现成的提示词,见提示词示例。
def median(numbers: list[float]) -> float:
if not numbers:
raise ValueError("median() needs at least one number")
ordered = sorted(numbers)
middle = len(ordered) // 2
if len(ordered) % 2 == 1:
return ordered[middle]
return (ordered[middle - 1] + ordered[middle]) / 2
# median([3, 1, 2]) returns 2
# median([4, 1, 3, 2]) returns 2.5
# median([]) raises ValueError
你好,谢谢邀请,很高兴你想到了我!可惜 14 号我去不了。改到下个月的某一天可以吗?到时候我很乐意聊聊这个项目。
祝好, [你的名字]
粘贴文字外面的标签是有原因的。填进去的文字可能包含看起来像指令的句子,而分隔符能防止模型把模板的指令和它要处理的材料混为一谈。
如何制作自己的模板
- 从一个效果好的提示词开始。 找一次答案令人满意的对话,整理出提示词的最终版本,包括你在后续消息中不得不补充的那些纠正。这些纠正是最有价值的部分,因为它们修正了第一个版本的错误。
- 标出下次会变的部分。 读一遍提示词,在下次使用时你会修改的每个词下面画线。通常是两到四处:一个主题、一个受众、一个长度、一段粘贴的输入。
- 把每一处都换成一个有名字的空白。 按你所用工具的要求来写空白,比如手动粘贴的提示词用
[audience],代码中用{audience}。 - 用三种不同的填法测试。 用一个典型情况、一个很短或很长的输入,以及一个不寻常的情况。如果其中一个失败了,说明固定的文字仍然对第一次的用法有所假设。一次只改一句,方法见迭代提示词。
- 保存在你能找到的地方。 笔记文件、文本扩展工具或代码片段管理器都可以。一个需要到处找的模板,你迟早会不再用它。
代码中的模板
在程序中,模板就是一个带命名字段的字符串。Python 的 str.format() 可以填充这些字段:
SUMMARY_TEMPLATE = """Summarize the text inside the <text> tags for {audience}.
Use at most {bullets} bullet points and lead with any action the reader must take.
<text>
{text}
</text>"""
with open("notes.txt", encoding="utf-8") as f:
meeting_notes = f.read()
prompt = SUMMARY_TEMPLATE.format(
audience="a manager who has two minutes",
bullets=3,
text=meeting_notes,
)
使用 str.format() 时,模板中的每个花括号字面量都必须写两遍({{ 和 }}),当模板包含 JSON 示例时,这一点很重要。你传入的值里的花括号,比如 meeting_notes 中的代码,则不需要转义。有些用于构建 AI 应用的库有自己的模板类,但它们做的事和格式字符串一样,只是外面多加了一些功能。
当值来自用户时,要记住模板会把他们的文字发送给模型。把它放在分隔符内,也不要给模型那些可能被恶意输入滥用的工具或数据。
模板还是系统提示词
模板和系统提示词解决的是不同的问题。系统提示词保存的是适用于一次对话或一个应用中每条消息的规则:人设、语气、助手绝不能做的事。模板保存的是一个带空白的任务。在应用中,你常常两者都用:一个固定的系统提示词定下基本规则,一个模板构建每条用户消息。
常见问题
提示词模板是什么?
提示词模板是一个可复用的提示词,每次使用时会变的部分用占位符表示,比如 [topic] 或 {language}。固定的文字里装的是你已经测试过的指令;每次只需填空,而不用从头写提示词。
怎么制作自己的提示词模板?
从一个已经给过你好答案的提示词开始。标出下次使用时你会改动的词,把每一处都换成一个有名字的空白,然后用三种不同的填法测试模板,其中包括一个不寻常的情况。让第一次得到好答案的那些指令保持原样。
提示词模板应该保存在哪里?
保存在任何能快速复制的地方:一个笔记文件、一个文本扩展工具或一个代码片段管理器。聊天应用里也有放复用文字的地方,比如自定义指令和项目指令,它们更适合放每条消息都适用的规则,而不是带空白的一次性任务。
怎么在 Python 中使用提示词模板?
把模板存成一个带命名字段的字符串,用 str.format() 或 f-string 来填充。使用 str.format() 时,模板中的花括号字面量要写两遍({{ 和 }}),比如模板里包含一个 JSON 示例的时候。把用户提供的文字放在分隔符内,让它和指令保持分开。