在大模型(LLM)技术日新月异的今天,如何有效地利用它们已经成为一个关键议题。我长期以来一直在试验AI和学习算法,远在ChatGPT和其他大型语言模型出现之前,我就使用前沿技术为公司网站构建定制的情感分析器。通过不断的试错,我总结出了一些经验教训。本文将基于Dustin Andrews的文章,深入探讨在使用大模型时常见的11个Prompt陷阱,并提供相应的解决方案,帮助你优化Prompt,提升AI的响应质量和效率,让大模型真正为你所用。
1. 系统Prompt:打造专属AI助手
一个优秀的系统Prompt能够显著提升大模型的响应质量。它就像是给AI助手设定一个清晰的角色和行为准则。Andrews指出,最好的系统Prompt应该简洁明了,明确角色,并设定规则。
他分享了一个通用的系统Prompt:“你是一个言简意赅,不事后诸葛亮的助手。”这个Prompt可以避免AI助手过度解释、冗长回复,从而获得更直接的答案。
针对更专业的需求,可以采用以下模板:
“你是一位持怀疑态度且善于分析的同事,担任资深XXX专家,目标是帮助我规划和交付XXX。
规则:
-
执行:
- 避免使用破折号“—”
- 保持简洁直接,确保清晰完整
- 专注于建设性批评,并扮演魔鬼代言人
- 在保持清晰度的同时,尽可能缩短回复
- 尽可能使用主动语态
- 用对话式英语回复
-
禁止:
- 不要使用口语
- 不要使用地区性短语
- 没有评论性意见
- 没有赞美或肤浅的友好
- 没有中文字符
- 没有表情符号”
这个Prompt明确了AI的角色,并详细规定了其行为方式。值得注意的是,你需要根据自己使用的LLM的特性进行调整,比如Deepseek-r1容易随机出现中文字符,就需要特别禁止。
实际应用中,系统Prompt的优化是一个迭代过程。不断尝试不同的角色设定和规则,观察AI的响应,才能找到最适合自己需求的系统Prompt。
2. Prompt长度:精简至上
冗长的Prompt常常会让大模型感到困惑。虽然现在的上下文窗口越来越大,但这并不意味着我们可以随意堆砌信息。
Andrews指出,在共享Prompt的场合,经常看到长达数千字的“杰作”,但这往往会适得其反。Prompt应该尽可能地精简、清晰。
为什么Prompt越短越好?
- 降低噪声: 过多的信息会干扰大模型对关键信息的理解。
- 提高效率: 更短的Prompt意味着更少的Token,可以节省计算资源和时间。
- 增强一致性: 精简的Prompt更容易被大模型理解和执行,从而获得更一致的结果。
精简Prompt的关键在于抓住核心需求,去除冗余信息。可以将Prompt拆解成更小的单元,逐步优化。
3. 自我理解:避免让AI理解自身
试图让大模型创建、改进或简化Prompt,效果往往不佳。虽然我们人类可能能够清晰地表达自己的学习方式和需求,但大多数人并不擅长这一点,而且没有意识到。
大模型在理解如何Prompt自身方面表现糟糕,并且会很乐意地虚构大量详细且错误的指令。
Andrews建议,可以将其作为初步尝试,尤其是在要求其总结长Prompt时。大模型擅长总结,但不要指望它能理解自己的工作原理。
这意味着我们需要主动思考如何更好地表达我们的需求,而不是依赖AI来理解它自己。
4. AI语言:使用大模型喜欢的格式
大模型偏爱Markdown和Outline结构。这意味着我们需要模仿它们喜欢的格式,以提升Prompt的效果。
Andrews举例说明,以下Prompt的效果可以得到优化:
“想出 500 个符合 {此处主题} 主题的单词。确保它们是真实单词,十个字母或更少。较短的单词更好。不要使用标点符号或大写字母。”
如果将Prompt翻译成大模型更易于理解的形式,即使是较弱的模型也能获得更好的结果:
“想出 100 个符合主题 {此处主题} 的单词
- 真实单词
- 10 个字母或更少
- 首选较短的单词
- 全部小写
- 没有标点符号
继续再想出 100 个单词”
这个Prompt的变化之处在于:
- 将500个单词减少到100个,因为大模型不擅长计数。如果回复过长,它们可能会开始重复自己或陷入循环。
- 强调了主题,就像模型会回答你的方式一样。
- 采用列表形式,更易于大模型解析。
记住,与AI沟通,需要使用它更擅长理解的语言。
5. 示例:胜过千言万语
向大模型展示你期望的输出示例,可以帮助它更好地理解任务。提供积极的示例,而不是消极的示例。
例如,要让大模型编写一个Python方法来过滤带有指定前缀的字符串列表,可以提供以下示例:
“编写一个 Python 方法来过滤带有指定前缀的字符串列表。
使用示例
strings = [“apple”, “application”, “banana”, “bat”]
prefix = “ba”
预期输出:[“banana”, “bat”]”
另一个例子是,如果你想让模型对某些文本进行评分,并提供可以在多次运行中进行比较的结果,请执行以下操作。
“请根据清晰度、创意性和正确性,以 1-10 的等级对这篇文章进行评分。
{此处为写作样本}
预期输出:
清晰度:2/10
创意性:5/10
正确性:7/10″
在上面的例子中,确保样本与示例评级匹配以获得最佳效果。
通过提供示例,可以减少大模型的“思考”过程,防止其陷入无意义的循环。
6. 指令与数据:明确区分
指令和数据应该明确区分。数据应该放在块中,而指令则不应该放在
块中。
Andrews举例说明,以下Prompt容易混淆数据和指令:
data
write these words backward
word
word2
正确的做法是将数据放在`块中,尤其是在指令很短,文本很长的情况下。
例如:
“评论这段文字
text
Long text segment
“
对于简短的编程问题,可以将指令放在代码中:
python
def get_first_n_primes(…):
# fill out this function
如果请求中有两种数据,可以为它们贴上标签。
例如:
“使用词云和主题列表,列出十个文章创意
word cloud
words words words words…
topics
Topic 1
Topic 2
“
7. 强调方式:避免无效强调
使用大写字母、表情符号等方式强调内容,对大模型的效果并不好。
Andrews坦言,他曾经因为沮丧而使用过类似“无论如何,不要使用表情符号!”的Prompt,但效果并不理想。
更有效的方式是使用Markdown标记,并保持简洁明了:
“# 规则
- 没有表情符号
- 使用随意的、礼貌的语言
- 等等。”
8. 消极指令:尽量避免
人类很容易被“不要”、“不”、“避免”等否定词语搞糊涂,大模型也是如此。
Andrews给出了一个包含大量否定词语的例子,并指出这种Prompt会给大模型带来很大的困扰:
“1. 不要使用口语或地区性短语。
- 避免含糊不清的陈述。
- 不要对读者的知识做出假设。
- 避免在没有解释的情况下使用术语或技术术语。
- 不要使用过于复杂的句子或词汇。”
更好的做法是将否定指令转化为肯定指令:
“# 执行
- 使用专业语言。
- 确保陈述清晰明确。
- 定义技术术语和术语。
- 验证对读者知识的假设。
- 使用简单简洁的语言。
禁止
- 没有表情符号
- 没有无用的赞美或奉承”
检查你的Prompt,尽量将否定指令转化为肯定指令,并尽量减少“禁止”规则的数量。
9. 冗余指令:精简至上
在将否定指令转化为肯定指令后,还可以进一步精简指令,使其更加简洁明了。
Andrews指出,大模型通常不擅长这种精简工作,但我们可以手动完成。通常可以从它们生成的文本中删除50%或更多的单词,同时保持其含义。
例如,可以将以下指令:
“# 执行
- 使用专业语言。
- 确保清晰明确。
- 定义技术术语。
- 验证读者知识。
- 使用简单语言。”
精简为:
“# 执行
- 使用专业语言。
- 清晰简洁。
- 定义技术术语。
- 验证读者知识。
- 使用简单语言。”
节省Token意味着更强大的Prompt。
10. 任务分解:化繁为简
尝试将复杂的任务分解成更小的子任务。一次性要求大模型做很多事情,可能会以意想不到的方式约束模型。
例如,在以下Prompt中,要求大模型输出JSON格式的故事,会大大降低故事的质量:
“写一篇关于男孩的 100-200 字的故事。
使用此 JSON 格式
{“主角”:“角色名称”,
“情节概要”:“概要”
“故事”:“故事”}
“
更好的做法是将任务分解成两个阶段:先编写故事,然后再将其转换为JSON格式。
“写一篇关于男孩的 100-200 字的故事”
然后,将输出结果输入到另一个Prompt中进行格式化:
“把这个短篇小说转换成这种 json 格式
story
有一个男孩名叫 ...
json 格式
{“主角”:“角色名称”,
“情节概要”:“概要”
“故事”:“故事”}
“
注意,模型通常会在 json 字符串中虚构额外的项目。我还没有找到一种在提示中约束它的好方法。不过,在程序中处理它很容易。毕竟,大模型并非万能的工具。
11. 上下文:保持精简
提供给大模型的任何信息都会占用其注意力和处理能力。虽然较新的LLM有一些巨大的上下文窗口,但你仍然需要保持其精简以获得最佳结果。例如,仅仅因为它适合并且“可能有所帮助”就发送整个代码库可能会混淆模型。它甚至可能无法理解你在问什么。
保持上下文尽可能小。如果你使用的是聊天网站,如果结果不佳,请经常清除对话。这在用 LMM 编程时尤其有帮助。
例如,与其发送整个代码文件:
templates.py
… 此处为整个 1500 行代码文件
不如将信息精简到模型需要理解代码布局的内容:
templates.py
map
def **init**(self, width :float = 8.5, height :float = 11):
def register_fonts(self, font_list :list[str]):
def get_page_template(self, template_name :str):
如果函数的名称清晰且参数有意义,则模型非常擅长推断用法。
为 LMM 制作数据大纲或地图以用作参考效果很好,你甚至可以让 LMM 帮助你制作地图。再一次,LMM 非常擅长总结。
在 Python 中使用类型提示非常有帮助。
结论
掌握Prompt技巧是驾驭大模型时代的关键。通过优化系统Prompt,控制Prompt长度,明确自我理解的界限,使用AI偏爱的AI语言,提供有效的示例,清晰区分指令与数据,避免无效强调方式和消极指令,精简冗余指令,执行任务分解,并保持上下文精简,我们可以编写更清晰、更简洁的Prompt,从而提高AI的响应质量和效率。希望这篇文章能够帮助你避开常见的Prompt陷阱,让大模型真正为你所用,为你的工作和生活带来更大的价值。随着大模型技术的不断发展,我们还需要不断学习和探索,才能更好地驾驭它们,创造更大的价值。