到底什么是大模型

39 阅读4分钟

摘要

随着人工智能技术的快速发展,"大模型"已成为科技领域最热门的话题之一。本文将从概念拆解入手,深入解析大语言模型(LLM)的核心含义,探讨大模型的训练原理,介绍主流的本地运行平台,并通过实际代码示例帮助你快速上手。大模型(LLM)是 Large Language Model 的缩写,即大语言模型,是一种基于深度学习的自然语言处理模型,通过海量文本数据进行训练,能够理解和生成人类语言。本文适合对AI感兴趣但不知如何入门的读者。


1. 概念拆解:从名字读懂大模型

1.1 大语言模型的定义

大模型,英文简称 LLM(Large Language Model),更准确的称呼是大语言模型。它是一种基于深度学习技术的人工智能模型,专门针对自然语言进行建模和处理。

大语言模型的核心特点是:

特征说明
大规模拥有数十亿甚至数千亿个参数
语言导向专注于理解和生成人类语言
预训练通过海量文本数据学习语言模式
通用能力可适配多种下游任务

1.2 拆解"大"、"语言"、"模型"

"大"——规模的体现

这里的"大"主要体现在三个维度:

参数规模    →  从亿级到万亿级参数
训练数据    →  数万亿token的文本
计算资源    →  需要大量GPU进行训练

例如:

  • GPT-3:1750亿参数
  • GPT-4:据传参数规模达万亿级
  • LLaMA 2:700亿参数
  • Qwen(通义千问):千亿级参数

"语言"——核心能力

大语言模型专注于处理语言任务:

  • 文本理解:阅读、抽取、分类
  • 文本生成:写作、翻译、摘要
  • 对话交互:问答、聊天、辅导
  • 代码能力:编写、解释、调试

"模型"——技术的载体

"模型"指的是深度神经网络,通常采用 Transformer 架构:

输入层 → 注意力机制 → 前馈网络 → 输出层
  ↓         ↓           ↓          ↓
 嵌入     多头自注意   全连接    概率分布

2. 大模型是如何训练出来的

2.1 训练流程概述

大模型的训练可以分为四个主要阶段:

graph LR
    A[数据收集] --> B[预训练]
    B --> C[指令微调]
    C --> D[RLHF对齐]
    D --> E[部署应用]

2.2 阶段一:数据准备

数据收集

训练数据的来源包括:

数据类型来源占比
网页数据Common Crawl、CC-News~60%
书籍语料Gutenberg、OpenBook~15%
代码数据GitHub、Stack Exchange~15%
问答数据Wikipedia、问答社区~10%

数据清洗

清洗步骤:

  1. 去除HTML标签和噪声
  2. 去重(精确去重+模糊去重)
  3. 过滤低质量内容
  4. 安全过滤(有害内容)
  5. 分词和token化

2.3 阶段二:预训练(Pre-training)

预训练是整个训练过程中最耗时的阶段,模型通过下一个词预测任务学习语言知识:

# 预训练的核心任务:预测下一个词
def next_token_prediction(text, model):
    """
    输入: "今天天气"
    目标: 预测下一个最可能的词
    输出: "很好" / "不错" / ...
    """
    tokens = tokenize(text)
    logits = model(tokens)
    next_token = argmax(logits)
    return decode(next_token)

预训练的特点:

  • 无监督学习:不需要人工标注
  • 自回归生成:逐词预测
  • 涌现能力:规模达到一定阈值后出现

2.4 阶段三:指令微调(SFT)

通过有监督的指令数据微调模型:

# 指令微调数据示例
examples:
  - instruction: "用一句话解释什么是大模型"
    response: "大模型是通过海量文本数据训练...

  - instruction: "写一首关于春天的诗"
    response: "春风拂面,万物复苏..."

2.5 阶段四:RLHF对齐

使用人类反馈强化学习(RLHF)使模型输出更符合人类价值观:

Step 1: 训练奖励模型
         ↓
    人类对多个回答排序
         ↓
    学习人类偏好函数
         ↓
Step 2: PPO优化
         ↓
    生成回答 → 奖励评分 → 策略更新

3. 运行本地模型的平台

3.1 主流平台对比

平台特点适用场景系统支持
Ollama简单易用,命令行交互快速体验Linux/macOS/Win
LM Studio图形界面,模型管理本地开发macOS/Win
vLLM高性能推理,API服务生产部署Linux
llama.cpp纯C++实现,低资源边缘设备全平台
Text Generation WebUIWeb界面,功能丰富实验研究全平台

3.2 Ollama 安装与使用

安装步骤

# macOS
brew install ollama

# Linux
curl -fsSL https://ollama.ai/install.sh | sh

# Windows
# 下载安装包: https://ollama.ai/download

常用命令

# 列出可用模型
ollama list

# 拉取模型
ollama pull llama3.2
ollama pull qwen2.5:7b

# 运行模型
ollama run llama3.2

# 删除模型
ollama rm llama3.2

3.3 LM Studio

LM Studio 提供图形化界面,适合不习惯命令行的用户:

  • 可视化模型浏览和下载
  • 内置聊天界面
  • 支持 OpenAI 兼容的 API
  • 参数配置可视化

3.4 vLLM

vLLM 专注于高性能推理,适合生产环境:

from vllm import LLM, SamplingParams

# 加载模型
llm = LLM(model="meta-llama/Llama-2-7b-chat-hf")

# 生成文本
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
outputs = llm.generate(["介绍一下大模型"], sampling_params)

print(outputs[0].outputs[0].text)

4. 本地运行的示例

4.1 使用 Ollama API 调用本地模型

"""
使用 Ollama API 调用本地大模型
依赖: pip install requests
"""

import requests
import json


class OllamaClient:
    """Ollama 本地模型调用客户端"""

    def __init__(self, base_url="http://localhost:11434", model="llama3.2"):
        self.base_url = base_url
        self.model = model

    def chat(self, message, system_prompt=None):
        """发送对话请求"""
        payload = {
            "model": self.model,
            "messages": [],
            "stream": False
        }

        if system_prompt:
            payload["messages"].append({
                "role": "system",
                "content": system_prompt
            })

        payload["messages"].append({
            "role": "user",
            "content": message
        })

        response = requests.post(
            f"{self.base_url}/api/chat",
            json=payload
        )

        return response.json()

    def generate(self, prompt):
        """生成文本"""
        payload = {
            "model": self.model,
            "prompt": prompt,
            "stream": False
        }

        response = requests.post(
            f"{self.base_url}/api/generate",
            json=payload
        )

        return response.json()


# 使用示例
if __name__ == "__main__":
    client = OllamaClient(model="qwen2.5:7b")

    # 简单问答
    response = client.chat("用一句话解释什么是大模型")
    print("回答:", response["message"]["content"])

    # 带系统提示词
    response = client.chat(
        "用 Python 写一个快速排序",
        system_prompt="你是一个专业的程序员,回答要简洁准确"
    )
    print("回答:", response["message"]["content"])

4.2 使用 Transformers 本地加载模型

"""
使用 Hugging Face Transformers 在本地运行大模型
依赖: pip install torch transformers accelerate
"""

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch


class LocalLLM:
    """本地大模型加载器"""

    def __init__(self, model_path):
        """
        Args:
            model_path: 模型路径或HuggingFace模型ID
        """
        print(f"正在加载模型: {model_path}")

        # 加载tokenizer
        self.tokenizer = AutoTokenizer.from_pretrained(
            model_path,
            trust_remote_code=True
        )

        # 加载模型(使用量化减少显存)
        self.model = AutoModelForCausalLM.from_pretrained(
            model_path,
            torch_dtype=torch.float16,
            device_map="auto",
            trust_remote_code=True
        )

        print("模型加载完成!")

    def chat(self, message, max_tokens=512):
        """对话生成"""
        # 构造输入
        inputs = self.tokenizer.encode(
            f"User: {message}\nAssistant: ",
            return_tensors="pt"
        ).to(self.model.device)

        # 生成
        with torch.no_grad():
            outputs = self.model.generate(
                inputs,
                max_new_tokens=max_tokens,
                temperature=0.7,
                top_p=0.9,
                do_sample=True
            )

        # 解码
        response = self.tokenizer.decode(
            outputs[0][inputs.shape[1]:],
            skip_special_tokens=True
        )

        return response


# 使用示例
if __name__ == "__main__":
    # 使用通义千问
    llm = LocalLLM("Qwen/Qwen2.5-7B-Instruct")

    response = llm.chat("什么是大模型?")
    print("回答:", response)

4.3 使用 LangChain 调用本地模型

"""
使用 LangChain 集成 Ollama
依赖: pip install langchain-ollama
"""

from langchain_ollama import ChatOllama
from langchain_core.messages import HumanMessage, SystemMessage


def basic_chat():
    """基础对话"""
    llm = ChatOllama(
        model="llama3.2",
        temperature=0.7
    )

    response = llm.invoke([HumanMessage(content="什么是大模型?")])
    print("回答:", response.content)


def structured_output():
    """结构化输出"""
    from langchain.output_parsers import JsonOutputParser
    from pydantic import BaseModel, Field

    class Answer(BaseModel):
        definition: str = Field(description="大模型的定义")
        parameters: str = Field(description="典型参数规模")
        examples: list = Field(description="代表性模型")

    llm = ChatOllama(model="qwen2.5:7b")
    llm_with_parser = llm.with_structured_output(Answer)

    result = llm_with_parser.invoke(
        "介绍大语言模型,包含定义、参数规模和例子"
    )

    print(f"定义: {result.definition}")
    print(f"参数规模: {result.parameters}")
    print(f"例子: {result.examples}")


def rag_pipeline():
    """RAG检索增强生成示例"""
    from langchain_community.document_loaders import TextLoader
    from langchain_ollama import OllamaEmbeddings
    from langchain_text_splitters import RecursiveCharacterTextSplitter
    from langchain_community.vectorstores import FAISS
    from langchain_core.prompts import ChatPromptTemplate
    from langchain_core.runnables import RunnablePassthrough
    from langchain_core.output_parsers import StrOutputParser

    # 1. 加载文档
    loader = TextLoader("knowledge.txt")
    documents = loader.load()

    # 2. 文档切分
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=500,
        chunk_overlap=50
    )
    chunks = text_splitter.split_documents(documents)

    # 3. 向量化
    embeddings = OllamaEmbeddings(model="nomic-embed-text")
    vectorstore = FAISS.from_documents(chunks, embeddings)

    # 4. 检索器
    retriever = vectorstore.as_retriever()

    # 5. 提示词
    template = """基于以下上下文回答问题:

    上下文:{context}

    问题:{question}
    """

    prompt = ChatPromptTemplate.from_template(template)

    # 6. 构建链
    chain = (
        {"context": retriever, "question": RunnablePassthrough()}
        | prompt
        | llm
        | StrOutputParser()
    )

    # 7. 执行
    response = chain.invoke("大模型是如何训练的?")
    print("RAG回答:", response)


if __name__ == "__main__":
    basic_chat()

5. 总结

核心要点回顾

概念关键点
大语言模型基于Transformer的大规模预训练模型
训练流程数据准备 → 预训练 → 指令微调 → RLHF
本地运行Ollama、LM Studio、vLLM、llama.cpp
开发实践Transformers、LangChain、Ollama API

进阶学习方向

1. 深入原理
   └── Transformer架构、注意力机制源码

2. 提示工程
   └── Few-shot、CoT推理、提示优化

3. 垂直领域应用
   └── RAG、知识库、Agent开发

4. 模型优化
   └── 量化、剪枝、蒸馏

参考资料

主要参考资料包括: