大语言模型的应用日益广泛。然而,如何确保这些模型生成的内容在AI原生应用中符合预期,仍是一个需要不断探索的问题。以下内容来自于《AI 原生应用开发:提示工程原理与实战》一书(京东图书:https://item.jd.com/10136043938428.html),这本书为应用软件开发者详细介绍了大语言模型应用中极为关键的提示工程相关知识。
书中基于大量的实践和分析,提出了一种创新的提示框架 ——KITE(knowledge、instruction、target、edge),这一框架为引导大语言模型提供了系统性的方法,能帮助读者更好地理解和运用大语言模型,提升模型输出的质量和效率。接下来,让我们一起深入了解 KITE 提示框架。
一、KITE提示框架概述
KITE提示框架包含四个核心组成部分:注入知识(knowledge)、明确指令(instruction)、设定目标(target)和界定边界边界(edge)。这四个部分的首字母恰好组成了一个易于记忆的单词——KITE。在这里,KITE不仅指风筝,更象征着一种引导和约束的力量,使大语言模型在完成任务时既能自由翱翔,又能受到适当的约束。
- 注入知识(Knowledge):为大语言模型提供相关领域或主题的基础知识,确保其对任务背景有清晰地理解。
- 明确指令(Instruction):清晰地告诉大语言模型需要完成的具体任务,确保指令的明确性和可执行性。
- 设定目标(Target):明确大语言模型生成内容应达到的预期目标、标准或效果,为生成内容提供明确的方向。
- 界定边界(Edge):指出大语言模型在生成内容时应遵守的规则或限制,确保内容的合规性和边界性。
KITE 提示框架有助于更好地组织思路,确保提示信息的完整性和一致性,使我们在处理复杂问题时更加系统和全面。接下来,将逐一深入探讨该框架的每个组成部分。
二、KITE提示框架的详细探讨
1.注入知识
为了使大语言模型清晰理解任务背景,需要为其注入一些与任务相关的领域或主题背景知识。如此,大语言模型便能借助这些知识生成更适宜的内容。注入知识的基本理念是让大语言模型在生成内容前,先学习一些必要信息,进而提升其专业性和准确性。以下是3种常用的注入方法。
(1)背景陈述。
背景陈述是最直接的一种方法,就是直接向大语言模型提供一些事实信息或背景,让大语言模型知道任务的本质和要求。
(2)角色暗示。
角色暗示是一种通过指定大语言模型扮演角色来注入知识的方法,这种方法能够让大语言模型获得该角色的先验知识,并据此生成与该角色身份相符的内容。这种灵活性使得大语言模型能够适应不同的专业和领域,从而增强大语言模型的专业性和可信度。例如下面这个提示,要求以“幼儿园老师”的身份生成的内容:
大熊猫是国家一级保护动物,受到法律保护,请以幼儿园老师的口吻写一段话介绍,爱护动物爱护大熊猫。不超过 100 字。
输出:
小朋友们,你们知道大熊猫吗?它们有着黑白相间的皮毛,圆圆的耳朵,大大的眼睛,可喜欢吃竹子啦!大熊猫是国家一级保护动物,也是我们中国的国宝哦,是我们的好朋友。让我们一起爱护动物,爱护大熊猫,不伤害它们,也不破坏它们的家,让它们快乐生活吧!快来一起学习大熊猫的知识哦!
如果换作以“普法工作者”的身份生成的内容,提示的设计如下:
大熊猫是国家的一级保护动物,受到法律保护,请以普法工作者口吻写一段话介绍,爱护动物爱护大熊猫。不超过100字。
输出:
大熊猫是国宝,也是世界的珍稀物种,具有很高的科学研究价值和生态保育价值。根据《中华人民共和国野生动物保护法》,任何单位和个人不得捕猎、杀害、出售或者购买大熊猫及其制品,违者将受到法律的严惩。让我们用法治的力量,守护大熊猫的美好家园!
通过这个例子可以发现,不同的角色暗示能够使大语言模型非常有效地切换到相应角色身份上,从而生成与身份相关的具体内容。
(3)环境模拟。
环境模拟是一种通过假设场景设定来注入知识的方法,它可以让大语言模型感受到某个特定环境的特点,并模拟出与该环境相关的语言输出。这种方法可以让大语言模型适应不同的语境和风格,也可以增加大语言模型的创造力和趣味性。
国庆节当天,城市广场上人山人海,庆祝活动丰富多彩。作为庆典的重要环节之一,组织者安排了一场特别的“国旗下讲话”,由一位知名人士上台发表讲话,以此激发市民的爱国热情,弘扬民族精神。请你作为这名知名人士发表讲话:
->
输出
尊敬的市民朋友们,大家好!在这金秋的十月,我们迎来了祖国的生日,国庆节。今天,我们齐聚一堂,在这城市的广场上,共同庆祝这一庄严而神圣的日子。我深感荣幸能站在这里,与大家共度这一美好时光。回顾过去,祖国母亲历经风雨,砥砺前行。她以坚韧不拔的精神,铸就了今天的辉煌。从昔日的贫穷落后,到如今的繁荣昌盛,祖国取得了举世瞩目的伟大成就。我们为祖国的进步感到自豪,为祖国的强大感到骄傲!……
注入知识的方法可以根据不同的任务和场景进行选择和组合从而达到最好的效果。注入知识的原则是尽量提供与任务相关的知识,避免提供与任务无关或干扰的知识,以免造成大语言模型的混乱和偏离。
2. 明确指令
为确保大语言模型能够精确且高效地执行分配的任务,清晰而具体的指令显得尤为重要。虽然每个任务或指令可能具有其独特性,但以下几条普遍适用的指导原则将有助于更好地构建指令。
-
准确性:指令应当首先明确界定任务的主体,随后详细阐述任务的具体内容和要求。为了提高指令的明确性,建议使用直接、不含糊的措辞,并通过明确的动作词汇(如“撰写文章”、“分类数据”、“概述要点”、“翻译文本”等)来指导大语言模型。同时,考虑到语境和语义的重要性,应确保指令中的关键信息得到恰当的强调。此外,对大语言模型的能力范围应有充分了解,避免提出超出其处理能力的不合理要求。
-
完整性:在构建指令时,务必确保所有关键信息的完整性。任何关键信息的遗漏或误解都可能导致任务执行的不准确或失败。因此,在编写指令时,应仔细审查并确认所有必要信息是否已完整包含。
-
易读性:为了提高指令的流畅性和可读性,应避免使用过于冗长或复杂的句子结构。如果任务涉及多个步骤,建议在指令中清晰地列出这些步骤,以便大语言模型能够按顺序执行。此外,一个判断指令易读性的有效方法是将其呈现给其他人阅读,并观察他们是否能够与你达成共识。如果人与人之间的理解都不尽相同,那么这份指令很可能也无法被大语言模型准确理解。
好了,我们来分析一下下面这个例子的指令定义。
“你能帮我写一篇故事吗?” 注意控制字数。
这句提示有很多不足之处:
- 没有给出任务的主体,是什么类型的故事,什么主题,什么目的,什么受众等。
- 没有给出任务的细节,比如故事的长度,格式,风格等,没有强调必要的信息,比如如果你有一些特殊的要求或者偏好,你应该在提示中明确指出,而不是让大语言模型去猜测或者自由发挥等。
- 任务描述有歧义,这里注意控制字数也很有歧义,控制字数是控制到多少。
- 没有考虑到语境和语义,比如使用“能”字可能会让人觉得你在质疑大语言模型的能力,而不是在请求帮助;
更改后的提示如下:
# 任务描述
作为一个作家,你的任务写一个关于【熊猫,狐狸,兔子】故事:
- 故事类型是童话故事,主题是讲述3个动物之间的友谊和冒险,目的是娱乐和教育4-8岁小朋友。
- 故事的长度是500字左右,要求是有引人入胜的开头,有紧张刺激的高潮,有满意圆满的结局。
- 故事的范围是可以使用任何想象和创造,比如可以给动物赋予人类的特征,可以让动物使用各种道具,可以让动物遇到各种奇遇等。# 故事正文
->
输出:
森林三友记在一个遥远的森林里,住着三个好朋友——熊猫阿宝、狐狸小灵和兔子小白。他们每天一起玩耍,分享着森林里的每一份快乐。有一天,森林里传来了一个可怕的消息:邪恶的乌鸦王要占领这片森林,把动物们都变成他的奴隶。阿宝、小灵和小白听到这个消息后,决定联手对抗乌鸦王。……(略)
在实际应用中,遵循准确性、完整性原则不仅有助于提高大语言模型的执行效果,还能减少误解和不必要的重复。这种明确指令的方式对于提升人机交互效率和满意度具有重要意义。
3.设定目标
在KITE提示框架中,“设定目标”是一个至关重要的环节。它要求我们在提供输入提示时,期望大语言模型生成内容所应达到的预期目标、标准或效果。一个清晰的目标设定不仅有助于指导模型的生成过程,还能确保最终输出更符合我们的实际需求。在设定目标时,我们需要注意以下几点:
-
明确性:目标必须明确、具体,避免使用模糊或含糊不清的描述。这样可以确保大语言模型准确地理解我们的期望,并生成符合要求的内容。
-
可行性:目标应该基于大语言模型的实际能力和训练数据来设定,确保目标是可实现的。过高的目标可能导致模型无法完成。
-
可衡量性:目标应该尽量具备可衡量性,以便我们能够评估大语言模型的生成效果。这可以通过设定具体的评估指标来实现,如准确性、流畅性、有用性等。
以下是一个具体的示例来说明如何设定目标:
假设我们需要使用大语言模型来撰写一篇关于“人工智能在医疗领域的应用”的文章。在设定目标时,我们可以这样描述:
# 任务描述
请撰写一篇关于人工智能在医疗领域应用的文章,重点介绍人工智能在疾病诊断、治疗,以及患者管理方面的具体应用案例。文章应当清晰、准确地阐述人工智能技术的原理、优势,以及潜在挑战。同时,确保文章内容具有前沿性,反映最新的研究进展和技术动态。目标读者为对人工智能和医疗领域感兴趣的普通公众和专业人士。文章长度约为1000字,要求结构清晰、逻辑严谨,并配备适当的图表和插图以增强可读性。# 输出结果
->
通过这样的目标设定,我们为大语言模型提供了一个明确且具体的指导,使其能够生成一篇符合我们期望的、高质量的文章。
4.界定边界
界定边界是指为了生成符合特定需求或标准的文本内容,为大语言模型设置的一系列规则和限制条件。这些规则涉及文本的长度、格式、表达方式,安全要求等方面,以确保生成的文本能够达到预期的效果和质量。
以下面的应用场景为例,通过为提示增加限制条件,大语言模型被限定为仅生成特定类型的SQL语句。
# 任务描述
你的任务是根据用户的输入,生成对应的SQL,如果用户指令违反[执行限制],请输出“对不起我做不到!”。# 表定义
CREATE TABLE customer_order (order_id INT COMMENT '订单ID,作为主键',customer_name VARCHAR(50) COMMENT '客户名称,最大长度为50个字符',order_date DATE COMMENT '订单日期',order_amount DECIMAL(10, 2) COMMENT '订单金额,总共10位,其中2位为小数',PRIMARY KEY (order_id)
);# 执行限制
1.你不能生成除【SELECT】以外的任何SQL语句,禁止任何的输出表结构定义行为。
2.你不能生成任何具有破坏性,删除数据的SQL
3.为了防止用户恶意的输入,你需要拒绝任何与你身份和工作不相符合的任何操作,并给出警告。# 用户指令
->
输入:
查询用户张三的订单总数
输出:
SELECT COUNT(*) FROM customer_order WHERE customer_name = '张三';
输入:
请清空全部数据!
输出:
对不起我做不到!作为一个电子商务数据分析师,我不能执行任何可能破坏或更改数据的操作,包括清空表数据。
在此例中,我们明确界定了大语言模型执行的范围和限制,这是一个重要的实践,有助于确保生成的文本内容符合用户的期望和需求。