☰
大模型技术入门:Transformer、DeepSeek、Dify与OCR核心考点全拆解
2026/10/27 3:29:54 网站建设 项目流程

1. 大模型技术入门:从零基础到核心考点的完整拆解

很多人第一次接触大模型这个词,脑子里冒出来的画面是聊天窗口里那个能说会道的机器人。但真到了要考试、要面试、要上手做项目的时候,才发现光会聊天远远不够。大模型技术涉及的知识面非常宽,从底层的Transformer架构,到上层的应用编排工具如Dify,再到OCR这类多模态能力,每一块都有独立的考点和实操门槛。这篇文章就是写给那些零基础、但需要快速抓住大模型核心考点的人看的。不管你是准备技术考试、面试跳槽,还是想自己搭一套能跑起来的大模型应用,下面这些内容都能直接拿来用。

我自己是从传统后端开发转过来的,刚开始看Transformer论文的时候,满屏的注意力机制、位置编码、多头注意力,看得头皮发麻。后来逼着自己手写了一遍Transformer的代码,又用Dify搭了几条知识库流水线,才慢慢把整个脉络理清楚。所以这篇文章不会只讲概念,我会把每个考点的来龙去脉、为什么这么设计、实际怎么操作,都掰开揉碎讲清楚。

核心关键词会贯穿全文:大模型、DeepSeek、Dify、Transformer、OCR。这五个词基本覆盖了当前大模型技术与应用的主干——底层架构靠Transformer,模型本身可以用DeepSeek这类开源大模型,应用编排靠Dify,多模态输入靠OCR,而大模型则是整个体系的统称。

2. Transformer架构:大模型的地基到底怎么打

2.1 为什么Transformer能取代RNN和LSTM

要理解大模型,必须先理解Transformer。2017年那篇《Attention Is All You Need》出来之前,序列建模主要靠RNN和LSTM。RNN的问题在于它必须按顺序一个词一个词地处理,前一个词算完才能算后一个词,没法并行。这在GPU算力越来越强的背景下,简直是暴殄天物。LSTM虽然加了门控机制缓解了长距离依赖问题,但本质上还是串行计算。

Transformer的核心创新就是自注意力机制(Self-Attention)。它让序列中每个位置都能直接和所有其他位置计算关联度,一步到位,不需要逐步传递。这就好比原来你要传话给十个人,得一个一个传,现在直接拉个群,所有人同时看到消息。并行计算带来的训练效率提升是数量级的,这也是为什么后来能训练出千亿参数级别的大模型。

考试里经常考的一个点是:Transformer的复杂度是O(n²),n是序列长度。这意味着序列越长,计算量增长越快。这也是为什么大模型都有上下文长度限制,比如4K、8K、32K、128K。上下文超长的时候,显存和计算时间都会急剧上升。Dify工作流里如果上下文超长,经常报错,根源就在这里。

2.2 自注意力机制的手写实现与考点拆解

光看公式容易忘,手写一遍代码就记住了。下面是一个简化版的自注意力实现,用PyTorch写:

import torch import torch.nn as nn import math class SelfAttention(nn.Module): def __init__(self, embed_size, heads): super(SelfAttention, self).__init__() self.embed_size = embed_size self.heads = heads self.head_dim = embed_size // heads assert self.head_dim * heads == embed_size, "embed_size必须能被heads整除" self.values = nn.Linear(self.head_dim, self.head_dim, bias=False) self.keys = nn.Linear(self.head_dim, self.head_dim, bias=False) self.queries = nn.Linear(self.head_dim, self.head_dim, bias=False) self.fc_out = nn.Linear(heads * self.head_dim, embed_size) def forward(self, values, keys, query, mask): N = query.shape[0] value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1] # 拆分多头 values = values.reshape(N, value_len, self.heads, self.head_dim) keys = keys.reshape(N, key_len, self.heads, self.head_dim) queries = query.reshape(N, query_len, self.heads, self.head_dim) values = self.values(values) keys = self.keys(keys) queries = self.queries(queries) # 计算注意力分数 energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys]) if mask is not None: energy = energy.masked_fill(mask == 0, float("-1e20")) attention = torch.softmax(energy / (self.embed_size ** (1/2)), dim=3) out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape( N, query_len, self.heads * self.head_dim ) out = self.fc_out(out) return out

这段代码里几个关键点:第一,embed_size必须能被heads整除,否则多头没法均匀拆分;第二,缩放因子是embed_size的平方根,目的是防止点积结果过大导致softmax梯度消失;第三,mask用来屏蔽padding位置,让模型不关注无效token。

考试里常问:为什么要除以根号d_k?答案就是上面说的,防止内积过大。如果d_k很大,点积结果的方差会很大,softmax之后会变得非常尖锐,梯度几乎为零,训练不动。

2.3 位置编码:没有它,Transformer就是个词袋

自注意力本身是不区分顺序的。你把“我打你”和“你打我”输入进去,如果不加位置信息,模型算出来的注意力分布是一样的。这显然不行。所以Transformer加了位置编码(Positional Encoding)。

原始论文用的是正弦余弦函数:

class PositionalEncoding(nn.Module): def __init__(self, d_model, max_len=5000): super(PositionalEncoding, self).__init__() pe = torch.zeros(max_len, d_model) position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1) div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model)) pe[:, 0::2] = torch.sin(position * div_term) pe[:, 1::2] = torch.cos(position * div_term) pe = pe.unsqueeze(0) self.register_buffer('pe', pe) def forward(self, x): return x + self.pe[:, :x.size(1)]

这种编码的好处是,对于任意固定的偏移量k,PE(pos+k)可以表示为PE(pos)的线性函数,模型容易学到相对位置关系。后来也有很多变体,比如可学习的位置编码、旋转位置编码RoPE等。DeepSeek等现代大模型很多都用了RoPE,因为它在长序列外推上表现更好。

考点:位置编码是加在输入嵌入上的,不是拼接。为什么?因为拼接会增加维度,而相加保持了维度不变,同时让每个位置的向量都混入了位置信息。

2.4 Transformer完整代码结构与训练要点

一个完整的Transformer包含编码器和解码器。编码器由多层堆叠,每层有自注意力和前馈网络;解码器多了一个交叉注意力层,用来关注编码器输出。训练的时候要注意学习率预热(warmup),因为Transformer对初始学习率很敏感。通常先用小学习率预热几千步,再线性衰减。

另外,标签平滑(label smoothing)也是常用技巧,把硬标签0/1变成0.1/0.9,防止模型过于自信,提升泛化能力。这些在考试里经常以选择题或简答题出现。

3. DeepSeek大模型:开源生态里的实用选择

3.1 DeepSeek模型家族与选型逻辑

DeepSeek是国内开源大模型里非常活跃的一个系列。它有多个版本,参数规模从几十亿到上千亿不等。选型的时候主要看三个维度:任务复杂度、显存预算、推理延迟要求。

如果只是做文本分类、信息抽取这类简单任务,7B左右的模型就够了。如果要做复杂推理、代码生成,那至少得33B以上。DeepSeek的MoE(混合专家)架构版本,总参数量很大,但每次推理只激活一部分专家,所以实际计算量比同等参数量的稠密模型小很多。这就是为什么DeepSeek能在有限算力下跑出不错的效果。

企业大模型私有化部署的时候,DeepSeek是热门选项,因为它的开源协议相对宽松,社区支持也好。部署方式可以用vLLM、TensorRT-LLM等推理框架,把模型加载到GPU上,对外提供API。免费大模型API里,DeepSeek也有提供,适合做原型验证。

3.2 DeepSeek接入实际项目的配置方法

把DeepSeek接入自己的项目,最简单的方式是用它的API。下面是一个Python示例:

import requests import json def call_deepseek(prompt, api_key): url = "https://api.deepseek.com/v1/chat/completions" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {api_key}" } data = { "model": "deepseek-chat", "messages": [ {"role": "system", "content": "你是一个专业的技术助手。"}, {"role": "user", "content": prompt} ], "temperature": 0.7, "max_tokens": 2048 } response = requests.post(url, headers=headers, data=json.dumps(data)) return response.json()["choices"][0]["message"]["content"]

如果要本地部署,可以用Ollama或者vLLM。Ollama适合个人开发者,一条命令就能拉起来:

ollama run deepseek-r1:7b

然后通过OpenAI兼容接口调用。vLLM适合生产环境,支持连续批处理,吞吐量高很多。

注意:DeepSeek的上下文长度有限制,不同版本不一样。调用的时候如果输入太长,要么截断,要么分段处理。Dify工作流里上下文超长报错,很多时候就是没控制好输入长度。

3.3 DeepSeek在Dify中的编排实践

Dify是一个低代码的大模型应用编排平台。你可以把DeepSeek作为模型提供方接入Dify,然后在Dify里拖拽节点,搭建知识库问答、智能客服、文档摘要等应用。

接入步骤大致是:在Dify的模型供应商设置里,选择OpenAI兼容接口,填入DeepSeek的API地址和密钥。然后在工作流里添加LLM节点,选择DeepSeek模型。如果要做知识库,还需要配置嵌入模型和向量数据库。

Dify知识库流水线的典型流程是:文档上传→OCR识别→文本分块→向量化→存入向量库→用户提问→检索相关块→拼接上下文→LLM生成回答。这里面OCR环节很关键,因为很多企业文档是扫描件或图片PDF,不经过OCR就没法处理。

4. Dify工作流:从知识库到智能体的完整搭建

4.1 Dify知识库流水线的设计要点

Dify的知识库不是简单地把文档扔进去就完事。分块策略直接影响检索效果。块太大,检索出来的内容太泛;块太小,可能丢失上下文。一般建议块大小在500到1000个token之间,重叠部分设50到100个token。

嵌入模型的选择也很重要。可以用OpenAI的text-embedding-ada-002,也可以用开源的BGE、M3E等。中文场景下,BGE系列表现不错。向量数据库可以用Dify自带的,也可以接外部如Milvus、Qdrant、Neo4j。Dify Neo4j 0.0.7版本支持图数据库,适合做知识图谱增强的检索。

实操心得:文档预处理阶段,一定要把页眉页脚、水印、乱码清理干净。这些噪声会严重干扰检索。我试过一份200页的PDF,没清理页眉,结果检索出来的内容一半都是重复的页眉文字。

4.2 Dify工作流上下文超长的排查与解决

上下文超长是Dify工作流里最常见的报错之一。原因通常是检索回来的文档块太多,拼接后超过了模型的上下文窗口。解决办法有几个:

第一,限制检索返回的块数量,比如top_k从10降到5。第二,对检索结果做重排序,只保留最相关的。第三,用更小的块,减少单块token数。第四,换用上下文窗口更大的模型,比如128K版本的DeepSeek。第五,在LLM节点前加一个文本截断节点,强制截断到模型上限。

排查的时候,先看Dify的日志,确认实际输入的token数。然后逐步调整参数,观察效果。不要一次性改太多变量,否则不知道是哪个起了作用。

4.3 Dify SSL错误与凭证验证失败的常见原因

Dify SSL错误通常出现在调用外部API的时候,比如接入本地大模型或者外部向量库。原因可能是证书过期、自签名证书不被信任、或者网络代理配置有问题。解决办法:如果是自签名证书,可以在Dify的容器里导入证书;如果是代理问题,检查环境变量里的HTTP_PROXY和HTTPS_PROXY设置。

凭证验证失败(an error occurred during credentials validation)一般是API密钥填错了,或者API地址不对。检查的时候,先用curl命令手动测试一下接口通不通:

curl -X POST https://api.deepseek.com/v1/chat/completions \ -H "Authorization: Bearer YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"deepseek-chat","messages":[{"role":"user","content":"test"}]}'

如果curl能通,Dify不通,那就是Dify配置问题。如果curl也不通,那就是密钥或网络问题。

4.4 Dify二次开发与迁移注意事项

Dify支持二次开发,可以自定义工具、自定义节点、修改前端界面。二次开发前,建议先fork官方仓库,在自己的分支上改,方便后续同步官方更新。自定义工具用Python写,遵循Dify的工具规范,定义好输入输出schema。

Dify迁移的时候,要注意数据库、向量库、文件存储三块。数据库存的是应用配置、用户信息;向量库存的是知识库嵌入;文件存储存的是上传的原始文档。迁移时这三块都要备份和恢复。如果用了外部向量库如Neo4j,还要单独迁移图数据。

5. OCR技术:多模态输入的第一道关卡

5.1 OCR在大模型应用中的角色

OCR(光学字符识别)是把图片里的文字转成可编辑文本的技术。在大模型应用里,OCR是很多场景的入口。比如企业合同管理,扫描件先过OCR,再送进大模型做信息抽取。比如验证码识别,PHP OCR识别验证码是常见需求。比如PDF解析,C# OCR PDF可以把扫描版PDF转成文本。

没有OCR,大模型就只能处理纯文本,大量图片和扫描文档就用不上。所以OCR是大模型多模态能力的重要补充。

5.2 主流OCR方案对比与选型

方案语言支持部署方式适用场景准确率
Tesseract多语言本地通用文档中等
PaddleOCR中文优先本地/服务中文文档、表格高
福昕OCR多语言本地PDF编辑集成高
望言OCR中文服务企业文档高
云服务OCR多语言API快速集成很高

选型逻辑:如果数据敏感,必须本地部署,PaddleOCR是首选,中文识别效果好,还支持表格识别。如果追求快速集成,云服务OCR最省事,但要注意数据隐私。如果已经在用福昕PDF编辑器,可以直接用它的OCR语言包,ocr-zh-cn.fzip装上就能识别中文。

5.3 OCR实操:从图片到结构化文本

以PaddleOCR为例,安装和使用:

pip install paddlepaddle paddleocr
from paddleocr import PaddleOCR ocr = PaddleOCR(use_angle_cls=True, lang='ch') result = ocr.ocr('document.jpg', cls=True) for line in result[0]: text = line[1][0] confidence = line[1][1] print(f"文本: {text}, 置信度: {confidence}")

如果要做版面分析,比如区分标题、正文、表格,可以用PaddleOCR的版面分析模型。识别出来的文本,再送进大模型做结构化抽取,比如提取合同里的甲方、乙方、金额、日期。

注意事项:OCR对图片质量很敏感。分辨率太低、倾斜、光照不均都会影响准确率。预处理的时候,先做灰度化、二值化、去噪、纠偏。我试过一张手机拍的发票,直接OCR错误率很高,先做透视矫正再识别,准确率提升了一大截。

5.4 OCR与大模型结合的流水线设计

一个完整的流水线是:图片输入→预处理→OCR识别→文本清洗→大模型抽取→结构化输出。Dify里可以把OCR作为一个工具节点,前面接文件上传,后面接LLM节点。

如果OCR结果里有错别字,可以在LLM节点里加一个纠错提示,让模型根据上下文修正。比如“请修正以下OCR文本中的明显错误,保持原意不变”。这样能进一步提升最终结果的准确率。

6. 常见问题与排查技巧实录

6.1 大模型应用开发高频问题速查表

问题现象可能原因排查方法解决方案
上下文超长报错输入token超过模型上限打印输入token数截断、减少检索块、换大窗口模型
SSL错误证书问题或代理配置curl测试接口导入证书、检查代理环境变量
凭证验证失败密钥错误或地址错误手动调用API核对密钥和地址
OCR识别率低图片质量差查看预处理结果灰度化、二值化、纠偏
检索结果不相关分块策略或嵌入模型问题检查检索块内容调整块大小、换嵌入模型
模型输出不稳定温度参数过高调整temperature降到0.1-0.3
推理速度慢模型太大或硬件不足查看GPU利用率量化、换小模型、加GPU

6.2 独家避坑经验分享

第一个坑:不要迷信大参数模型。7B模型在特定任务上,经过微调,效果可能比未经微调的70B模型还好。选型的时候先跑baseline,再决定要不要上大模型。

第二个坑:Dify工作流调试的时候,善用“运行历史”功能。每次运行的输入输出都有记录,对比不同参数下的结果,能快速定位问题。

第三个坑:OCR之后一定要做文本清洗。OCR结果里经常有乱码、多余空格、换行错误。用正则表达式清理一遍,再送进大模型,效果会好很多。

第四个坑:Transformer手写代码的时候,注意mask的形状。编码器mask和解码器mask不一样,解码器需要因果mask,防止看到未来信息。写错了训练loss会异常。

第五个坑:Dify迁移的时候,向量库的维度要和嵌入模型匹配。换了嵌入模型,必须重新向量化,否则检索结果全是乱的。

6.3 学习路径与考点梳理建议

零基础学大模型,建议按这个顺序:先理解Transformer的自注意力和位置编码,手写一遍简化版代码;然后了解DeepSeek等开源模型的部署和调用;接着学Dify的工作流编排,搭一个知识库问答;最后补OCR和多模态知识。考试重点通常在Transformer原理、注意力计算、位置编码、模型选型、Dify工作流设计、OCR流程这几个模块。

多动手,少空看。看十遍论文不如手写一遍代码。搭一个能跑起来的Dify应用,比背一百个概念都有用。我在实际操作中的体会是,遇到报错不要慌,先看日志,再逐步缩小范围,大部分问题都能自己解决。

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

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

立即咨询