Transformer 是一种基于自注意力机制的神经网络架构,由 Google 在 2017 年提出:
Attention(Q, K, V) = softmax(QK^T / √d_k) · V
其中:
- Q (Query): 查询向量
- K (Key): 键向量
- V (Value): 值向量
- d_k: 键向量的维度(用于缩放)
| 特征 | GPT (Decoder-only) | BERT (Encoder-only) |
|---|---|---|
| 注意力机制 | 单向(因果)注意力 | 双向注意力 |
| 训练任务 | 下一个词预测(CLM) | 掩码语言模型(MLM)+ NSP |
| 应用场景 | 文本生成、对话、续写 | 文本分类、命名实体识别、问答 |
| 输入处理 | 从左到右,只能看到前文 | 可以同时看到上下文 |
from transformers import AutoModelForCausalLM, AutoTokenizer, Trainer
# 1. 加载预训练模型
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")
# 2. 准备任务数据
train_dataset = prepare_dataset(your_data)
# 3. 配置训练参数
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
learning_rate=5e-5, # 通常比预训练小
per_device_train_batch_size=4
)
# 4. 微调模型
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset
)
trainer.train()
| 维度 | 预训练 | 微调 |
|---|---|---|
| 数据量 | TB 级别 | MB-GB 级别 |
| 计算成本 | 极高(百万美元级) | 较低(百到千美元级) |
| 训练时间 | 数周到数月 | 数小时到数天 |
| 学习率 | 较大(1e-4) | 较小(5e-6 ~ 5e-5) |
Prompt Engineering 是设计和优化输入提示词的技术,用于引导大模型生成期望的输出。
❌ 不好的 Prompt:
"翻译这段话"
✅ 好的 Prompt:
"你是一位专业的英文翻译,请将以下中文翻译成地道的英文,
保持原文的语气和风格,注意专业术语的准确性。
中文:[原文]
英文:"
通过在 prompt 中提供少量示例(通常 2-5 个),让模型学习任务模式并应用到新样本。
任务:判断评论的情感倾向(积极/消极/中性)
示例1:
评论:这个产品质量真不错,物超所值!
情感:积极
示例2:
评论:配送速度太慢了,等了一周才到。
情感:消极
示例3:
评论:产品一般般,没什么特别的。
情感:中性
现在请分析:
评论:界面设计很漂亮,但是功能有点少。
情感:
请从文本中提取结构化信息,返回 JSON 格式。
示例1:
文本:张三,男,28岁,软件工程师,年薪30万
输出:{"name": "张三", "gender": "男", "age": 28, "job": "软件工程师", "salary": "30万"}
示例2:
文本:李四女士今年35岁,是一名产品经理
输出:{"name": "李四", "gender": "女", "age": 35, "job": "产品经理", "salary": null}
现在请提取:
文本:王五,26岁前端开发,月薪2万
通过让模型展示中间推理步骤,提高复杂任务的准确性。
❌ 直接提问:
Q: 一个咖啡店上午卖出15杯咖啡,每杯28元;下午卖出23杯,每杯32元。
如果成本是售价的40%,今天的净利润是多少?
A: 948元
✅ 使用 CoT:
Q: [同上问题],请一步步计算。
A: 让我一步步分析:
1. 上午营收:15 × 28 = 420元
2. 下午营收:23 × 32 = 736元
3. 总营收:420 + 736 = 1156元
4. 总成本:1156 × 40% = 462.4元
5. 净利润:1156 - 462.4 = 693.6元
答案:693.6元
示例:
Q: 一个水池有两个进水管和一个出水管。甲管每小时注水10吨,
乙管每小时注水15吨,丙管每小时排水8吨。
如果三管同时开放,6小时后水池里有多少水?
A: 让我一步步思考:
1. 甲管进水速度:10吨/小时
2. 乙管进水速度:15吨/小时
3. 丙管出水速度:8吨/小时
4. 净增速度:10 + 15 - 8 = 17吨/小时
5. 6小时后:17 × 6 = 102吨
答案:102吨
现在请解答:[新问题]
Embedding 是将文本转换为固定维度的向量表示,使得语义相似的文本在向量空间中距离较近。
from openai import OpenAI
client = OpenAI()
# 生成 embedding
response = client.embeddings.create(
model="text-embedding-ada-002",
input="人工智能正在改变世界"
)
embedding = response.data[0].embedding
# embedding 是一个 1536 维的向量
print(f"维度: {len(embedding)}") # 1536
print(f"前5维: {embedding[:5]}")
| 模型 | 维度 | 特点 |
|---|---|---|
| OpenAI text-embedding-ada-002 | 1536 | 性能好,成本低 |
| Sentence-BERT | 768 | 开源,本地部署 |
| BGE (BAAI) | 1024 | 中文效果好 |
| Cohere Embed | 1024/4096 | 多语言支持 |
import numpy as np
def cosine_similarity(vec1, vec2):
"""计算余弦相似度"""
dot_product = np.dot(vec1, vec2)
norm1 = np.linalg.norm(vec1)
norm2 = np.linalg.norm(vec2)
return dot_product / (norm1 * norm2)
# 示例
text1 = "机器学习是人工智能的分支"
text2 = "深度学习是AI的重要领域"
text3 = "今天天气真好"
emb1 = get_embedding(text1)
emb2 = get_embedding(text2)
emb3 = get_embedding(text3)
print(cosine_similarity(emb1, emb2)) # 高相似度:0.85
print(cosine_similarity(emb1, emb3)) # 低相似度:0.12