好久没动过博客了,最近正好在看ai安全,就以此着手讲讲现在最流行的LLM模型吧
线下最火的deepseek,chatGPT,通义千问等所有大模型都有个统称,叫做LLM(Large Language Model, LLM)。都是基于transformer架构通过配置不同策略和算法以及关键的prompt实现不同效果的语言模型的。为什么叫large,是模型调用学习了很多参数,比如GPT-4o就存储了2000亿的参数,这也是为什么现在主流模型需要很高显存才能顺利运行的原因。
如果有一定的模型经验的师傅应该清楚,自己训练出来的模型是不会拥有人性化回复的功能的,这个就是prompt(提示词)的作用了,通过合理优秀的prompt使模型更全面丰富的回答各种问题,并通过正向激励机制将模型引向更合理的结果。而最近很火的长思考deepseek,主要利用的就是LLM的第二个重要机制:CoT。模型会根据用户输入的内容自动扩容补充提示词,最后利用这些提示词来生成对应的输出。
本质上AI诞生的基础就是网络上浩如烟海的数据和知识库。但是电脑或者说模型是理解不了这些数据的,所以对于这些文本、音频、视频等五花八门的数据集,我们需要在过滤分词后将其统一转为token形式,然后才会导入模型中以便后续的升维或者降维操作。
在数据处理成模型能理解的向量之后,就可以进行模型训练了。目前主流的模型有自回归语言模型,也叫解码器-only模型:仅关注上文对下文的影响来进行下一个单词的预测,典型的就是GPT;还有掩码模型也叫编码器-only模型:通过掩码机制和双向自注意力机制使模型同时关注上下文对单词进行预测输出,适用于分类分级任务,典型的就是BERT;还有些特殊模型如T5,侧重某一个领域如文本翻译任务的模型。
需要关注的是,预训练的过程中,因为导入的数据是未经过区分且是在固定日期之前的,所以所有模型都存在一个知识日期截止时间,在这个时间之后的数据模型是无法获取的,这方面的问题也是模型最容易出现幻觉的地方。
在预训练之后,模型也只是一个存储了大量参数和资源的死板知识库,不会用人类能理解的语言将知识复述出来,这时就需要微调策略对其进行进一步的训练了。最开始的微调是全参数微调,下面是pytorch实现的最基础样例:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
# 1. 加载预训练模型与分词器
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer.pad_token = tokenizer.eos_token # 设置填充符
# 2. 数据准备(示例为文本生成任务)
train_texts = ["<指令>写一首关于春天的诗指令><内容>...", ...]
train_encodings = tokenizer(train_texts, truncation=True, padding="max_length", max_length=512)
class CustomDataset(torch.utils.data.Dataset):
def __init__(self, encodings):
self.encodings = encodings
def __getitem__(self, idx):
return {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
def __len__(self):
return len(self.encodings.input_ids)
train_dataset = CustomDataset(train_encodings)
# 3. 训练参数配置(关键参数说明)
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
per_device_train_batch_size=2, # 根据GPU显存调整
gradient_accumulation_steps=16, # 模拟更大batch size
learning_rate=1e-5,
weight_decay=0.01,
fp16=True, # 启用混合精度
deepspeed="./configs/zero3.json", # 使用DeepSpeed ZeRO-3优化
logging_dir="./logs",
report_to="tensorboard",
save_strategy="epoch",
)
# 4. 自定义损失函数(可选)
def compute_loss(model, inputs, return_outputs=False):
outputs = model(**inputs)
logits = outputs.logits
labels = inputs["input_ids"]
shift_logits = logits[..., :-1, :].contiguous()
shift_labels = labels[..., 1:].contiguous()
loss_fct = torch.nn.CrossEntropyLoss()
loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))
return (loss, outputs) if return_outputs else loss
# 5. 初始化Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
compute_loss=compute_loss,
)
# 6. 开始训练
trainer.train()
通过调整所有权重参数来让预训练大模型适应下游任务,这种是终极铁头娃娃做法,虽然是最有效的,但是需要的算力非常大。
还有一个叫做提示词微调,通过人工输入prompt让模型学会人类语言,通过反复模拟对话的场景赋予模型人类的“性格”,使其可以像人类一样聊天。
MoE(Mixture of Experts,混合专家模型) 是一种通过动态组合多个子模型(专家)提升神经网络性能的架构设计。其核心思想是将复杂任务分解,由不同专家分工处理,再通过门控网络(Gating Network)加权整合结果。每个专家专注特定数据模式,例如自然语言处理中可分别处理语法、语义或领域知识,门控网络则根据输入实时选择相关专家激活,实现“分而治之”。
核心优势:
高效扩展性:增加专家数量即可提升模型容量,计算量仅线性增长(传统模型呈平方增长)。
动态计算:针对不同输入激活不同专家,避免全参数计算,降低推理成本。
领域适配灵活:通过调整专家结构快速适配多任务,如Google的GShard实现万亿级参数扩展。
应用场景:
大语言模型:如传闻中的GPT-4采用MoE架构平衡性能与算力消耗。
多模态学习:为图像、文本分别设计专家,提升跨模态对齐效率。
边缘计算:轻量级专家部署于终端设备,动态调用减少能耗。
挑战与趋势:专家负载不均衡和训练稳定性仍是难点,当前研究聚焦稀疏门控、专家共享参数等技术。随着MoE与注意力机制、强化学习的深度融合,其或将成为下一代AI基础架构的核心组件。
在大量算力加持下,现在的LLM已经可以处理各种形态的数据了,可以将语音、图像、音视频等不同类型格式的数据相互转化输出,在某些付费的ChatGPT增值服务里面还有直接对应的语音交互而不是先转化为文字再输出。
在配置了RAG之前,模型的输出就相当于人类的“说话不过大脑”,直接在自身数据库中找到匹配度最高就直接输出了。因为我们需要给LLM加入RAG(检索增强生成),让模型在输出之前先关联一下知识库,确保输出无误之后在进行输出,有效降低了模型幻觉现象。同时也让知识截止日期不再那么清晰,因为这个知识库可以联网实时更新。
RAG最关键的作用在于可以让LLM通用模型快速学习到某个专业领域的专业知识并迅速给出合理的答案。例如要将LLM应用在法律方面,那么可以直接将知识库中的数据更新成法律方向的数据集就可以使LLM进化成法律专用大模型了。
RAG和微调的对比如下
对比维度 | RAG(检索增强生成) | 微调(Fine-Tuning) |
---|---|---|
核心原理 | 结合检索外部知识库与生成模型,动态补充上下文 | 通过调整模型参数使其适配特定任务 |
数据依赖 | 依赖外部知识库(非训练数据) | 需要大量标注训练数据 |
模型修改 | 不改变基础模型参数 | 修改全部或部分模型参数 |
实时性 | 支持实时更新知识库(无需重新训练) | 更新需重新训练模型 |
计算成本 | 推理时需检索+生成(单次成本较高) | 训练成本高,但推理成本低 |
可解释性 | 可追踪检索结果作为依据 | 黑箱生成,解释性较差 |
知识时效性 | 通过更新知识库获取最新信息 | 受限于训练数据的时间范围 |
适用场景 | 需要结合动态知识(如最新资讯/领域文档)的任务 | 需要深度适应特定领域模式的任务(如医疗诊断/法律文书) |
典型应用 | 问答系统、客服机器人 | 文本分类、命名实体识别 |
训练复杂度 | 无需训练(仅构建检索系统) | 需要完整训练流程(数据准备、超参调优等) |
硬件要求 | 中等(需同时运行检索模型+生成模型) | 高(全参数微调需多GPU) |
领域迁移能力 | 通过切换知识库快速适配新领域 | 需要重新训练才能适配新领域 |
处理未知信息 | 可通过检索库补充新知识 | 无法处理训练数据外的信息 |
安全控制 | 可通过检索库过滤危险内容 | 依赖模型自身的安全性训练 |
冷启动成本 | 低(无需标注数据即可搭建) | 高(需准备充足标注数据) |
开源工具示例 | LangChain + Chroma | HuggingFace Transformers + PEFT |
最初的prompt是在NLP领域提出的,为了提示模型对于分类特征的关注度,让模型更关注于哪一个特征。而引入到LLM当中,就是平时我们输入的内容就是prompt的一种,而模型针对我们的prompt给出的回答就叫做completion。
temperature就是模型参数的一种,可以理解为“红温程度”,temperature越低模型温度越低,冷静的模型会非常保守,非常可靠,是“保守派”;而temperature越高模型就会更激进,会选择更有创意的回答。
System Prompt类似于模型的cosplay。就是将模型设置为一个特定角色,加入特定背景使模型对某一方面的关注度更高。
本文大概说了LLM的产生、由来和当前发展趋势,LLM在可以预见的未来一定会成为热门的话题,本文中提到的所有策略方法也会迎来落幕的那天,希望看到这里的各位师傅可以以此创造出更优秀的算法方案。下一篇应该会讲讲知识蒸馏技术。