理解大模型工作原理

引言:当计算机学会了"说话"

想象一下,你正在和一个"人"对话,他能理解你的问题,能写出优美的诗句,能解释复杂的科学概念,甚至能帮你写代码。但这个"人"其实是一个运行在服务器上的软件程序。它如何做到的?

这就是大语言模型(Large Language Model, LLM)创造的奇迹。在本文中,我将用一个PHP开发者的视角,带你深入理解这个"数字大脑"的工作原理。

一、大模型是什么?

1.1 从一个形象的比喻开始

传统程序 vs 大模型

对比维度传统程序大语言模型
工作方式按照程序员写的代码执行根据海量数据"学习"出的规律工作
知识来源程序员明确告诉它从数万亿文本中自己"领悟"
灵活性只能处理预设的场景能应对从未见过的问题
类比按照菜谱做菜的厨师尝过百万道菜后自己创造新菜的大厨

1.2 从数字到智能:三个关键洞察

洞察一:词语可以用数字表示

就像我们可以用经纬度表示地球上的任何位置,我们也可以用一组数字(向量)表示一个词的含义:

"国王" = [0.8, 0.3, -0.2, 0.5, ...]
"王后" = [0.7, 0.4, -0.1, 0.6, ...]
"苹果" = [0.1, 0.9, -0.8, -0.3, ...]

洞察二:词语之间的关系可以用数学计算

经典的"国王 - 男人 + 女人 = 王后"实验表明,这些数字向量之间可以进行数学运算,而且结果符合语义!

洞察三:上下文决定含义

“苹果"在"苹果很好吃"和"苹果发布了新手机"中含义不同。大模型需要理解这种差异。

二、大模型的核心架构

2.1 从神经元到神经网络

单个神经元(生物类比):

树突(接收信号) → 细胞体(处理信号) → 轴突(输出信号)

人工神经元(数学抽象):

输入 × 权重 + 偏置 → 激活函数 → 输出

2.2 神经网络层级

一个完整的神经网络由多个层级组成:

输入层(接收原始数据)
[隐藏层1] ← 参数:权重、偏置
[隐藏层2] ← 参数:权重、偏置
[隐藏层3] ← 参数:权重、偏置
输出层(产生最终结果)

大模型的规模:

  • 层数:数十到数百层

  • 神经元数:每层数千到数万个

  • 参数总量:数十亿到数千亿

2.3 Transformer:大模型的革命性架构

2017年,Google提出的Transformer架构彻底改变了AI领域。它的核心创新是自注意力机制

自注意力机制的直观理解

当模型读到"那只动物没过马路,因为它太累了"这句话时,需要理解"它"指的是"动物"还是"马路”。

自注意力机制会让模型"关注"到:

  • “它” 与 “动物” 的关联强度:0.95

  • “它” 与 “马路” 的关联强度:0.15

  • “它” 与 “没过” 的关联强度:0.30

这样模型就知道"它"指的是"动物"。

注意力计算的核心公式(简化版):

Attention(Q, K, V) = softmax(Q × K^T) × V

其中:

  • Q (Query):当前词作为"提问者"

  • K (Key):其他词作为"被查询对象"

  • V (Value):实际要提取的信息

2.4 大模型的两阶段生命

第一阶段:预训练(学习通用知识)

过程

  1. 收集海量互联网文本(数万亿 tokens)

  2. 随机遮盖部分词语,让模型预测

  3. 对比预测结果和真实结果,调整参数

  4. 重复数万亿次,直到模型学会语言规律

预训练的成果

  • 语言理解能力

  • 世界知识

  • 逻辑推理能力

  • 代码理解能力

第二阶段:对齐(学会与人类对话)

预训练后的模型虽然知识丰富,但不会"好好说话"。它可能会:

  • 回答不礼貌

  • 产生有害内容

  • 不理解用户意图

RLHF(基于人类反馈的强化学习) 解决这个问题:

步骤1:收集人类偏好数据
问题:"如何杀死一个进程?"
回答A:"在Linux中使用kill命令"
回答B:"你想杀死哪个进程?告诉我PID"
人类更喜欢回答B(更安全、更有帮助)

步骤2:训练奖励模型
让模型学会判断"什么样的回答是人类喜欢的"

步骤3:强化学习优化
用奖励模型指导大模型调整行为

三、大模型如何"思考"

3.1 推理过程:一步步生成

大模型生成回答时,是一个词一个词逐步产生的:

<?php

class LLMInference
{
    protected $model;
    
    public function generate($prompt, $maxTokens = 100)
    {
        $output = $prompt;
        $context = $prompt;
        
        for ($i = 0; $i < $maxTokens; $i++) {
            // 1. 基于当前上下文,预测下一个词的概率分布
            $nextTokenProbs = $this->model->predictNextToken($context);
            
            // 2. 从概率分布中采样选择下一个词
            $nextToken = $this->sampleFromDistribution($nextTokenProbs);
            
            // 3. 检查是否应该停止
            if ($nextToken === '<END>') {
                break;
            }
            
            // 4. 将新词加入上下文
            $context .= $nextToken;
            $output .= $nextToken;
        }
        
        return $output;
    }
    
    protected function sampleFromDistribution($probs)
    {
        // 温度参数控制随机性
        // 温度低 → 选概率最高的词(确定性)
        // 温度高 → 更多样化的选择(创造性)
        $temperature = 0.8;
        
        // 应用温度
        $scaled = array_map(function($p) use ($temperature) {
            return pow($p, 1 / $temperature);
        }, $probs);
        
        // 归一化
        $sum = array_sum($scaled);
        $normalized = array_map(function($p) use ($sum) {
            return $p / $sum;
        }, $scaled);
        
        // 根据概率采样
        return $this->weightedRandom($normalized);
    }
}

3.2 上下文窗口:模型的"工作记忆"

大模型有一个重要限制:上下文窗口。它决定了模型一次能"记住"多少信息。

模型上下文窗口约合汉字
GPT-3.54K tokens3000字
GPT-48K/32K/128K6000-10万字
Claude100K/200K7.5-15万字
Gemini1M75万字

为什么有这个限制

  • 计算复杂度:注意力机制是 O(n²) 复杂度

  • 内存消耗:长上下文需要巨大显存

  • 注意力分散:太长反而效果下降

3.3 涌现能力:规模带来的质变

当模型规模超过某个阈值时,会突然出现小模型不具备的能力:

能力小模型(1亿参数)大模型(1000亿参数)
语言理解基础深入
逻辑推理
代码生成简单模板复杂算法
数学解题加减法微积分
创意写作不通顺有文采

这就像:几粒沙子还是沙子,但堆积成沙丘后,出现了"沙丘"的特性。

四、大模型的局限性

4.1 幻觉问题

模型可能会"自信地胡说八道":

// 问:2024年奥运会中国拿了多少金牌?
// 模型可能回答(如果知识截止到2023年):
"2024年巴黎奥运会中国代表团表现出色,共获得38枚金牌..."

// 但实际上2024奥运会还没举行!

原因

  • 模型只是在"续写"最可能的文本

  • 无法区分"知道"和"不知道"

  • 没有"事实检查"机制

解决方案

  • RAG(检索增强生成)

  • 提示词要求"不知道时说不知道"

  • 结果验证

4.2 知识截止日期

模型的知识停留在训练数据的截止时间:

应对方法

  • RAG注入最新知识

  • 联网搜索插件

  • 定期更新模型

4.3 计算资源消耗

运行大模型需要惊人的计算资源:

模型规模参数数量推理所需显存训练成本
小模型70亿14GB$10万
中等模型130亿26GB$100万
大模型700亿140GB$1000万
超大模型1750亿350GB$1亿+

五、该怎么用?

5.1 使用原则

  1. 把模型当实习生,不是百科全书

    • 需要监督和指导

    • 需要明确的任务说明

    • 需要检查输出质量

  2. 提示词就是代码

    // 不好的提示词
    "写一个用户注册函数"
    
    // 好的提示词(像代码一样清晰)
    "用PHP写一个用户注册函数,要求:
    1. 使用Laravel框架
    2. 包含邮箱唯一性验证
    3. 密码需要加密存储
    4. 注册成功后发送欢迎邮件
    5. 返回JSON格式的响应"
    
  3. 始终验证输出, 不要直接信任

5.2 成本意识

每次API调用都在花钱

优化策略

  • 缓存常见问题

  • 使用更小的模型处理简单任务

  • 精简提示词

  • 批量处理

5.3 实际集成简单示例

<?php

namespace App\Services;

use Illuminate\Support\Facades\Cache;
use OpenAI;

class LLMService
{
    protected $client;
    
    public function __construct()
    {
        $this->client = OpenAI::client(config('services.openai.key'));
    }
    
    public function ask($question, $context = [])
    {
        // 1. 检查缓存
        $cacheKey = 'llm_' . md5($question . json_encode($context));
        if (Cache::has($cacheKey)) {
            return Cache::get($cacheKey);
        }
        
        // 2. 构建提示词
        $prompt = $this->buildPrompt($question, $context);
        
        // 3. 调用模型
        $response = $this->client->chat()->create([
            'model' => 'gpt-3.5-turbo',
            'messages' => [
                ['role' => 'system', 'content' => '你是一个专业的PHP开发助手'],
                ['role' => 'user', 'content' => $prompt]
            ],
            'temperature' => 0.7,
            'max_tokens' => 500
        ]);
        
        $answer = $response->choices[0]->message->content;
        
        // 4. 缓存结果(1小时)
        Cache::put($cacheKey, $answer, 3600);
        
        // 5. 记录使用情况(用于成本分析)
        $this->logUsage($response->usage);
        
        return $answer;
    }
    
    protected function buildPrompt($question, $context)
    {
        $prompt = "问题:$question\n\n";
        
        if (!empty($context)) {
            $prompt .= "参考信息:\n" . json_encode($context, JSON_UNESCAPED_UNICODE) . "\n\n";
        }
        
        $prompt .= "请给出专业、准确的回答:";
        
        return $prompt;
    }
}

其他

大语言模型不是魔法,而是一套精妙的数学系统。理解它的工作原理,能让你:

  • 更好地使用:知道它的能力和边界

  • 更好地集成:设计合理的架构

  • 更好地优化:控制成本,提升效果

  • 更好地创新:基于理解创造新应用