系列文章导览
导言
笔者由于工作原因需要使用LLM来完成一些网络安全相关的任务,但是笔者在调研后发现,目前讲解LLM的技术文章普遍集中于单个小点,而鲜有体系化讲解LLM使用的文章,因此,笔者准备从LLM使用者的角度出发,即不考虑LLM的训练与全参数微调等,仅仅是调用一个已训练好的LLM的api,系统化的讲解LLM的各种使用技巧------即提示工程。
之前已经说完了提示工程的一些基础知识,包括基本的提示结构和两种不同的提示,接下来说的就是如何设计一个提示(prompt)以及设计时可以注意的技巧
迭代式设计
设计提示是一个迭代过程,需要大量实验才能获得最佳结果。
在写提示的时候,可以从简单的提示开始,依据模型的输出和预期结果之间的差距,逐渐添加更多元素和上下文。如果想让大模型处理一个大型任务,可以尝试将任务分解成更简单的子任务,利用提示让模型逐个的解决子任务。从而避免给设计提示过程增加太多复杂性。
指令要足够清晰
当处理简单任务的时候,可以使用命令式的语句与较为明确的词汇,以告知模型你想要实现的目标。例如"分类"、"总结"、"翻译"、"排序"等。
最有效的prompt需要大量实验才能找到。尝试使用不同的指令,配合不同的关键词、上下文来找最适合任务的prompt。通常,上下文与你所尝试执行的任务越具体和相关,效果越好。
在写prompt的时候,指令应当放置于prompt的开头。并且使用一些清晰的分隔符,如"###",来分隔指令和上下文。
举个例子:
vi
### 指令
任务:情感分析
### 上下文
- 示例1:这段文字真是太棒了,我非常喜欢! - 积极
- 示例2:我不太喜欢这个,感觉很一般。 - 消极
- 示例3:这本书的内容很客观,提供了很多事实信息。 - 中性
### 输入数据
1. 我真的对这个产品感到失望,它没有达到我的期望。
2. 这是我看过的最好的电影之一,强烈推荐给大家!
3. 报告详细介绍了市场的现状,很中立。
### 输出指示
- 对于每个输入文本,模型应输出一个情感标签,表明文本是积极的、消极的还是中性的。
具体与简洁
在设计prompt时,要非常具体。提示越描述性和详细,结果就越好。尽可能具体、描述性和详细地说明期望的上下文、结果、长度、格式、风格等:
- 明确上下文:提供足够的背景信息,使模型能够理解任务的背景。例如,如果正在寻求关于特定行业的趋势分析,确保提及该行业。
- 定义期望的结果:详细描述希望模型提供的信息类型。例如,如果需要一个摘要,指定是需要一段简短的摘要还是一个详细的执行摘要。
- 指定长度和格式:如果对输出的长度有特定的要求,比如推文长度限制或段落形式,明确指出。同样,如果你需要列表、表格或其他特定格式,也要指明。
- 设定风格:如果对输出的风格有特定要求,比如正式、幽默或非正式,确保在提示中指出。这有助于模型生成符合期望的语气和风格的文本。
- 避免模糊性:尽量避免使用模糊或多义的语言。明确指出需求,避免使用"可能"、"或许"或"如果适用"等词语。
- 指导性指令:使用清晰的动词来指导模型的行为,如"总结"、"比较"、"解释"等,这些动词可以明确指示模型应采取的行动。
在设计提示时,你还应该考虑提示的长度,现有的模型对于能处理的上下文信息的长度是有限制的,比如gpt系列是128k token。因此在prompt中包含太多不必要的细节反而可能让模型失去之前生成的可用信息。细节应该是与任务高度相关的。而prompt中所需要包含的细节性描述就是需要大量实验的东西。
同样举个例子:
shell
### 指令
任务:提取关键信息并生成简短的文本摘要
### 上下文
- 示例1:输入:「该公司在2024年第一季度的净利润增长了15%,主要得益于其云计算服务的强劲需求。」 - 摘要:「2024年第一季度,公司净利润增长15%,云计算服务需求旺盛。」
- 示例2:输入:「最新研究显示,全球海平面在过去十年内上升了约5毫米,这一趋势与气候变化有关。」 - 摘要:「研究:过去十年全球海平面上升5毫米,与气候变化相关。」
### 输入数据
输入:「科学家们发现了一种新的材料,能够在室温下超导电,这一发现可能会彻底改变能源传输和电子设备。」
### 输出指示
- 模型应为每个输入文本提供一个简洁的摘要,突出主要信息和关键数据,摘要长度不超过30个词。
在这个例子中,指令非常具体,明确指出了任务是提取关键信息并生成文本摘要。上下文中的示例非常描述性和详细,提供了输入文本和期望的摘要输出,这有助于模型理解如何从输入中提取关键信息并形成简短的摘要。输入数据和输出指示也很清晰,指导模型对给定的文本进行操作,并指出输出的长度限制。
避免不精确的语句
在写prompt时候,应当尽力避免模糊的语句,这里直接举个例子:
解释提示工程的概念。保持解释简短,只用几句话,不要太描述性。
上面的提示没有清楚的指明应该使用多少句话以及应该使用什么风格等信息。更好的提示应当是非常具体、简洁且切中要点的。例如:
用2-3句话向高中生解释提示工程的概念。
这种提示清晰地指出了所需的解释长度、预期的受众(高中生),以及解释的目的(让高中生理解)。这样的提示更容易被模型理解,并且更有可能产生符合预期的精确和有用的输出。
只说应该做的
当设计提示时,应该专注于指导模型应该做什么,而不是不应该做什么。这样做可以帮助模型更具体地理解任务要求,并提供更准确的输出。以下是一个类似的中文示例,针对一个旅游推荐聊天机器人:
不良示例的提示:
提示:
以下是一个向用户推荐旅游目的地的聊天机器人。请不要询问用户的预算。不要询问用户的旅行偏好。
用户:请根据我的兴趣推荐一个旅游目的地。
机器人:
输出:
好的,我可以根据你的兴趣来推荐旅游目的地。你更喜欢自然风光还是城市探险?你有没有特别的旅行偏好?
改进后的提示:
css
提示:
以下是一个向用户推荐旅游目的地的聊天机器人。该机器人负责根据当前热门旅游景点进行推荐。它应该不询问用户的个人预算,也不询问用户的旅行偏好。如果机器人没有推荐的目的地,应回答"抱歉,今天没有找到合适的旅游目的地推荐给您。"
用户:请根据我的兴趣推荐一个旅游目的地。
机器人:
输出:
抱歉,我无法获取您的具体兴趣信息。不过,这里是目前全球热门旅游景点的列表:[旅游景点列表]。希望您能从中找到喜欢的目的地!
在这个改进后的示例中,聊天机器人被明确指示根据当前热门旅游景点进行推荐,而不是询问用户的个人偏好或预算,这避免了不必要的询问,并直接提供了用户所需的信息。如果机器人无法提供推荐,它也会礼貌地告知用户。这样的提示更加具体和专注,有助于生成更好的用户体验。
(针对于代码生成任务)给出起始语句
在生成代码时候,使用"引导词"来引导模型朝特定模式发展。举个例子: 如下是一个没有使用引导词的较差prompt:
bash
# 编写一个简单的Python函数,该函数
# 1. 让我输入以厘米为单位的长度
# 2. 将厘米转换为千米
在下面的改进的prompt示例中,添加"import"暗示模型应该开始用Python编写。(同样地,"SELECT"是开始SQL语句的好提示词。)
python
# 编写一个简单的Python函数,该函数
# 1. 让我输入以厘米为单位的长度
# 2. 将厘米转换为千米
import