当前位置:首页 > 人工智能 > 正文内容

从LLM出发——由浅入深探索AI开发的全流程

admin3周前 (06-27)人工智能88

适合人群:已掌握传统ML,想深入理解大模型原理 | 预计阅读时间:20分钟 | 含架构图解 + 代码实战

一、引言:为什么大模型能"理解"人类语言?

2022年底ChatGPT发布后,全球掀起了一股大模型热潮。但很多人使用大模型时,感受是"输入一句话,机器神奇地给出了回答"——这背后究竟是什么原理?

核心答案:大模型本质上是一个极度复杂的文本预测器。它的任务是:给定前面的文本(Prompt),预测下一个词(Token)是什么。

例如:

  • 输入:"今天天气真____"

  • 模型预测:"好"(概率60%)、"热"(25%)、"差"(10%)、其他(5%)

GPT-3有1750亿个参数,GPT-4据估计有1.8万亿个参数。这些参数就是模型从海量文本中"学习"到的知识。

本文目标

  1. 拆解Transformer架构(大模型的基石)

  2. 理解注意力机制(Transformer的核心创新)

  3. 掌握大模型开发全流程(预训练 → 微调 → 对齐)

  4. 用HuggingFace加载并运行开源模型

二、Transformer架构拆解

2.1 为什么需要Transformer?

RNN/LSTM时代(2010年代)的问题

  • 按顺序逐个处理单词,无法并行(训练慢)

  • 长距离依赖问题——处理长句子时,"记忆"会衰减

  • 例如:"我____年前在巴黎住过,那个城市真的很美"——"城市"指代"巴黎",但相隔太远,RNN容易遗忘

Transformer的革命性创新

  • 完全并行:一次性处理整个句子,不用按顺序

  • 自注意力(Self-Attention) :每个词可以直接"看到"句子中的任何其他词,距离不再是问题

2.2 Transformer整体架构(记住这张图)

text
                    ┌─────────────────┐
                    │   输出(概率)   │
                    └────────┬────────┘
                             │
                    ┌────────▼────────┐
                    │   Softmax层     │
                    └────────┬────────┘
                             │
                    ┌────────▼────────┐
          ┌─────────┤   线性层(FFN)  │─────────┐
          │         └────────┬────────┘         │
          │                  │                   │
          │    ┌─────────────▼─────────────┐    │
          │    │       残差连接 + 层归一化  │    │
          │    └─────────────┬─────────────┘    │
          │                  │                   │
          │    ┌─────────────▼─────────────┐    │
          │    │   多头自注意力(Multi-Head)│    │
          │    └─────────────┬─────────────┘    │
          │                  │                   │
          │    ┌─────────────▼─────────────┐    │
          └────┤     残差连接 + 层归一化    ├────┘
               └─────────────┬─────────────┘
                             │
               ┌─────────────▼─────────────┐
               │   位置编码(Positional)   │
               └─────────────┬─────────────┘
                             │
               ┌─────────────▼─────────────┐
               │   输入嵌入(Input Embed)  │
               └─────────────┬─────────────┘
                             │
               ┌─────────────▼─────────────┐
               │   输入("今天天气真好")   │
               └───────────────────────────┘

核心组件说明

组件作用类比
输入嵌入将单词转为向量(数字列表)把文字"翻译"成计算机能理解的数字
位置编码给每个词打上"位置标签",因为Transformer没有顺序概念给排队的人发号码牌
多头自注意力让每个词与其他所有词"交流",理解上下文开会时每个人都能听到所有人的发言
残差连接把输入和输出相加,防止网络退化复习时把新知识和旧知识结合
层归一化稳定训练过程,加速收敛把数据调整到统一的尺度
前馈网络(FFN)对每个词独立做非线性变换每个人听完发言后独立思考

2.3 自注意力机制(Self-Attention)——数学原理

输入:每个单词的向量表示(维度d_model,如768)

核心计算:每个单词都计算三个向量

  • Q(Query,查询) :"我关注什么?"

  • K(Key,键) :"我有什么特征?"

  • V(Value,值) :"我携带什么信息?"

Attention计算步骤(以"我"关注"天"为例):

  1. 计算"我"的Q与所有词的K的点积 → 得到"关注度分数"

  2. 除以√d_k(缩放,防止梯度消失)

  3. Softmax归一化 → 得到注意力权重(和为1的概率分布)

  4. 用权重对所有的V加权求和 → 得到"我"的新表示

公式

text
Attention(Q, K, V) = softmax(Q·K^T / √d_k) · V

直观理解

  • Q·K^T:衡量"我"与每个词的相关性

  • softmax:把相关性转为概率(和为1)

  • 乘以V:根据相关程度,从所有词中"汲取"信息

2.4 多头注意力(Multi-Head Attention)

为什么要用"多头"?

  • 单头注意力只关注一种"关系模式"

  • 多头(如8头、12头)可以同时关注多种关系

    • 头1:关注语法关系(主谓宾)

    • 头2:关注指代关系("它"指代什么)

    • 头3:关注情感色彩

    • 头4:关注数量关系

实现

python
# 伪代码多头输出 = concat(头1, 头2, ..., 头h) · W_O
其中每个头都是独立的 Attention(Q_i, K_i, V_i)

三、主流大模型对比

模型发布方参数量架构特点开源?适合场景
GPT-4OpenAI~1.8T纯解码器(Decoder-only)通用对话、推理
Claude 3.5Anthropic~数百B纯解码器长上下文、安全
LLaMA 3Meta8B/70B/405B纯解码器学术研究、二次开发
Qwen 2.5阿里0.5B-72B纯解码器中文场景、多语言
ChatGLM3智谱AI6B/32BGLM架构(双向)中文、对话
DeepSeek-V3深度求索671B (MoE)MoE混合专家低成本推理

架构趋势:目前绝大多数主流大模型都采用纯解码器(Decoder-only)架构,因为:

  1. 训练效率高(单向注意力,可并行)

  2. 自回归生成(一个一个词输出)符合对话场景

  3. 实验表明Decoder-only在同等规模下效果最好

四、大模型开发全流程

text
┌─────────────────────────────────────────────────────────────────┐
│                    阶段1:预训练(Pre-training)                 │
│  数据:TB级互联网文本(书籍、网页、论文、代码)                  │
│  成本:数百万美元(GPU集群运行数周)                            │
│  产出:基座模型(Base Model,如LLaMA-3-8B)                    │
│  特点:懂世界知识,但不懂"对话"                                │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                    阶段2:监督微调(SFT)                       │
│  数据:数万条人工标注的对话数据(Question + Answer)            │
│  成本:数千美元                                                │
│  产出:对话模型(Chat Model,如LLaMA-3-8B-Instruct)           │
│  特点:学会"回答问题"的格式和风格                              │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                    阶段3:强化学习对齐(RLHF)                  │
│  数据:人类偏好数据(多选:A回答好还是B回答好?)              │
│  成本:数万美元                                                │
│  产出:对齐模型(如ChatGPT、Claude)                           │
│  特点:更安全、更有用、更符合人类价值观                        │
└─────────────────────────────────────────────────────────────────┘

4.1 预训练详解

预训练的核心任务:预测下一个词(Next Token Prediction)

训练数据格式:

text
输入:"今天天气真好,我打算出去____"
标签:"走"、"逛"、"玩"等(真实的下一个词)

训练规模

  • LLaMA 3-8B:在15万亿个Token上训练

  • 1个Token ≈ 0.75个英文单词 ≈ 0.5个中文字

  • 15万亿Token ≈ 750万本《三体》的体量

硬件需求

  • 成千上万张A100/H100 GPU

  • 训练成本:数千万美元

结论:预训练是巨头的游戏,个人开发者不需要做。我们要做的是站在巨人肩膀上——使用开源预训练模型。

4.2 微调(Fine-tuning)——个人开发者能做的事

微调就是在预训练模型的基础上,用少量数据"调整"模型,让它适应特定任务。

LoRA(Low-Rank Adaptation)——最流行的微调方法:

  • 核心思想:不修改原始模型参数,而是"外挂"一个小矩阵(Adapters)

  • 参数量:只需训练原始模型参数的0.1%-1%

  • 效果:媲美全量微调

  • 硬件:消费级GPU(如RTX 4090,24GB显存)即可微调7B模型

python
# 使用LoRA微调的伪代码from peft import LoraConfig, get_peft_model

lora_config = LoraConfig(
    r=8,                # 秩(低维矩阵维度)
    lora_alpha=16,      # 缩放系数
    target_modules=["q_proj", "v_proj"],  # 作用在Q和V投影矩阵上
    lora_dropout=0.05,
    task_type="CAUSAL_LM")model = get_peft_model(base_model, lora_config)# 然后正常训练——但只更新LoRA参数,原始模型冻结

4.3 RLHF(人类反馈强化学习)

RLHF是让大模型"更听话"的关键步骤。

三步走

  1. 训练奖励模型(Reward Model) :给同一问题的多个答案打分(人类标注好的,好回答得高分,差回答得低分)

  2. 用PPO算法微调:让模型生成"能拿到高分的回答"

  3. 迭代:重复以上步骤,模型越来越符合人类偏好

效果

  • Base Model:知识丰富但可能输出杂乱、不安全内容

  • SFT Model:学会了对话格式,但可能"讨好"用户(比如用户问"如何制作炸弹",模型会乖乖回答)

  • RLHF Model:学会了"拒绝"不安全问题,并且回答更有条理

五、实战:用HuggingFace加载开源大模型

5.1 环境准备

bash
# 安装依赖(建议用Python 3.10+)pip install transformers datasets accelerate torch
pip install bitsandbytes  # 量化(节省显存)

5.2 加载并运行Qwen2.5-7B-Instruct(中文最强开源模型之一)

python
import torchfrom transformers import AutoTokenizer, AutoModelForCausalLM# 模型名称(从HuggingFace下载)model_name = "Qwen/Qwen2.5-7B-Instruct"# 加载分词器tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)# 加载模型(使用4-bit量化,只需约6GB显存)model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,
    device_map="auto",          # 自动分配到GPU
    trust_remote_code=True,
    load_in_4bit=True,          # 4-bit量化
    bnb_4bit_compute_dtype=torch.float16)# 对话函数def chat_with_qwen(prompt, max_new_tokens=512):
    messages = [
        {"role": "system", "content": "你是一个乐于助人的AI助手。"},
        {"role": "user", "content": prompt}
    ]
    
    # 应用聊天模板
    text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )
    
    # 编码输入
    inputs = tokenizer(text, return_tensors="pt").to(model.device)
    
    # 生成回答
    with torch.no_grad():
        outputs = model.generate(
            **inputs,
            max_new_tokens=max_new_tokens,
            temperature=0.7,      # 随机性(0.0=确定性,1.0=更随机)
            do_sample=True,
            top_p=0.9             # 核采样
        )
    
    # 解码输出(只取新增的部分)
    response = tokenizer.decode(
        outputs[0][inputs.input_ids.shape[1]:], 
        skip_special_tokens=True
    )
    return response# 测试print(chat_with_qwen("请用三句话解释什么是人工智能。"))

输出示例

text
人工智能(AI)是计算机科学的一个分支,致力于创建能够执行通常需要人类智能的系统。它通过算法和模型让机器从数据中学习模式,从而完成识别、推理、决策等任务。当前AI已广泛应用于语音助手、图像识别、自动驾驶等领域。

5.3 批量推理与性能优化

python
import time# 对比不同批次大小的生成速度def benchmark_generation(prompts, batch_size=1):
    start = time.time()
    results = []
    
    for i in range(0, len(prompts), batch_size):
        batch = prompts[i:i+batch_size]
        batch_texts = []
        for p in batch:
            messages = [{"role": "user", "content": p}]
            text = tokenizer.apply_chat_template(
                messages, tokenize=False, add_generation_prompt=True
            )
            batch_texts.append(text)
        
        inputs = tokenizer(batch_texts, return_tensors="pt", padding=True).to(model.device)
        outputs = model.generate(**inputs, max_new_tokens=100, temperature=0.7)
        responses = tokenizer.batch_decode(outputs, skip_special_tokens=True)
        results.extend(responses)
    
    elapsed = time.time() - start    print(f"处理 {len(prompts)} 条,耗时 {elapsed:.2f}秒,速度 {len(prompts)/elapsed:.2f} 条/秒")
    return results

prompts = ["什么是深度学习?", "如何学习Python?", "推荐一本编程书。"]benchmark_generation(prompts, batch_size=3)

5.4 加载其他开源模型(统一接口)

python
# LLaMA 3 8Bmodel_name_llama = "meta-llama/Meta-Llama-3-8B-Instruct"# ChatGLM3 6Bmodel_name_glm = "THUDM/chatglm3-6b"# DeepSeek V3(需要较大显存)model_name_deepseek = "deepseek-ai/DeepSeek-V3"# 用法完全一致,只需替换model_name即可# 注意:LLaMA需要申请访问权限(HuggingFace上申请)

六、推理优化技术

技术原理效果适用场景
量化(Quantization)将FP16/FP32权重转为INT8/INT4显存减少75%,速度提升2-3倍所有场景,推荐4-bit
KV Cache缓存已生成Token的K和V向量,避免重复计算生成速度提升5-10倍自回归生成(对话)
Flash Attention优化Attention计算的内存访问模式速度提升2-4倍,显存大幅降低长序列场景
批处理(Batching)同时处理多条输入吞吐量提升3-5倍离线批量推理

七、RAG(检索增强生成)——大模型"联网"方案

大模型的"幻觉"问题(一本正经地胡说八道)是落地应用的最大障碍。RAG是当前最有效的解决方案。

7.1 RAG工作流程

text
用户问题 → 向量检索 → 从知识库中检索相关文档 → 将文档+问题一起给LLM → 生成基于事实的回答

7.2 RAG实战(简易版)

python
from sentence_transformers import SentenceTransformerimport chromadbfrom chromadb.utils import embedding_functions# 1. 准备知识库(公司文档、个人笔记等)documents = [
    "人工智能是计算机科学的分支,研究如何让机器具备智能。",
    "机器学习是AI的子集,让机器从数据中学习。",
    "深度学习使用多层神经网络进行学习。",
    # ... 实际应用中可能有数千到数百万条文档]# 2. 构建向量数据库client = chromadb.PersistentClient(path="./chroma_db")collection = client.get_or_create_collection(
    name="knowledge_base",
    embedding_function=embedding_functions.SentenceTransformerEmbeddingFunction(
        model_name="all-MiniLM-L6-v2"
    ))# 3. 添加文档到向量库collection.add(
    documents=documents,
    ids=[f"doc_{i}" for i in range(len(documents))])# 4. 检索 + 生成def rag_query(query):
    # 检索最相关的3条文档
    results = collection.query(query_texts=[query], n_results=3)
    retrieved_docs = results['documents'][0]
    
    # 构建提示词
    context = "\n".join(retrieved_docs)
    prompt = f"""基于以下信息回答问题。如果信息不足,请说"不知道"。
    【参考信息】{context}【问题】{query}【回答】"""    
    return chat_with_qwen(prompt)# 测试print(rag_query("深度学习和机器学习是什么关系?"))

输出

text
深度学习是机器学习的一个子集。机器学习让机器从数据中学习,而深度学习使用多层神经网络进行学习,是机器学习中处理复杂数据(如图像、语音)的主要方法。

八、避坑指南

常见问题解决方案
"我的模型回答全是乱码"检查tokenizer是否与模型匹配,确保使用正确的apply_chat_template
"GPU显存不足(OOM)"使用4-bit量化(load_in_4bit=True),或减小max_new_tokens
"生成速度太慢"开启KV Cache(transformers默认开启),使用vLLM加速库
"模型拒绝回答简单问题"检查系统提示词(System Prompt),不要设置过于严格的限制
"回答与事实不符(幻觉)"使用RAG检索外部知识库,或使用更可靠的模型(如GPT-4)

九、思考题

  1. 自注意力机制的Q、K、V分别代表什么?如果Q=K=V,会出现什么情况?

  2. 为什么说"预训练是巨头的游戏,微调才是个人开发者的战场"?

  3. 如果让你用LoRA微调一个7B模型用于"法律咨询"场景,你认为需要准备什么样的训练数据?数据量大概需要多少?

下期预告:第4篇我们将告别理论,全部实战——5个即学即用的AIGC办公场景项目,包括AI邮件助手、会议纪要、Excel数据分析、RAG知识库和PPT生成。让你的AI能力立刻转化为生产力!


发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。