六种最常见的LLM定制策略,按资源消耗从最少到最多的顺序排列:
提示工程(Prompt Engineering)
解码与采样策略(Decoding and Sampling Strategy)
检索增强生成(Retrieval Augmented Generation)
Agent
微调(Fine Tuning)
基于人类反馈的强化学习(Reinforcement Learning from Human Feedback)
1、提示工程(Prompt Engineering)
提示(Prompt)是发送给LLM的输入文本,用于引发AI生成的响应,它可以由指令、上下文、输入数据和输出指示符组成。
指令:这是为模型如何执行任务提供的描述或指示。
上下文:这是外部信息,用于指导模型在特定范围内进行响应。
输入数据:这是你希望模型生成响应的输入。
输出指示符:这指定了输出的类型或格式。
基本的提示工程技术包括零次提示(zero shot prompting)、一次提示(one shot prompting)和少量提示(few shot prompting)。用户可以在与LLM互动时直接实现这些基本提示工程技术,从而高效地使模型的行为与新目标对齐。API实现也是一种选择。
由于提示工程的高效性和有效性,人们也探索和开发出了越来越多的用于提升提示的逻辑结构的复杂方法。
思维链(Chain of Thought,CoT)要求LLM将复杂的推理任务分解为逐步的思维过程,从而提高多步骤问题的表现。每个步骤都会明确暴露其推理结果,并作为后续步骤的前置上下文,直到得出最终答案。
思维树(Tree of Thought,ToT)是CoT的扩展,通过考虑多条不同的推理分支并自我评估选择,决定下一步最佳行动。它对于涉及初步决策、未来策略和多种解决方案探索的任务更为有效。
自动推理和工具使用(Automatic Reasoning and Tool use,ART)在CoT的基础上构建,它解构复杂任务,并允许模型使用预定义的外部工具(如搜索和代码生成)从任务库中选择少量示例。
协同推理与行动(Synergizing Reasoning and Acting,ReAct)结合了推理轨迹与行动空间,模型在行动空间中搜索,并基于环境观察确定下一步最佳行动。
像CoT和ReAct这样的技术通常与Agent工作流结合使用,以增强其能力。
2、解码与采样策略(Decoding and Sampling Strategy)
解码策略可以通过推理参数(例如temperature、top_p、top_k)在模型推理时进行控制,从而决定模型响应的随机性和多样性。贪婪搜索、束搜索和采样是三种常见的自回归模型生成的解码策略。在自回归生成过程中,LLM根据前一个token的条件,基于候选token的概率分布逐个输出token。
默认情况下,使用贪婪搜索来生成概率最高的下一个token。
与此不同,束搜索解码会考虑多个下一个最佳token的假设,并选择在整个文本序列中具有最高综合概率的假设。以下代码片段使用transformers库,在模型生成过程中指定束搜索路径的数量(例如,num_beams=5表示考虑5个不同的假设):
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(tokenizer_name)
inputs = tokenizer(prompt, return_tensors="pt")
model = AutoModelForCausalLM.from_pretrained(model_name)
outputs = model.generate(**inputs, num_beams=5)
采样策略是控制模型响应随机性的第三种方法,通过调整这些推理参数:
温度(Temperature):降低温度会使概率分布变得更加尖锐,从而增加生成高概率词语的可能性,减少生成低概率词语的可能性。当温度 = 0 时,相当于贪婪搜索(最不具创意);当温度 = 1 时,会生成最具创意的输出。
Top K采样:这种方法筛选出K个最可能的下一个token,并在这些token之间重新分配概率。模型从这个筛选出的token集合中进行采样。
Top P采样:与从K个最可能的token中采样不同,top-p采样从最小的token集合中选择,该集合的累积概率超过阈值p。
以下示例代码片段从累积概率大于0.95(top_p=0.95)的前50个最可能的token中进行采样(top_k=50):
sample_outputs = model.generate(
**model_inputs,
max_new_tokens=40,
do_sample=True,
top_k=50,
top_p=0.95,
num_return_sequences=3,
)