大语言模型(LLM)是基于自监督学习预训练的深度学习模型,训练数据量庞大、训练时间长,并且包含大量的参数。LLM在过去两年中彻底改变了自然语言处理领域,展现了在理解和生成类人文本方面的卓越能力。
然而,这些通用模型的开箱即用性能并
不总能满足特定的业务需求或领域要求
。LLM单独使用时无法回答依赖于公司专有数据或封闭环境的问题,这使得它们在应用中显得
相对通用
。
由于从零开始训练一个LLM模型需要大量的训练数据和资源,这对于中小型团队来说基本不可行。因此,近年来开发了多种LLM定制策略,以便针对需要专业知识的不同场景调优模型。
定制策略大致可以分为两种类型:
-
使用冻结模型:这些技术不需要更新模型参数,通常通过上下文学习或提示工程来实现。由于它们通过改变模型的行为而不需要大量训练成本,因此具有成本效益,广泛应用于工业界和学术界,每天都有新的研究论文发表。
-
更新模型参数:这是一种相对资源密集的方法,需要使用为特定目的设计的自定义数据集来调优预训练的LLM。这包括如微调(Fine-Tuning)和基于人类反馈的强化学习(RLHF)这些流行的技术。
这两种定制范式进一步分化为各种专门的技术,包括LoRA微调、思维链(Chain of Thought)、检索增强生成(RAG)、ReAct和Agent框架等。每种技术在计算资源、实现复杂度和性能提升方面提供了不同的优势和权衡。
定制LLM的第一步是选择合适的基础模型作为基准。例如Huggingface这些基于社区的平台,提供了由顶级公司或社区贡献的各种开源预训练模型,如Meta的Llama系列和Google的Gemini。Huggingface还提供了例如Open LLM Leaderboard这样的排行榜,可以根据行业标准的指标和任务(如MMLU)来比较LLM。
云服务提供商如AWS(亚马逊)和AI公司(如OpenAI和Anthropic)也提供访问专有模型的服务,这些通常是付费服务,且访问受限。
选择LLM时需要考虑以下几个因素:
-
开源模型还是专有模型
:开源模型允许完全定制和自托管,但需要技术专业知识,而专有模型则提供即时访问,通常可以提供更好的响应质量,但成本较高。
-
任务和指标
:不同的模型在不同任务上表现出色,包括问答、总结、代码生成等。通过比较基准指标并在特定领域任务上进行测试,来确定合适的模型。
-
架构
:一般来说,仅解码器模型(如GPT系列)在文本生成方面表现更好,而编码-解码模型(如T5)在翻译任务上表现优秀。现在有更多的架构出现并展现出良好的结果,例如专家混合模型(MoE)DeepSeek。
-
参数数量和模型大小
:较大的模型(70B-175B参数)通常提供更好的性能,但需要更多的计算资源。较小的模型(7B-13B)运行更快且更便宜,但可能在能力上有所减少。
在确定了基础LLM之后,让我们来看一下六种最常见的LLM定制策略,按资源消耗从最少到最多的顺序排列:
-
-
解码与采样策略(Decoding and Sampling Strategy)
-
检索增强生成(Retrieval Augmented Generation)
-
-
-
基于人类反馈的强化学习(Reinforcement Learning from Human Feedback)
提示(Prompt)是发送给LLM的输入文本,用于引发AI生成的响应,它可以由指令、上下文、输入数据和输出指示符组成。
提示工程(Prompt Engineering)涉及有策略地设计这些提示组件,以塑造和控制模型的响应。基本的提示工程技术包括零次提示(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工作流结合使用,以增强其能力。这些技术将在接下来的Agent部分中详细介绍。
解码策略可以通过推理参数(例如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,
)
检索增强生成(Retrieval Augmented Generation,简称RAG),最初在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中提出,已被证明是一种
有前景
的解决方案,能够将外部知识集成进来,并在处理领域特定或专业查询时减少常见的LLM幻觉问题。RAG允许动态地从知识领域中提取相关信息,并且通常不涉及更新LLM参数的大规模训练,使其成为一种用于将通用LLM适配到特定领域的成本效益高的策略。
RAG系统可以分为
检索
和
生成
两个阶段
。
检索过程的目标是通过对外部知识进行切块、创建嵌入、索引和相似性搜索,找到与用户查询密切相关的知识库内容。
-
切块(Chunking)
:将文档划分为较小的段落,每个段落包含一个独立的信息单元。
-
创建嵌入(Create embeddings)
:嵌入模型将每个信息块压缩为向量表示。用户查询也通过相同的向量化过程转换为向量表示,这样用户查询就可以在相同的维度空间中进行比较。
-
索引(Indexing)
:这一过程将这些文本块及其向量嵌入存储为键值对,从而实现高效且可扩展的搜索功能。对于超出内存容量的大型外部知识库,向量数据库提供高效的长期存储。
-
相似性搜索(Similarity search)
:计算查询嵌入与文本块嵌入之间的相似性分数,用于搜索与用户查询高度相关的信息。
RAG系统的生成过程则将检索到的信息与用户查询结合,形成增强的查询,并将其传递给LLM,以生成丰富上下文的响应。
以下代码片段首先指定LLM和嵌入模型,然后执行步骤将外部知识库文档切块为文档集合。接着从文档创建索引,基于索引定义查询引擎,并使用用户提示查询查询引擎。
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core import VectorStoreIndex
Settings.llm = OpenAI(model="gpt-3.5-turbo")
Settings.embed_model="BAAI/bge-small-en-v1.5"
document = Document(text="\\n\\n".join([doc.text for doc in documents]))
index = VectorStoreIndex.from_documents([document])
query_engine = index.as_query_engine()
response = query_engine.query(
"Tell me about LLM customization strategies."
)
上述示例展示了一个简单的RAG系统。基于此,改进后的高级RAG引入了预检索和后检索策略,以减少检索和生成过程之间的协同作用有限等问题。例如,重新排序技术使用能够理解双向上下文的模型对检索到的信息进行重新排序,并与知识图谱集成,用于高级查询路由。更多技巧可以参考《
高阶RAG技巧:探索提升RAG系统性能的不同技巧
》。
LLM Agent是2024年的热门话题,并且可能在2025年继续成为生成AI领域的主要关注点。
推荐阅读:
《
如何构建与未来并肩的Agentic AI:从基础到高级应用的全景指南
》
《
从AI Agent到Agentic Workflow:技术焦点的转变与未来发展
》
《
2025如何学习Agent?谷歌重磅发布Agent白皮书
》
《
免费,中文!微软推出面向初学者的AI Agent课程啦
》
与RAG相比,Agent在创建查询路径和规划基于LLM的工作流方面表现更为出色,具有以下优势:
-
-
根据特定标准利用各种工具。这种工具使用能力使得Agent与基本的RAG系统不同,因为它赋予LLM独立选择工具的控制权。
-
-
可以通过Agent框架实现如CoT、ReAct这几种上下文学习技术,我们将详细讨论ReAct。ReAct代表Synergizing Reasoning and Acting in Language Models(在语言模型中协同推理与行动),由三个关键元素组成——
行动、思考
和
观察
。
这个框架由Google Research在普林斯顿大学提出,基于思维链(Chain of Thought)构建,将推理步骤与一个行动空间结合,使得工具使用和函数调用成为可能。此外,ReAct框架强调根据环境观察来确定下一个最佳行动。
以下是原始论文中的一个示例,展示了ReAct的内部工作过程,其中LLM生成第一个思考并通过调用“Search [Apple Remote]”函数进行行动,然后观察其第一次输出的反馈。第二个思考基于先前的观察,从而引导到不同的行动“Search [Front Row]”。这个过程会反复进行,直到达到目标。研究表明,ReAct通过与简单的Wikipedia API交互,克服了在链式推理中常见的幻觉和错误传播问题。此外,通过决策痕迹的实施,ReAct框架还增强了模型的可解释性、可信度和诊断能力。
下面使用llamaindex展示了一个基于ReAct的Agent实现。首先,它定义了两个函数(multiply和add)。其次,这两个函数被封装为FunctionTool,形成了Agent的行动空间,并根据其推理执行。
from llama_index.core.agent import ReActAgent
from llama_index.core.tools import FunctionTool
def multiply(a: float, b: float) -> float:
return a * b
multiply_tool = FunctionTool.from_defaults(fn=multiply)
def add(a: float, b: float) -> float:
return a + b
add_tool = FunctionTool.from_defaults(fn=add)
agent = ReActAgent.from_tools([multiply_tool, add_tool], llm=llm, verbose=True)
当结合自我反思或自我修正时,Agent工作流的优势更加显著。这是一个日益增长的领域,目前正在探索各种Agent架构。
推荐阅读:
《
亚马逊开源Multi-Agent Orchestrator:打造无缝智能对话体验
》
《
HuggingFace smolagents:仅1000行代码的轻量级Agent框架,赠书
》
《
传统 RAG vs. Agentic RAG:动态图示清晰解析
》
《
2025年这7种用于构建Agentic RAG系统的架构不可或缺
》
微调(Fine-tuning)是向LLM输入特定的领域和专业数据集,以修改模型,使其更好地与某一目标对齐的过程。它不同于提示工程和RAG,因为它允许更新LLM的权重和参数。完全微调指的是通过反向传播更新预训练LLM的所有权重,这需要大量的内存来存储所有权重和参数,并可能导致模型在其他任务上的能力显著下降(即灾难性遗忘)。
因此,
PEFT
(Parameter Efficient Fine Tuning,参数高效微调)被更广泛地应用,以减轻这些问题,同时节省模型训练的时间和成本。PEFT方法主要分为三类:
-
选择性微调(Selective)
:选择初始LLM参数的一个子集进行微调,相较于其他PEFT方法,这种方法在计算上可能更加密集。
-
重参数化(Reparameterization)
:通过训练低秩表示的权重来调整模型权重。例如,低秩适应(Lower Rank Adaptation,LoRA)就是这一类方法之一,通过用两个较小的矩阵表示权重更新,从而加速微调。
-
加性微调(Additive)
:向模型中添加额外的可训练层,包括适配器(adapters)和软提示(soft prompts)等技术。
微调过程与深度学习训练过程类似,需要以下输入:
以下是使用transformers Trainer实现微调的示例:
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
output_dir=output_dir,
learning_rate=1e-5,
eval_strategy="epoch"
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
compute_metrics=compute_metrics,
)
trainer.train()
微调有广泛的应用场景。例如,指令微调(instruction fine-tuning)通过在prompt-completion(提示-完成)对上进行训练,优化LLM进行对话和遵循指令的能力。另一个例子是领域适应(domain adaptation),这是一种无监督的微调方法,帮助LLM在特定的知识领域中专门化。
RLHF
(Reinforcement Learning from Human Feedback,人类反馈强化学习)
是一种强化学习技术,通过基于人类偏好的方式来微调LLM。RLHF的工作原理是通过人类反馈训练一个
奖励模型
,并将该模型用作奖励函数,通过PPO(Proximal Policy Optimization,近端策略优化)优化强化学习策略。这个过程需要两组训练数据:一组用于训练奖励模型的
偏好数据集
,和一组用于强化学习循环中的
提示数据集
。
让我们将其分解成几个步骤:
-
收集偏好数据集
,由人工标注员对模型生成的不同回答进行评分,标注哪些回答符合人类偏好。偏好数据集的一个示例格式为{input_text, candidate1, candidate2, human_preference}
,表示哪个候选答案更受偏好。
-
使用偏好数据集训练奖励模型
,该奖励模型本质上是一个回归模型,输出一个标量,表示模型生成回答的质量。奖励模型的目标是最大化优胜候选答案与失败候选答案之间的分数。
-
在强化学习循环中使用奖励模型对LLM进行微调
。目标是更新策略,使得LLM能够生成最大化奖励模型所产生奖励的回答。这个过程使用提示数据集,提示数据集的格式为{prompt, response, rewards}
。
开源库
Trlx
被广泛应用于实现RLHF,它提供了一个模板代码,展示了RLHF的基本设置:
from trl import PPOTrainer, PPOConfig, AutoModelForSeq2SeqLMWithValueHead
from trl import create_reference_model
from trl.core import LengthSampler
model = AutoModelForCausalLMWithValueHead.from_pretrained(config.model_name)
tokenizer = AutoTokenizer.from_pretrained(config.model_name)
config = PPOConfig(