跳转至

大模型应用概述

大模型应用概述图

📖 章节导读

大语言模型(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-4o:当前最强大的通用多模态模型 - GPT-4o-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:671B MoE架构 - DeepSeek-R1:强推理模型 - 特点:开源、推理能力出色

1.2.3 模型量化对比

选择模型时,需要综合考虑性能、成本、延迟和部署方式。下表整理了 2025 年主流模型的关键指标:

模型 参数量 上下文窗口 输入价格($/1M tokens) 输出价格($/1M tokens) MMLU HumanEval 部署方式
GPT-4o 未公开 128K 2.50 10.00 88.7 90.2 API
GPT-4o-mini 未公开 128K 0.15 0.60 82.0 87.0 API
o3 未公开 200K 10.00 40.00 92.3 96.7 API
Claude Sonnet 4 未公开 200K 3.00 15.00 88.9 93.7 API
Claude Opus 4 未公开 200K 15.00 75.00 90.1 95.2 API
DeepSeek-V3 671B(37B激活) 128K 0.27 1.10 87.1 82.6 API/本地
DeepSeek-R1 671B(37B激活) 128K 0.55 2.19 90.8 97.3 API/本地
Qwen3-235B 235B(22B激活) 128K 0.80 2.40 86.5 80.4 API/本地
LLaMA-4-Maverick 400B(17B激活) 1M 免费(本地) 免费(本地) 85.5 78.2 本地
Mistral Large 123B 128K 2.00 6.00 86.3 84.1 API/本地

注意:以上价格和基准测试数据为 2025 年中数据,具体请以各厂商官网为准。MoE 模型的"激活参数"指每次推理实际使用的参数量,远小于总参数量。

1.2.4 如何选择模型

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

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

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

1.3 LLM 核心概念

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

1.3.1 Token 与计费

LLM 不是按"字"或"词"处理文本,而是按 token 处理。Token 是模型词表中的最小单元。

Python
"""Token 计数示例"""
import tiktoken

# GPT-4o 使用 o200k_base 编码
enc = tiktoken.encoding_for_model("gpt-4o")

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-4o-mini"
) -> dict:
    """估算API调用成本"""
    pricing = {
        "gpt-4o":      {"input": 2.50,  "output": 10.00},
        "gpt-4o-mini": {"input": 0.15,  "output": 0.60},
        "o3":          {"input": 10.00, "output": 40.00},
        "claude-sonnet-4": {"input": 3.00, "output": 15.00},
        "deepseek-v3": {"input": 0.27,  "output": 1.10},
    }

    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}",
        "output_cost": f"${output_cost:.6f}",
        "total_cost": f"${input_cost + output_cost:.6f}",
    }

# 示例:一次典型对话(500输入 + 1000输出)
print(estimate_cost(500, 1000, "gpt-4o-mini"))
# {'model': 'gpt-4o-mini', 'input_tokens': 500, 'output_tokens': 1000,
#  'input_cost': '$0.000075', 'output_cost': '$0.000600', 'total_cost': '$0.000675'}

print(estimate_cost(500, 1000, "gpt-4o"))
# {'model': 'gpt-4o', 'total_cost': '$0.011250'}  —— 贵了约16倍

1.3.2 Temperature 与生成控制

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-4o-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 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-4o":          (2.50, 10.00),
            "gpt-4o-mini":     (0.15, 0.60),
            "claude-sonnet-4-20250514": (3.00, 15.00),
            "deepseek-chat":   (0.27, 1.10),
        }
        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-4o-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-4o-mini")
print(f"[GPT-4o-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-4o-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-4o-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-4o-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.encoding_for_model(model)

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

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

    4维决策:①任务类型(通用对话选GPT-4o/Claude,中文特化选Qwen/DeepSeek) ②部署方式(云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 — 模型排名参考

最后更新日期:2025-07-11 适用版本:LLM应用指南 v2025