一根网线插不进Transformer——聊聊LLM的前世今生
本文最后更新于38 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

#LLM #AI #Agent #Transformer

LLM从何而来?

大语言模型(Large Language Model 简称LLM)是由早期的语言模型(Langage Model 简称LM)演化而来

而语言模型其实在我们过去的生活中更为常见,想象你在与朋友的对话时输入“你在”输入法会自动提示“干嘛”“哪里”“呀”,而这就是一个微型的语言模型。

语言模型的发展其实相当朴实,他一共经历了三个阶段:

1.统计语言模型

代表技术:N-gram

统计语言模型将会根据语料库中词组出现最多的频率来进行词组预测,比如当它获得了足够多的词语和句子时,发现 “吃”后面跟着“饭”的次数最多,他就会认为预测词是饭。

但是统计语言模型的缺点也很明显,就是他只能预测相当短的词语而非句子,生成的内容往往逻辑不通

2.神经网络语言模型

代表技术:RNN

把词语转换成一串数字(词向量/Embedding)。它开始有了“初级记忆”,能处理更长的句子。

“转换”“向量”听起来很复杂,其实原理相当简单。

我们都知道计算机由二进制构成,而二进制是0与1组成的世界,那么我们想把人类语言中的词语变成数字语言,最简单的想法是不是就是为没一个词语进行编号赋值?

而这就是最早期的做法,叫做One-Hot Encodibng:

让我们举个列子,假设词典里有三种词语[猫、狗、手机]:

猫=[1,0,0]

狗=[0,1,0]

手机=[0,0,1]

我们可以发现,三种不同维度的向量坐标确实可以做到区分不同词汇的词语了,但是神经网络的本质并非数据库,它并不靠“记”谁在哪以达到转换区分目的,而是依靠矩阵运算。

神经网络在处理数据时,会将输入值乘以一个“权重”(Weight,我们设为 w)

当我们把词语输入模型,模型会进行类似“y=wx+b”的计算:

假设我们要训练一个模型来判断“这个词是否描述动物”,模型学到了一个规律:输入数字越大,越不可能是动物。 当你输入 猫(1):1 * w = 0.5(模型判断:大概率是动物)。 当你输入 狗(2):2 * w = 1.0(模型判断:概率降低了,可能不是动物)。 发现问题了吗? 仅仅因为你给“狗”编的号比“猫”大,计算机就认为狗具备某种特征的程度是猫的两倍。但在现实中,狗并不是“两倍的猫”,它们是平等的实体。这就是符号赋值(Label Encoding)带来的误导。

如果我们不用单一的数字 12,而是用坐标呢? 想象你在玩《我的世界》或任何 3D 游戏。 的坐标是 (1, 0) 的坐标是 (0, 1) 此时,如果你计算它们到原点 (0,0) 的距离,它们都是 1。这意味着它们在重要性上是完全平等的。

它们的区别仅仅在于方向(方位)不同:一个在水平轴上,一个在垂直轴上。计算机会通过学习知道:

往“水平方向”走代表增加“猫性”;往“垂直方向”走代表增加“犬性”。

回到刚才举的例子:

猫=[1,0,0]

狗=[0,1,0]

手机=[0,0,1]

现在就很好理解了,虽然我们的确区分了这三者的不同之处,但是用余弦相似度去计算的话,“猫”和“狗”的关系,竟然和“猫”与“手机”的关系一模一样——都是“0”,极易产生的后果就是当你在训练一个翻译模型后,它学到了”我爱猫“是一句正向取向很高的话,但输入“我爱狗”时,他可能完全无法理解甚至会报错。

现在的中文常用词大概有10万个,如果一直使用这种[1,0,1…]的方式,那想要完全区分这些常用词可能需要10万维的向量,而这么长的向量中,其中99999位都是0,只有1位是1。这在计算机内存中属于极度的浪费。

而同样的,这种学习方式缺乏了如今的ai一种很重要的能力:——泛化能力。

当“猫”与“狗”在空间中靠的很近时,模型学到“猫有毛”后,也会自动推测“狗有毛”。而one-hot的方式,就算模型将猫的全部信息尽数了解后,看到“狗”也不会有任何信息可以借鉴,他必须从零开始学习关于“狗”的一切。

但正如我们所说,one-hot只是很早起的技术,在后来,又出现了很多在神经网络语言模型界里可以算得上技术革新的技术:

2013年,Google提出了Word2Vec,他不再是one-hot一般的手动给词语赋值,而是让模型通过大量阅读去给词语分配坐标。

比如让模型看几百万篇文章后,模型发现“猫”和“狗”经常出现在“宠物”、“吃”、“睡”这些词的周围,所以模型自动给猫分配了坐标(比如[0.1,0.5,-0.2]),给“狗”分配了类似的坐标

第二次飞跃就是RNN(循环神经网络),这解决了“句子是一个整体的问题”

它引入了一个“隐藏模式”的概念,像一个小本子一样记录前面词语的信息,这样就组成了一句人工智能计算机可以理解的“话”。

不过缺点就是记忆很短,如果句子太长,读到结尾的时候,开头的词语他就忘记的差不多了(这就是所谓的梯度消失的问题)

3.预训练语言模型 (PLM)

代表技术Transformer

相信所有对人工智能自然语言理解的小伙伴都对这个词语不陌生,那么如此熟悉的技术究竟改变了什么以及是如何改变过往语言模型理解词语的逻辑的呢?

在Transformer以前,模型读句子就像看电影,必须一帧一帧观看,就像我们前文提到的RNN,而Transformer读句子就像看画,一眼扫过去全图就会尽收眼底。

那么这是怎么做到的呢?当模型对句子进行处理时,他会同时给句子里出现的所有词计算一个相关度(权重)再处理每一个词时,根据每个句子中其他词根据这些词的相关度进行注意力转换。那么,这些又是怎么做到的?

要让计算机知道什么词语与什么词语有关需要的核心流程分为三步:身份转换(QKV)、匹配打分(Matching)和信息融合(Merging)

1.身份转换

当句子进入模型后,每个词向量都会通过三个不同的矩阵乘法,找到他们最合适的”向量位置“,变成三个新的向量:Query(Q)、Key(K)和Value(V)

Query:搜索单,代表“我要找什么”

Key:个人介绍,代表“我是谁,我有什么特征”

Value:核心财富,代表“我真正的含义信息”

2.匹配打分

这是Transformer极为重要的一步,举个例子,你向大模型输入一句话“猫在大街上追逐那只老鼠,因为它很饿”

当模型处理“饿”这个字时,他会拿着“饿”的Query去和句子里所有词(包括它自己)的Key逐一进行点积运算

点积越大,代表两个向量的方向越接近,即“语义相关度”越高

“饿”的 Query * “大街”的 Key = 分数很低(饿和路没啥逻辑关系)。

“饿”的 “猫”的 Key = 分数极高(模型在训练中见过无数次“生物”与“饿”的关系,它们的 Q 和 K 在数学上被训练得非常契合)。

最后,这些分数会经过一个叫Softmax的函数,转换成百分比(权重)。比如:“猫”站80%,“追逐”站10%,“它”占5%

3.信息融合

现在,Transformer明显已经知道“饿”这个词与哪个词的关系最为亲近了,接下来,它会根据刚才算出的权重,去收集大家的Value

它会拿走“猫”的 80% 的信息;

拿走“追逐”的 10% 的信息……

结果: “饿”这个词的向量,在这一层处理完后,里面就偷偷“混入”了大量关于“猫”的信息。这时候,计算机眼里的“饿”,就不再是字典里孤立的词,而是“那只由于没吃东西而腹部空空的猫的状态”。

为什么加个“大”字(LLM)就变强了?

其实当我们进入Transformer时已经可以将这种语言模型称为大语言模型(LLM)了

因为LLM正是在Transfornmer这种架构的规模性表现:

当语言模型的参数量(可以理解为大脑突触的数量)和训练数据达到一定规模后,发生了一种“涌现(Emergence)”现象,也就正式完成了称呼从“lm”到“llm”的转变。

LM(早期):只能完成填空、简单的翻译。

LLM(现在):突然学会了推理、写代码、甚至理解人类的幽默。这就像水分子多了会变成波浪,神经元多了会产生意识一样。

但需要注意的是,大模型本身其实还是文字接龙的进阶版,并非理解了自然语言的本身含义。

发展过程中的衍生词:

在与大模型进行对话时,我们会将我们与大模型对话时介绍的背景信息和最终指示分别称作上下文(Context)和提示词(Prompt)

刚才说了这么多,其实Transformer的作用是语义理解而不是上下文记忆,那么我们平时在一个对话框里和ai畅通无阻的理解上下文又是如何做到的呢?

其实这部分的原理很简单,我们将发生的历史对话统统划分为上下文(context),这样就形成了记忆(Memory)

不知道大家是否还记得,ChatGPT刚发行3.5的时候,是没有联网搜索功能的,导致许多在他没有获取到知识库的地方或者一些实时更新的消息时,经常胡说八道。所有的知识库都是由以往的互联网数据库构成的,但是现在无论是gpt、gemini还是豆包、deepseek都无疑拥有了联网搜索的功能,这无疑让大模型的回答更加精准,那么这个功能又是怎么做到的呢?

最自然而然的想法是为什么不可以给Transformer加一个联网功能呢?那是因为Transformer与联网系统完全是两个毫无关系的系统,它只能且只会负责词语理解的部分。Transformer 是一个复杂的数学函数。给它联网,就像是试图给一个正在高考的学生直接在脑子里插一根网线——这显然不符合它的生理结构和当地法规(嗯)

那我们换一种方式,当用户需要联网搜索的内容时,来一个第三方告诉负责语义理解的系统搜索结果是什么不就好了吗?

那么这个神秘的第三方就是——智能体(Agent)

RAG的联网搜索也主要分为三步:

1.检索

第三方系统(搜索引擎或向量数据库)拿着你的问题去互联网上“搜索”。它找到了最新的新闻和咨询以及百科等等。

2.增强

系统把搜索到的结果和你的原问题打包在一起,重新拼成一段话。

后台偷偷生成的 Prompt: “你是 AI 助手。以下是搜到的实时信息:[2026 世界杯在美加墨举办]。请根据这些信息回答用户的问题:2026 年世界杯在哪?”

3.生成

Transformer 收到这段话后,通过最新消息和 QKV 机制生成真正的回答

这就是早期智能体朴实无华的实现方式,在聊天时加一段prompt。

那么agent既然可以实现上网对信息检索,那是否可以做到对本地文档和数据库进行检索呢?

答案是肯定的,不过检索方式与Transformer类似,都是通过语义匹配向量化的信息并将其加入上下文以增强内容的可靠性的办法叫做RAG(检索增强生成)

我们现在可以来复习一下了解到的计算机专业语言:

LLM LM Prompt Context Memory Agent RAG

^^

那么我们继续向内进阶了解Agent,假设我在Agent里写了很多功能:搜索、文件读取、脚本执行和pdf转换

那么当我们需要agent转告人工智能的prompt需求内容特别多时,prompt难免就会显得极其臃肿

比如“给我整理下今天劲爆的新闻,我有搜索、文件读取、脚本执行等工具可以使用,需要的话告诉我。那么我们的人工智能就要发送“调用搜索功能,关键词 新闻 劲爆”的消息ping回去,那么在需求很多时,这种自然语言交流的方法就会显得有些臃肿。

但是我们是否可以让智能体与大模型之间使用编码方式沟通?这显然可能会出现很多问题,因为我们无法预料到大模型会怎样用编码形容自己的需求,这里可能会出现的乱子很多,来列举三条:

1.“幻觉编码”:发明不存在的参数

AI 可能会根据你的要求,自作聪明地“发明”代码。

 你的预期编码:`SEARCH(key="新闻")`
AI:它觉得“劲爆”很重要,于是自发生成了 `SEARCH(key="新闻", severity="high", explosive=True)`。
后果就是你的 Python 后台根本没有 `severity` 这个参数,直接报 `TypeError`。

2. “格式污染”:

AI 很难完全闭嘴。即使你要求它“只输出代码”,它也可能因为太有礼貌而破功。

    > “好的,没问题!这是你要的编码:
    `EXEC_SCRIPT(file="test.py")`
    希望能帮到你!”
    >
你的 Flask 后台尝试 `json.loads()` 这一堆文字,直接抛出 `JSONDecodeError`。

 3. “逻辑嵌套陷阱”:无法处理优先级

当需求变多时,AI 可能会在编码里玩“套娃”,导致程序逻辑死循环。

解决方式就是限制大模型用指定的死板的格式来回答,比如“json”——zo而这种根据json格式在agent和大模型之间的交流方式就被称作Function Calling

以上情况是功能存在于agent本身时它与大模型的调用方法,那当功能不存在于agent内部而是外界时,agent应该如何调用这些工具呢?

这就涉及到agent与外部工具的接口协议:MCP(模型上下文协议)

完成了:大语言模型——(function calling)——agent——(MCP)——功能模块

这个流程里的agent更像是一个传话器的功能

当然 你也可以选择直接与agent进行对话,市面上有许多软件都属于agent这个分类

cli:iflow、codex、claude code

ide:cursor、antigravity、trae

桌面助手:claswdbot、moltbot、openclaw

agent可以直接通过你的自然语言去调用你电脑里的文件去规划流程实现目标,比如你可以命令他“帮我提取某个pdf里的文件翻译后保存为word”,agent就会自己去规划提取、翻译和保存的流程趋势性。

不过唯一的缺点就是agent的作用是要消耗token的,而token真的很贵。。。。所以一般来说,这些流程我们不会全权交予agent来完成,比如提取和保存这两个步骤,完全可以用python或者其他编程语言写为固定的脚本,比如OCR等技术的实现,这些技术如果明天有机会我会详细写一写;中间的翻译也可以直接和大模型沟通即可。整个过程其实不需要agent进行自动规划,不仅没有必要还更加烧钱。

而当我们人脑去思考这些链式流程任务时,一个名为Langchain的框架很适合去撰写这些任务流程。

而对于变成小白和0编程经验者,这种类似的可视化拖拽工作流叫做——workdlow(工作流)

当我们想在我们的电脑实现真正的使用自然语言转换各种文件的自动化又不想买token时,我们就可以将各种不同文件到不同文件的转化文件统一放到一个目录里

比如:

-skill.md

-form_doc.py

-from_txt.py

-from_ppt.py

-to_html.py

-to_pdf.py

-to.png.py

并且告诉agent先读取“skill.md”中的要求,在遵守要求的前提下根据文件的格式选取指定脚本完成用户的任务。我们也可以把这个目录写进agent写死一段程序去读在这个位置的文件,这样就不用每次都说“加载skill文件”这句废话了(其实就是把提示词放到目录里存起来了) 而存储变成读取命令的这一步,我们就叫它——agent的skill(技能)

这时,我们发现agent的上下文和记忆可能会变得非常多和大,所以我们这里可以把agent分为许多subagent。

这里的概念与pycharm里的总体环境与虚拟环境的概念很相似,对于独立的子任务可以独立在subagent里面完成,子agent产生的上下文不会保存到主agent里。

总的来说,语言模型从统计频率起步,经过神经网络学会了把词语变成坐标,Transformer让模型第一次真正”看懂”了词与词之间的关系。参数规模堆上去之后,涌现出了推理和理解能力,LM正式升格为LLM。

但光有语言理解还不够——Context补上了记忆,RAG补上了实时信息,Function Calling规范了模型与工具之间的沟通方式,MCP打通了Agent与外部世界的接口。最终形成了我们现在用到的这条完整链路:

LLM → Function Calling → Agent → MCP → 工具/世界

而Langchain、Workflow、Skill这些东西,本质上都是在这条链路上做工程层面的组织和管理。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇