提示工程
Open AI的官方文档 GPT 最佳实践中的6大策略。分别是:
- 写清晰的指示
- 给模型提供参考(也就是示例)
- 将复杂任务拆分成子任务
- 给GPT时间思考
- 使用外部工具
- 反复迭代问题
提示的结构
在这个提示框架中:
- 指令(Instuction)告诉模型这个任务大概要做什么、怎么做,比如如何使用提供的外部信息、如何处理查询以及如何构造输出。
- 上下文(Context)则充当模型的额外知识来源。这些信息可以手动插入到提示中,通过矢量数据库检索得来,或通过其他方式(如调用API、计算器等工具)拉入。一个常见的用例是把从向量数据库查询到的知识作为上下文传递给模型。
- 提示输入(Prompt Input)通常就是具体的问题或者需要大模型做的具体事情,这个部分和“指令”部分其实也可以合二为一。但是拆分出来成为一个独立的组件,就更加结构化,便于复用模板。这通常是作为变量,在调用模型之前传递给提示模板,以形成具体的提示。
- 输出指示器(Output Indicator)标记要生成的文本的开始。如果生成 Python 代码,可以使用 “import” 向模型表明它必须开始编写 Python 代码。LangChain中的代理在构建提示模板时,经常性的会用一个“Thought:”(思考)作为引导词,指示模型开始输出自己的推理(Reasoning)。
LangChain 提示模板的类型
导入方式:
from langchain.prompts.prompt import PromptTemplate
from langchain.prompts import FewShotPromptTemplate
from langchain.prompts.pipeline import PipelinePromptTemplate
from langchain.prompts import ChatPromptTemplate
from langchain.prompts import (
ChatMessagePromptTemplate,
SystemMessagePromptTemplate,
AIMessagePromptTemplate,
HumanMessagePromptTemplate,
)
使用 PromptTemplate
from langchain import PromptTemplate
template = """\
你是业务咨询顾问。
你给一个销售{product}的电商公司,起一个好的名字?
"""
prompt = PromptTemplate.from_template(template)
print(prompt.format(product="鲜花"))
输出:
你是业务咨询顾问。
你给一个销售鲜花的电商公司,起一个好的名字?
在这里,"你是业务咨询顾问。你给一个销售{product}的电商公司,起一个好的名字?" 就是原始提示模板,其中 {product} 是占位符。
通过PromptTemplate的from_template方法,创建了一个提示模板对象,并通过prompt.format方法将模板中的 {product} 替换为 "鲜花"。
这样,就得到了一句具体的提示:你是业务咨询顾问。你给一个销售鲜花的电商公司,起一个好的名字?
在上面这个过程中,LangChain中的模板的一个方便之处是from_template方法可以从传入的字符串中自动提取变量名称(如product),而无需刻意指定。上面程序中的product自动成为了format方法中的一个参数。
使用 ChatPromptTemplate
OpenAI对传输到gpt-3.5-turbo和GPT-4的messsage格式说明如下:
消息必须是消息对象的数组,其中每个对象都有一个角色(系统、用户或助理)和内容。对话可以短至一条消息,也可以来回多次。
通常,对话首先由系统消息格式化,然后是交替的用户消息和助理消息。
系统消息有助于设置助手的行为。例如,你可以修改助手的个性或提供有关其在整个对话过程中应如何表现的具体说明。但请注意,系统消息是可选的,并且没有系统消息的模型的行为可能类似于使用通用消息,例如“你是一个有用的助手”。
用户消息提供助理响应的请求或评论。
助理消息存储以前的助理响应,但也可以由你编写以给出所需行为的示例。
重要论文
-
《Language models are Few-Shot learners(大模型是少样本学习者)》
-
单样本学习的匹配网络,Vinyals, O., Blundell, C., Lillicrap, T., & Wierstra, D. (2016). Matching networks for one shot learning. In Advances in neural information processing systems (pp. 3630-3638).
-
用语义输出编码做零样本学习,Palatucci, M., Pomerleau, D., Hinton, G. E., & Mitchell, T. M. (2009). Zero-shot learning with semantic output codes. In Advances in neural information processing systems (pp. 1410-1418).
-
对示例角色的重新思考:是什么使得上下文学习有效?Min, S., Lyu, X., Holtzman, A., Artetxe, M., Lewis, M., Hajishirzi, H., & Zettlemoyer, L. (2022). Rethinking the Role of Demonstrations: What Makes In-Context Learning Work? Proceedings of the 2022 Conference on Empirical Methods in Natural Language Processing (EMNLP 2022).
-
微调后的语言模型是零样本学习者,Wei, J., Bosma, M., Zhao, V. Y., Guu, K., Yu, A. W., Lester, B., Du, N., Dai, A. M., & Le, Q. V. (2022). Finetuned Language Models Are Zero-Shot Learners. Proceedings of the International Conference on Learning Representations (ICLR 2022).
使用 FewShotPromptTemplate
1. 创建示例样本
2. 创建提示模板
3. 创建 FewShotPromptTemplate 对象
4. 调用大模型创建新文案
Chain of Thought是什么
CoT这个概念来源于学术界,是Jason Wei等人于2022年在论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models(自我一致性提升了语言模型中的思维链推理能力)》中提出来的概念。它提出,如果生成一系列的中间推理步骤,就能够显著提高大型语言模型进行复杂推理的能力。
使用CoT来引导AI的推理过程。
- 问题理解:首先,AI需要理解用户的需求。例如,用户可能会说:“今天要参加朋友的生日Party,想送束花祝福她。”可以给AI一个提示模板,包含示例:“遇到XX问题,我先看自己有 没有 相关知识,有的话,就提供答案;没有,就调用工具搜索,有了知识后再试图解决。”
- 信息搜索:接下来,AI需要搜索相关信息。例如,它可能需要查找哪些花最适合生日派对。
- 决策制定:基于收集到的信息,AI需要制定一个决策。通过思维链详细思考决策的流程,先做什么后做什么。例如,给它一个示例:“*遇到生日派对送花的情况,先考虑用户的需求,然后查看鲜花的库存,最后决定推荐一些玫瑰和百合,因为这些花通常适合生日派对。 *”—— 那么有了生日派对这个场景做示例,大模型就能把类似的思维流程运用到其它场景。
- 生成销售列表:最后,AI使用OutputParser生成一个销售列表,包括推荐的花和价格。
总结
本节课了解了提示工程的原理,几种提示模板的用法,FewShot的思路,以及Chain of Thought(CoT,即“思维链”)和Tree of Thoughts(ToT,即“思维树”)这两个的概念,并探讨了如何利用它们引导大型语言模型进行更深入的推理。
- CoT的核心思想是通过生成一系列中间推理步骤来增强模型的推理能力。在Few-Shot CoT和Zero-Shot CoT两种应用方法中,前者通过提供链式思考示例传递给模型,后者则直接告诉模型进行要按部就班的推理。
- ToT进一步扩展了CoT的思想,通过搜索由连贯的语言序列组成的思维树来解决复杂问题。我通过一个鲜花选择的实例,展示了如何在实际应用中使用ToT框架。