LLM全景图:理解大模型技术栈
要开始使用大语言模型,首先需要理解几个基本概念。
LLM (大语言模型)是基于Transformer架构的模型,它处理文本的基本单位叫Token (中文通常是1-2个字符)。模型在一次处理中能接收的文本长度称为Context长度 。另一个重要参数是Temperature,它控制输出的随机性------0表示确定性输出,更高的值会增加创意但降低可控性。
技术栈架构
以下是大模型应用的典型技术栈:
调用 使用 使用 依赖 依赖 依赖 依赖 应用层
ChatGPT
Claude
文心一言 编程框架
LangChain
LlamaIndex
vLLM
Ollama 闭源模型
GPT-4
Claude-3 开源模型
Llama-3
Qwen-7B 计算框架
PyTorch
TensorFlow 加速库
CUDA
TensorRT
主流模型对比
选择模型时,需要考虑成本、性能和你的具体需求。下面是目前常用的模型对比。
闭源模型
| 模型 | 价格($/M tokens) | 优势 | 劣势 | 选择场景 |
|---|---|---|---|---|
| GPT-4 | 30 | 最强能力 | 贵、慢 | 复杂推理 |
| GPT-3.5 | 0.5 | 性价比高 | 能力一般 | 日常对话 |
| Claude-3 | 15 | 长文本(200K) | 中文一般 | 文档处理 |
开源模型
| 模型 | 参数 | 显存需求 | 特点 | 部署难度 |
|---|---|---|---|---|
| Llama-3-8B | 8B | 16GB | 综合最强 | 简单 |
| Qwen2.5-7B | 7B | 14GB | 中文最佳 | 简单 |
| DeepSeek-Coder | 7B | 14GB | 代码专精 | 简单 |
| Mixtral-8x7B | 46B | 96GB | MoE架构 | 困难 |
选型决策树
python
def select_model(budget, use_case, privacy):
if privacy == "high":
return "Llama-3-8B" if budget < 3000 else "Llama-3-70B"
if use_case == "code":
return "GPT-4" if budget > 1000/月 else "DeepSeek-Coder"
elif use_case == "chinese":
return "Qwen2.5" if privacy else "GPT-3.5"
else:
return "GPT-3.5" # 默认选择
基本使用方法
调用API
python
# 方式1:OpenAI
from openai import OpenAI
client = OpenAI(api_key="sk-...")
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "Hello"}]
)
print(response.choices[0].message.content)
# 方式2:统一接口(支持多家API)
import litellm
response = litellm.completion(
model="claude-3-sonnet", # 或 gpt-4, gemini-pro 等
messages=[{"role": "user", "content": "Hello"}]
)
本地模型部署
如果你对数据隐私有顾虑,可以在本地部署开源模型:
python
# 方式1:使用Ollama(推荐新手)
import requests
response = requests.post('http://localhost:11434/api/generate',
json={"model": "llama3", "prompt": "Hello"})
print(response.json()['response'])
# 方式2:使用Transformers
from transformers import AutoTokenizer, AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B-Instruct")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-Instruct")
inputs = tokenizer("Hello", return_tensors="pt")
outputs = model.generate(**inputs, max_length=100)
print(tokenizer.decode(outputs[0]))
流式输出
为了提高用户体验,你可以让模型逐字符输出结果,而不是一次性等待完整回复:
python
import sys
for chunk in client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "写一首诗"}],
stream=True
):
if chunk.choices[0].delta.content:
sys.stdout.write(chunk.choices[0].delta.content)
sys.stdout.flush()
成本计算与选择
大模型的成本取决于你选择使用API还是本地部署。下面的工具可以帮你估算月度成本:
python
class LLMCostCalculator:
"""成本计算工具"""
# 价格表(美元/百万token)
PRICES = {
"gpt-4": {"input": 30, "output": 60},
"gpt-3.5": {"input": 0.5, "output": 1.5},
"claude-3": {"input": 15, "output": 75},
"本地7B": {"input": 0, "output": 0, "gpu_hour": 0.5}
}
def calculate_monthly_cost(self, model, daily_requests, avg_tokens=500):
"""计算月度成本"""
if model.startswith("本地"):
# 本地部署成本 = 电费 + 硬件折旧
gpu_hours = daily_requests * 0.01 # 假设每请求0.01小时
return gpu_hours * 30 * self.PRICES[model]["gpu_hour"]
else:
# API成本
total_tokens = daily_requests * avg_tokens * 30
cost = total_tokens * self.PRICES[model]["output"] / 1_000_000
return cost
def recommend_solution(self, daily_requests, budget):
"""推荐方案"""
if daily_requests < 100:
return "使用GPT-3.5 API"
elif daily_requests < 1000:
return "混合方案:本地7B + GPT-3.5备用"
else:
return "本地部署Llama-3或Qwen"
# 使用示例
calc = LLMCostCalculator()
print(f"GPT-4月成本: ${calc.calculate_monthly_cost('gpt-4', 100):.2f}")
print(f"推荐方案: {calc.recommend_solution(500, 100)}")
实际应用案例
不同的应用场景对模型和成本的需求不同。以下是几个常见案例:
| 应用 | 推荐模型 | 关键技术 | 预算/月 |
|---|---|---|---|
| 智能客服 | GPT-3.5/Qwen-7B | RAG+缓存 | $50-500 |
| 代码助手 | DeepSeek-Coder | 微调+IDE集成 | $0-100 |
| 文档问答 | Claude/Llama+RAG | 向量库+检索 | $100-1000 |
| 内容创作 | GPT-4/Claude | Prompt优化 | $500-5000 |
知识库问答是常见的应用场景。这里展示一个基本实现:
python
# 知识库问答最小实现
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
# 1. 构建知识库
texts = ["文档1内容", "文档2内容"]
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(texts, embeddings)
# 2. 问答
qa = RetrievalQA.from_llm(
llm=ChatOpenAI(),
retriever=vectorstore.as_retriever()
)
answer = qa.run("问题")
优化与问题排解
使用LLM应用时,你可能会遇到一些常见的问题。以下是解决方案:
Token超限:如果上下文超过模型限制,使用滑动窗口截断早期的对话历史。
响应慢:启用流式输出可以让用户更快看到结果,同时缓存重复的请求也能显著加快速度。
成本高:可以采用混合部署策略,简单请求用本地小模型,复杂请求用API调用。
幻觉问题:大模型有时会生成虚假信息。使用RAG系统并降低temperature参数可以缓解这个问题。
性能优化示例
python
# 1. 缓存重复请求
from functools import lru_cache
@lru_cache(maxsize=1000)
def cached_llm_call(prompt):
return llm.generate(prompt)
# 2. 批处理
responses = await asyncio.gather(*[
llm.agenerate(prompt) for prompt in prompts
])
# 3. 模型量化(减少75%显存)
model = AutoModelForCausalLM.from_pretrained(
"model_name",
load_in_4bit=True
)
学习路线
如果你是初学者,可以按以下步骤学习:
- 第1周:调通API,实现一个基础对话应用
- 第2周:加入RAG知识库功能,部署到Web界面
有用的资源包括Ollama(本地模型部署)、LangChain(应用框架)和Hugging Face(模型仓库)。
实践建议
- 从API开始。大多数初学者应该先用现成的API服务测试想法,而不是立即部署本地模型。
- 测试不同的模型。每个模型的成本和性能不同,找到适合你用例的组合需要实验。
- 关注成本。如果你的应用会频繁调用模型,选择正确的模型和优化方案可以显著降低成本。