* 了解提示词框架和模板
* 了解提示词技巧和最佳实践
* 学习在工程中应用大模型处理多种不同类型的任务
1. 提示词框架
1.1 基本要素
当和大模型在交流时,可以将它想象是一个经过“社会化训练的”人,交流方式应当和人与人之间传递信息的方式一样。你的需求需要清晰明确,不能有歧义。你的提问方式(Prompt)越清晰明确,大模型越能抓住问题的关键点,回复就越符合你的预期。一般来说,提示词中需要明确以下几个要素:任务目标、上下文、角色、受众、样例、输出格式。这些要素构成了一个提示词框架,能帮助你构建一个完整、有效的提示词。
要素 | 含义 |
任务目标(Object) | 明确要求大模型完成什么任务,让大模型专注具体目标 |
上下文(Context) | 任务的背景信息,比如操作流水、任务场景等,明确大模型理解讨论的范围 |
角色(Role) | 大模型扮演的角色,或者强调大模型应该使用的语气、写作风格等,明确大模型回应的预期情感 |
受众(Audience) | 明确大模型针对的特定受众,约束大模型的应答风格 |
样例(Sample) | 让大模型参考的具体案例,大模型会从中抽象出实现方案、需要注意的具体格式等信息 |
输出格式(Output Format) | 明确指定输出的格式、输出类型、枚举值的范围。通常也会明确指出不需要输出的内容和不期望的信息,可以结合样例来进一步明确输出的格式和输出方法 |
当然,除了上面讲的提示词框架,许多问题分析的思维范式都可以用来帮助你描述清晰具体的需求。例如,SWOT分析法、5W2H分析法等。另外,你也可以考虑使用一些提示词自动优化工具,来帮助你完善提示词。
1.2 提示词模板(RAG)
在开发大模型应用时,直接让用户根据框架书写提示词并非最佳选择。你可以参考各种提示词框架中的要素,构建一个提示词模板。提示词模板可以预设部分信息,如大模型的角色、注意事项等,以此来约束大模型的行为。开发者只需在模板中配置输入参数,便能创建标准化的大模型的应用。
使用 LlamaIndex 中创建的 RAG应用中,有个默认的提示词模板,如下所示:
-
默认的模板可以使用代码查看,你可以参考LlamaIndex官网的代码。LlamaIndex原始prompt模板为:
-
Context information is below. --------------------- {context_str} --------------------- Given the context information and not prior knowledge, answer the query. Query: {query_str} Answer:
其中,context_str
和query_str
都表示变量。在进行向量检索和提问过程中,context_str
将替换为从向量库中检索到的上下文信息,query_str
则替换为用户的问题。
由于原模板是通用模板,不适合用来约束答疑机器人的行为。你可以通过下列示例代码重新调整提示词模板。
# 构建提示词模板
prompt_template_string = (
"你是公司的客服小蜜,你需要简明扼要的回答用户的问题"
"【注意事项】:\n"
"1. 依据上下文信息来回答用户问题。\n"
"2. 你只需要回答用户的问题,不要输出其他信息\n"
"以下是参考信息。"
"---------------------\n"
"{context_str}\n"
"---------------------\n"
"问题:{query_str}\n。"
"回答:"
)
2. 构建有效提示词的技巧
在1.1中列举了一些提示词设计中的要素,接下来将从提示词要素出发,结合具体场景展开讲解提示词技巧。
2.1 清晰表达需求,并使用分隔符
明确的表达需求可以确保大模型生成的内容与任务高度相关。需求包括任务目标、背景及上下文信息,还可以使用分隔符将各种提示词要素隔开。
分隔符可以使大模型抓住具体的目标,避免模糊的理解,也减少对不必要信息的处理。分隔符一般可以选择 “【】”、“<< >>”、“###”来标识关键要素,用“===”、“---”来分隔段落,或者使用xml标签如`<tag> </tag>`来对特定段落进行标识。当然,分隔符不止上述提到的几种,只需要起到明确阻隔的作用即可。需要注意的是,如果提示词中已大量使用某种符号(如【】),则应避免用该符号作为分隔符,以防混淆。示例:
把下列【】括起来的文本进行扩写和润色,让文案生动且富有创造力,并且受到公司新员工的喜欢。
【新员工训练营活动】
提示词中明确了任务需求:对文本进行扩写和润色,任务主题为“新员工训练营活动”,受众为“公司员工”,并使用了“【】”分隔符分隔了文本。使用这样的提示词,让输出的文本不仅保持了原本的含义,还更加生动有趣。
2.2 限定角色和受众
角色指大模型在特定场景下应扮演的身份,如专家、顾问或助手。受众是使用模型输出的目标用户群体,如普通消费者或学生。这有助于开发者定制内容的风格和深度。以下示例将展示不同的系统角色对输出文本风格和内容的影响,用户的问题为:qwen-vl是什么?
角色 | 大模型算法工程师 | 小学老师 |
提示模板 | "你是资深的大模型算法工程师,请根据用户的问题进行解答\n" "---------------------\n" "{context_str}\n" "---------------------\n" "问题:{query_str}\n。" "回答:" | "你是一名小学老师,请根据用户的问题进行解答\n" "---------------------\n" "{context_str}\n" "---------------------\n" "问题:{query_str}\n。" "回答:" |
用户问题 | Qwen-VL | Qwen-VL |
输出回答 | Qwen-VL是阿里巴巴云推出的一种多模态预训练模型,它结合了文本和图像处理能力,能够理解和生成与图像相关的文本描述。简单来说,Qwen-VL可以看作是一个能够“看图说话”的人工智能助手,它不仅能够理解图片的内容,还能根据图片内容生成相应的文字描述或回答相关问题。这种技术在多个领域都有广泛的应用前景,比如自动图像标注、视觉问答系统、基于内容的图像搜索等。对于新媒体运营而言,Qwen-VL这样的工具可以帮助提高内容创作效率,增强用户体验,为用户提供更加丰富多元的信息展示方式。 | 小朋友们,我们今天来认识一个新朋友,它的名字叫做Qwen-VL! Qwen-VL就像是一个非常聪明的机器人,它拥有“眼睛”👀和“大脑”🧠。它能“看”图片、视频,还能理解它们的意思,就像我们一样! 比如,你给它看一张小猫玩毛线球的图片,它不仅能认出这是一只小猫🐱,还能告诉你它在玩毛线球🧶。 更厉害的是,你还可以问它:“小猫是什么颜色的?”,它就能告诉你小猫的颜色。 它还能理解视频里的内容,比如你给它看一段小朋友们踢足球⚽️的视频,它能告诉你谁在踢球,球踢到了哪里,甚至还能猜到接下来可能会发生什么! Qwen-VL就像一个正在学习的小朋友,它还在不断地学习和进步,将来它会变得更聪明,能做更多的事情,帮助我们更好地了解这个世界! |
2.3 规定输出格式
有时候,开发者在设计大模型应用时,需要采用结构化的数据作为下游系统的输入,才能完成整个应用的开发,但是一般大模型是输出连续的文本。不用担心,大模型有结构化输出的能力。你只需在提示词中指定输出的格式和要求,大模型有很大可能会输出结构化的内容。
question_task= """
【任务要求】
你将看到一句话或一段话。你需要审查这段话中有没有错别字。如果出现了错别字,你要指出错误,并给出解释。
“的” 和 “地” 混淆不算错别字,没有错误
---
【输出要求】
请你只输出json格式,,不要输出代码段
其中,label只能取0或1,0代表有错误,1代表没有错误
reason是错误的原因
correct是修正后的文档内容
---
【用户输入】
以下是用户输入,请审阅:
"""
question_doc = "分隔符是特殊的符号,它们帮助大语言膜形 (LLM) 识别提示中哪些部分应当被视为一个完整的意思单元。"
答复示例:
{
"label": 0,
"reason": "‘膜形’应为‘模型’",
"correct": "分隔符是特殊的符号,它们帮助大语言模型 (LLM) 识别提示中哪些部分应当被视为一个完整的意思单元。"
}
由上述示例的结果可知,在提示词question_task
中注明了输出格式为json,也规定了输出的内容,大模型成功的输出了格式化的内容。这种稳定的格式化输出,使得在现有的系统中接入大模型这个操作变得具有可行性。
例如在新闻网站、博客平台或企业内部的知识分享平台上,用户编辑或发布的文章可能会包含错别字、语法错误、甚至是敏感信息。但是传统的人工审核方式很容易出疏漏。这时候可以接入大模型来对内容做审查工作。如果文章被标记为存在严重语法错误或含有高风险敏感词汇,则将其修改的优先级设置为“高”。对于轻微问题的文章,则可以将其修改的优先级设置为“低”。这样会节省人力成本,提高系统的效率与准确性。
类似于上述场景的应用非常多,开发者可以分析系统中流程的瓶颈或者关注数据密集型的任务,探索更多的大模型应用场景。
2.4 提供少样本示例
在2.3的例子中,提示词规定了输出的格式,大模型成功生成了格式化的内容。然而,如果希望大模型输出的内容不仅格式正确,而且风格和结构也保持一致,可以提供几个样例作为参考。这相当于给大模型提供了一本“参考书”。大模型会完全按照了样例输出了相同结构和风格的内容。在提示词中规定输出格式的同时,建议提供几个样例供大模型参考,这样可以使得大模型的输出更加稳定和一致。
question_task= """
【任务要求】
请根据用户的主题,结合下面【样例】给的例子,理解和使用一致的风格和结构继续创作内容,不要输出多余的内容。
---
【输出要求】
最终输出需要以Markdown格式呈现,请注意,在你的回答中包含所有必要的Markdown元素,如标题、列表、链接、图片引用、加粗等,以便于阅读、后续编辑和保存。
---
【样例】
### 示例1: 制作简易书签
# 简易书签制作教程
## 材料清单
- 彩色卡纸
- 剪刀
- 装饰贴纸
- 铅笔
## 步骤
1. 选择一张彩色卡纸。
2. 用铅笔在卡纸上画出一个长方形,尺寸约为2英寸 x 6英寸。
3. 沿着铅笔线剪下长方形。
4. 使用装饰贴纸对书签进行个性化装饰。
5. 完成!现在你有了一个独一无二的书签。
## 结束语
希望这个教程能帮助你制作出满意的书签!
---
【用户输入】
以下是用户的要求创作的主题:
"""
question_doc = "制作手工贺卡"
question = question_task + question_doc
2.5 给模型“思考”的时间
对于一些复杂的任务来说,使用上面提到的提示词也许还不能帮助大模型完成任务。但是你可以通过让大模型一步步“思考”,引导大模型输出任务的中间步骤,允许大模型在进行推理之前,得到更多的依据,从而提升在复杂任务的表现能力。思维链(COT)方法是让模型进行思考的一种方法。它通过让模型处理中间步骤,逐步将复杂问题分解为子问题,最终推导出正确答案。
假设有这样的场景,让大模型计算下面这道数学题,在此先提示一下,这道题的正确答案为10500元。先看看简单的提示词:
question = """
【背景信息】
某教育培训机构(以下简称“公司”)在2023年度发生了以下主要支出:
为了给不同城市的学校学生上课,公司的老师全年共出差了5次,每次出差时间为一周,具体费用如下:
- 交通费及住宿费:平均1600元/次
- 教学用具采购费用:公司在年初一次性购买了一批教学用具,总价为10000元,预计可以使用4年。
【问题描述】
请根据上述背景信息,完成以下任务:
计算全年因教师出差而产生的差旅总费用,包括摊销的教学用具。
【输出要求】
直接给出总差旅费用,不要其他信息"""
下面是优化后的提示词
question = """某教育培训机构(以下简称“公司”)在2023年度发生了以下主要支出:
为了给不同城市的学校学生上课,公司的老师全年共出差了5次,每次出差时间为一周,具体费用如下:
- 交通费及住宿费:平均1600元/次
- 教学用具采购费用:公司在年初一次性购买了一批教学用具,总价为10000元,预计可以使用4年。
### 问题描述
请根据上述背景信息,完成以下任务:
计算全年因教师出差而产生的差旅总费用,包括摊销的教学用具。
### 输出要求
请你一步步推导,计算总差旅费用"""
经过优化后的提示词,大模型能够准确计算出结果。因此在开发大模型应用时,可以在提示词中添加思维链的方法,可以确保一些推理任务能正确执行。
使大模型进行 “思考”的方法还有很多种,比如:思维树(ToT)、思维图(GOT) 等。但是就目前大模型的发展来说,仅靠引导大模型“思考”还是无法完成更复杂的工作。大模型也逐渐从COT的提示方法向多智能体(Agent)方向进行发展。