目录
基础概念
LLM应用
基础概念
训练:前向计算+反向传播(算梯度、更新权重)
推理:前向计算
微调:使用预训练模型在带标注的数据集上训练,过程中算法工程师主要关注loss曲线和LR
- 全参数微调Full Fine-tuning,FFT:重新训练预训练模型的所有参数
- 低秩自适应LoRA(Low-rank adaptation):原有预训练模型参数不变,新增参数,训练过程只改变这些新挂接的参数。Transformers的LoRA库是PEFT
- QLoRA:把原有的预训练模型参数压缩,原本一个数字用16-bit存,现在只用4-bit存。Transformers库是BitsAndBytes
token:词块,并不等同于最后生成的答案,例如“人工智能”这 4 个字。优化好的模型(如 Qwen)可能会把它识别为 1 个 Token;而没优化的模型可能会把它拆成 4 个甚至更多 Token。并且符合、空格换行等也算token,或者一个生僻字可能会被拆成多个音节,那么它就占了多个token。(api调用的大模型返回completion_tokens代表该回答使用了多少token)
双向:模型能看到之前和之后的词。训练方式为把中间的词mask,然后让模型根据前后的词预测。BERT
单向:模型只能看到之前的词。给前3个词,让模型预测第4个词。也是模型生成能力的来源,GPT、qwen、Llama
分词器tokenzier:将自然语言翻译成大模型能理解的机器语言
- 切分:将句子切成一个个块,例如”大模型”可能会被切成”大”和”模型”
- 映射:给每一个词按照词典映射成一个ID,例如”模型”->[121, 108]
- 还原:LLM输出数字后,将数字还原成文字
损失函数loss:微调的目标是为了让模型生成的答案更接近SFT里的output,loss函数就是用来衡量生成答案和output之间差距的尺子。一个微调训练必须有一个损失函数,其会在正向计算结束后立即介入
学习率LR:损失函数计算出梯度(误差的方向和大小)后,需要乘以学习率才是最终模型参数需要挪动的距离。即学习率越高,参数更新越大
- 当前业界一般采用动态学习率,例如在刚启动训练时学习率需从0缓慢升到设定值(预热)
温度Temperature:惊喜值,控制随机性和创造力,越高答案越随机,越地答案越准确
maxToken:给生成的回答设定的物理上限,控制长度、节约成本、防止死循环
Transformers:Hugging Face开发的一套Python库,把复杂的深度学习模型架构(BERT、GPT、Llama、Qwen)进行了封装,同时支持PyTorch和TensorFlow,在没有这个库之前想要使用BERT需要写上几百行代码,现在只需要3行就能调用BERT这个世界顶级的预训练模型
自注意力机制:一个词在理解自己的同时,能自动地看向句子中其他的词,从而更确定自己在当前语境下的含义。在Transformers中自注意力机制是,每一个字(token)会被转化为三个向量,Query、Key、Value
以”小明骑自行车”中的”小明”为例
- Q:”我要去找一个动作,看看我做了什么”->在句子中找到了”骑”的K符合要求
- K:”我是主语、我是名词、我是人”->句子中的其他字,例如”骑”的Q在找主语时会匹配到这个K
- V:”我是具体叫小明的那个人,我有头发 我身高165 是个学生”,其他Q匹配到这个K时,模型就会把这个V提取出来,融合到最终理解中
AutoModel:Transformers库里的工具,只需要传入模型名,自动去匹配加载对应模型
Hugging Face:社区,Transformers项目诞生地,也是全球最大的AI模型库,包含模型权重、数据集和demo
LangChain:python的开源库,也是一种思想。当前业界常见做法是编排和智能共存,即部分步骤用人为写好的编排,部分步骤交给Agent规划
- 零件层:手动拼接字符串Prompt、构造发送http请求、解析LLM返回的JSON等脏活、RAG的实现(和LlamaIndex功能一样)
- 编排层:人为制定好流程,步骤1->步骤2->…..
- Agent智能层:告诉模型自然语言,让模型自动去规划编排步骤。
深度学习框架:PyTorch(统治地位)、TensorFlow(传统,C++支持较好)、JAX(谷歌最新推出,性能好),提供底层的数学计算能力,大模型的本质是矩阵计算和求导,如何把数据传给显卡让其计算、利用GPU的CUDA核、管理显存、计算梯度并更新模型参数这些最脏最累的活都由深度学习框架来做,还有比如多张显卡来实现分布式计算这种操作也由其管理
Map-Reduce策略:将执行内容分割成一个类似map的结构,map的每个key对应部分执行内容,分别执行完成后再汇总。常用于RAG文档过长,导致模型上下文窗口无法完全载入使用。
vLLM:在用户和LLM展开会话时,为了记住之前的对话内容,需要把这些内容放在显存里,比如Pytorch会为每次请求预留一大块连续显存。vLLM参考操作系统的虚拟内存思想提出了分页注意力机制,将KV cache拆成一个个分页,哪里有空间就塞到哪里,提高显存利用率,并且在用户针对某一个文章重复提问时,可以重复利用
● 比起pyTorch原生的批处理(同时来4个请求,需要4个都生成完答案才能返回),vLLM可以一个请求结束就空出位置,给下一个请求计算,保证显卡不空转
KV Cache:大模型的推理过程是,输入”你好吗”,根据”你好吗”->预测出第一个字”我”,根据”你好吗 我”->预测出”我很”……最后得出回答”我很好”。处理每个字都会产生K和V两个关键矩阵,KV Cache作用就是把之前已经计算出来的KV做缓存,避免后续重复计算。所以KV Cache能极大地提高推理速度,但是很吃显存,和算法题一样用空间换时间
- 原理在于“你”中你的KV和“你好吗”中你的KV是一模一样的
微调用标注数据集:用于微调用的数据集,微调过程就是让大模型根据指令instruction+输入input生成回答,然后一次次地调整参数让大模型生成的回答概率上更接近于输出output
1 | { |
MoE混合专家架构:传统模型在一个推理进来的时候会经过所有的参数计算,也叫Dense稠密模型,MoE模型是在神经网络每一层不视作一个矩阵,而是多个小矩阵,每个推理过此层时根据router判断只激活相关的小矩阵去进行计算
- 优点:时间换空间,保证生成质量的同时推理速度快
- 缺点:显存占用依旧大,需要将完整的参数放进显存;进行LoRA微调后可能会出现路由坍塌(例如:所有的token在某层只去激活特定的几个矩阵,导致57B模型效果退化为7B)
- 路由坍塌的解决办法:负载均衡,强制router把流量均匀分给各专家,或者LoRA只微调新增参数部分
LLM应用
1.LangChain框架:模块化的框架,用于将LLM与其他组件(数据源、代理等)相结合来实现一个完整应用
- Agent:LLM结合工具实现多步推理和行动
- Chain:顺序执行多个组件(如Prompt+LLM)
- Loaders:从各种数据源加载数据
- Prompts:管理和构建发给LLM的提示
- Memory:在多轮对话中保持上下文记忆
- Retrieval:从外部知识库检索信息
2.检索增强生成RAG:一种思想,根据私有文档丰富大模型知识的技术,解决大模型训练完成后无法获取新知识的弊端
- 检索:根据用户提问到文档库里找到相关的一部分知识
- 进阶版可以加上精排,例如对检索到的结果,用Rerank模型根据用户的提问进行重排序
- 增强:将这部分知识塞进用户的提问中
- 例如:比如用户问:“我下周能请假吗?”会把搜到的《公司请假制度》里的那段话塞进去。
- 生成:LLM看到用户提问+检索到的知识生成回答
LlamaIndex:Python的开源库,RAG的具体实现 - 加载、清洗
- 切片:固定500个字符切一次、尽可能保留完整性以/n为分隔符切、每次切片保留上次切片末尾的50-100字符重叠来保证连贯性
- 打标签:为每个切片标记来自于原始文档哪个位置(给每个向量新增一个元数据,最后一起放进向量数据库里)
- 向量化:使用预训练的词嵌入模型来做
- 入库:存入向量数据库,向量、对应文本、元数据都放入向量数据库
3.一个完整的Agent包括以下部分
- 大脑LLM
- 记忆Memory
- 工具Tools
- 规划Planning