请求走过的路
你敲下的一个字,要走很长一段路,才会变成答案回来。这里以一个典型的端为例,把这条路画出来 — 本地和其他服务,可能走更短或不同的路。
全景 — 五个地方
- 我的电脑
- 网络
- 远处的机器
我电脑上的程序
聊天机器人、代码编辑器、应用。它接住你的请求,决定要送出什么。
网络
跨越互联网的那条路。在这条路上来往的只有文字和文件。
远处的计算机器
数据中心里的服务器接下请求,交给一个已经加载好模型的运行时,所以不会每个问题都重新打开一次模型。非常大的模型,可能分散在好几块芯片或好几台机器上。
计算模型
神经语言模型从训练样例中学习数值权重,生成时用权重和当前上下文计算候选词元分数。它并非简单查出存储的互联网句子,也不是只统计紧邻前词的次数。
回到我的电脑
程序把答案显示出来;只有在你允许时,它才动手做事。
第 1 个和第 5 个地方是同一台电脑——我的电脑
把第 3 个地方打开看看
-
硬盘上沉睡着的一个大数字文件。那个文件就是模型本身。
-
运行时把它读进来,放到专门用来计算的芯片上,然后就一直摆在那儿。
-
门卫核对钥匙,请求排队等着轮到自己。
-
计算就冲着早已放在上面的那些数字来跑。
一步一步看
一共八步。到第八步,路会分成两条。
我把它送出去
键盘和鼠标的动作经过操作系统,交给你正在看的那个程序。麦克风不一样:只有在你允许时,程序才会接收声音,用语音识别把它变成文字 — 或者把声音送给能直接听的模型。
程序收拾行李
你的问题、最近的对话,还有你附上的文件或图片,会和应用打开的指令、工具一起装进包袱。它不会把你整个硬盘都捞走 — 只有你允许的东西才跟着去。包袱有大小上限,所以应用会把较早的部分截短、压缩或干脆拿掉。AI 有时好像忘了你前面说过的话,原因就在这里。
跨越互联网
文字通常走 HTTPS,也就是网页用的那条上了锁的路。像实时语音这种需要双向一直说下去的东西,则会把连接一直开着。
计算机器接住它
运行时 — 把模型那一大堆数字放在内存里并进行计算的程序 — 把收到的文字切成词元(模型读得懂的小块)。如果模型还不在内存里,就得先加载,所以第一个回答会来得慢。
抽出下一个词元
模型给每一个可能的下一个词元打分,然后挑出一个。它把这个词元接到末尾,再回到同一步,一遍又一遍,直到出现表示「结束」的词元,或者达到长度上限。怎么挑是一项设置:温度调低,就更常拿最高分,答案的变化更小 — 但更稳定的答案并不等于更真实的答案。
每个词元都回到这一步
边出边送回来
答案不会等到全部写完才送。文字是几小块几小块地到达;有些声音、图片和视频也是边生成边送,另一些则作为完成的文件一次送到。
程序把它铺到屏幕上
所以文字看起来像有人在打字。并不是有谁在你眼前慢慢思考 — 只是小块正在陆续到达,每块多大、来得多快,由服务决定。
路不是一条,是两条
把这两条画成同一条路,正是可怕的误会的源头。它们并不一样。
只是对话
-
屏幕上的文字
-
到此为止
查看详情
文字在屏幕上流过,就到此为止。你的电脑上什么也没发生。本站的 Lyen 学习助手走的就是这条路。
借一双手
-
找出工具请求
-
请求许可
-
真的动手
-
把结果装回去
结果装进第 2 步的包袱,再从第 3 步出去
查看详情
回来的仍然只是文字。当这段文字是一个工具请求 — 「改一下这个文件」 — 时,你电脑上的会先检查,再替它去做。然后把结果装进第 2 步的包袱,从第 3 步再次送出去,对话就这样继续。这样的往返,就是人们所说的。
做得好的程序,在删除文件或执行命令之前会先问你 — 而决定关掉这个提问的,是人。这个提问就是保险栓:它由程序来执行,而不是对的一句客气嘱咐。
如果一定要打个比方
-
一副身体可以换掉它的计算零件。同一个,明天就能接上另一家公司的模型。
-
同一个计算零件,同时应付着彼此素不相识的众多人的请求。活着的东西做不到这种事。
查看详情
模型是只会计算的零件;身体是你电脑上的程序,或者包在它外面的服务。会计算的零件没有手 — 它自己不能创建文件,也不能打开应用,只能用文字提出请求。真正动起来的一切,都是程序在它被允许的范围内做的。
再说两件事
计算机器并不总在远方
此刻这个网站,就是那张图
| 1 · 我的程序 | 2 · 网络 | 3 · 远程机器 | 4 · 计算模型 | 5 · 我的屏幕 | |
|---|---|---|---|---|---|
| 就在我自己的浏览器里 | 是 | 否 | 否 | 是 | 是 |
| 经由我们的服务器 | 是 | 是 | 是 | 是 | 是 |
| 在远处那家公司的机器上 | 是 | 是 | 是 | 是 | 是 |
走中间那条路(经过我们的)时,真正的计算也是在第三条路上、在远方某家公司的机器上发生的。我们的服务器只负责核对请求并把它搬运过去。
查看详情
小模型可以在你自己的电脑里运行。本站的语音就是这样:语音模型下载好以后,把文字变成语音的工作就在你的设备上完成。聊天则不同 — 那些消息仍然经由 SONUB 送到服务。
打开 Lyen 学习助手,随便问点什么。把它送到我们的服务器,服务器再交给远处的计算机器。文字一小块一小块回来,那是第 6 步;这些文字在屏幕上一点点长出来,那是第 7 步。Lyen 走的是只对话那条路,从不碰你电脑上的文件。
Lyen 学习助手就是这样。我们的服务器只负责把请求递过去,并不运行模型。
计算真正发生的地方。他们内部用的是哪种,并没有公开。
给大人的注解
写给需要更精确说法的人。
词元
模型并不读单词。把文字切成 — 有时是整个单词,有时是几个字母,有时只是一个 — 每一个都变成一个数字。不同的模型切同一句话的方式不同,所以同一段文字算出来的词元数也可能不同。
流式传输
一边生成一边把局部输出推送出去,通常走 。每一块有多大,各家产品并不相同;有的不是按词元,而是按句子送。
模型的种类
有 (大语言模型)、SLM(小语言模型)、VLM(连图片一起看的模型),还有生成图像和视频的扩散模型。LLM 和 SLM 主要是大小不同,VLM 还能读图片,扩散模型输出的不是文字,而是图像和视频。
怎么挑
下一个词元怎么选,是一项设置。把调低,模型更常选最高分,同样的输入会得到更相似的回答;调高,回答就更多变。就算调到零,实际的服务也不保证每次给出一模一样的答案,而且更稳定的答案并不是更正确的答案。
RAG · MCP · 技能
这些是往包袱里多装东西的几种方式的名字。 搜索文档并附上找到的内容; 是连接工具的一种常用方式;是事先准备好的成套指令。哪些能用,由应用的设置和权限决定 — 从来不是模型自己说了算。
运行模型的程序(运行时)
本站实际用的是 ONNX Runtime(语音合成)和 sherpa-onnx(语音识别)。在服务器上跑大语言模型时,用的是干同样活儿的另一些程序 — vLLM、TensorRT-LLM、llama.cpp 等等。哪家公司用哪一个,并没有公开。
数字、精度、内存——以及让数字运转的运行时
-
模型文件 乐谱
-
运行时 指挥
-
CPU · GPU 演奏者
| 擅长 | |
|---|---|
| ONNX Runtime | 在多种设备上运行多种模型 |
| llama.cpp | 在自己的电脑上运行 LLM(GGUF) |
| FreeToken | 在个人 PC 上运行超大 MoE 模型 |
查看详情
是学习得到的海量数字与计算结构。把这些结构载入,并在CPU、等计算设备上真正执行它们。
可以把模型文件想成乐谱,CPU和GPU是演奏者,运行时则是读谱并协调演奏的指挥。
ONNX Runtime — 一种跨平台通用引擎,可运行图像、语音、语言等多类模型,并通过执行提供连接针对不同硬件的加速器。
llama.cpp — 一种专注于让和VLM以较少配置运行在本地或端多种硬件上的引擎,常与格式的模型文件配合使用。
FreeToken — 为了在个人电脑上运行超大MoE模型(在众多专家中只挑一部分来计算的模型)而做的运行时。它把NVIDIA GPU、CPU、主内存(RAM)以及它们之间的连接合在一起,当作一台机器来用。
什么是参数?
- 张量
- 矩阵
- 向量
- 标量 = 1个参数
- 向量
- 矩阵
[0.2, −0.7, 1.3]
1个向量・3个标量数字・3个参数
8B里的B是Billion(十亿),不是。8B模型不是有80亿个,而是大约有80亿个,每个参数都只是一个数(标量)。
参数与权重
- 权重
- 偏置
- 嵌入
- 归一化系数
y = w₁x₁ + w₂x₂ + b都是参数,但参数不全是权重。
查看详情
参数是模型在学习中得到或调整的一个标量数字。向量、和张量是装数字的,其中每一个标量数字都算一个参数。
权重是最典型的一类参数,它决定输入对结果产生多强的影响。偏置、嵌入和归一化系数等也可能是参数。
一个参数并不是装着一条知识的盒子。如果张量或矩阵是大抽屉柜,参数就是其中一个数字格;位数表示这个数字记录得有多精细。
一个参数占多少位?
查看详情
参数是一个数字,却能用不同精度保存。减少位数通常能节省内存,但实际文件还会有缩放因子、元数据等额外开销。
为什么8B模型大约是8GB?(按8位计算)
权重容量 ≈ 参数量 × 每参数位数 ÷ 8表中是只计算权重并采用十进制单位的简化理论值。实际量化文件还存有缩放因子、元数据和其他结构,因此可能更大。
查看详情
使用8位精度时,每个参数约占1字节。因此80亿参数的纯权重大约需要8GB。同样的参数量采用不同精度,容量也会不同。
真正运行时还需要更多内存
- 权重
- KV缓存
- 计算缓冲区
- 运行时开销
越长,越大
运行内存 = 权重 + KV缓存 + 计算缓冲区 + 运行时开销查看详情
权重文件只是起点。推理还需要保存先前的KV缓存、临时计算缓冲区和运行时开销。因此理论上4GB的模型实际可能需要5~8GB甚至更多;上下文越长,KV缓存通常越大。
小小的数字怎样表达大量知识?
查看详情
8位能表示256个等级,但单个参数里并没有存放“首尔是韩国首都”这样的句子。知识分散在数十亿参数跨越许多层相互作用所形成的整体模式里。
一个像素只是一个颜色值;数百万像素排列起来,就会出现人脸或风景。模型知识也以相似方式从分散的数字模式中涌现。
AI模型是由向量、矩阵和张量组织起来的海量标量参数模式。精度决定理论权重容量;运行时把权重载入内存,再用额外的工作内存在可用硬件上执行模型。
同一条路,一步一步全看
- 1 从我的手到程序
- 2 把要送的东西装好
- 3 跨越互联网
- 4 服务器门口
- 5 服务器内部 — 机器和运行时
- 6 模型开始算
- 7 一个词元一个词元,反复来
- 8 回来的路
- 9 程序接住它
- 10 借手的循环
1 从我的手到程序 第 1 个地方 4 步
-
一个键被按下
键盘里那台小小的电脑发现哪个键动了,把它变成一个数字,顺着线送出去。
-
操作系统接住它
内核里的驱动把这个数字变成输入事件,排好队交给此刻在最前面的那个窗口。
-
程序从队列里取出来
每个程序都在跑一个循环,一次取一个事件来处理。字出现在输入框里,就是这一步。
-
麦克风走的是另一条路
声音以每秒几万次测量值的形式到来。在文本模型看到之前,语音转文字模型先把说话的部分变成文字 — 不过有些较新的模型可以直接听声音。
2 把要送的东西装好 第 1 个地方 7 步
-
系统提示词
写程序的人事先定好的规矩排在最前面 — 你是什么,该怎么回答。
-
到目前为止的对话
之前的几轮对话按顺序放进去。因为有上限,应用会先丢掉、缩短或概括最早的那些 — 没放进去的内容,模型根本看不到。
-
你附上的东西
图片或文件以服务能接受的形式附上:原始字节、文件 ID、链接,或者一长串叫作 base64 的字母。对于 PDF,服务可能抽出其中的文字、把页面拍成图片,或用 OCR 来读。
-
翻你自己的资料(RAG)
这就是 。你的问题被变成数字(或关键词),再把你的文档里与它最匹配的几段找出来,一起装进去。模型本身并没有重新 — 找到的段落也仍然需要核对。
-
工具清单
应用允许的每个工具,名字和输入格式都像菜单一样写出来。应用可以列出自己的工具,也可以从 那里取得。
-
技能和命令
别人事先写好的成捆指令 — — 在任务需要时被插进来。技能包还可能带着脚本和参考文件,所以在信任它之前先读一读。
-
塞进上限里
整个包袱都按词元来计数。一旦超过上限,应用就得剪掉、缩短或拿掉一些东西 — 通常先从最旧的内容下手。
3 跨越互联网 第 2 个地方 4 步
-
找地址
把服务器的名字换成数字地址()。
-
开路,再上锁
在发送任何东西之前,你的电脑和服务器先开出一条路,并商定一把秘密钥匙,这样中间谁也读不到经过的内容(TCP 和 TLS;较新的 /3 用 QUIC 把两件事一起做了)。
-
表明身份
在请求的头部附上钥匙()或票据(令牌)。算在谁账上,就在这里定下来。
-
把请求送出去
到目前为止装好的一切,变成一个请求,通常用 写成,然后发出去。如果双方需要一直说下去 — 比如实时语音 — 就会让连接保持打开。
4 服务器门口 第 3 个地方 3 步
-
门卫
看看钥匙对不对、叫得是不是太频繁,然后交给一台闲着的计算机器。
-
排队
请求不会马上被计算,而是先排一小会儿队。轮到的时候,运行时会拿着早已装载好的那一份数字,把排着队的好几个问题一起算。
-
检查进来的东西
开算之前,先看看这个请求有没有违反规矩。
5 服务器内部 — 机器和运行时 第 3 个地方 3 步
-
数字文件正睡着
训练完的模型,就是存储设备上一个很大的文件。它本身不做任何计算。本站的语音模型也是四个文件,加起来大约 398MB。
-
运行时装载一次
服务器启动时(或应用准备就绪时),运行时读入那个文件,做好运行的准备,并把它留在内存里,所以不会每个问题都重新打开。如果内存不够,或者服务器重启,就得再加载一次。
-
加速器接下乘法
同样的乘法要做上天文数字那么多次,于是交给专为此打造的芯片,旁边配着快速内存让数字待着。普通 CPU 也能做,只是会慢一些。
运行时并不住在加速器里面。它是另一个独立跑着的程序,负责读文件、把数字放到那块芯片旁边的内存里。
把多个请求捆在一起是第 17 步,把算过的留着是第 27 步 — 这两件事都由这个程序来做。
6 模型开始算 第 4 个地方 7 步
-
切成词元
文字被切成这个模型的认识的小块,每一块都得到一个固定的编号(ID)。换一个模型,同样的文字可能被切成不同的小块。
-
编号变成一串数字
每个 ID 都会挑出一长串在训练中学到的数字()。ID 编号本身没有意义;用法相近的小块,最后可能变得相似的,是这些数字串。
-
标上顺序
每个词元排在第几个,也会用数字告诉模型 — 没有它,模型就分不清「狗咬人」和「人咬狗」。各个模型的做法不同,旋转位置嵌入(RoPE)是常见的一种。
-
互相看(注意力)
:对每一个词元,模型都要算出该看前面每个词元多少,再按这个比例把它们的信息混合起来。它只往回看 — 从不看还没写出来的词元。
-
一层层地乘和加
这些数字要穿过很多层 — 大模型有几十层 — 每一层都做一次注意力,再做一轮乘法和加法。每过一层,数字就挪动一点;一共有多少层,要看是哪个模型。
-
给全部打分
最后一层给它认得的每一个词元打分 — 视模型而定,几万到几十万个分数一次出来。
-
挑一个
最后的分数被变成()。让概率更尖或更平, 和 top-p 只留下最可能的几个,然后抽出一个词元。总是拿最高分的做法叫作(greedy)。
7 一个词元一个词元,反复来 第 4 个地方 3 步
-
接到后面
-
算过的省着用
前面词元已经算好的数字会被保存下来(KV 缓存),而不是重算一遍。这样省时间,但占内存;整体速度还取决于文字有多长、服务器有多忙,以及网络。
-
回到第 22 步
多了一个词元的文字,再一次穿过模型 — 多亏第 27 步,已经算过的部分可以直接再用。就这样一圈又一圈,直到出现表示「结束」的词元,或者到达长度上限。
把答案一路写下去的循环就是它 — 每一个词元都回到第 22 步。
8 回来的路 第 2 个地方 4 步
-
把词元编号还原成能读的文字
-
边出边送
不等整段答案写完,做出多少就推出多少,一小块一小块地送()。
-
检查出去的东西
送出去的文字,也要看看有没有违反规矩。
-
记下用了多少
数一数送进去和送出来的词元各有多少。账单就是从这里出来的。
9 程序接住它 第 5 个地方 4 步
-
按顺序把到达的小块拼起来
-
画到屏幕上
读懂 Markdown,把它变成标题、列表和框画出来。看上去像有人在打字的,就是这一部分。
-
找出工具请求
程序一直盯着,看答案里有没有夹着约定格式的。
-
核对参数
那个工具是不是真有、参数长相对不对,都要在动手之前查一遍。
10 借手的循环 第 5 个地方 4 步
-
请求许可
凡是有风险的事 — 删除文件、执行命令 — 做得好的应用会先问你。这道确认放在应用里,而不在模型里;把它关掉,是人做的决定。
-
真的动手
应用照模型的要求去做:改一个文件、执行一条命令,或者调用另一个程序(MCP 服务器)— 只在它被授予的权限之内。
-
把结果装回去
出了什么、失败的话为什么,都作为新的一行装进第 6 步那段对话里。
-
回到第 15 步
重新装好、里面放着那个结果的包袱,再发出去一次。这样反复下去,直到模型说完成了,或者应用因为上限、取消或出错而让它停下。
人们所说的,指的就是这个循环 — 一次又一次回到第 15 步。