
浅谈大模型(含本地部署deepseek)
大模型的发展速度越来越快,已经充斥着当今各行各业,今天我将简单的介绍一下大模型的基本原理以及使用方法。
一.大模型的分类
按照应用场景,大模型可以分为
1.大语言模型(LLM):
这类大模型专注于自然语言处理(NLP)
2.多模态模型:
多模态大模型能够同时处理和理解来自不同感知通道(如文本、图像、音频、视频等)的数据,并在这些模态之间建立关联和交互
二.大模型是如何工作的
大模型的工作流程可以分为两部分,第一部分是分词化与词表映射,第二部分为生成文本
分词化(Tokenization):将段落和句子分割成更小的分词(token)的过程
大语言模型生成文本的过程:根据给定的文本预测下一个token(根据下一个分词的概率的不同做出不同的选择)
三.大模型的应用
1.文本生成与创作
在工作中,我们会用大模型来帮我们生成文本内容,只要描述清晰任务和细节,大模型就可以实现文案创意、专题写作、代码生成等各种文本生成任务
2.写代码与技术问题解决
在编程领域,通过提示词提供清晰的任务描述,生成准确的代码片段或解决特定编程问题的方案
3.智能客服
大模型技术在智能客服和营销领域的应用,通过自然语言理解和生成能力,提升客户服务体验和营销效果
四,提问方法(Prompt提示词工程)
1.零样本提示
在提问过程中不给出示例,由大模型自行理解并给出答案
2.少样本提示
在提示词中(通常几个或几十个)示例,也称为少样本提示(Few-Shot Prompting),以帮助模型更好地理解任务要求和期望输出
增加示例的方法
精选代表性样本:选择具有代表性的实例,覆盖任务的各种情况,同时避免使用可能引起模型混淆的极端或边缘案例,确保模型能从有限的数据中学习到任务的核心特性
保证示例的多样性:尽可能覆盖任务的各种角度和情境,确保模型能从有限的数据中学习到任务的核心特征
使用相似的格式和结构:在所有的示例中使用相似的提示格式和结构,使模型能够清晰识别输入与输出的关系
让大语言模型生成示例:实践时,我们还可以先让LLM按照提示生成一些示例,再进行筛选或人工调整,以提高示例质量和针对性
3.角色扮演
赋予模型一个具体的角色或身份,如“作为经验丰富的营养师”,来引导模型在特定角色视角下生成回答
需要专业知识或特定视角的问题解答。例如,模拟老师、医生、律师等回答相关领域的问题
模拟特定人物或角色的语言风格。例如,模仿某个著名人物(如历史人物或文学角色)语言风格的文本时。
以及设定一些具体的情境和逻辑对话内容
4.思维链
把一个复杂的任务,拆分成多个稍微简单的任务,让大语言模型分步来思考问题,称为思维链(Chain-of-Thought Prompting,CoT)提示,这种方式可让大语言模型像人类一样逐步理解或进行推理,从而极大地提升LLM的能力
五.大模型API的调用
1.本地部署大模型(deepseek)
1.官网下载ollama(windows):https://ollama.com/download
2.按照指示安装ollama
3.本机cmd窗口输入ollama run deepseek-r1:8b(根据显卡级别选择合适版本)
deepseek本地部署完成
4.使用dify实现私有知识库以及大模型调试(此处我选择部署在虚拟机Linux系统中)
5.进入github官网拉取镜像 https://github.com/langgenius/dify
6.LInux部署dify 启动 Dify
# 进入dify-main
cd docker-main
# 处理依赖
docker compose up -d
将dify-main/docker路径下的.env-example改名为.env
并在其文件末尾添加如下两行
# 启用自定义模型
CUSTOM_MODEL_ENABLED=true
# 指定Ollama的API地址(根据部署环境调整IP)
OLLAMA_API_BASE_URL=宿主机IP:11434
由于dify和ollama部署在不同环境,需要开通防火墙使端口通信(默认11434)
打开虚拟机主页(以VMware为例)
要注意你的虚拟机需要是NAT模式
最后点击确定、应用。
同样的,我们还需要打开宿主机上11434端口的可监听性
在Windows宿主机上,允许11434端口的入站连接:
-
打开“控制面板” → “Windows Defender 防火墙” → “高级设置”。
-
新建入站规则:选择“端口” → TCP 11434 → 允许连接。
此时访问虚拟机上的dify容器
点击右上角设置,选择模型供应商,安装ollama(我这里已经安装)
点击保存即可进入调试
2.调用现有大模型接口
目前市场上有许多的大模型api可供使用,比如Chat-GPT、Chat GLM、Deepseek等,不过由于其服务商不同,调用是否免费以及是否支持微调,主要还是根据其服务条款
以当前免费的Chat GLM-4-Fllash为例,我将展示其简单的调用方法。
具体详细操作见 https://www.bigmodel.cn/dev/api/normal-model/glm-4
示例环境:python
首先我们要注册一个API key
进入deepseek官方接口文档:首次调用 API | DeepSeek API Docs
右上角点击deepseek platform,其中可以注册得到你的api key
执行以下代码
#下载并导入相关组件
from openai import OpenAI
#声明客户端
client = OpenAI(api_key="你注册的key", base_url="https://api.deepseek.com")
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "你是一个智能助手"},
{"role": "user", "content": "你好"},
],
stream=False
)
print(response.choices[0].message.content)
同样可以将其封装为一个方法执行调用
from openai import OpenAI
def ai(message):
client = OpenAI(api_key="你注册的key", base_url="https://api.deepseek.com")
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "你是一个智能助手"},
{"role": "user", "content": message},
],
stream=False
)
print(response.choices[0].message.content)
# 调用方法
ai(message="你是谁")
运行结果
六.大模型原理和调试
1.Agents
agent流程图
Memory:短期记忆,是指在执行过程中的上下文,会在子任务的执行过程产生和暂存,在任务完结后被清 空,长期记忆是长时间保留的信息,一般是指外部知识库,通常用向量数据库来存储和检索。(短期记忆和长 期记忆应用于不同的场景,比如同一个用户使用服务时对上下文进行回顾)
Planning:智能体会把大型任务分解为子任务,并规划执行任务的流程;智能体会对任务的执行过程进行思 考和反思,从而决定继续执行任务,或判断任务完结并终止执行
Tools:为智能体配备工具API,比如:计算器、搜索工具、代码执行器、数据库查询工具等,有了这些API, 智能体就可以与物理世界交互,解决实际问题。
Action:智能体具体的执行操作
agent执行机制
仅思考和仅执行都是不可取的,需要同时兼备两者(ReAct)
agent记忆机制
形成记忆:大模型在大量包含世界知识的数据集上进行预训练。在预训练中,大模型通过调整神经元的权重来 学习理解和生成人类语言,这可以被视为“记忆”的形成过程。通过使用深度学习和梯度下降技术,大模型可以 不断 提高基于预测或生产文本的能力,进而形成世界记忆或长期记忆
短期记忆:在当前任务执行过程中所产生的信息,比如某个工具或某个子任务执行的结果,会写入短期记忆 中。记忆在当前任务过程中产生和暂存,在任务完结后被清空。
长期记忆:长期记忆是长时间保留的信息。一般是指外部知识库,通常用向量数据库来存储进和检索。
agent工具使用
Agent可以通过学习外部调用API来获取模型权重中所缺少的额外信息,这些信息包括当前信息、代码执行能 力和访问专有信息源等,这对于预训练以后难以修改的模型权重来说是非常重要的。
agent可以利用外部工具来突破自身认知的限制,提升其能力。
此处的工具是指本地工具,其中预制工具指大模型中提前定义封装好的工具;自定义工具是由用户自己自定义 一些工具来完成自己想要的效果,一般是代码层面。
工具集则一般指外部服务,调用外部的API来完成任务,(例如微软服务)
2.RAG
RAG,也称为检索增强生成,是利用个人或私域数据增强LLM的一种范式。通常,它包含两个阶段:
1.索引
构建知识库
该阶段会用到以下工具或组件:
Data connectors
数据连接器。他负责将来自不同数据源的不同格式的数据注入,并转换为Index支持的文(Document) 表现形式,其中包含了文本和元数据
Documents/Node
Document是Index中容器的概念,他可以包含任何数据源,包括,PDF文档,API响应,或来自数据库 的数据
Node是Index中数据的最小单元,代表了一个Document的分块。他还包含元数据,以及与其他Node的 关系信息。这使得更精确的检索操作成为可能。
Data Indexs
Index提供便利的工具,帮助开发者为注入的数据建立索引,使得未来的检索简单而有效。
最常用的索引是想来那个存储索引-VectorStoreIndex。
2.查询
从知识库检索相关上下文信息,以辅助LLM回答问题
在查询阶段,RAG管道根据的用户查询,检索最相关的上下文,并将其与查询一起,传递给LLM,以合成响应。这使LLM能够获得不在其原始训练数据中的最新知识,同时也减少了虚构内容。该阶段的关键挑战在于检索、编排和基于知识库的推理。
LlamaIndex提供可组合的模块,帮助开发者构建和集成RAG管道,用于问答、聊天机器人或作为代理的一部分。这些构建块可以根据排名偏好进行定制,并组合起来,以结构化的方式基于多个知识库进行推理。
该阶段的构建块包括:
●Retrievers
检索器。它定义如何高效地从知识库,基于查询,检索相关上下文信息。
● Node Postprocessors
Node后处理器。它对一系列文档节点(Node)实施转换,过滤,或排名。
Response Synthesizers
响应合成器。它基于用户的查询,和一组检索到的文本块(形成上下文),利用LLM生成响应。
RAG管道包括:
● Query Engines
管询引擎一端到端的管道,地许用户基于知识库,以自然语言提间,并跃得回客,以及相关的上下文。
● CHBT Engines
聊天引擎-端到端的管道,允许用尸基于知识犀进行对送(多次交互,会话历史)
● Agents
代理。它是一种由M驱动的目动化决策器。代理可以像查询引掌或聊天引擎一样使用。主要区别在于,代理动态地决定最佳的动作序列,而不是遵循预定的逻辑。这为其提供了处理更复杂任务的额外灵活性。
3.什么是微调
微调是指在一个已经预训练好的模型基础上,利用特定领域的数据集进行二次训练的过程。这一过程可以帮助模型更好的理解目标任务的特点,从而提高其在特定任务上的表现,也就是让大模型的预测更加准确。
1.微调的基本步骤
1.准备数据
数据收集:根据具体的应用场景,收集与目标任务相关的数据。例如,如果目标是改进一个聊天机器人的问答能力,那么就需要收集大量的人机对话记录。
数据清洗:去除噪声数据、重复项和无关信息,确保数据质量。此外,还需要进行适当的预处理,比如分词、标准化文本格式等。
2.选择基线模型
根据任务的具体需求选择合适的基础模型。例如,对于文本生成任务,可以选择基于Transformer架构的模型;而对于文本分类,则可以选择BERT等模型。
需要考虑的因素包括模型的复杂度、可用的预训练权重以及模型的可扩展性等
3.设计损失函数
损失函数用于量化模型预测与实际标签之间的差距。选择合适的损失函数对于引导魔性学习至关重要。
常见的损失函数有交叉熵损失(Cross-Entropy Loss)用于分类任务,均方误差(Mean Squared Error,MSE)用于回归任务等。
4.微调参数设置
学习率:决定模型参数更新的速度。过高可能导致模型不稳定,过低则会导致收敛速度慢。
批次大小(Batch Size):每次梯度更新所使用的样本数量。较大的批次可以提高训练效率,但可能增加内存占用
迭代次数(Epochs):完整遍历一次训练集的次数。过多的迭代可能导致过拟合。
5.训练与验证
使用准备好的数据集训练模型,并定期使用验证集评估模型的性能。
监控训练过程中的关键指标,如准确率、损失值等,以便及时调整训练策略。
6.超参数调整
根据验证集上的表现调整模型的超参数,以优化模型性能。
可以使用网络搜索(Grid Search)、随机搜索(Random Search)或贝叶斯优化(Bayesian Optimization)等方法进行自动化的超参数优化。
4.微调中的难点
1.数据偏差
如果训练数据集存在偏差,如样本分布不均衡,模型可能会倾向于某一类样本而忽视其他类别,导致性能 下降。
解决方法包括增加样本多样性、使用数据增强技术、重采样不平衡的数据集等。
2.过拟合问题
当模型在训练集上表现很好而在验证集或测试集上表现不佳时,表明发生了过拟合。
解决方案包括使用正则化技术(如L1/L2正则化)、早停法(Early Stopping)等。
3.计算资源限制
大模型的训练通常需要大量的GPU资源和存储空间。
可以考虑使用云服务提供商提供的计算资源、模型压缩技术或者分布式训练方法。
4.模型稳定性
不同的初始化方式和训练策略可能会导致模型性能波动
采用更好的初始化策略、调整学习率调度策略、增加模型的正则化方法可以提升模型的稳定性
5.任务适应性
将预训练模型的知识迁移到新的任务上并非易事,因为不同任务之间可能存在差异。
可以尝试使用迁移学习技术,如冻结部分模型、添加额外的任务特定层等方法来帮助模型更好的适应新任务
5.微调的步骤
调试大模型是一个复杂且系统化的过程,需要结合数据、模型结构、训练策略和硬件资源等多方面进行优化。
这里暂时不使用工具进行微调,主要讲解微调的基本核心步骤
1.数据检查与预处理
-
数据质量分析:
-
检查数据集的分布(如类别平衡、噪声数据、缺失值)。
-
验证标注准确性(尤其是监督学习任务)。
-
分析数据多样性(避免过拟合特定模式)。
-
-
预处理验证:
-
确保数据预处理(如归一化、分词、数据增强)与模型预期输入一致。
-
通过可视化(如图像、文本片段)确认预处理后的数据合理。
-
-
小样本测试:
-
用极小的子集(如几十条样本)快速测试模型是否能过拟合,验证数据流和模型的基础能力。
-
2.模型结构与代码验证
-
代码逐层检查:
-
核对模型结构(如层数、参数维度、激活函数)是否符合设计。
-
对比开源实现(如Hugging Face、官方代码库)排除低级错误。
-
-
梯度与参数初始化:
-
检查梯度是否正常(避免梯度消失/爆炸),使用梯度裁剪(
gradient clipping
)或调整初始化方法(如Xavier、He初始化)。 -
验证参数是否被正确加载(如预训练权重是否匹配)。
-
-
计算图调试:
-
使用工具(如PyTorch的
torchviz
)可视化计算图,确保前向传播逻辑正确。
-
3.训练过程监控
-
损失与指标跟踪:
-
监控训练/验证损失曲线,判断是否收敛、过拟合或欠拟合。
-
检查关键指标(如准确率、F1值)是否符合预期。
-
-
学习率与优化器:
-
尝试学习率调度(如Warmup、Cosine衰减)。
-
对比不同优化器(如Adam、AdamW、LAMB)的效果。
-
-
硬件资源占用:
-
监控GPU显存、CPU/内存使用率,避免资源瓶颈(如OOM错误)。
-
4.超参数调优
-
关键参数搜索:
-
学习率、批量大小(batch size)、权重衰减(weight decay)是核心超参数。
-
使用网格搜索、随机搜索或贝叶斯优化(如Optuna、Ray Tune)进行调参。
-
-
正则化策略:
-
调整Dropout率、权重衰减系数,或添加数据增强防止过拟合。
-
-
分布式训练参数:
-
优化多卡训练的批大小和梯度累积步数(gradient accumulation)。
-
5.分布式训练调试(如多GPU/TPU)
-
通信效率:
-
检查分布式训练框架(如PyTorch DDP、DeepSpeed)的配置。
-
分析通信开销(如NCCL后端参数优化)。
-
-
同步问题:
-
确保参数同步正常(如梯度聚合是否正确)。
-
调试混合精度训练(如
AMP
是否启用,有无数值溢出)。
-
6.评估与错误分析
-
验证集/测试集分析:
-
分场景评估模型表现(如不同类别、不同长度的输入)。
-
可视化注意力权重、特征图(如Captum、Grad-CAM)辅助理解模型行为。
-
-
错误样本分析:
-
收集预测错误的样本,分析共性模式(如特定领域、噪声干扰)。
-
根据错误类型调整数据或模型(如增加困难样本的训练权重)。
-
7.资源与效率优化
-
显存优化:
-
使用梯度累积(gradient accumulation)、激活检查点(activation checkpointing)。
-
混合精度训练(FP16/BF16)或模型量化(Post-Training Quantization)。
-
-
计算加速:
-
利用算子融合(如FlashAttention)、编译优化(如PyTorch 2.0的
torch.compile
)。
-
8.工具与日志
-
可视化工具:
-
使用TensorBoard、WandB记录实验指标。
-
通过PyTorch Profiler或Nsight分析计算瓶颈。
-
-
版本控制:
-
记录每次实验的超参数、代码版本和结果(如DVC、MLflow)。
-
9.分阶段调试策略
-
简化问题:先用小模型、小数据调试,确认基础逻辑正确。
-
增量扩展:逐步增大模型规模和数据量,观察问题何时出现。
-
对比实验:固定其他变量,仅调整单一参数定位问题。
附:
具体的搭建并训练本地的大模型需要用到的大模型蒸馏技术以及搭建本地知识库等内容,本篇不对其进行考虑,具体操作步骤将会在后续的“大模型”专栏中发布。
更多推荐
所有评论(0)