☰
自然语言处理与大模型期末复习指南:从NLP基础到RAG实战
2026/10/20 7:18:23 网站建设 项目流程

每到期末季,某高校2025秋的《自然语言处理基础与大模型》这门课,讨论热度总是居高不下。这门课严格来说分两大块:前半段是经典NLP基础,后半段是大模型相关技术。期末考核既有卷面理论题,也有动手实操项目,很多同学到了最后两周才开始着急。这篇文章我按课程的实际情况,把复习思路、核心考点、项目实操和踩坑经验都整理出来,希望能帮还在硬啃资料的同学少走点弯路。

先说明一下背景:这门课的考核一般由笔试和课程项目构成,笔试占比约40%-60%,项目占比约40%-60%,不同学期会有浮动。笔试以简答和计算推导为主,项目则要求完成一个可运行的大模型应用系统。也就是说,光会背概念不行,必须真的训练或调用过模型,得对数据、参数、评测都有体感。下面我按复习阶段、考点拆解、项目流程和常见坑四个部分展开,内容都是基于我们这学期上课和期末实战总结的,工程细节比较多。

1. 课程全景:从NLP基础到大模型的复习地图

1.1 这门课到底考什么

很多同学第一反应是“背背Transformer结构,记一下attention公式,再了解下ChatGPT的发展就完了”,但实际期末并没有这么简单。从往届题目和本学期平时的练习来看,笔试内容包括三个层次:

第一层是基础理论。比如n-gram语言模型、词向量(Word2Vec、GloVe)、RNN与LSTM的公式推导、注意力机制与Transformer的Encoder-Decoder结构。这些内容是必考的,占了大概四成分数。尤其是手动计算attention score、推导LSTM的梯度传播这类题,如果平时只看PPT不做推导,考试时基本会卡住。

第二层是预训练模型与大模型机制。重点包括BERT的预训练任务(MLM、NSP)、GPT的生成式预训练、指令微调(Instruction Tuning)、RLHF流程、LoRA与PEFT参数高效微调、RAG检索增强生成、上下文窗口与幻觉问题。这部分以概念解释、流程分析和对比题为主。

第三层是应用与设计题。会让你设计一个解决真实场景任务的系统,比如“给非技术用户做一个文档问答机器人”“给法律文书做摘要与关键词抽取”,要求说明模型选型、数据集来源、评测方法、部署方案。这种题考的不是背功,而是对整个pipeline有没有通盘理解,也是期末项目答辩时老师最喜欢追问的方向。

1.2 复习资源怎么排优先级

如果你的时间是两周,我强烈建议按“PPT + 作业 + 实验代码 + 代表性论文”来分配。

第一优先级是课程PPT和平时作业。老师PPT里反复强调的公式、经典图、对比表格,大概率会原模原样出现在考试中。平时作业的计算题,比如sigmoid梯度、softmax求导、cross-entropy loss的反向传播,务必自己完整推一遍。

第二优先级是实验代码。该课程一般会有两到三次实验,比如用HuggingFace训练一个文本分类模型,用transformers加载大模型做生成式问答。这些代码里的参数、数据预处理方式、训练循环、评测指标,都是期末项目的基础模板,不要只跑通就删掉,要能讲清每一处关键代码的作用。

第三优先级是经典论文和综述。不建议从原文逐字啃,重点看:Transformer的QKV计算、BERT的预训练任务、GPT的decoder-only结构、LoRA的原理、RAG的三段式流程、RLHF的奖励模型与PPO。论文里的图比文字更重要,读完要能自己画出来。

另外有一个很多人忽略的点:工具链的熟悉程度。考试前我会建议把所有实验代码在本地跑一遍,确认环境没坏、能稳定复现结果。因为期末项目答辩时,老师如果让你现场运行一个demo或改个参数,你连环境都起不来,印象分就会很糟糕。

2. 核心考点拆解:从词向量到大模型的安全得分点

2.1 NLP基础部分必须拿分的五个概念

词向量与分布式表示。考点集中在Word2Vec的两种训练方式:CBOW和Skip-gram。考试常问“为什么用负采样”“高频词为什么要降采样”“词向量做加法为什么能近似类比语义关系”。复习时把Word2Vec的损失函数写一遍,特别是logistic回归形式的负采样目标函数,就不慌了。

n-gram语言模型与困惑度。要会计算给定语料的bigram概率,也要求写出困惑度(Perplexity)公式。注意一个细节:PPL是对句子概率取几何平均后的倒数,所以PPL越低越好。考试可能给一个小语料,让你算一个简单句子的PPL,这种题就是送分题,千万不要因为公式记混丢分。

RNN与LSTM。常考LSTM的三个门(输入门、遗忘门、输出门)公式,以及如何缓解梯度消失。面试和考试都喜欢问“为什么LSTM能解决长依赖”,答案是细胞状态(cell state)上的加性更新,让梯度可以跨时间步传递。如果题目给了一个带数值的单元状态,让你手算一次更新,只要照着公式带数字就能算出来。

Attention与Transformer。这是重中之重。不仅要把scale dot-product attention公式写出来,还要能解释为什么除以根号d_k。考试常考两种题:一是计算题,给定Q、K、V矩阵,手动算attention输出;二是简答题,解释Transformer相比RNN的优势,比如并行计算、长距离依赖捕捉更好。

序列标注任务。包括分词、词性标注、命名实体识别(NER)。考点是CRF的条件概率公式、维特比算法的思想、BIO标注方案。现在很多任务已经不需要手写CRF,但原理题仍可能出现,比如“为什么在序列标注中softmax独立分类效果不如CRF”,答案是标签之间的转移依赖。

2.2 大模型部分的高频考点

BERT与GPT的本质区别。一句话概括:BERT是encoder-only,用双向上下文做理解任务;GPT是decoder-only,用单向上下文做生成任务。考试可能会扩展到“为什么GPT可以统一多种任务”。复习时建议画一张图,把预训练目标和下游任务适配方式对比。

指令微调与上下文学习。需要理解Instruction Tuning本质上是把各个任务的输入输出格式统一成自然语言指令,让模型学会“听指令”。上下文学习(In-Context Learning)则是不改参数,通过给few-shot例子让模型完成新任务。笔试简答题里,很容易混淆“微调”和“提示工程”的区别,记住一个关键点:微调会更新模型权重,提示工程不会。

RLHF的三阶段流程。阶段一是监督微调(SFT),阶段二是用人类偏好数据训练奖励模型(Reward Model),阶段三是用强化学习(PPO)优化策略模型。考试喜欢让你画出流程图并说明每一阶段的数据格式和损失函数。复习时把三阶段的名字和核心损失函数(比如奖励模型的ranking loss、PPO的ratio与clip操作)梳理清楚。

LoRA与参数高效微调。LoRA核心思想是冻结预训练权重,在矩阵乘法路径旁插入低秩矩阵。需要掌握:低秩矩阵维度r的设定、最终权重更新公式 (W' = W + BA),以及为什么LoRA能降低显存消耗。今年期末项目里很多同学选择用LoRA微调,答辩时老师基本都会追问这几个细节。

RAG检索增强生成。包括索引构建(文档切分、embedding、向量库)、检索(相似度计算)、生成(把检索结果拼进Prompt)。高频考点是“RAG能解决幻觉问题的哪些方面”,以及如何设计一个RAG系统。别忘了提到chunk size对检索质量的影响,这属于踩过坑才有体感的细节。

2.3 相似概念的易混点对比

对比项核心区别期末答题要点
Word2Vec vs GloVeWord2Vec用局部上下文窗口,GloVe利用全局共现统计提到全局统计信息即可
BERT vs GPTencoder双向 vs decoder单向影响预训练任务和下游适应方式
SFT vs RLHFSFT模仿人类回答,RLHF通过奖励优化偏好RLHF包含奖励模型与PPO
全量微调 vs LoRA是否更新全部参数、显存成本LoRA用低秩矩阵减少可训练参数
RAG vs 微调RAG改输入上下文,微调改模型权重解决知识更新的角度不同
传统CRF vs 深度学习序列标注显式建模标签转移 vs 基于上下文特征CRF可以约束标签合法性

这张表建议考前自己默写一遍,考试时遇到“比较题”直接按照“定义、结构、训练方式、适用场景”四要素展开,分数不会低。

3. 期末实操项目:从零完成一个基于大模型的问答系统

3.1 选题与数据准备

期末项目要求一般很开放,往届常见选题包括:文本分类助手、FAQ问答机器人、文档摘要工具、情感分析、命名实体识别demo。但今年明显偏向大模型应用,即要求调用或微调一个大模型,完成任务。我的建议是选一个“数据容易获取且评测相对客观”的题目,不要一上来就做多轮开放对话,因为主观性太强,答辩容易翻车。

我当时选的题目是“某知识库问答系统”:给一堆课程讲义txt,让模型回答“哪些概念在文档里被提及”,并要求给出依据。这样既用到了RAG流程,又能通过检索命中率客观打分。前期数据准备做了一个小工具,把PDF、docx统一转成txt,再按段落切分。切分时一开始没经验,直接按字符长度切,结果把表格和标题切成两半,检索效果很差。

后来改用结构感知切分:PDF解析后用“章节标题 + 段落”为单位,每个chunk控制在300~500字,前后重叠50~100字。这样检索到的片段语义完整,生成的引用也能对得上原文。数据清洗时要注意编码问题,很多导出的txt是GBK编码,代码里统一用utf-8读取并忽略无效字符。

3.2 模型选型与显存估算

大模型选择上,有两条路线:本地微调路线和API调用路线。本地微调适合学校提供的计算资源充足的情况,四条A卡能跑起来;API调用则适合快速做demo,但答辩证时如果老师问“数据去哪里了”“隐私怎么保障”,你得有预案。

选型时可以按参数量划分:7B量级模型是单卡可微调的甜点,13B量级需要多卡或量化,70B及以上一般只能做推理。我用的某个7B模型,在单张消费级卡上做LoRA微调,显存占用大约12-15GB左右,勉强能跑。如果只用推理不微调,7B模型在8GB显存下也可以通过4-bit量化运行,速度会慢一些。

显存估算公式我直接给你:模型显存约为参数量 × 每个参数的字节数。比如7B参数,全精度FP16为7e9×2字节=14GB,再加上优化器状态、梯度、激活值,全量微调至少需要40GB以上,所以一般选LoRA。LoRA的显存需求大约是:加载基础模型14GB + 可训练低秩矩阵和优化器状态1~2GB + 激活值若干,所以16GB单卡基本可行。

3.3 微调与推理的关键代码

这里给一个基于HuggingFace的LoRA微调代码框架,是我改完能直接跑的版本。

from datasets import load_dataset from transformers import ( AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer, DataCollatorForLanguageModeling ) from peft import LoraConfig, get_peft_model, TaskType model_path = "your-base-model" tokenizer = AutoTokenizer.from_pretrained(model_path) tokenizer.pad_token = tokenizer.eos_token model = AutoModelForCausalLM.from_pretrained( model_path, torch_dtype="auto", device_map="auto" ) lora_config = LoraConfig( task_type=TaskType.CAUSAL_LM, r=8, lora_alpha=32, lora_dropout=0.05, target_modules=["q_proj", "v_proj", "k_proj", "o_proj"], ) peft_model = get_peft_model(model, lora_config) peft_model.print_trainable_parameters() def tokenize_function(examples): outputs = tokenizer( examples["text"], truncation=True, max_length=1024 ) outputs["labels"] = outputs["input_ids"] return outputs dataset = load_dataset("json", data_files="train.jsonl")["train"] tokenized_dataset = dataset.map(tokenize_function, batched=True) training_args = TrainingArguments( output_dir="./lora-qa", per_device_train_batch_size=2, gradient_accumulation_steps=4, learning_rate=2e-4, num_train_epochs=3, fp16=True, logging_steps=10, save_steps=500, ) trainer = Trainer( model=peft_model, args=training_args, train_dataset=tokenized_dataset, data_collator=DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False), ) trainer.train()

几个容易出错的地方:一是数据集格式,最好每行是一个JSON对象,包含一个text字段,内容用“指令+回答”拼好;二是labels一定要设置,否则因果语言模型损失算不了;三是如果显存紧张,把per_device_train_batch_size降到1,然后调大gradient_accumulation_steps,效果等同于扩大batch size。

推理阶段可以用现成的AutoModelForCausalLM加载微调后的checkpoint,再写一个generate函数。注意max_new_tokens别设太小,否则生成到一半就截断;temperature在问答场景建议设为0.1~0.3,太高模型容易自由发挥。

3.4 评测指标怎么设计才有说服力

期末项目答辩最怕的就是老师说“你的系统到底好不好”。如果你只说“看起来还不错”,基本等于送命。建议按任务类型准备两个维度的指标。

对于检索部分,用命中率(Recall@k)和MRR。我当时的做法是构造50对“问题-正确文档片段”,然后检索排名前50的结果里能出现正确片段的比例。RAG系统里,召回率比精确率更重要,因为生成模型可以容忍一些噪声,但不能漏掉关键信息。

对于生成回答,用ROUGE和BERTScore对比标准答案。因为问答是抽取式的,ROUGE-L会比较合适。注意指标只能说明相关性,还要人工抽查10-20个回答,检查是否包含幻觉内容,比如“回答里提到文档不存在的日期或结论”。在答辩PPT里,我放了一个表格,横向对比三种方法:纯模型生成、RAG检索+模型生成、微调+RAG结合,结果很明显,最后一种在ROUGE-L和人工打分上高出一截。这种对比数据能让答辩更有底气。

4. 常见问题与避坑实录

4.1 训练Loss不下降怎么办

这是期末项目问得最多的问题。我遇到过的原因有三个:

数据格式错误。模型输入全是同一个模板,模型学会输出模板但学不到内容,loss虽然降了,生成结果却全是模板。解决方法是检查数据里的输入输出是否真的一致,尤其是标点符号和换行符。

学习率太大或太小。LoRA常用的学习率在1e-4到3e-4之间。如果loss一上来就是nan,多半是学习率太大或fp16精度溢出,把learning_rate下调到1e-5再试。

tokenizer特殊符号处理错误。比如忘了设置pad_token,或者数据的填入方式不一致,导致模型在padding位上也计算loss。我后面把非input_ids的位置在labels中设为-100,loss才正常。

4.2 模型输出了正确的事实但引用位置错误

RAG系统有个经典问题:检索回来的chunk是对的,但生成的回答里标了错误的来源编号。这是因为模型在生成时自己编了引用格式,并没有真正“对齐”到检索片段。打通方案是限制prompt,让模型只能输出“根据片段1:xxx”这样的格式,如果片段里没有答案就直接说“文档未提及”。再不行就做一个后处理规则:回答中提到片段编号时,检查对应片段是否真的包含该内容,不包含就把引用替换成“未知来源”。

另外注意chunk切分会直接影响引用正确性。如果切分太碎,一个完整的定义被切成两半,模型引用了后半段但前半段的内容没出现,老师一翻原文就觉得你的系统不严谨。解决办法是保留段落边界,并对重复内容做去重。

4.3 计算资源不够时的替代方案

很多组到最后才说“我们只有一张卡,微调跑不动”。如果你也遇到这个情况,优先做三件事:

第一,量化加载。用load_in_4bit=True配合bitsandbytes,把基础模型压到4-bit,再在上面做LoRA。这样7B模型加载占4GB左右,单卡16GB仍可训练。

第二,缩小训练数据规模。不需要整个数据集都进训练,可以把精选后的500~1000条高质量数据拿来微调,效果未必比几千条差。数据质量比数量重要,这是大模型可塑性强的特点。

第三,放弃微调,改为纯RAG + Prompt优化。大部分期末任务是知识问答、摘要、分类,只要检索够好,一个7B模型的zero-shot能力就已经能拿到不错的分数。微调属于锦上添花,别本末倒置。

4.4 期末答辩容易被追问的三个问题

答辩老师很喜欢围绕“泛化性”和“工程细节”提问,比如:

“你的方法换一批数据还能用吗?” 回答思路:说明数据预处理模块和模型训练模块是解耦的,新增数据只需走到同一个pipeline,不需要改代码。

“为什么选择这个模型而不是更大的模型?” 回答思路:结合显存、推理速度、任务需求说。不要只说资源不够,最好说“经过对比,该7B模型在任务准确率上已达到13B模型的95%以上,但推理速度提高2倍”。

“你的系统有没有失败案例?” 这里千万别答“没有”。老师会认为你根本没做测试。老实说“在对多文档片段进行聚合回答时,存在信息冲突,我们的策略是优先采用时间更新或用户指定权重”,反而能展示你考虑得全面。

5. 考前速记与个人体会

到了考前最后一天,不要再去啃LoRA的论文或RLHF的数学细节了。把以下几项过一遍:Transformer架构图画一遍,每个子层和维度标清楚;BERT和GPT的预训练目标用一句话说出区别;RAG的三段式流程能默写;LoRA的更新公式能写出来。这些都是高频考点,也是期末项目里实际操作的内容,趁临考前做到“指哪打哪”。

我个人这一学期下来最深的感触是,这门课如果说有秘诀,那就是尽早把实验环境搭好,并让代码模板跑通。哪怕你后面换任务、换模型,只要有一个可靠的工程基座,剩下的都是改数据和改参数而已。很多同学期末熬夜并不是因为复习任务重,而是前期实验环境没搞定,最后才发现连模型都加载不了。

最后再分享一个小技巧:答辩前把项目的README写好,里面包含环境版本、运行命令、数据格式、评测脚本。老师如果觉得你的项目不错,会想自己跑一跑,一个清晰的README往往让印象分直接拉满。期末成绩不是靠突击背出来的,而是靠平时把每一步做扎实,考试和答辩自然水到渠成。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询