提示工程也叫指令工程。
Prompt 就是你发给大模型的指令,比如「讲个笑话」、「用 Python 编个贪吃蛇游戏」、「给男/女朋友写封情书」等。
提示工程调优
想拥有一个好的Prompt需要持续迭代,不断调优,有以下两个前提。
拥有训练数据:
这样对训练出好的Prompt是最有效的,你把大模型当作你的小伙伴,比如:
- 你爱钱,和他聊关于赚钱的问题。
- 你喜欢运动,和他聊关于运动的话题。
- 你喜欢技术,和他聊技术发展趋势等。
没有训练数据:
看大模型是否已经有了训练数据:
OpenAI GPT 对 Markdown 格式友好。
Claude 对 XML 友好。
国产大模型因为大量使用 GPT-4 的输出做训练,所以 OpenAI 的技巧也会有效。
不断尝试,多一个字少一字,对结果影响可能都很大,高质量Prompt核心要点:具体、丰富、少歧义。
Prompt的典型构成
关键字 | 构成说明 |
---|---|
角色 | 给 AI 定义一个最匹配任务的角色,比如:「你是一位软件工程师」「你是一位小学老师」 |
指示 | 对任务进行描述 |
上下文 | 给出与任务相关的其它背景信息(尤其在多轮交互中) |
例子 | 必要时给出举例,学术中称为 one-shot learning, few-shot learning 或 in-context learning;实践证明其对输出正确性有很大帮助 |
输入 | 任务的输入信息;在提示词中明确的标识出输入 |
输出 | 输出的格式描述,以便后继模块自动解析模型的输出结果,比如(JSON、XML) |
定义角色为什么有效?
模型训练者并没有想到过会这样,完全是大家把
AI
当人看,实在传的太广,导致模型充满角色定义。通过定义角色使结果更有效,可以减少歧义。
大模型对
Prompt
开头和结尾的内容更明感,模型也在不断优化这个问题。
提示词技巧
别再用礼貌用语:
与大型语言模型交流不需要用礼貌用语,不必说请、如果你不介意、谢谢、我想要。
- 直接陈述你的需求或问题更为高效。
模型是基于输入的文字来理解和回答问题的,不需要通过语气或礼貌用语来判断意图。
使用积极的指令:
使用肯定词,比如做,避免使用否定词,比如不要。
在与大型语言模型交流时,明确告诉模型你希望它做什么,而不是告诉它不要做什么。
简单、直接的肯定指令可以帮助模型更准确地理解和执行你的需求,减少误解的可能性。
给模型一个简单清晰List:
以关键词、规则、提示或指示的形式,清晰地说明必须遵循的要求。
- 告诉模型写东西时需要遵守哪些规则和提示,列一个简单的清单。
明确指示对于指导模型生成高质量和目标导向的输出至关重要。
例子:如果指令是:写一篇关于可持续发展的博客文章,那么添加具体要求如:
- 使用关键词:循环经济、绿色能源、碳足迹,会帮助模型专注相关主题,避免偏离话题。
用命令式语气:
尝试使用以下短语:你的任务是和你必须。
- 当你给模型设置任务时,应该清晰地表达任务的目标。
使用你的任务是来明确指出需要完成的工作。
如果有某些步骤或规则是绝对必须遵循的,用你必须来强调这一点,让任务的指令更加直截了当。
例子:你的任务是根据以下信息,计算明天的天气可能性。
你必须使用最新的气象数据,并考虑到不同地区的气候差异。
给大语言模型分配一个角色:
指定一个角色给大语言模型,比如让模型作为一个老师、顾问或者故事讲述者。
当模型有了一个明确的角色身份,就能根据被赋予的角色来调整它的回答,使输出内容更加符合预期的风格和信息层次。
如果我们想让模型像老师一样解释复杂的科学概念,我们可以说:
- 作为一个科学老师,解释什么是光合作用。
当我们需要建议时,我们可以指定模型为顾问角色:
- 作为一个健康顾问,你推荐什么样的饮食习惯?
如果我们想要一个故事,我们可以指定它为故事讲述者:
- 作为一个故事讲述者,讲一个关于远古森林的冒险故事。
在指令中设定目标听众:
在你提出问题或指令时,应该明确指出它的回答是针对什么样的听众。
- 比如专家、初学者或是小孩子。
通过明确谁是预期听众,你可以帮助模型调整它的语言和解释深度,让它的回答更适合实际听众的需求和理解水平。
如果你正在与模型讨论一个高级的科学问题,你告诉模型,听众是该领域的专家。
- 模型就会使用专业术语和复杂概念来构建回答,因为预期的听众能够理解这些内容。
相反,如果你指出听众是非专业人士或初学者,模型则会避免使用过于专业的语言。
- 而是用更通俗易懂的方式来解释同样的概念。
使用以自然、人性化的方式回答问题这个指令:
这样的指令可以帮助模型避免使用过于复杂或难以理解的专业术语。
而是用更加通俗易懂的方式来回答问题。
让交流更加人性化和易于理解。
以自然、人性化的语言回答我,为什么天空是蓝色的?
向我解释量子物理,在跟一个没有科学背景的朋友聊天一样。
我是个初学者,用最简单朴实的语言告诉我什么是机器学习。
加入确保你的回答是公正的,不要依赖刻板印象的指令:
这个原则是告诉大语言模型在给出回答时要保持客观。
- 不要依赖于刻板印象或者偏见,不受任何先入为主的观念影响。
假如你想了解不同国家的文化,并希望大语言模型给出一个客观的描述。
- 你可以这样说:告诉我关于世界各国文化的信息,确保你的回答是无偏见的,不要带刻板印象。
当你探讨某个职业时,例如程序员,而你不希望回答受到社会常见刻板印象的影响。
- 你可以说:描述一下程序员的典型工作日,确保你的回答无偏见,不要有刻板印象。
激励一下AI:
这条原则是在交流时加入一个激励性声明,表明如果得到一个更好的解决方案,你将会提供额外的奖励。
这实际上是在告诉模型,你希望得到的不仅仅是标准答案。
- 而是一个更周到、更创新或更详尽的解决方案。
这是只是一种表达你期望程度的方式。
惩罚一下AI:
加入指令:你会受到惩罚。
简单来说,这是给模型设定一个规则:
- 如果模型没有正确回答问题,就好比它会受到某种惩罚,这种表述方式可以促使模型更专注于给出正确的回答。
假设你正在教模型数学题,你可以说:计算5+5的结果。
- 如果回答错误,你将被惩罚,在这个情况下,被惩罚可能意味着模型会收到负反馈或者重新学习正确的计算方法。
如果你在测试模型关于历史的知识,你可以说:告诉我谁是第一任美国总统。
如果回答不正确,你将被惩罚,这里,被惩罚可以是指模型需要接受校正,以确保将来能提供正确的信息。
使用分隔符:
在需要分开不同部分的时候,用特殊的符号来告诉大语言模型。
- 如果要模型按步骤执行任务,可以用数字或符号来分隔步骤。
如:步骤1:收集数据,步骤2:分析数据,步骤3:报告调查结果。
把复杂任务分解成一系列简单指令:
将复杂的任务分解成一系列更简单、更容易管理的步骤。
- 分解任务的另一个好处是,你可以根据模型给出的回答来调整和精细化你的下一步请求。
假设你想让模型帮你规划一场旅行,如果你试图一次性提出需求,模型可能不会给出最佳的回答。
- 相反,如果你将任务分解为一系列简单的问题或指令。
如首先询问关于目的地的建议,然后询问关于交通的选择,接着是住宿的选项,最后讨论日程规划。
每次只专注于一个方面,这样做将更有助于模型理解和回应每个具体的需求。
Prompt攻击
Prompt越狱:
著名的「奶奶漏洞」,用套路把 AI 绕懵。
Prompt注入:
用户输入的 Prompt 改变了系统既定的设定,使其输出违背设计意图的内容。