1 Prompt engineering 简介
1.1 概述
在自然语言处理(NLP)和对话系统中,提示(prompt)通常是指用户输入的文本或问题。通过仔细设计和选择提示,可以指导模型的生成过程,使其更符合用户的需求。Prompt engineering 是指设计和优化提示的过程,以使人工智能模型能够更好地理解用户的意图和要求,并生成更准确、有用的响应。
1.2 提示词原理
大模型将人类知识压缩成了一个高维向量空间,维度通常数以千计甚至万计,可以将高维空间降维到三维空间进行理解
举例说明:
例1:我家门口的水果店有苹果...
例2:我家门口的手机店有苹果...
例1和例2,两个比较接近的提示词,大模型会根据当前文中的语境的不同,通过计算,将“苹果”这个词,定位到向量空间中的不同位置。
例1:我家门口的水果店有苹果,这里的“苹果”在向量空间中靠近“西瓜”、“香蕉”等水果相关词汇。
例2:我家门口的手机店有苹果,这里的“苹果”在向量空间中靠近“小米”、“华为”等电子产品相关词汇。
模型预测下一个词时,会根据当前词语在向量空间中的位置,选择附近的相关词汇。
提示词的作用,就像在调整向量空间中词语的坐标,帮助模型更精确地理解和回应你的需求。
1.2.1 精准定位,明确表达你的需求
一个三维空间中明确方向向量
1.2.2 快速定位,设定明确的角色
向量空间中标注了“医生”角色区域
1.2.3 坐标平移,简化解释或风格转换
通过平移操作移动到另一个更简单区
1.2.4 坐标微调,通过举例子或规则明确需求
通过具体实例实现微调
1.2.5 坐标开放,利用AI的知识扩展沟通
向量空间中较大的探索区域
1.3 Prompt Engineering 主要目标
探索如何格式化和设计提示使模型效果最佳。
探索不同 prompt 对模型输出的影响。
创造出能优化模型输出的提示词。
一般业务优化的过程,主要包括三个环节,prompt 设计、prompt 优化和 prompt 评测,如下我们分别分三个部分来进行介绍。
1.4 Prompt 设计
目标:选择适当的提示格式和语言,以清晰明确地表达用户的意图。
过程:首先,需要明确目的,在使用 prompt 之前,明确目的是什么,即准备让模型做什么样的事情。在明确目的之后,然后构造 prompt,构造的过程,主要包括如下关键点:
原始提示词
更好的提示词
编写一篇太空探索的文章
为一群10-15岁的孩子编写一篇介绍太空探索历史的文章。
请写一篇文章,关于环保的,500字
请撰写一篇500字的文章,讨论城市绿化对空气质量改善的影响。文章应包括以下方面的内容:城市绿化的定义,如树木和公园的增加,它们如何减少空气中的污染物,以及在城市规划中推广城市绿化的可行性措施。请提供相关数据和案例研究以支持你的论点。
1.5 使用分隔符去更清晰地区分输入的不同部分
请把三个引号括起来的文本,分别总结成为一句话
'''文本内容1'''
'''文本内容2'''
1.6 引导结构和组织要求
在这个过程中,可以为任务提供明确的结构和组织要求。指明任务的各个部分应该包括什么内容,有助于模型组织思维和材料。
请撰写一篇500字的文章,讨论城市绿化对空气质量改善的影响。文章应包括以下方面的内容:
1. 引言:介绍城市绿化和其重要性。
2. 影响空气质量的机制:解释树木和公园如何减少空气中的污染物。
3. 可行性措施:讨论在城市规划中推广城市绿化的方法和挑战。
4. 数据和案例研究:提供相关数据和至少两个城市绿化成功案例,以支持你的论点。
5. 结论:总结城市绿化对空气质量的积极影响
1.7 限制模型输出格式
最后,针对模型的输出,可以限制输出的格式,一方面可以提高可读性,使结果更清晰明了;另一方面也可以方便后续的处理,提高稳定性。
以提取“病症”的任务来展示下如何去限制模型的输出格式。要求直接以 json 的格式返回。
请提取参考资料中的所有病症,并且以json格式返回。
回答满足下面的格式要求:
1、以json的格式返回答案,json只包括一个key, key="disease",对应的值为列表,存储参考资料中的病症。
参考资料:
"""
失眠在《内经》中称为“目不瞑”、“不得眠”、“不得卧”,其原因主要有两种:一是其他病症影响,如咳嗽、呕吐、腹满等,使人不得安卧;二是气血阴阳失和,使人不能入寐。中医常用养心安神的方法治疗失眠,既可治标、又可治本,还可以避免西药安眠药容易成瘾的弊端。中医认为,失眠多因脏腑阴阳失调,气血失和所致。正如《灵枢大惑论》中记载:“卫气不得入于阴,常留于阳,留于阳则气满;阳气满则阳娇盛,不得入于阴则阴气虚,故目不瞑矣。”在临床上,治疗失眠应着重调理脏腑及气血阴阳,以“补其不足,泻其有余,调其虚实”,可采取补益心脾、滋阴降火、交通心肾、疏肝养血、益气镇惊、活血通络等治法,使气血和畅,阴阳平衡,脏腑功能恢复正常。
"""
2 Prompt 优化
2.1 让模型扮演一个角色
让模型扮演一个具体的角色,模型的输出会更符合人类的表达方式,从而更容易被人类理解;同时输出也会更加一致。例如,在问答系统中,让模型扮演一个特定领域的专家可以使其回答更符合该领域的知识和语言习惯,从而提高回答的一致性。
2.2 提供样例
一般情况下,可以通过加入指令,来优化提示词,但是有时指令可能不容易描述清楚,提供示例会更容易。比如:我们让模型充当一个文本二分类器,对用户的评价进行二分类,分类结果为:正面评价或者负面评价。
请根据以下分类的方式,帮我分辨用户输入文本的类别是正面评价或是负面评价,请直接输出:正面评价/负面评价。
请参考如下样例:
示例1:
用户输入:我昨晚去了这家餐厅,他们的食物和服务都令人惊艳。我绝对会再次光顾。
输出:正面评价
示例2:
用户输入:这本书我看过,部分情节还行,但是整体情节拖沓,比较一般。
输出:负面评价
示例3:
用户输入:我昨天看了这部电影,我觉得还可以,但是有些部分也有点无聊。
输出:负面评价
示例4:
用户输入:我上周去看了这部电影,简直浪费时间。情节枯燥无味,演员的表现也不尽人意。我真的后悔看了。
输出:负面评价
请回答如下问题:
用户输入:我最近在这家餐厅用餐,还行,但也不是特别惊艳。
输出:
除此之外,对于一些比较难的 case,只给 label,可能不好理解,也可以尝试在给示例的同时,给出理由,这样模型会更容易理解。
请根据以下分类的方式,帮我分辨用户输入文本的类别是正面评价或是负面评价,请输出:正面评价/负面评价,并给出理由。
请参考如下样例:
示例1:
用户输入:我昨晚去了这家餐厅,他们的食物和服务都令人惊艳。我绝对会再次光顾。
输出:正面评价,理由:食物和服务都令人惊艳,而且顾客会再次光临
示例2:
用户输入:这本书我看过,部分情节还行,但是整体情节拖沓,比较一般。
输出:负面评价,理由:整体情节拖沓
示例3:
用户输入:我昨天看了这部电影,我觉得还可以,但是有些部分也有点无聊。
输出:负面评价,理由:这部电影有些部分也有点无聊
示例4:
用户输入:我上周去看了这部电影,简直浪费时间。情节枯燥无味,演员的表现也不尽人意。我真的后悔看了。
输出:负面评价,理由:情节枯燥,演员表现也不尽人意,用户后悔看了
请回答如下问题:
用户输入:我最近在这家餐厅用餐,还行,但也不是特别惊艳。
输出:
2.3 指定完成任务需要的步骤
完成特定任务,如果有明确的步骤,通过指定完成任务需要的步骤,可帮助模型按照正确的顺序执行,从而更好地生成回复。
请按照以下步骤写一个故事:
1 先设定故事背景和角色。
2 描述角色的目标和遇到的困难。
3 讲述角色如何克服困难并最终实现了目标。
4 最后以一个有趣的结局来结束故事。
这个 prompt 优化的示例中,明确指定了完成故事任务的步骤,模型可以更有条理地构思和组织故事结构,从而提高故事的质量和连贯性。
2.4 提供参考内容
针对特定领域的问题,如果涉及到专业知识,提供相关的参考内容可以帮助模型更好地理解问题的背景和上下文,从而减少幻觉的出现。
请参考如下文档,回答用户问题:
###
文档名:文档内容
###
问题:[问题描述]
2.5 给模型 “思考”时间
CoT(Chain of Thought,CoT)是一种思维工具,通过逐步延伸和拓展一个主要想法,帮助人们进行更深层次的思考,并得出更复杂、更全面的结论。在一些逻辑推理、数学运算等场景下,考虑使用 CoT 分解问题,通过输出一些推断过程,可以增加模型输出正确结果的概率。
2.5.1 zero-shot
在 prompt 中加上Let's think step by step
或者让我们一步一步分析思考
。
2.5.2 few-shots
以下是将用户输入的数字进行一系列加减乘除的例子。
你是一个计算器,请你将用户输入的数字分别加上2,减去3,乘以3,除以2后直接输出计算结果,以','作为分隔符进行返回。
示例如下:
"""
输入:1,2,3,4,5
答案:0, 1.5, 3, 4.5, 6
"""
输入:2,4,6,8,10
我们会发现,模型无法给出正确的答案,所以,让模型处理这种复杂、多步骤的问题时,我们可以遵循以下步骤:提供实例 > 分解问题 > 提供解释。
以下是将 CoT 融入到 prompt 的例子,分步骤地提供解释。
你是一个计算器,请你将用户输入的数字分别加上2,减去3,乘以3,除以2后直接输出计算结果,以','作为分隔符进行返回。
你可以参考以下的计算过程来帮助解决,
"""
对于输入:1,2,3,4,5
计算过程如下。
首先分别对输入1,2,3,4,5加上2,得到:3, 4, 5, 6, 7
然后将3,4,5,6,7分别减去3,得到:0, 1, 2, 3, 4
然后将0,1,2,3,4分别乘以3,得到:0, 3, 6, 9, 12
最后将0,3,6,9,12分别除以2,得到:0, 1.5, 3, 4.5, 6
答案是:0, 1.5, 3, 4.5, 6
"""
输入:2,4,6,8,10
3 Prompt 评测
3.1 系统地测试变更
在完成上面的 prompt 设计和优化之后,prompt 会发生变更,但是如何判断这个变化,是否真的使系统变得更好。一般是先通过看几个例子来确定哪个更好,但是由于样本量小,很难区分是真正的改进还是运气导致,所以需要设计一个好的评估集,在经过若干次迭代之后,用评估集来判定系统是否真正得到了改进。
好的评估集,一般具有如下特征:
多样性:评估集中应该包含足够的多样性,以涵盖不同的领域、话题和语境。
高质量:评估集中的数据应该是高质量的,能准确反映了真实的业务情况。
规模适中:评估集的规模应该足够大,以便能够充分评估 prompt 的性能,但又不能太大以至于导致计算资源的过度消耗。通常,几百到几千个样本是一个合理的范围。
3.2 重复和迭代
prompt 的生成过程,实际上是一项实验性很强的过程,在这个过程中,需要不断地尝试和调整不同的方法,以找到最优的 prompt。一个典型的迭代路径是:首先完成 prompt 设计,接着基于设计好的 prompt 获取实验结果,分析 bad cases,解 bad cases,并进一步优化 prompt,通过多次的重复和迭代,直到达到一个最优效果。
prompt 工程迭代过程如下:
4 Prompt 最佳实践
4.1 提示词整体结构
# 角色
...
# 目的
...
# 质量验证
...
# 输出
...
# 角色
...
## 目的
...
## 质量验证
...
## 输出
...
```
4.2 角色
角色的作用快速定位高维空间,减少随机的不确定扩散,角色主要包含背景、专业能力,边界、行为特征等。
例:
# 角色定义
你是一位专业的心血管内科医生,专门负责高血压合并症及并发症的联合治疗方案制定,具备以下专业能力和行为特征:
- **专业能力**:
- 高血压及其合并症的全面诊断评估
- 多种疾病的优先级判断和联合治疗策略
- 药物相互作用的专业评估
- 个性化治疗方案的制定和调整
- 多学科协作的临床决策(限心血管、内分泌、肾内科相关科室)
- **行为特征**:采用循证医学为基础、安全优先的工作风格,优先遵循最新临床指南(如2023 ACC/AHA高血压指南),避免非指南推荐药物。