文章目录
- prompt概述
- 推理(提问)技巧
- 基础prompt构造技巧
- 进阶优化技巧
- prompt自动优化
参考链接:
- Pre-train, Prompt, and Predict: A Systematic Survey of
Prompting Methods in Natural Language Processing - 预训练、提示和预测:NLP中提示的系统综述
随着LLM时代的到来,通过prompt直接对话语言模型,得到预期结果,解析后用于实际应用的模式也随之推广。那么什么是prompt,如何用好prompt去激发语言模型的潜力,成为了预训练语言模型底座+prmpt-tuning范式的重要议题。
prompt概述
prompt通俗来说就是通过设计自然语言提示词,让预训练的语言模型“回忆”预测出学习到的内容,并对提示词的问题做出解答,具体步骤如下:
- 设计模版:设计一个自然语言模版,该模版中一个位置用于存放输入文本[X],一个位置用于存放输出文本[Z];根据模版构造问答样本,如设计模版为"[X] The movie is [Z]“,输入内容[X]为"I love this movie.”,预测结果的位置为[Z]存放的位置,通过这样的模式去构造样本;
- 中间位置的为完形填空prompt,还有前缀、后缀的prompt形式;
- prompt并非局限于自然语言,也可以是向量化后的token;
- [X] 和 [Z] 槽位数量可以根据任务需要灵活调整;
- 搜索回答:这一步主要经大模型推理预测找到得分最高的结果
z
ˆ
zˆ
zˆ。通过预训练的大模型可能会有一组允许的
Z
Z
Z(生成任务可以是任意文本,分类任务可以是一组单词)被预测出来,函数
f
f
i
l
l
(
x
′
,
z
)
f_{fill}(x', z)
ffill(x′,z)(
x
′
x'
x′为根据模版构造的未填充结果的文本)表示用潜在回答
z
z
z填充提示
x
′
x'
x′中的位置 [Z],得到的结果一般被称为 filled prompt,如果填充的是正确回答,则被称为 answered prompt,具体表现为,通过使用预训练的大模型计算会从相应filled prompt 从可能的回答集合
Z
Z
Z中找出概率最大的结果
z
ˆ
zˆ
zˆ,得到answered prompt;
- 映射回答:最后,基于得分最高的回答 z ˆ zˆ zˆ 到得分最高的输出 y ˆ yˆ yˆ,尤其是在分类任务中需要进行这样的结果映射(比如excellent、fabulous、wonderful 等近义词可以映射到某一情感类别);
推理(提问)技巧
prompt采用完形填空、前缀还是后缀的形式,是预训练底座或者微调时需要考虑的,当前就总结基于大模型完成推理(提问)时,该如何设计prompt以及使用什么样的技巧才能更好地激发大模型的潜能。
基础prompt构造技巧
当提问的方式与大模型的语料库更接近时,模型的预测效果可能会更好,不过大多数大模型的语料库都是非公开的,好在都是采用类似的模版设计,因此能够总结出一定的规律。
想要在推理时得到较理想的预测结果,结合很多prompt经验来看,一个合理的架构就包含了构造prompt所需的技巧,下面介绍一个ChatGPT3官方提出的prompt构造模版CRISPE(Capacity and Role、Insight、Statement、Personality、Experiment),具体为:
构造步骤 | 技巧描述 | 示例 |
---|---|---|
Capacity and Role | 指定角色和能力 | “假设你是一个机器学习架构开发专家,并且还是一个资深博客作家。” |
Insight | 给定一些背景信息 | “博客的受众是有兴趣了解机器学习最新进展的技术专业人士。” |
Statement | 说明任务目标 | “全面概述最流行的机器学习框架,包括它们的优点和缺点。包括现实生活中的例子和案例研究,以说明这些框架如何在各个行业中成功使用。” |
Personality | 控制输出格式与风格 | “在回复时,请使用 Andrej Karpathy、Francois Chollet、Jeremy Howard 和 Yann LeCun 的混合写作风格。” |
Experiment | 指定输出结果的要求,如单输出/多输出 | “给出多个输出示例” |
上述模版包含了很多构造prompt的技巧,不同的模版侧重的技巧可能有差异,但是都是可以用来尝试的范式,其他更多的模版可以参考:9个prompt构造模版范式;
还有很多prompt的设计技巧,避免模型出现幻觉等,更好地得到目标输出结果,比较基础简单的技巧如:
- 提供更多的细节/背景信息;
- 描述更清晰,避免模糊的表达;
- 多尝试不同的prompt构造范式,选取最适合任务的一种提问方式;
- 采用效果好的prompt范式,多次调用模型,选出投票结果(self-consistency);
- 把单个问题拆分成多个子问题,一步一步地得到最终结果(least to most);
- 知识增强,通过检索引入外部知识,构造prompt,提升效果(RAG,Retrieval Augmented Generation);
- 把问题拆分成不同的问题后,逐步进行提问(self-ask)等;
# 采用langchain生成self-ask示例
# pip install langchain
# pip install openai
# pip install google-search-results
import os
os.environ['OPENAI_API_KEY'] = str("xxxxxxxxxxxxxxxxxxxx")
os.environ["SERPAPI_API_KEY"] = str("xxxxxxxxxxxxxxxxxxxx")
from langchain import OpenAI, SerpAPIWrapper
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
llm = OpenAI(temperature=0)
search = SerpAPIWrapper()
tools = [
Tool(
name="Intermediate Answer",
func=search.run,
description="useful for when you need to ask with search",
)
]
self_ask_with_search = initialize_agent(
tools, llm, agent=AgentType.SELF_ASK_WITH_SEARCH, verbose=True
)
self_ask_with_search.run(
"What is the hometown of the reigning men's U.S. Open champion?"
)
# 输出self-ask示例
#> Entering new AgentExecutor chain...
# Yes.
# Follow up: Who is the reigning men's U.S. Open champion?
# Intermediate answer: Carlos Alcaraz
# Follow up: Where is Carlos Alcaraz from?
# Intermediate answer: El Palmar, Spain
# So the final answer is: El Palmar, Spain
# > Finished chain.
# El Palmar, Spain
更多技巧可以参考以下内容:
- OpenAI官方技巧教程
- Reasoning with Language Model Prompting: A Survey
- Awesome-Prompt-Engineering
- 12 Prompt Engineering Techniques
如果模型的参数是可以通过入口传递的,也可以通过参数设置调整模型的预测结果:
- 温度系数(Temperature):控制模型输出随机性的参数。它影响模型在选择下一个词时的确定性,越接近1时模型的输出越随机;
- 多样性(top p):采样策略,模型仅从累计概率超过指定阈值p的最可能的词中进行选择。设置 top-p 为0.9,模型将从概率最高的一小部分词中选择,这些词的累计概率加起来接近0.9。;
- 重复惩罚(penalty):控制模型重复内容的输出,在长篇回答或生成文章时,使用重复惩罚可以帮助减少冗余和重复。
进阶优化技巧
上面提到的链接里有很多更细节/高阶的优化技巧,下面主要是从两种现在应用比较广泛的范式出发来介绍进阶的优化技巧,能更好地解决模型产生幻觉的问题。
把问题拆分成一步一步的小问题,并逐步进行解答,直到得到最终的目标结果。中间过程结合RAG,就能够产出更稳定、准确性更高的模型预测结果;
现在又很多AI-Agent(如:LangChain)集成了这些大模型推理优化技巧,还包含很多底层数据处理和检索等能力,可以协助使用者更好地进行大模型应用,提升模型的预测效果;
- CoT
论文链接:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
是一种引导大模型进行任务分解的提问方法,作法是给出任务分解的少量示例,利用大模型的上下文学习能力(in-context learning)引导模型进行任务拆解,并得到目标结果,如图所示:
- ReAct(Reason+Act)
论文链接:React: Synergizing Reasoning and Acting in
Language Models
引导大模型将问题进行更细致的拆分,在不同的子问题阶段拆分出Thought、Act和Observation三步,分步骤去检索/LLM推理并解答每个子步骤的问题,把各个问题的流程拼接成大模型的最终输入,让模型更有规划地去解决目标问题;
- ReWOO(Reasoning WithOut Observation)
论文链接:ReWOO: Decoupling Reasoning from Observations
for Efficient Augmented Language Models
去掉了ReAct处理手段中的Observation阶段,并且把Thought、Act转换成Planner、Worker和Solver三个阶段,把问题拆分成不同的子问题(Planner),根据子问题去检索/LLM推理对应的结果(Worker),拼接各个子问题的问答,输入给大模型得到目标问题的预测结果;
- ToT(Tree of Thought)
论文链接:Tree of Thoughts: Deliberate Problem Solving
with Large Language Models
ToT是结合了多种优化技巧的一种优化方案,在解决复杂问题时具有更大的优势。CoT是基于问题将问题划分成多个子步骤,并通过检索或者向大模型提问的方式得到各个步骤的结果,而CoT则是在会基于初始问题拆分出多个一级问题,每个问题会通过检索/LLM推理的方式解决,以此类推,就可以得到一颗树结构,最终的结果通过广度优先搜素、深度优先搜索等方式来拼接每一步的内容,最终输入给大模型得到目标答案;
- GoT(Graph of Thought)
论文链接:Graph of Thoughts: Solving Elaborate Problems with Large Language Models
在ToT的基础上引入了循环refine的结构,特定节点上可以想循环神经网络一样不断更新结果,使得整个过程的调整空间更大;
prompt自动优化
还有一些转为优化prompt设计的架构,可以帮你优化提问的文本内容:
- AutoPrompt:Eliciting Knowledge from Language Models with Automatically Generated Prompts
- PromptAgent: Strategic Planning with
Language Models Enables Expert-Level
Prompt Optimization - Guiding Large Language Models via Directional Stimulus Prompting
- Synthetic Prompting: Generating Chain-of-Thought Demonstrations for Large Language Models