大模型应用概述¶
📖 章节导读¶
大语言模型(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 如何选择模型¶
模型选择应基于四个维度做决策:
┌─────────────────────────────────────────────────────────┐
│ 模型选择决策框架 │
├──────────────┬──────────────────────────────────────────┤
│ 维度 │ 考虑因素 │
├──────────────┼──────────────────────────────────────────┤
│ ① 任务类型 │ 通用对话 → 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 是模型词表中的最小单元。
"""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 |
"""不同 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 采用消息列表格式,每条消息有明确角色:
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环境¶
# 创建虚拟环境
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:
# .env 文件(加入 .gitignore 中)
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxx
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxxxxx
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxx
"""安全加载 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 多提供商统一客户端¶
实际项目中通常需要支持多个模型提供商。以下是一个统一封装:
"""统一的多提供商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 在本地运行开源模型:
# 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
"""使用 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 基础对话(带错误处理)¶
"""生产级的基础对话函数"""
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 的打字机效果):
"""流式输出示例 —— 实现打字机效果"""
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 多轮对话管理器¶
实际应用中需要管理对话历史,以下是一个完整的多轮对话实现:
"""多轮对话管理器 —— 支持历史管理和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 实用工具:文本摘要器¶
将以上知识组合成一个实用的文本摘要应用:
"""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"))
📝 本章小结¶
本章全面介绍了大模型应用开发的基础知识:
- ✅ 发展历程:从 Transformer(2017) 到 GPT-4/开源生态(2025) 的完整脉络
- ✅ 主流模型对比:闭源(GPT/Claude) vs 开源(LLaMA/Qwen/DeepSeek),含量化指标和定价
- ✅ 核心概念:Token计费、Temperature控制、消息角色体系
- ✅ 环境搭建:多提供商API配置、.env安全管理、Ollama本地部署
- ✅ 实战代码:错误处理、流式输出、多轮对话管理器、文本摘要器
关键代码模式(后续章节会反复用到): - UnifiedLLM:多提供商统一客户端 - ChatSession:带token限制的多轮对话管理 - 指数退避重试:生产环境必备的错误处理 - stream=True:流式输出改善用户体验
通过本章学习,你应该能够: - 根据任务需求选择合适的模型(参考 1.2.3 对比表) - 安全配置多个模型提供商的 API - 实现带错误处理和流式输出的对话应用 - 构建多轮对话管理器(含历史裁剪) - 估算 API 调用成本
🔗 下一步¶
下一章我们将深入学习Prompt工程,掌握如何设计有效的Prompt。
继续学习: 02-Prompt工程.md
💡 思考题¶
-
大模型的发展有哪些关键节点?
Transformer(2017) → GPT-1(2018) → BERT(2018) → GPT-3(2020,Few-shot涌现) → ChatGPT(2022,RLHF对齐) → GPT-4(2023,多模态) → 开源爆发(Llama/Qwen/DeepSeek,2023-2025)。核心转折:规模定律的发现使"大力出奇迹"成为共识。
-
闭源模型和开源模型各有什么优缺点?
闭源(GPT-4o/Claude):性能天花板高、API开箱即用、持续更新,但成本高、数据隐私风险、供应商锁定。开源(Llama/Qwen/DeepSeek):可私有化部署、可微调定制、无API成本,但需自行运维、性能略低于最强闭源、硬件门槛高。
-
如何选择合适的大模型?
4维决策:①任务类型(通用对话选GPT-4o/Claude,中文特化选Qwen/DeepSeek) ②部署方式(云API vs 私有化) ③预算(API按token计费 vs GPU自建) ④数据安全(敏感数据必须私有化)。建议先用API验证可行性,再考虑自建。
-
大模型在哪些场景下表现最好?
生成类(文案/代码/翻译)、理解类(摘要/分类/情感分析)、推理类(数学/逻辑/规划)、对话类(客服/助手)。不适合:实时计算、精确数值运算、需要最新知识(需RAG增强)。
-
如何评估大模型的效果?
自动指标:BLEU/ROUGE(生成)、准确率/F1(分类)、Pass@k(代码)。人工评估:相关性、流畅性、有害性。综合基准:MMLU(知识)、HumanEval(代码)、GSM8K(数学)。生产环境还需评估延迟、成本、一致性。
📚 参考资料¶
- "Attention Is All You Need" - Vaswani et al., 2017
- "Language Models are Few-Shot Learners" - Brown et al., 2020
- OpenAI API Documentation
- Anthropic API Documentation
- DeepSeek API Documentation
- Ollama 官方文档
- tiktoken - OpenAI Tokenizer
- Chatbot Arena Leaderboard — 模型排名参考
最后更新日期:2025-07-11 适用版本:LLM应用指南 v2025