← 返回面试准备

🧠 LLM 基础理论面试题

大模型原理、Prompt Engineering、Embedding 与向量检索

1. 大模型原理与架构

什么是 Transformer 架构?它解决了哪些问题? 中等
完美答案

Transformer 是一种基于自注意力机制的神经网络架构,由 Google 在 2017 年提出:

核心组成部分:

  • Self-Attention(自注意力机制):能够捕捉序列中任意两个位置之间的依赖关系
  • Multi-Head Attention(多头注意力):从多个子空间学习不同的表征
  • Position Encoding(位置编码):为序列中的每个位置添加位置信息
  • Feed-Forward Network(前馈网络):对每个位置独立进行非线性转换

解决的问题:

  • 长序列依赖:RNN/LSTM 难以捕捉长距离依赖,Transformer 通过注意力机制直接建立任意距离的连接
  • 并行化计算:RNN 必须顺序处理,Transformer 可以并行计算所有位置,训练效率大幅提升
  • 梯度消失:避免了 RNN 的梯度消失问题,信息可以直接传递

关键创新:

Attention 计算公式
Attention(Q, K, V) = softmax(QK^T / √d_k) · V

其中:
- Q (Query): 查询向量
- K (Key): 键向量
- V (Value): 值向量
- d_k: 键向量的维度(用于缩放)
💡 面试加分点:
  • 提到 "Attention is All You Need" 论文
  • 解释为什么除以 √d_k(防止 softmax 梯度过小)
  • 说明 Encoder-Decoder 结构的应用场景(翻译 vs 生成)
  • 对比 GPT(Decoder-only)和 BERT(Encoder-only)的区别
GPT 和 BERT 的架构有什么区别?各自适用于什么场景? 困难
完美答案

架构对比:

特征 GPT (Decoder-only) BERT (Encoder-only)
注意力机制 单向(因果)注意力 双向注意力
训练任务 下一个词预测(CLM) 掩码语言模型(MLM)+ NSP
应用场景 文本生成、对话、续写 文本分类、命名实体识别、问答
输入处理 从左到右,只能看到前文 可以同时看到上下文

GPT 架构特点:

  • 自回归生成:逐个生成 token,每次只能看到之前的内容
  • Causal Mask:使用掩码防止看到未来信息
  • 适合生成任务:擅长创作、对话、代码生成

BERT 架构特点:

  • 双向编码:同时考虑上下文信息
  • 掩码预测:随机遮盖 15% 的词进行预测
  • 适合理解任务:擅长分类、抽取、语义理解
⚠️ 常见误区:
  • GPT 不是不能做理解任务,只是需要通过 prompt 引导
  • BERT 虽然不擅长生成,但可以通过 fine-tune 做条件生成
  • 现代 LLM(如 GPT-3/4)通过海量数据也获得了强大的理解能力
💡 实际应用建议:
  • 需要生成内容:选 GPT 系列(文章、代码、对话)
  • 需要理解分类:选 BERT 系列(情感分析、实体识别)
  • 需要检索召回:使用 BERT 做 Embedding 编码
  • 需要端到端对话:GPT 更合适(可以持续生成)
什么是模型的预训练和微调(Fine-tuning)?有什么区别? 中等
完美答案

预训练(Pre-training):

  • 目标:在海量无标注数据上学习通用语言知识
  • 数据:通常使用互联网文本、书籍、代码等(TB 级别)
  • 任务:
    • GPT: 下一个词预测(Next Token Prediction)
    • BERT: 掩码语言模型(Masked Language Model)
  • 成本:需要大量算力(数千到数万GPU时)
  • 结果:得到一个具有通用能力的基础模型

微调(Fine-tuning):

  • 目标:在特定任务的数据上调整模型参数
  • 数据:使用任务相关的标注数据(通常几千到几万条)
  • 方法:
    • 全量微调:更新所有参数
    • LoRA:只训练少量额外参数
    • P-tuning:只优化 prompt 的表示
  • 成本:相对较低(几个到几十个GPU时)
微调流程示例(PyTorch)
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)
💡 实际项目建议:
  • 优先使用预训练模型:如 GPT-3.5、GPT-4、Llama 2
  • 数据量充足时:考虑全量微调或 LoRA
  • 数据量不足时:使用 Few-shot Learning 或 Prompt Engineering
  • 资源受限时:使用量化模型 + LoRA(成本降低 80%)

2. Prompt Engineering 技巧

什么是 Prompt Engineering?为什么重要? 简单
完美答案

Prompt Engineering 是设计和优化输入提示词的技术,用于引导大模型生成期望的输出。

为什么重要:

  • 模型能力激发:同一个模型,不同 prompt 效果差异巨大
  • 无需微调:通过优化 prompt 就能解决很多任务
  • 成本效益:相比微调,prompt 优化几乎零成本
  • 灵活性高:可以快速迭代和调整

基本原则:

Prompt 设计示例对比
❌ 不好的 Prompt:
"翻译这段话"

✅ 好的 Prompt:
"你是一位专业的英文翻译,请将以下中文翻译成地道的英文,
保持原文的语气和风格,注意专业术语的准确性。

中文:[原文]
英文:"

核心要素:

  • 角色定义:"你是一位...专家"
  • 任务说明:清晰描述要做什么
  • 输出格式:指定返回格式(JSON、列表等)
  • 示例引导:提供 Few-shot 示例
  • 约束条件:限制输出长度、风格等
💡 实用技巧:
  • 使用"请一步步思考"可以提高推理准确性(Chain of Thought)
  • 提供 2-3 个示例比 0-shot 效果通常好 30%+
  • 明确输出格式可以大幅降低解析错误
什么是 Few-shot Learning?如何设计有效的 Few-shot Prompt? 中等
完美答案

Few-shot Learning 概念:

通过在 prompt 中提供少量示例(通常 2-5 个),让模型学习任务模式并应用到新样本。

类型对比:

  • Zero-shot:不提供示例,直接描述任务
  • One-shot:提供 1 个示例
  • Few-shot:提供 2-5 个示例
  • Many-shot:提供更多示例(可能超过上下文长度)
Few-shot Prompt 示例:情感分类
任务:判断评论的情感倾向(积极/消极/中性)

示例1:
评论:这个产品质量真不错,物超所值!
情感:积极

示例2:
评论:配送速度太慢了,等了一周才到。
情感:消极

示例3:
评论:产品一般般,没什么特别的。
情感:中性

现在请分析:
评论:界面设计很漂亮,但是功能有点少。
情感:

设计原则:

  • 示例多样性:覆盖不同类型和难度
  • 格式一致:所有示例使用相同的格式
  • 示例质量:选择清晰、典型的样本
  • 顺序影响:最近的示例影响更大(Recency Bias)
Few-shot 实战:JSON 提取
请从文本中提取结构化信息,返回 JSON 格式。

示例1:
文本:张三,男,28岁,软件工程师,年薪30万
输出:{"name": "张三", "gender": "男", "age": 28, "job": "软件工程师", "salary": "30万"}

示例2:
文本:李四女士今年35岁,是一名产品经理
输出:{"name": "李四", "gender": "女", "age": 35, "job": "产品经理", "salary": null}

现在请提取:
文本:王五,26岁前端开发,月薪2万
💡 优化技巧:
  • 动态示例选择:根据输入相似度选择最相关的示例
  • 示例平衡:确保各类别示例数量平衡
  • 难度递进:从简单到复杂排列示例
  • 错误示例:有时加入错误示例+纠正可以提高效果
⚠️ 注意事项:
  • 示例过多会占用大量 token,增加成本
  • 示例偏差会导致模型输出偏差
  • 对于复杂任务,示例质量比数量更重要
什么是 Chain of Thought (CoT)?如何提高模型的推理能力? 中等
完美答案

Chain of Thought (思维链):

通过让模型展示中间推理步骤,提高复杂任务的准确性。

基本原理:

  • 显式推理:将隐式思考过程显式化
  • 步骤分解:将复杂问题分解为多个小步骤
  • 自我验证:每步推理可以被检查和纠正
不使用 CoT vs 使用 CoT
❌ 直接提问:
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元

CoT 变体:

  • Zero-shot CoT:只需加"Let's think step by step"
  • Few-shot CoT:提供带推理过程的示例
  • Self-Consistency:生成多个推理路径,投票选最优
  • Tree of Thoughts:探索多个推理分支
Few-shot CoT 示例
示例:
Q: 一个水池有两个进水管和一个出水管。甲管每小时注水10吨,
   乙管每小时注水15吨,丙管每小时排水8吨。
   如果三管同时开放,6小时后水池里有多少水?

A: 让我一步步思考:
1. 甲管进水速度:10吨/小时
2. 乙管进水速度:15吨/小时
3. 丙管出水速度:8吨/小时
4. 净增速度:10 + 15 - 8 = 17吨/小时
5. 6小时后:17 × 6 = 102吨

答案:102吨

现在请解答:[新问题]

适用场景:

  • 数学推理:应用题、方程求解
  • 逻辑推理:因果分析、条件判断
  • 常识推理:需要多步推理的常识问题
  • 代码调试:一步步分析代码逻辑
💡 实战经验:
  • CoT 对 GPT-3.5+ 等大模型效果显著,小模型可能效果有限
  • 数学类问题准确率可提升 30-50%
  • "请一步步思考"这个简单 prompt 往往足够有效
  • 结合 Self-Consistency(生成3-5次,取多数)可进一步提升

3. Embedding 与向量检索

什么是 Embedding?它在 LLM 中的作用是什么? 简单
完美答案

Embedding 是将文本转换为固定维度的向量表示,使得语义相似的文本在向量空间中距离较近。

核心概念:

  • 向量化:文本 → 数值向量(如 1536 维)
  • 语义表示:向量捕捉文本的语义信息
  • 相似度计算:通过向量距离衡量文本相似度
Embedding 示例(OpenAI API)
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]}")

在 LLM 中的作用:

  • 语义检索:根据语义相似度检索相关文档
  • RAG 系统:为检索增强生成提供基础
  • 聚类分析:文本分类、话题聚类
  • 推荐系统:基于内容的推荐
  • 异常检测:识别异常或不相关的文本

常用 Embedding 模型:

模型 维度 特点
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
💡 实用建议:
  • 选择 Embedding 模型时,优先考虑是否支持你的语言
  • 维度不是越高越好,要权衡性能和存储成本
  • 对于中文场景,BGE 或 M3E 效果通常好于通用模型
  • 缓存常用文本的 Embedding 可以节省成本
🎯 LLM 基础理论面试准备建议: