大语言模型的效果好,很大程度上归功于算力和数据集,算力使得模型可以足够大,大到模型的理解、记忆、推理和生成以及泛化能力可以同时兼备,而数据集则是模型学习的来源。
LLM中的prompt方法主要用于fine-tune阶段,即在预训练的基础上,针对特定任务的模板或提示语,这些提示语通常包含了问题的关键信息,例如问题类型、答案类型、限制条件等,通过少量的标注数据(提示语)对模型进行微调,使其更好地适应特定的任务和应用场景。在这个过程中,prompt工程可以帮助模型更好地理解任务和输入,并生成更准确的输出,从而提高模型在实际应用中的效果和性能。
在推理时,prompt方法不用于修改用户的输入。相反,它主要用于为模型提供额外的上下文信息,以便更好地理解用户的输入和问题。例如,在问答任务中,prompt方法可以生成一个与问题相关的提示语,帮助模型更好地理解问题和用户输入,并生成更准确的答案。
具体来说,prompt工程可以通过以下几个方面来帮助模型:
提供任务相关的提示信息:prompt工程可以生成针对特定任务的提示信息,例如问题类型、答案类型、限制条件等。这些提示信息可以帮助模型更好地理解任务和输入,并生成更准确的输出。
生成针对特定任务的模板:prompt工程可以生成针对特定任务的模板,以帮助模型更好地生成符合要求的输出。例如,在问答任务中,可以使用模板来指导模型生成符合问题要求的答案。
提供额外的上下文信息:prompt工程可以提供额外的上下文信息,以帮助模型更好地理解输入和问题。例如,在文本生成任务中,可以使用prompt工程提供的上下文信息来帮助模型生成符合要求的文本。
在文本生成领域的Prompt 工程,为大型语言模型(LLM)创建输入请求,从而产生预期的输出,要能为模型创造好的问题-答案对,一个好的提示工程师往往对大模型具有一定的理解,并且能够清晰归纳总结和陈述问题。提示工程最早可以追溯到ChatGPT的文本-文本模型,在这之后对于文生图以及非文提示都有发展。
当开发人员希望用模型构建系统时,模型幻觉限制带来了真正的挑战,因为整个系统必须满足质量、安全性和可信要求。例如,我们能相信LLM提供的自动代码审查是正确的吗?或者关于如何处理保险相关任务的问题的返回答案是可靠的吗?
本文介绍几种常用的文生文方法,这些方法可以用在营销、广告创意、数学、律法、商业案例等方便,问了方便,本篇以数学上的鸡兔同笼问题( "鸡和兔在一个笼子里,共有35个头,94只脚,那么鸡有多少只,兔有多少只?”)为例。
1.1 模型幻觉
大型语言模型中的幻觉源于数据压缩和不一致。由于许多数据集可能已过时或不可靠,因此质量保证具有挑战性。为了减轻幻觉:
模型的温度是指用于调整模型预测的概率分布的标量值。在LLM的情况下,它在坚持模型从训练数据中学到的东西和产生更多样化或创造性的反应之间取得平衡。通常,这些创造性的答案更容易产生幻觉。
1.约束模型创造力的温度参数;
2.关注prompt工程,引导模型逐步思考,并在响应中提供事实和来源参考。
3.结合外部知识来源以改进答案验证。
这些方法的结合可以达到最佳效果。
paper将生成虚假的或者不忠实于信息源的生成内容称为幻觉。
幻觉可以归为以下几类:
1.逻辑谬误:模型在推理中出错,提供错误的答案。
2.捏造事实:模型没有回答“我不知道”,而是自信地断言不存在的事实。
3.数据导致的偏差:由于某些数据的普遍存在,模型的输出可能会出现偏差,导致结果不正确。
对于LLM为什么会产生幻觉,一种解释是模型的训练的过程是数据的压缩过程,如下图所示,训练集里大量的数据最终压缩为少量参数以及参数间关系,这种压缩的关键是生成式模型存储了输入(文本或像素)之间关系(概率)的数学表示,而不是输入本身,更重要的是,这种表示让我们提取知识(通过抽样或运行查询/提示)。
这种压缩降低了保真度,完全恢复原始知识成为一项困难的,因而模型倾向于不完美地“填补空白”或产生幻觉,这是对这种压缩但有用的知识表示的权衡。
当LLM的训练数据集包含有关向他们提出的问题的有限、过时或矛盾的信息时,LLM也会产生幻觉。
Prompt方法如下:
1.2 直接回答
1.3 思维链(CoT)
Chain-of-thought (CoT) 思维链提示,思维链的核心思想是将最终答案获取分为多个中间过程,这一中间到最终答案的过程就是诱导模型用模仿思路的推理步骤来提高推理能力,这会提高模型再数学以及常识推理方面的能力。比如数学上常见的鸡兔同笼问题,在早期CoT是提供Q&A少量示例的,这被称为few-shot提示技术,当然也可以在Q的时候加上“请逐步推导”,“请给出详细的思考过程”,这被证明同样是有效的,这被称为zero-shot提示技术。很多模型显示CoT技术能够提升模型的推理能力。
1.4 Least-to-most prompting
这一方法的核心思想是既然人类通过事实和逻辑思维得出结论,那么通过一些逻辑思维推理的例子,LLM也应该可以学习到这一技能。
CoT作为一种小样本(few-shot )提示工程方法,LLM可以被教导如何将挑战或问题分解成推理模式。Self-Ask方法不仅引导LLM在推理的时候遵循CoT方法,也让LLM能够自己提问以获得最终答案。但是如果LLM要解决的问题比Self-Ask例子更难呢?Least-to-most就是用于处理这类问题的prompt方法,该方法以以下策略为基础:
1.将复杂问题分解为一系列更简单的子问题。
2.然后依次解决每一个子问题。
先解决的子问题的答案有益于未解决的子问题,最少到最多的提示是一种使用逐步提示序列来得出最终结论的技术。
从最少到最多的提示可以结合思维链和自洽方法,对于一些问题,两阶段的least-to-most prompting可以合并为单次prompt。
1.5 Self-consistency decoding
思维链推理产生了一条思维路径,然后反过来又被遵循。相反,自我一致性利用了直觉,即一个复杂的推理问题通常允许多种不同的思维方式,从而导致其唯一的正确答案。
自洽方法由三个步骤组成:
提示LLM生成思维链(CoT)推理部分。
生成一组多样化的推理路径。
为最终答案选择最一致的输出。
1.6 Self-Ask Prompting
这种方法的核心思想是即使LLM对问题没有明确直接的答案,但是LLM有足够知识和技能,这些知识和技能能够解决一些子问题,通过这些子问题能够解决最终的问题。Source.
自我提问提示是从直接和思维链提示的进步,LLM推理被明确展示,LLM还将问题分解为更小的后续问题,LLM知道何时达到最终答案,并且可以从后续中间答案转移到最终答案。
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
self_ask_with_search = initialize_agent(
tools, llm, agent=AgentType.SELF_ASK_WITH_SEARCH, verbose=True
)
self_ask_with_search.run(
"鸡和兔在一个笼子里,共有35个头,94只脚,那么鸡有多少只,兔有多少只?”
)
1.7 Meta-Prompting
Meta-Prompting方法是指通过提问的方式引导用户思考问题,即能够根据问题自己提问思考并逐步解决原始问题,以下是使用Meta-Prompting方法详细回答这个问题的步骤:
Q: 鸡和兔在一个笼子里,共有35个头,94只脚,那么鸡有多少只,兔有多少只?
A: 我们可以通过以下问题来引导思考:
鸡和兔的数量分别是多少?设鸡的数量为x,兔的数量为y。
题目中给出了哪些条件?我们需要将这些条件转化为方程式。
如何将问题转化为方程组的形式?可以根据头和脚的数量来列出方程组。
如何求解方程组?可以使用代数方法或图形方法求解。
求解出来的结果是否符合题目要求?我们需要检验求解出来的结果是否满足题目中给出的条件。
最终的结果是什么?我们需要将求解出来的鸡和兔的数量反馈给用户。
根据以上问题,我们可以得到以下详细回答:
鸡和兔的数量分别是多少?设鸡的数量为x,兔的数量为y。
题目中给出了哪些条件?我们需要将这些条件转化为方程式。题目中给出了35个头和94只脚,因此可以列出以下两个方程式:
x + y = 35 (鸡和兔的总数为35)
2x + 4y = 94 (鸡的脚有2只,兔的脚有4只)
如何将问题转化为方程组的形式?可以根据头和脚的数量来列出方程组。我们可以通过以下问题来引导思考:
鸡和兔的总数是多少?
鸡和兔的脚的总数是多少?
鸡和兔的脚的总数如何与鸡和兔的数量相关联?
根据以上问题,我们可以得到以下方程组:
x + y = 35 (鸡和兔的总数为35)
2x + 4y = 94 (鸡的脚有2只,兔的脚有4只)
如何求解方程组?可以使用代数方法或图形方法求解。我们可以通过以下问题来引导思考:
如何消去其中一个未知量?
如何求解另一个未知量?
根据以上问题,我们可以得到以下过程:
将第一个方程式乘以2,得到2x + 2y = 70
将第二个方程式减去上面的式子,得到2y = 24
解得y = 12
将y = 12代入第一个方程式,得到x = 23
求解出来的结果是否符合题目要求?我们需要检验求解出来的结果是否满足题目中给出的条件。我们可以通过以下问题来引导思考:
求解出来的鸡和兔的数量是否满足题目中给出的总数?
求解出来的鸡和兔的脚的数量是否满足题目中给出的总数?
根据以上问题,我们可以得到以下答案:
鸡和兔的总数为35,求解出来的鸡和兔数量之和为35,符合题目要求。
鸡和兔的脚的总数为94,求解出来的鸡和兔脚的数量之和为94,符合题目要求。
最终的结果是什么?我们需要将求解出来的鸡和兔的数量反馈给用户。因此,最终结果是:鸡有23只,兔有12只。
1.8 ReAct
对人类来说,推理和行动之间的紧密协同使人类能够快速学习新任务,并进行稳健的推理和决策。即使面临不可预见的情况、信息或不确定性,我们也能做到这一点。ReAct核心思想是将推理和采取行动结合起来。
根据研究,ReAct通过与维基百科等知识源交互,克服了CoT推理的幻觉和错误级联问题。生成了类似人类的任务解决轨迹。
如下图所示,在基于ReAct的Agent的事件序列中,推理跟踪使LLM的最终结果更具可解释性,并在思维过程中使用各种引用。
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
react = initialize_agent(tools, llm, agent=AgentType.REACT_DOCSTORE, verbose=True)
1.9 Symbolic Reasoning & PAL
Symbolic Reasoning & PAL方法是一种基于符号推理和可行性逻辑的智能问答技术,它可以使用逻辑推理和知识表示来解决复杂的问题。
鸡兔同笼本身就是数学问题,很容易想到用符号化的方法解决这类问题。下面是一个蔬菜统计问题,其也展示了符号化的方法过程。
1.10 Iterative Prompting
LLM微调以及增强的提示工程都可以提升模型的性能。确保prompt是上下文相关的,包含小样本训练示例和对话历史。迭代提示应该建立一个上下文思维链,它否定了不相关事实和幻觉的产生。交互式上下文感知&上下文提示。
1.11 Sequential Prompting
通常推荐系统是在流水线架构中开发的,包括多阶段候选集生成(检索更相关的项目)和排名(将相关项目排名在更高的位置)过程。Sequential Prompting侧重于推荐系统的排名阶段,因为LLM在大规模候选集上运行更昂贵。
排序性能对检索到的排名靠前的候选项目敏感,更适合考察LLM推荐能力的细微差异。