把一句提问交给对话模型时,它并没有从柜子里抽出一篇写好的说明。它看到的是一串字符。字符先被切成小块,每一小块换成一个编号。后面的工作,都是在这些编号上往前接,一次接出一小段,再把小段变回人能读的句子。知道这件事,后面那些看起来很顺的回答,就不容易被当成凭空出现的成品。
切分不是按固定词条来的。常用的片段会单独成块,少见的组合会被拆得更碎。一句不长的提问,切完之后往往是几十个小块。小块的顺序必须保留,因为顺序一乱,同样的字会指向另一件事。把条件和结果对调,模型后面接出来的句子就会跟着偏。切分本身不产生新意思,它只是把原来的句子变成一条可以计算的队列。
这条队列不会无限变长。模型每次向前看,都有一个固定的窗口。窗口里放得下的小块是有数的。提问太长,最早的那几句就会被挤出窗口。挤出去的部分,等于这次计算看不见。所以把背景写在最前面,又在结尾追加很多旁支,真正被用到的常常是靠近结尾的那一段。想让某一条限制生效,就要把它放在窗口还留得住的位置,而不是只在开头提一次。
![]()
接下一小块的时候,模型会回头看窗口里已有的小块,但不是平均地看。有的小块权重大,有的几乎被忽略。权重来自这些小块彼此之间的关系,而不是来自一句外部口令。问的是步骤,描述动作的小块会被抬高。问的是原因,表示条件的小块会被抬高。这就是同一段原文,换一个问法,回答侧重点会变的原因。它不是重新找来一篇成品,而是同一条队列上,目光停的位置不一样。
目光停住之后,模型得到的是一张候选表。表上每一格是一个可能的下一小块,旁边有一个高低不同的分数。分数高的更常被选中,分数低的不是绝对不会出现。于是同一个提问,连着问两次,用词可能不一样,但主干常常还在。若每次都只取分数最高的那一格,句子会更稳,也更容易变得呆板。若允许偶尔走到旁边的格子,句子更活,也更容易拐到不相关的方向。
句子是一小块一小块长出来的。前一块选偏了,后一块就在错误的前提下继续接。这和人写字时可以停下来划掉半句不一样。模型一旦把那一小块写进队列,它就变成后面的上下文。所以一个早期的偏差,会在后面被放大。看到回答后半段开始空转,多半不是突然失灵,而是前面积累的小块已经把话题带离了原来的提问。
停止也有规则。遇到句号、问号,或者长度到达上限,生成就会停。停下来不等于问题已经答完。它只说明这一轮接块结束了。有的回答停在一个完整的句子上,意思却还缺一块。有的回答把窗口里所有能看见的点都点到了,于是显得很长,其实每一点都只写了表面。判断值不值得往下读,要看它有没有把提问里的限制逐条接住,而不是看它停得够不够长。
![]()
出错常见的来源就这几处。窗口里没有关键限制,回答就会用更常见的说法把空缺补上。提问里有两个都说得通的词,候选表上两个方向的分数接近,结果可能跳到你没打算问的那一个。链条太长,前面每一块都只偏一点,最后一段就会离题。这三类情况,都不是模型突然产生了意图,而是队列、窗口和候选表一起造成的。
可以自己做三个检查。第一,把提问里的限制单独再写一遍,放在最后,看回答是否还遵守。第二,把同一个意思换一种说法再问一次,看两次主干是否一致。主干差得很远,说明候选表上的高分格子不稳定,这次结果不宜直接拿去用。第三,对回答里的数字、专名和先后顺序逐项核对。这些最容易在接块时被顺手补全,也最容易补错。
模型适合承担的是整理和起草。你给出清晰的步骤、边界和反例,它能把这些小块连成一段可读的话。你没有给出的部分,它也会连,只是连出来的是高分格子上的常见说法。常见说法不一定适合你的场合。把回答当成待核对的草稿,而不是当成已经验过的结论,使用起来就稳得多。
还有一种看起来很完整的失败。回答的句子都通顺,结构也整齐,可它回避了提问里最难的那一条,只把容易接的部分写得很满。这是因为难的那一条在候选表上分数分散,容易的部分分数集中。生成过程偏向分数集中的方向。读的时候可以先找提问里最难的限制,看回答是正面接住了,还是用相邻的话题绕了过去。
若要减少这种绕开,提问本身就要把难的限制写成短句,并且只留一个主要问题。一次塞进很多互不相关的要求,窗口里的权重会被摊薄,每一条都接不深。与其让它同时处理五件事,不如先让它把一件事的步骤写完,确认之后再进入下一件。这样每一轮的队列都短,偏差也不容易越滚越大。
人在阅读时容易被流畅度带走。句子越顺,越觉得它背后有一套完整依据。其实流畅只说明小块之间接得上,不说明每一块都对应着你给出的事实。把回答拆回提问的条款,一条一条对,流畅带来的错觉就会减弱。对得上的留下,对不上的标出来,再决定要不要再问一轮。
再问的一轮要把偏差说具体。不要只说重新写。要指出哪一条限制没被接住,哪一个专名可能不对,希望下一段改哪一部分。这些话会变成新的小块,进入下一轮窗口,权重才有地方可放。空泛地要求更好,候选表几乎不会因此改变。
窗口里的小块也不都来自你刚刚打进去的字。若前面已经有一段对话,那些旧句子同样占着位置。旧句子里的一个例子,可能比你这句新提问的权重还高。于是回答会沿着旧例子继续,而不是沿着新限制继续。遇到这种情况,与其在同一条队列里反复追加,不如另起一次,只保留必须留下的几条限制。队列变短之后,新的限制才站得住。
编号本身也值得看一眼。人读到的是字,模型比较的是编号之间的距离。两个意思接近的说法,编号会靠得比较近,于是候选表上它们会一起出现。两个字面相近、意思很远的说法,也可能因为共享某些片段而靠得不够远。这就是回答偶尔会把相近的词用混的原因。它不是没看见你的字,而是这些字对应的编号,在它的空间里离另一个意思太近。
因此,写提问时可以把容易混的词拆开。不要只给一个简称,再指望它自己补全。把对象、范围和不要做什么写成三句短话,每句只做一件事。短话切出来的小块更完整,权重也更集中。长句里套着转折和补充,切完之后小块彼此牵连,目光就容易停在最顺的那一截,而不是停在你最在意的那一截。
接出来的段落还有一个容易忽略的特点。它很会维持语气上的一致。一旦开头用了确定的口气,后面的小块就会继续用确定的口气,哪怕中间某一步其实并没有把握。读的人如果只听口气,就会把不确定的步骤也当成已经核实的步骤。把口气和内容分开看,先问这一句依赖的前一块是什么,不确定的地方就露出来了。
最后把整个过程收成一条线。提问被切成小块,小块进入有限的窗口,每一小步回头看已有的块并给它们不同的权重,然后从候选表里取出下一块,直到停下。回答好不好,取决于窗口里有没有关键限制,也取决于你愿不愿意把接出来的句子再对回原来的条款。知道这条线,就能判断一份回答是在顺着提问往下接,还是在高分的常见说法上自行铺开。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.