第 2 课 · 约 25 分钟

分诊台到底在看什么?

你打一句话,OpenSquilla 在把它交给模型之前,会先在你自己的电脑上替它分一次诊,决定这一句交给四档里的哪一档。C0 接最简单的事,回得快,用量也少,往上一档比一档能干,C3 是压轴的那一档。这一课把分诊台拆开,看它读了哪三样东西,8000 棵判断树又是怎么投票的,最后在这个页面里亲手让它判几句。

1一道证明题,该交给哪一档?

我们把一道数学证明题交给 OpenSquilla 0.5.8,题目是证明根号 2 是无理数。往下读之前,你可以在下面替它选一档。

证明根号 2 是无理数,分诊台会交给哪一档?

  1. C0,第一档
  2. C1,第二档
  3. C2,第三档
  4. C3,压轴的那一档

C0,而且票很集中,四档的票里 C0 占了 82%。

很多人会选 C2 或 C3,理由也很自然,证明题是数学里难的那一类,难题就该交给能力更强的模型。这个想法把两件事混在了一起,一件是话题听起来有多深,一件是回答这一句要做多少事。根号 2 是无理数的证明在中学课本里就有,先假设它能写成一个最简分数,两边平方以后会推出分子和分母都是偶数,和最简这两个字矛盾,十来行就写完了。任何一个模型都背得出这段证明,交给第一档,答案一样是对的。

拿一句话题浅、事情多的来对照,帮我规划一个三天两夜的潮汕旅行路线,预算两千块。这里面没有一个难字,可要回答它,得把三天拆成几段,每一段排上要去的地方和要吃的东西,再把花销算进两千块里,前后还要对得上。分诊台把它交给了 C2,票是 70%。

分诊台估的是回答这一句要做多少事,话题听起来多高深,它不太在乎。

看两边的托盘,一卷现成的证明很轻,一份要排三天、还要算进两千块的计划很重。

更极端的一句是证明 P 不等于 NP,这是计算机科学里悬了半个多世纪的难题。它同样落在 C0,票是 85%。原因还是一样,对这一句来说,好的回答是讲清楚到今天为止还没有人证出来,难在哪里。这是一段讲解,交给 C3 也不会因此就把它证出来。

2句子越长,档位就越高吗?

既然分诊台在估工作量,最容易想到的办法就是看长度,字越多,要读的越多,要写的也越多。我们拿两句来试。一句是一长串购物清单,二十样东西,让它按字母顺序排一下。另一句只有二十六个字,帮我写个脚本,把生产数据库里三年前的订单数据全部删除。

这两句,哪一句被分到的档位更高?

  1. 购物清单那句,字多,档位就高
  2. 两句一样
  3. 删订单那句,字少,档位反而高

删订单那句进了 C2,票是 86%。八十一个字的购物清单只到 C1,票是 58%。

拖到地上的长清单只是排个序,那张盖着火漆的小卡片却要动真数据。

长度确实有用。把真路由器分过的 105 句画在一张图上,横着是字数,竖着是它投出来的档位,越往右的点整体越往上走。可这条趋势拦不住那些离它很远的点,最短的几句 C2 只有二十几个字,C1 里最长的一句有一百二十个字。在这 105 句里,字数大约能解释档位变化的四成,剩下的六成要靠别的东西。

这张图是怎么来的。105 句是我们写的日常请求,每一句都在一台 Windows 电脑上用 OpenSquilla 0.5.8 安装包里带的分档模型跑过,点的位置和颜色就是它给的结果。纵轴是把四档的票按 0、1、2、3 加权平均得到的一个数,点越高,票越偏向高的几档。换一批句子,相关系数会跟着变,但长度只是线索之一,这一点不会变。

3它到底看了哪三样东西?

剩下的六成,要到 OpenSquilla 的源码里去找。分诊台会从每一句话里提取 380 个数,归起来是三样东西。

三个隔间,左边装意思,中间装字的片段,右边装规则。

第一样是这句话的意思。一个专门把文字变成数字的小模型读完整句话,给出 512 个数,它叫 BGE 编码器,只有 24 MB。意思相近的两句话,这 512 个数也相近,分诊台再把它们压成 64 个数交给后面。第二样是字的片段。句子里所有连着的两个、三个、四个字都会被拆出来,比如数据库这个词会拆出数据、据库和数据库,再和一张有一万个片段的词表对一遍,压成 100 个数。这一样不懂意思,但它能认出报错、部署、SQL 这些片段经常出现在哪一类请求里。第三样是 48 条写死的规则,数一数有多少个字、多少行,看看有没有代码块,像不像日志,有没有报错堆栈,提到了几个文件路径,还有 14 组关键词各碰到了几个。比如排错那一组里有 error、报错、修复,风险那一组里有部署、删除、生产。

这 380 个数会交给 8000 棵判断树。每棵树只问几个是非题,比如有 69 棵树开口的第一个问题都在问平均一行有多少个字,其中一棵问的是平均一行有没有超过 83 个字。答完几个问题,它走到一片叶子上,叶子上写着一个分数,这棵树就给自己负责的那一档加上这么多分,分数是负的,就是扣分。8000 棵树分成四组,每组 2000 棵,各管一档。全部加完以后,四档的总分会换成四份加起来等于 100% 的票。

每棵树只往自己那一档的罐子里投一点,8000 棵投完,哪个罐子最满,哪一档接单。

上面这片森林画的就是分档模型本身。四排从左到右是 C0 到 C3,每排 2000 棵树,最远处是第 1 轮,离你最近的是第 2000 轮。往上长的树在给这一档加分,长在玻璃板下面的树在扣分,树越高,这一次加的或扣的分越多。每排中间那道半透明的帘子,表示数到那一行为止这一档能拿到几成票,帘子一直走进前面的罐子里,罐里的圆片一枚代表 5% 的票。

点开第一排最远处的那棵树看看。第 1 轮的四棵树像一条起跑线,不管是哪一句话,它们都会先给每一档扣掉一分到一分半,C3 那一棵扣得少一些,所以只数第 1 轮的话,105 句全都是 C3 领先,票在三成上下。后面七千多棵树才一点点把四档拉开,其中一半多的树加减的分都不到千分之一。可别小看这些小树,给 Flask 应用加登录功能那一句,数到第 200 轮时 C2 只有 33% 的票,数完 2000 轮才到 50%。

这片森林是现算的。树的高低、帘子和罐子里的票,都是用 OpenSquilla 0.5.8 安装包里的那份分档模型,在你的浏览器里对这一句一棵一棵算出来的。树高和分数成正比,只有超过 0.056 分的几棵截在同一个高度,顶上加了一颗白点,点开能看到它真实的分数。帘子上数到半路的票,是把前面这些轮的分加起来,再用模型自己的换算方法换成的票,模型实际干活时只在数完 2000 轮以后用这份票。

如果把规则这 48 个数全部清零,别的不动,105 句里大概有多少句会换一档?

  1. 几乎没有,规则只是辅助
  2. 一成左右
  3. 三成左右
  4. 一大半

30 句,差不多三成。把意思清零有 23 句换了档,把字的片段清零有 19 句换了档。三样东西各管一部分句子,少了哪一样,都会有一批句子被分到别的地方。

这个分诊台是真的。8000 棵判断树、一万个片段的词表和 BGE 编码器,都来自 OpenSquilla 0.5.8 的安装包,它按 Apache-2.0 协议开源,我们只换了运行它们的语言。预设的 105 句直接用客户端算好的 380 个数,四档的票和客户端算出来的一致到小数点后七位。你自己打的句子在本机现算,我们拿这 105 句逐句比过,104 句分到同一档,剩下那一句三档的票本来就只差两个百分点,差别来自编码器在不同处理器上的舍入,OpenSquilla 自己的文档里也记着不同电脑之间会有这种差别。关掉一样东西,是把那一块的数清零再跑同一个模型。模型训练时没见过这样的输入,所以这只能告诉你它有多依赖这一块,清零以后的票本身不对应任何一种真实情况。

虾姑和关姨在分诊台上一格一格地拔,拿掉一样东西,看票往哪边倒。

挑一句你觉得会分错的话,在分诊台里试一下,看看结果和你想的一样不一样,差在哪一样东西上。

4怎么读四档的票

分诊台最后给出四个加起来等于 100% 的数,哪一档的票最多,就由哪一档接单。读这四个数要看两件事,一件是最多的那一档是谁,另一件是它比第二名多出多少。

我们的接口偶尔返回 502,大概每小时两三次,日志里没有报错,帮我分析根因并给出排查步骤,这一句 C2 拿了 76%,第二名 C1 只有 18%,结果没什么悬念。Python 里怎么把字符串转成整数就不一样了,C0 51%,C1 46%,只差 5 个百分点,交给 C0 只是因为它多了这一点点。还有一句更悬,一个人把自家猫一周里每天几点吃饭都记了下来,让它数一数这周一共喂了几次,分诊台给的是 C0 32%,C1 34%,C2 32%,三档几乎打平。

两盏灯都半亮着,票差不多的时候,换一两个字就可能换一档。

票很平的时候,交出去的那一档就不太稳,句子里改一两个字,接单的可能就换了一档。OpenSquilla 在这里不会为了稳妥多叫一个更高档的模型,它先按票最多的那一档交出去;如果答得不好,你点重做,它会往上升一档再答一次。这是第三课要讲的事,这一课只要记住,票越悬,越可能用到重做。

5句子里有生产、删除这样的词,档位会往上走吗?

第 2 节那句删订单的话,只有二十六个字就进了 C2。规则里有一组风险关键词,就是为这种句子准备的,里面有部署、删除、生产、客户,还有 deploy、rollback、migration、delete 这几个英文词,碰上一个就记一个,另外还有单独的生产环境组和删除组。这听起来很合理,一个写错了会删掉真数据的脚本,宁可交给能力更强的那一档。

我们在分诊台里做了一组对照,每次只改一两个字。帮我写个脚本,把数据库里三年前的订单数据导出成表格,这一句 C2 的票是 70%。把导出成表格换成全部删除,涨到了 82%。回到导出那一句,只在数据库前面加上生产两个字,涨到了 84%。同样在关键词表里的客户,放进一封改聚会时间的邮件里,C1 和 C2 的票却几乎没动。

只改了这一两个字接单的一档C2 的票
帮我写个脚本,把数据库里三年前的订单数据导出成表格C270%
帮我写个脚本,把数据库里三年前的订单数据全部删除C282%
帮我写个脚本,把生产数据库里三年前的订单数据导出成表格C284%
帮我写一封邮件,告诉朋友周末的聚会改到周日C141%
帮我写一封邮件回复客户,告诉他周末的聚会改到周日C139%

所以关键词会把档位往上推一把,推多少要看整句话。它们只是 380 个数里的十几个,判断树看的是它们和长度、意思、字的片段放在一起的样子。

6为什么在你自己的电脑上算?

分诊发生在把请求交给模型之前。如果分诊台放在别人的服务器上,你的每一句话都要先多送出去一趟,只为了决定交给谁。OpenSquilla 把它放在本机,它的说明里写着,分类在本机上完成,为了做这个判断,你的提示词不会离开本机。而且决定档位时它只看你这一句,前面聊过什么、上一轮答了什么,都不进分档用的那 380 个数,这些内容会用在第三课要讲的继续还是重做上。

你刚才在分诊台里打的句子,走的也是这条路。模型文件下载到你的浏览器以后,计算全在这台设备上进行,这个页面没有把那句话发给任何人。

分诊台装在你自己的电脑里,那句话被压在桌上,没有飞出窗外。

留一个问题

帮我把这篇三千字的文章翻译成英文和帮我把这篇三千字的文章改写成一份三分钟能讲完的演讲稿,字数差不多。你觉得分诊台会把哪一句放得更高,用这一课的三样东西各说一句理由,再到分诊台里打进去试一试。

不看上面,写下这一课撞上的两堵墙

一堵是话题越难档位越高,证明题落在 C0 把它推倒了。另一堵是字越多档位越高,购物清单和删订单那一对把它推倒了。分诊台估的是这一句要做多少事,靠的是意思、字的片段和规则三样东西一起投票。