跳转至

大模型应用概述

2026-03-26 核验:本总览章只保留稳定概念,不再维护实时排行榜。OpenAI 示例默认已收紧为 gpt-5.4 / gpt-5-mini;为了与 DeepSeek、Ollama 等兼容接口对照,部分代码仍使用 Chat Completions 风格,新建 OpenAI 原生项目应优先考虑 Responses API

📖 章节导读

大语言模型(LLM)是当前 AI 领域最热门的技术之一,正在改变我们构建应用的方式。本章将介绍大模型的发展历程、主流模型和应用场景。

🎯 学习目标

  • 理解大模型的发展历程
  • 了解主流大模型的特点
  • 掌握大模型的应用场景
  • 能够搭建大模型开发环境

1.1 大模型发展历程

1.1.1 早期阶段(2017-2019)

Transformer 诞生(2017): - Google 提出 Transformer 架构 - Attention 机制解决长距离依赖 - 为后续大模型奠定基础

BERT(2018): - Google 提出双向预训练模型 - 引入 Masked Language Model - 在 NLP 任务上取得突破

GPT-1(2018): - OpenAI 提出生成式预训练模型 - 使用 Transformer 解码器 - 展示了生成式模型的潜力

1.1.2 快速发展(2020-2022)

GPT-3(2020): - 1750 亿参数的超大模型 - 展示了惊人的 Few-shot 能力 - 推动了 AI 应用的新浪潮

CLIP(2021): - OpenAI 提出多模态模型 - 连接文本和图像 - 开启多模态应用新方向

ChatGPT(2022): - OpenAI 发布对话式 AI - 展示了强大的对话能力 - 引爆全球 AI 热潮

1.1.3 开源时代(2023-至今)

LLaMA(2023): - Meta 开源大模型 - 提供了强大的开源选择 - 推动了开源社区发展

Mistral(2023): - 高效的开源模型 - 性能接近闭源模型 - 推动了开源模型优化

Qwen(2023): - 阿里巴巴开源中文大模型 - 中文能力强 - 推动了中文大模型发展

1.2 主流大模型

1.2.1 闭源模型

GPT 系列(OpenAI): - GPT-5.4:面向专业工作与复杂任务的当前旗舰模型 - GPT-5 mini:当前更稳妥的低延迟、高性价比选择 - o 系列(o1/o3):推理系列模型 - 特点:推理能力强,多语言支持好

Claude 系列(Anthropic): - Claude Opus 4:最强大的推理模型 - Claude Sonnet 4:平衡性能与速度 - 特点:长文本、安全性高、编程能力强

文心一言(百度): - 百度自研大模型 - 中文理解能力强 - 特点:中文优化、知识丰富

1.2.2 开源模型

LLaMA 系列(Meta): - LLaMA-3/3.1:强大的开源基座 - LLaMA-4:最新版本,支持 MoE 架构 - 特点:开源、可私有部署

Qwen 系列(阿里): - Qwen3:最新版本,中文能力强 - Qwen2.5-72B:超大参数版本 - 特点:中文优化、多模态

Mistral 系列(Mistral AI): - Mistral-7B:高效的小模型 - Mixtral-8x7B:MoE 架构 - 特点:效率高、性能好

DeepSeek 系列(深度求索): - DeepSeek-V3.2:671B MoE 架构 - DeepSeek-R1:强推理模型 - 特点:开源、推理能力出色

1.2.3 模型量化对比

选择模型时,需要综合考虑性能、成本、延迟和部署方式。由于价格、上下文窗口、基准成绩和可用模型都会快速变化,本总览章不再维护静态实时排行榜;最新的官方核验结果请参考:

这里保留一张稳定的选型维度表,帮助你先做架构判断:

模型类别 常见代表路线 典型优势 典型代价 适合场景
通用云 API 模型 OpenAI / Anthropic / Google 接入快、效果稳定、工具生态成熟 持续 API 成本、受地区/权限影响 产品验证、企业应用、复杂工作流
推理模型 o 系列 / DeepSeek-R1 类路线 更强的多步推理与规划能力 延迟更高、成本更高或更难控 数学、规划、复杂决策
开源通用模型 Qwen / Llama / Mistral / DeepSeek 开源线 可私有化、可微调、成本可控 运维复杂、效果依赖部署栈 数据敏感、本地部署、二次开发
多模态前沿模型 GPT-5.4 / Gemini 2.5 / Claude 4.6 视觉路线 文本+图像+音频/工具联合能力 API 变化快、价格和权限波动大 OCR、视觉问答、桌面/浏览器 Agent
小模型/经济型模型 mini / flash / 小尺寸开源模型 成本低、延迟低、适合大规模调用 上限较低、复杂任务容易退化 分类、抽取、路由、Judge、预处理

注意:如果某个项目对“价格、上下文、具体 benchmark”高度敏感,不要直接抄总览章里的旧表,应该在立项时重新核一次官方价格页和模型文档。

1.2.4 如何选择模型

模型选择应基于四个维度做决策:

Text Only
┌─────────────────────────────────────────────────────────┐
│                     模型选择决策框架                       │
├──────────────┬──────────────────────────────────────────┤
│  维度        │  考虑因素                                  │
├──────────────┼──────────────────────────────────────────┤
│  ① 任务类型  │  通用对话 → GPT-5.4 / Claude Sonnet 4.6  │
│              │  复杂推理 → o3 / DeepSeek-R1              │
│              │  中文特化 → Qwen3.5 / DeepSeek-V3.2       │
│              │  代码生成 → Claude Opus 4.6 / DeepSeek-R1 │
├──────────────┼──────────────────────────────────────────┤
│  ② 部署方式  │  快速验证 → 云API(OpenAI/Anthropic)       │
│              │  数据敏感 → 本地部署(Ollama/vLLM)          │
│              │  大规模    → 自建推理集群                    │
├──────────────┼──────────────────────────────────────────┤
│  ③ 成本预算  │  低预算 → GPT-5 mini / 小尺寸开源模型   │
│              │  中预算 → GPT-5.4 / Claude Sonnet 4.6     │
│              │  零API成本 → 本地部署开源模型               │
├──────────────┼──────────────────────────────────────────┤
│  ④ 性能需求  │  低延迟 → 小模型(7-14B) 或 GPT-5 mini  │
│              │  高质量 → 大模型(70B+) 或 o3               │
│              │  长文本 → Claude 4.6(1M) / Llama 4 Scout / Maverick │
└──────────────┴──────────────────────────────────────────┘

实用建议:先用 API 验证产品可行性(成本低、速度快),确认效果后再评估是否迁移到开源本地部署。

1.3 LLM 核心概念

在开始编程之前,理解以下核心概念至关重要:

1.3.1 Token 与计费

LLM 不是按"字"或"词"处理文本,而是按 token 处理。Token 是模型词表中的最小单元——可以理解为一个"子词片段"。例如 "hamburger" 可能被拆分为 ["ham", "burger"] 两个 token,而常用词 "the" 本身就是一个 token。

为什么理解 Token 很重要?

  • 计费依据:所有主流 API 都按 token 数量收费,而非字符数或字数。同样的内容,不同语言消耗的 token 差异很大。
  • 上下文窗口:每个模型有最大上下文长度(如 128K tokens),超出部分会被截断。理解 token 计数才能合理规划输入输出。
  • 中英文差异:英文平均约 1 token ≈ 4 个字符;中文平均约 1 token ≈ 1.5-2 个汉字。这意味着同样的内容,中文消耗的 token 约为英文的 2-3 倍,成本也相应更高。
Python
"""Token 计数示例"""
import tiktoken

# GPT-5 / GPT-5.4 家族当前可用 o200k_base 编码族做示例估算
enc = tiktoken.get_encoding("o200k_base")

texts = [
    "Hello, world!",
    "大语言模型应用开发",
    "The quick brown fox jumps over the lazy dog.",
    "def fibonacci(n): return n if n <= 1 else fibonacci(n-1) + fibonacci(n-2)",
]

for text in texts:
    tokens = enc.encode(text)
    print(f"文本: {text}")
    print(f"  Token数: {len(tokens)}")
    print(f"  Token列表: {[enc.decode([t]) for t in tokens[:10]]}")
    print()

# 成本估算函数
def estimate_cost(
    input_tokens: int,
    output_tokens: int,
    model: str = "gpt-5-mini"
) -> dict:
    """估算预算消耗(示例预算单位)"""
    # 以下仅演示“按输入/输出分别计费”的计算逻辑;
    # 真实项目应从官方 pricing 页面或配置中心同步实时价格
    pricing = {
        "gpt-5.4":      {"input": 1.00, "cached_input": 0.10, "output": 6.00},
        "gpt-5-mini": {"input": 0.30, "cached_input": 0.03, "output": 1.80},
        "gpt-5-nano": {"input": 0.08, "cached_input": 0.008, "output": 0.50},
    }

    if model not in pricing:
        return {"error": f"未知模型: {model}"}

    p = pricing[model]
    input_cost = input_tokens / 1_000_000 * p["input"]
    output_cost = output_tokens / 1_000_000 * p["output"]

    return {
        "model": model,
        "input_tokens": input_tokens,
        "output_tokens": output_tokens,
        "input_cost": f"{input_cost:.6f} budget_units",
        "output_cost": f"{output_cost:.6f} budget_units",
        "total_cost": f"{input_cost + output_cost:.6f} budget_units",
    }

# 示例:一次典型对话(500输入 + 1000输出)
print(estimate_cost(500, 1000, "gpt-5-mini"))
# {'model': 'gpt-5-mini', 'input_tokens': 500, 'output_tokens': 1000,
#  'input_cost': '0.000150 budget_units', 'output_cost': '0.001800 budget_units',
#  'total_cost': '0.001950 budget_units'}

print(estimate_cost(500, 1000, "gpt-5.4"))
# {'model': 'gpt-5.4', 'total_cost': '0.006500 budget_units'}  —— 明显高于轻量模型

1.3.2 Temperature 与生成控制

Temperature 控制生成的随机性,是最重要的生成参数。其底层原理是对模型输出的 logits(原始分数) 进行缩放后再做 softmax 归一化:

  • temperature → 0:logits 被无限放大,最高概率的 token 几乎必被选中 → 输出确定、重复
  • temperature = 1:保持模型原始概率分布 → "正常"风格
  • temperature → 2:logits 被压缩,各 token 概率趋于均匀 → 输出多样、不可预测

简单类比:temperature 就像水龙头的"温度旋钮"——往左拧(低值)输出稳定冰冷的事实,往右拧(高值)输出天马行空的创意。

参数 范围 作用 推荐场景
temperature 0.0 ~ 2.0 控制随机性,越高越随机 事实类任务 0.0-0.3 ,创意任务 0.7-1.0
top_p 0.0 ~ 1.0 核采样,与 temperature 二选一 通常保持 1.0
max_tokens 1 ~ 模型上限 最大输出 token 数 按需设置,避免浪费
frequency_penalty -2.0 ~ 2.0 降低重复词频 长文本设 0.3-0.5
presence_penalty -2.0 ~ 2.0 鼓励新话题 创意写作设 0.3-0.6
Python
"""不同 temperature 的效果对比"""
from openai import OpenAI
import os

client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))

prompt = "用一句话描述人工智能的未来"

for temp in [0.0, 0.5, 1.0, 1.5]:
    responses = []
    for _ in range(3):  # 每个temperature生成3次
        resp = client.chat.completions.create(
            model="gpt-5-mini",
            messages=[{"role": "user", "content": prompt}],
            temperature=temp,
            max_tokens=100,
        )
        responses.append(resp.choices[0].message.content)

    print(f"\n--- temperature={temp} ---")
    for i, r in enumerate(responses, 1):  # enumerate同时获取索引和元素
        print(f"  [{i}] {r}")
    # temperature=0.0 时三次结果几乎相同
    # temperature=1.5 时三次结果差异很大

1.3.3 消息格式与角色

LLM API 采用消息列表格式,每条消息有明确角色:

Python
messages = [
    # system: 设定AI的行为和角色(只需一条,放在最前)
    {
        "role": "system",
        "content": "你是一位资深Python工程师,回答简洁、准确,必要时给出代码示例。"
    },
    # user: 用户输入
    {
        "role": "user",
        "content": "如何实现一个线程安全的单例模式?"
    },
    # assistant: AI的历史回复(用于多轮对话)
    {
        "role": "assistant",
        "content": "可以使用 `threading.Lock` 配合双重检查锁定..."
    },
    # user: 用户的后续问题
    {
        "role": "user",
        "content": "能给一个完整的代码示例吗?"
    },
]

关键理解: LLM 本身是无状态的。每次 API 调用都是独立的。"多轮对话"是通过把历史消息全部发送给模型实现的。这意味着对话越长,消耗的 token 越多,成本越高。

1.4 大模型应用场景

1.4.1 文本生成

场景: - 内容创作:文章、故事、诗歌 - 代码生成:编程辅助、代码补全 - 翻译:多语言互译 - 摘要:长文本摘要

案例: - ChatGPT:对话式 AI 助手 - Claude:长文本处理 - 文心一言:中文内容生成

1.4.2 对话系统

场景: - 智能客服:自动回答用户问题 - 虚拟助手:个人 AI 助手 - 教育辅导:个性化学习辅导 - 医疗咨询:健康咨询(需谨慎)

案例: - ChatGPT:通用对话 AI - Character.AI:角色扮演对话 - Replika:AI 伴侣

1.4.3 知识问答

场景: - 文档问答:基于文档回答问题 - 知识库查询:企业知识问答 - 技术支持:技术问题解答 - 学习辅助:学习问题解答

案例: - Perplexity.AI:文档问答 - ChatPDF:PDF 文档问答 - 企业知识库:内部知识问答

1.4.4 Agent 应用

场景: - 任务自动化:自动执行复杂任务 - 工具调用:调用 API 和工具 - 决策支持:辅助决策制定 - 流程自动化:自动化业务流程

案例: - AutoGPT:自主 Agent - BabyAGI:任务规划 Agent - LangChain Agent:可编程 Agent

1.5 环境搭建

1.5.1 Python 环境

Bash
# 创建虚拟环境
python -m venv llm_env
source llm_env/bin/activate  # Linux/Mac
# llm_env\Scripts\activate  # Windows

# 安装核心依赖
pip install openai anthropic     # 云端API客户端
pip install tiktoken             # Token计数
pip install python-dotenv        # 环境变量管理
pip install rich                 # 美化终端输出(可选)

# 安装本地模型依赖(可选)
pip install "transformers>=4.45,<5" torch   # Hugging Face
pip install ollama               # Ollama Python客户端

1.5.2 API Key 安全管理

⚠️ 绝对不要将 API Key 硬编码在代码中或提交到 Git 仓库。

推荐使用 .env 文件 + python-dotenv

Bash
# .env 文件(加入 .gitignore 中)
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxx
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxxxxx
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxx
Python
"""安全加载 API Key 的标准做法"""
import os
from dotenv import load_dotenv

load_dotenv()  # 自动读取 .env 文件

# 封装为统一的配置获取函数
def get_api_key(provider: str) -> str:
    """获取指定提供商的 API Key,缺失时给出清晰错误"""
    key_map = {
        "openai": "OPENAI_API_KEY",
        "anthropic": "ANTHROPIC_API_KEY",
        "deepseek": "DEEPSEEK_API_KEY",
    }
    env_var = key_map.get(provider.lower())
    if not env_var:
        raise ValueError(f"不支持的提供商: {provider}")

    key = os.environ.get(env_var)
    if not key:
        raise EnvironmentError(
            f"缺少环境变量 {env_var},请在 .env 文件中配置"
        )
    return key

1.5.3 多提供商统一客户端

实际项目中通常需要支持多个模型提供商。以下是一个统一封装:

Python
"""统一的多提供商LLM客户端"""
from openai import OpenAI
from anthropic import Anthropic
import os
from dotenv import load_dotenv
from dataclasses import dataclass

load_dotenv()

@dataclass  # @dataclass自动生成__init__等方法
class LLMResponse:
    """统一的响应格式"""
    content: str
    model: str
    input_tokens: int
    output_tokens: int
    total_tokens: int

    @property  # @property将方法变为属性访问
    def cost_estimate(self) -> float:
        """粗略成本估算(示例预算单位)"""
        pricing = {
            "gpt-5.4": (1.00, 6.00),
            "gpt-5-mini": (0.30, 1.80),
            "gpt-5-nano": (0.08, 0.50),
        }
        if self.model in pricing:
            ip, op = pricing[self.model]  # 元组解包:pricing的值是(输入价, 输出价)元组,一行赋值给ip和op两个变量
            return (self.input_tokens * ip + self.output_tokens * op) / 1_000_000
        return 0.0

class UnifiedLLM:
    """支持 OpenAI / Anthropic / DeepSeek 的统一客户端"""

    def __init__(self):
        # OpenAI
        if os.environ.get("OPENAI_API_KEY"):
            self.openai = OpenAI()
        else:
            self.openai = None

        # Anthropic
        if os.environ.get("ANTHROPIC_API_KEY"):
            self.anthropic = Anthropic()
        else:
            self.anthropic = None

        # DeepSeek (兼容OpenAI接口)
        if os.environ.get("DEEPSEEK_API_KEY"):
            self.deepseek = OpenAI(
                api_key=os.environ["DEEPSEEK_API_KEY"],
                base_url="https://api.deepseek.com"
            )
        else:
            self.deepseek = None

    def chat(
        self,
        message: str,
        model: str = "gpt-5-mini",
        system: str = "You are a helpful assistant.",
        temperature: float = 0.7,
        max_tokens: int = 1024,
    ) -> LLMResponse:
        """统一的对话接口"""

        # Anthropic Claude
        if model.startswith("claude"):
            if not self.anthropic:
                raise RuntimeError("未配置 ANTHROPIC_API_KEY")
            resp = self.anthropic.messages.create(
                model=model,
                max_tokens=max_tokens,
                system=system,
                messages=[{"role": "user", "content": message}],
                temperature=temperature,
            )
            return LLMResponse(
                content=resp.content[0].text,
                model=model,
                input_tokens=resp.usage.input_tokens,
                output_tokens=resp.usage.output_tokens,
                total_tokens=resp.usage.input_tokens + resp.usage.output_tokens,
            )

        # DeepSeek
        elif model.startswith("deepseek"):
            if not self.deepseek:
                raise RuntimeError("未配置 DEEPSEEK_API_KEY")
            client = self.deepseek

        # OpenAI (默认)
        else:
            if not self.openai:
                raise RuntimeError("未配置 OPENAI_API_KEY")
            client = self.openai

        # OpenAI 兼容接口(OpenAI / DeepSeek)
        resp = client.chat.completions.create(
            model=model,
            messages=[
                {"role": "system", "content": system},
                {"role": "user", "content": message},
            ],
            temperature=temperature,
            max_tokens=max_tokens,
        )
        usage = resp.usage
        return LLMResponse(
            content=resp.choices[0].message.content,
            model=model,
            input_tokens=usage.prompt_tokens,
            output_tokens=usage.completion_tokens,
            total_tokens=usage.total_tokens,
        )

# ---------- 使用示例 ----------
llm = UnifiedLLM()

# OpenAI
r1 = llm.chat("什么是Transformer?", model="gpt-5-mini")
print(f"[gpt-5-mini] {r1.content[:100]}...")
print(f"  Tokens: {r1.total_tokens}, 成本单位: {r1.cost_estimate:.6f}")

# DeepSeek (如果配置了key)
# r2 = llm.chat("什么是Transformer?", model="deepseek-chat")

1.5.4 本地模型部署( Ollama )

对于数据敏感场景或零 API 成本需求,推荐使用 Ollama 在本地运行开源模型:

Bash
# 1. 安装 Ollama (https://ollama.com)
# 2. 下载模型
ollama pull qwen3:8b       # 阿里通义千问 8B
ollama pull deepseek-r1:8b  # DeepSeek推理模型 8B
ollama pull llama3.1:8b     # Meta LLaMA 3.1 8B
Python
"""使用 Ollama 本地模型 —— 兼容 OpenAI 接口"""
from openai import OpenAI

# Ollama 默认在 localhost:11434 提供 OpenAI 兼容接口
local_client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama",  # Ollama 不需要真实key,但字段必须提供
)

# 与云端API完全相同的调用方式
response = local_client.chat.completions.create(
    model="qwen3:8b",
    messages=[
        {"role": "system", "content": "你是一位AI助手,用中文回答。"},
        {"role": "user", "content": "什么是注意力机制?请简要说明。"}
    ],
    temperature=0.7,
)

print(response.choices[0].message.content)
# 优势:零成本、数据不出本地、无网络延迟
# 劣势:需要GPU(8B模型约需6GB显存)、质量低于顶级闭源模型

1.6 实战:第一个 LLM 应用

1.6.1 基础对话(带错误处理)

Python
"""生产级的基础对话函数"""
from openai import OpenAI, APIError, RateLimitError, APIConnectionError
import os
import time
from dotenv import load_dotenv

load_dotenv()
client = OpenAI()

def chat(
    message: str,
    system: str = "You are a helpful assistant.",
    model: str = "gpt-5-mini",
    temperature: float = 0.7,
    max_retries: int = 3,
) -> str:
    """
    带重试和错误处理的对话函数

    Args:
        message: 用户消息
        system: 系统提示词
        model: 模型名称
        temperature: 生成温度
        max_retries: 最大重试次数
    Returns:
        模型回复文本
    """
    for attempt in range(max_retries):
        try:  # try/except捕获异常,防止程序崩溃
            response = client.chat.completions.create(
                model=model,
                messages=[
                    {"role": "system", "content": system},
                    {"role": "user", "content": message},
                ],
                temperature=temperature,
            )
            return response.choices[0].message.content

        except RateLimitError:
            wait = 2 ** attempt  # 指数退避: 1s, 2s, 4s
            print(f"[Rate limit] 等待 {wait}s 后重试...")
            time.sleep(wait)

        except APIConnectionError:
            print(f"[连接错误] 第 {attempt+1}/{max_retries} 次重试...")
            time.sleep(1)

        except APIError as e:
            print(f"[API错误] {e.status_code}: {e.message}")
            raise  # 非临时性错误,直接抛出

    raise RuntimeError(f"API调用失败,已重试 {max_retries} 次")

# 使用
print(chat("用三句话解释什么是大语言模型"))

1.6.2 流式输出( Streaming )

流式输出让用户无需等待完整响应,显著改善体验( ChatGPT 的打字机效果):

Python
"""流式输出示例 —— 实现打字机效果"""
from openai import OpenAI
import os
from dotenv import load_dotenv

load_dotenv()
client = OpenAI()

def stream_chat(
    message: str,
    system: str = "You are a helpful assistant.",
    model: str = "gpt-5-mini",
) -> str:
    """流式对话,实时打印每个token"""
    stream = client.chat.completions.create(
        model=model,
        messages=[
            {"role": "system", "content": system},
            {"role": "user", "content": message},
        ],
        stream=True,  # 开启流式输出
    )

    full_response = []
    for chunk in stream:
        delta = chunk.choices[0].delta
        if delta.content:
            print(delta.content, end="", flush=True)
            full_response.append(delta.content)

    print()  # 换行
    return "".join(full_response)

# 效果:文字逐字出现,而非等待数秒后一次性显示
response = stream_chat("写一首关于编程的五言绝句")

1.6.3 多轮对话管理器

实际应用中需要管理对话历史,以下是一个完整的多轮对话实现:

Python
"""多轮对话管理器 —— 支持历史管理和token限制"""
from openai import OpenAI
import tiktoken
import os
from dotenv import load_dotenv

load_dotenv()

class ChatSession:
    """多轮对话会话管理"""

    def __init__(
        self,
        model: str = "gpt-5-mini",
        system: str = "You are a helpful assistant.",
        max_history_tokens: int = 4000,
    ):
        self.client = OpenAI()
        self.model = model
        self.system = system
        self.max_history_tokens = max_history_tokens
        self.history: list[dict] = []
        self.enc = tiktoken.get_encoding("o200k_base")

    def _count_tokens(self, messages: list[dict]) -> int:
        """估算消息列表的token数"""
        total = 0
        for msg in messages:
            total += len(self.enc.encode(msg["content"])) + 4  # 角色标记开销
        return total

    def _trim_history(self):
        """当历史超出token限制时,移除最早的对话轮次"""
        while (
            len(self.history) > 2  # 至少保留最近一轮
            and self._count_tokens(self.history) > self.max_history_tokens
        ):
            # 移除最早的一轮(user + assistant)
            self.history.pop(0)
            if self.history and self.history[0]["role"] == "assistant":
                self.history.pop(0)

    def send(self, message: str, temperature: float = 0.7) -> str:
        """发送消息并获取回复"""
        self.history.append({"role": "user", "content": message})
        self._trim_history()

        messages = [
            {"role": "system", "content": self.system},
            *self.history,
        ]

        response = self.client.chat.completions.create(
            model=self.model,
            messages=messages,
            temperature=temperature,
        )

        reply = response.choices[0].message.content
        self.history.append({"role": "assistant", "content": reply})

        return reply

    def reset(self):
        """清空对话历史"""
        self.history.clear()

    @property
    def total_tokens_used(self) -> int:
        """当前历史的总token数"""
        return self._count_tokens(self.history)

# ---------- 使用示例 ----------
session = ChatSession(
    model="gpt-5-mini",
    system="你是一位Python编程导师,用简洁易懂的方式教学。",
    max_history_tokens=4000,
)

# 多轮对话
print("Q1:", r1 := session.send("什么是装饰器?"))
print(f"[历史token: {session.total_tokens_used}]\n")

print("Q2:", r2 := session.send("能给个实际的例子吗?"))
print(f"[历史token: {session.total_tokens_used}]\n")

print("Q3:", r3 := session.send("如何用装饰器实现缓存?"))
print(f"[历史token: {session.total_tokens_used}]\n")

# 模型能理解上下文:第3个问题不需要重新解释"装饰器"是什么

1.6.4 实用工具:文本摘要器

将以上知识组合成一个实用的文本摘要应用:

Python
"""LLM驱动的智能文本摘要器"""
from openai import OpenAI
import tiktoken
import os
from dotenv import load_dotenv

load_dotenv()
client = OpenAI()

def summarize(
    text: str,
    style: str = "brief",
    model: str = "gpt-5-mini",
    language: str = "中文",
) -> str:
    """
    智能文本摘要

    Args:
        text: 要摘要的文本
        style: 摘要风格 - "brief"(简要), "detailed"(详细), "bullets"(要点)
        model: 使用的模型
        language: 输出语言
    """
    style_prompts = {
        "brief": f"用{language}写一段简要摘要(50-100字)",
        "detailed": f"用{language}写一段详细摘要(200-300字),保留关键细节",
        "bullets": f"用{language}列出5-7个关键要点,每个要点一句话",
    }

    # Token 检查
    enc = tiktoken.encoding_for_model(model)
    input_tokens = len(enc.encode(text))

    if input_tokens > 100000:
        return "错误:文本过长,请分段处理"

    prompt = f"""{style_prompts.get(style, style_prompts['brief'])}

原文:
{text}"""

    response = client.chat.completions.create(
        model=model,
        messages=[
            {"role": "system", "content": "你是一个专业的文本摘要助手。"},
            {"role": "user", "content": prompt},
        ],
        temperature=0.3,  # 摘要任务用低temperature保证准确性
    )

    return response.choices[0].message.content

# 测试
sample_text = """
大语言模型(Large Language Model, LLM)是一种基于深度学习的自然语言处理模型,
通常具有数十亿甚至数千亿个参数。这些模型通过在海量文本数据上进行预训练,
学习了语言的统计规律和语义知识。LLM的核心架构通常基于Transformer,
利用自注意力机制来捕捉文本中的长距离依赖关系。
近年来,GPT系列、Claude系列和开源的LLaMA、Qwen系列等模型不断刷新各项基准测试的记录,
展示了在文本生成、推理、编程、翻译等任务上的卓越能力。
LLM的应用已经从学术研究扩展到了商业领域,包括智能客服、内容创作、
代码辅助、数据分析等场景,正在深刻改变各行各业的工作方式。
"""

print("=== 简要摘要 ===")
print(summarize(sample_text, style="brief"))

print("\n=== 要点摘要 ===")
print(summarize(sample_text, style="bullets"))

📝 本章小结

本章全面介绍了大模型应用开发的基础知识:

  1. 发展历程:从 Transformer(2017) 到 GPT-4/开源生态(2025) 的完整脉络
  2. 主流模型对比:闭源(GPT/Claude) vs 开源(LLaMA/Qwen/DeepSeek),含量化指标和定价
  3. 核心概念: Token 计费、 Temperature 控制、消息角色体系
  4. 环境搭建:多提供商 API 配置、.env 安全管理、 Ollama 本地部署
  5. 实战代码:错误处理、流式输出、多轮对话管理器、文本摘要器

关键代码模式(后续章节会反复用到): - UnifiedLLM:多提供商统一客户端 - ChatSession:带 token 限制的多轮对话管理 - 指数退避重试:生产环境必备的错误处理 - stream=True:流式输出改善用户体验

通过本章学习,你应该能够: - 根据任务需求选择合适的模型(参考 1.2.3 对比表) - 安全配置多个模型提供商的 API - 实现带错误处理和流式输出的对话应用 - 构建多轮对话管理器(含历史裁剪) - 估算 API 调用成本

🔗 下一步

下一章我们将深入学习Prompt 工程,掌握如何设计有效的 Prompt 。

继续学习: 02-Prompt 工程.md

💡 思考题

  1. 大模型的发展有哪些关键节点?

    Transformer(2017) → GPT-1(2018) → BERT(2018) → GPT-3(2020,Few-shot 涌现) → ChatGPT(2022,RLHF 对齐) → GPT-4(2023,多模态) → 开源爆发(Llama/Qwen/DeepSeek,2023-2025)。核心转折:规模定律的发现使"大力出奇迹"成为共识。

  2. 闭源模型和开源模型各有什么优缺点?

    闭源(GPT-5.4/Claude 4.6):性能天花板高、 API 开箱即用、持续更新,但成本高、数据隐私风险、供应商锁定。开源(Llama/Qwen/DeepSeek):可私有化部署、可微调定制、无 API 成本,但需自行运维、性能略低于最强闭源、硬件门槛高。

  3. 如何选择合适的大模型?

    4 维决策:①任务类型(通用对话选 GPT-5.4/Claude 4.6 ,中文特化选 Qwen3.5/DeepSeek-V3.2) ②部署方式(云 API vs 私有化) ③预算(API 按 token 计费 vs GPU 自建) ④数据安全(敏感数据必须私有化)。建议先用 API 验证可行性,再考虑自建。

  4. 大模型在哪些场景下表现最好?

    生成类(文案/代码/翻译)、理解类(摘要/分类/情感分析)、推理类(数学/逻辑/规划)、对话类(客服/助手)。不适合:实时计算、精确数值运算、需要最新知识(需 RAG 增强)。

  5. 如何评估大模型的效果?

    自动指标: BLEU/ROUGE(生成)、准确率/F1(分类)、 Pass@k(代码)。人工评估:相关性、流畅性、有害性。综合基准: MMLU(知识)、 HumanEval(代码)、 GSM8K(数学)。生产环境还需评估延迟、成本、一致性。

📚 参考资料

  1. "Attention Is All You Need" - Vaswani et al., 2017
  2. "Language Models are Few-Shot Learners" - Brown et al., 2020
  3. OpenAI API Documentation
  4. Anthropic API Documentation
  5. DeepSeek API Documentation
  6. Ollama 官方文档
  7. tiktoken - OpenAI Tokenizer
  8. Chatbot Arena Leaderboard — 模型排名参考

最后更新日期: 2026-03-26 适用版本: LLM 应用指南 v2026

⚠️ 核验说明(2026-03-26):本页已纳入 2026-03-26 全站统一复核批次。若文中涉及外部模型、API、版本号、价格或第三方产品名称,请以官方文档和实际运行环境为准。