1级
说明构建 的全过程,然后通过亲手完成 XSLM。 选一个例子,把你的设计和理由大声讲出来。
报考条件
年满10周岁可报考。
屏幕共享面试
通过SONUB视频功能共享整个屏幕后进行作业。
1级面试任务——构建 XSLM
- 考官会询问 是如何构建的——环境、与项目结构、、、、文本生成、、XChat 和发布。考生要立刻用自己的话回答。
- 回答之后,考生通过亲手完成 XSLM。考生输入并运行源码,保存训练好的,启动 Runner,并让自己训练的模型在 XChat 中作答——考试到此结束。
所有内容都要亲手输入并运行,不能交给外部 或其他人。在你操作期间,考官可能会问某个输出或某行是什么意思。
各级通用说明
面试问题示例:猜下一个词的人工智能
考官 如果要做一个,在学生写学习笔记时猜出下一个词,你会怎么做?又怎样确认它好用?请一步一步说明。
按下面四个步骤回答。每一步都写了要说什么,并附一个简短例子。
-
1. 目标
说清这个人工智能为谁做什么——输入什么、输出什么。例如:“学生输入‘机器’,它推荐‘学习’。”
-
2. 数据
说清它从什么学、学多少、留出什么用来测试。例如:“我自己笔记里的 2,000 个句子——80% 用来学习,20% 留作测试。”
-
3. 做法
说清它内部怎样工作、用什么来做。例如:“一个 统计哪个词后面跟哪个词,推荐最常出现的下一个词。”
-
4. 检验
说清怎么知道它好用——一个要测量的数字和一个局限。例如:“在测试句子上,统计真正的下一个词落在前三个推荐里的比例。它只看前面一个词,所以长句子会出错。”
考官可能会换题目——例如过滤垃圾短信或推荐午餐菜单——但你仍按同样的四个步骤回答。级别越高,每一步说得越详细;面试里除了这道题,还有符合各级别的其他问题和任务。
学什么
- 用自己的话说明构建 的每一步——从准备到、、、文本生成、、XChat 和发布。
- 通过亲手输入并运行 XSLM 源码,一直做到用自己训练的在 XChat 中对话。
- 检查输出(、生成的文本、 响应),遇到问题时阅读并加以修正。
如何评分
- 考生是否按顺序、流畅地用自己的话说明了如何构建 XSLM?
- 考生是否通过屏幕共享完成了 XSLM,并让自己训练的模型在 XChat 中作答?
- 考生是否检查了输出,并说明了自己如何修正错误?
面试预测问题
以下20道题是考官在面试中可能提出的问题示例。不要只想猜中一个正确的词,请把答案大声说明出来。展开每一题可以看到说明示例和追问。这些不是正式试题。
整体流程、环境与数据
-
1
考官 请说明 是什么,以及从准备到在 XChat 中对话的完整构建顺序。
查看说明示例
说明示例 XSLM(Extra Small Language Model)是你在 SONUB 上从零构建的一个微型 ,用来学习 是如何开发的。顺序是:检查环境 → 文件夹、settings.json 和数据(prepare.py)→ (tokenizer.py)→ (engine.py、model.py)→ (train.py)→ 文本生成(generate.py)→ (runner.py)→ XChat 聊天界面(xchat.py)→ 在 上发布(export.py)。当你的被保存、再次加载并在 XChat 中使用时,XSLM 就完成了。
追问 即使 XSLM 的回答很奇怪,为什么也可以说它已经完成了?
-
2
考官 请说明为什么构建 不需要 pip install、、,也不需要。
查看说明示例
说明示例 /ai/build 上的是用 在中运行的 32bit ,并且已经装好了 3。源码只使用 Python ,从不 import ,因此不需要用 pip 安装任何东西。由你从零开始自己,也不任何外部 ,所以不需要 API key。计算在浏览器模拟出的 上运行。
追问 要在自己的电脑上运行同样的源码,需要什么?
-
3
考官 请说明 项目的文件夹结构以及 settings.json 中的各项值。
查看说明示例
说明示例 所有工作都在 ~/xslm 中进行。 存放原始文本(raw.txt)、、和;checkpoints 存放好的(model.json); 源码直接放在项目文件夹中。settings.json 中有 width(的大小)、(一次能看到多少个词元)、merges( 合并次数)、steps(训练重复次数)、(每次改变多少)、seed 和 等值。
追问 在继续训练时修改 settings.json 会发生什么?
-
4
考官 请说明(raw.txt)的格式,以及 prepare.py 如何处理它。
查看说明示例
说明示例 raw.txt 每行是一个问答对,格式为 "Q: … | A: …"。prepare.py 以 读取它,去掉空行和重复行,并检查至少有五行不同的内容且全部格式正确。然后每五行中留出一行用于验证,保存 /train.txt 和 data/val.txt(默认数据得到 12 行训练数据和 3 行)。
追问 如果加入一个自己的问答对,首先要重新生成哪个文件?
-
5
考官 请说明为什么要把分成训练集和验证集,以及为什么要在转换成之前按问答对来划分。
查看说明示例
说明示例 是从未过的文本,所以它能显示模型能否处理新文本,而不只是死记硬背。如果在把文本转换成词元之后随便从哪里切开,同一个例子可能同时落在两边,所以要先按问答对划分。这样验证 才真实可信。
追问 如果验证数据也被用于训练,验证 loss 就再也无法告诉你什么?
分词器与模型
-
6
考官 请说明为什么需要,以及 基于字符的 如何学习词表。
查看说明示例
说明示例 只能计算数字,不能计算文字,所以分词器给每一段文本分配一个编号。基于字符的 BPE 从单个字符开始,按照 settings.json 中 merges 指定的次数,把出现最频繁的一对相邻片段合并成一个新片段。合并的顺序就成为规则,保存在 /tokenizer.json 中。
追问 如果调大 merges,同一段文本的数量和词表大小会如何变化?
-
7
考官 请说明 encode 和 decode 是什么、roundtrip: OK 检查的是什么,以及从未见过的字符会怎样。
查看说明示例
说明示例 encode 先把文本逐个字符转换成数字,再按相同顺序应用学到的合并规则,得到一个数字列表;decode 把数字转换回片段并拼接起来。roundtrip: OK 表示整个训练文本被转换成数字后又完全还原成了原文。新字符不会被学习——它会变成编号为 0 的片段 �。
追问 如果重新,为什么不能继续使用已经训练好的?
-
8
考官 请说明 和是什么,以及为什么要把它们相加。
查看说明示例
说明示例 embedding 是一张按查出一个数字(长度为 width)的表。同一个还需要知道自己处在哪个位置,所以要加上为每个位置单独学习的位置向量。两张表都从随机值开始,并在中不断变化。
追问 为什么位置向量表的行数与 相同?
-
9
考官 请说明 中的 Query、Key、Value 以及 。
查看说明示例
说明示例 Query 是当前位置要寻找的东西,Key 是之前每个位置的,Value 是要取走的信息。Query 和 Key 给出相关度分数, 把分数变成,再按这个比例混合各个 Value。causal mask 让每个位置只能看到自己和之前的位置,因此在时无法偷看答案。
追问 为什么之后加入时,之前位置的分数不能改变?
-
10
考官 请说明 engine.py 中的 Value 和 backward 做什么,以及 之后的各层(、和)。
查看说明示例
说明示例 一个 Value 保存一个数字、它对 的影响(grad),以及每次运算的记录。backward 沿反向遍历并累加,因此被多次使用的的影响也会被加总。MLP 把扩展到 width 的两倍再压缩回来,残差连接把一层的输入加到它的输出上,以免信息丢失,输出层(head)则为词表中的每个词给出下一个的分数。
追问 的数量由什么决定?如何计算?
训练与文本生成
-
11
考官 请说明 学习做什么,以及 。
查看说明示例
说明示例 目标是。如果是 [a, b, c],输入 [a, b] 的答案就是 [b, c]。cross-entropy loss 是正确词元所得的对数的负值,所以正确词元得到的概率越大,它就越小。 小并不保证说的是真话。
追问 对于给每个词元相同概率的模型,loss 与词表大小有什么关系?
-
12
考官 请按顺序说明 train.py 中一个训练步骤里发生了什么。
查看说明示例
说明示例 它从中随机挑出一段 +1 个,把每个的 grad 清为 0,计算 并用 backward 求出。如果梯度的总大小超过 1,就把它缩小到 1(clipping),然后从每个权重中减去 × 梯度()。之后保存检查点,并打印 step 和 loss。
追问 如果不把 grad 清为 0,会发生什么?
-
13
考官 请说明检查点保存了什么,以及恢复训练时会检查什么。
查看说明示例
说明示例 checkpoints/model.json 保存设置、、的()、、step 和随机状态。它先写入一个,再用 替换上去,所以如果保存中途停止,之前的检查点仍然保留。下次运行时会检查设置、分词器和数据是否未变——若有变化就有意拒绝,若没变就从保存的 step 继续。
追问 为什么修改数据后继续从是有风险的?
-
14
考官 请说明如何检查是否顺利——如何解读训练 和验证 loss。
查看说明示例
说明示例 train.py 会在训练前后打印验证 loss,并在每一步打印 step 和 loss。每一步挑选的片段都不同,所以 loss 会上下波动。不要凭一个数字下判断——要比较趋势,以及训练前后的验证 loss。如果只有训练 loss 下降而验证 loss 上升,就要怀疑(overfitting)。
追问 如果 过大很多,loss 会怎样变化?
-
15
考官 请说明 generate.py 如何写出文本,以及 、 和 seed 的作用。
查看说明示例
说明示例 它读取检查点重建,然后重复:输入最后 个,得到下一个词元的分数,选出一个并追加到末尾。temperature 为 0 时选分数最高的,temperature 越大,越平均。top_k 只保留前 k 个候选,为 0 时全部保留。相同的检查点、问题、seed 和设置会得到相同的文本。
追问 更多的随机性能让不足的模型回答得更好吗?
Runner、XChat 与发布
-
16
考官 请说明 (runner.py)是什么、它开放哪些 ,以及如何检查它。
查看说明示例
说明示例 Runner 是一个课堂用的,它只读取一次检查点,接收 请求并调用 generate。在 (loopback)上、settings.json 中的 上, 返回 {"status": "ok"}, /generate 返回根据 中的 生成的文本。在后台启动它,用 调用 /health 和 /generate,并检查空 JSON 这类错误请求会得到 400,而不是让服务器崩溃。
追问 为什么重新训练后必须重启 Runner?
-
17
考官 请说明 XChat(xchat.py)做什么,以及从 XChat 到 再到的流程。
查看说明示例
说明示例 XChat 只是聊天界面——它自己从不加载。它读取问题,套上格式(Q: … A:),以 发送到 Runner 的 /generate,并显示返回的文本。这段文本由 Runner 用保存的权重写出。如果 Runner 没有运行,XChat 会显示连接错误,而不是假的回答。
追问 为什么 XChat 在发送问题前要加上 "Q:" 和 "A:"?
-
18
考官 请说明如何在 上发布完成的 ,以及要上传哪些文件。
查看说明示例
说明示例 export.py 把(model.safetensors)、设置(config.json)、(tokenizer.json)和运行用的源码收集到 hub 文件夹中,并读回来检查没有任何改变。编写(),在 Hugging Face 上创建一个 Public ,然后用 Write 令牌运行 install → push。当在另一个文件夹中 git clone,再执行 python3 export.py --restore . 和 python3 generate.py 能得到相同的回答时,就算发布完成了。
追问 如果 git push 因为被拒绝,你漏掉了哪一步?
-
19
考官 请说明 格式是什么,以及中写些什么。
查看说明示例
说明示例 safetensors 是一种文件,开头是 头部(名称、形状、位置),后面是以 4-byte 值依次写入的数字。它不包含可运行的,所以读取是安全的。模型卡说明是什么,并列出文件、运行方法、、及其局限(它是用于学习的,所以回答大多是随机的)。
追问 全部上传完成后,Access Token 要怎么处理?
-
20
考官 在面试中亲手完成 时,请说明你将如何证明真的是你自己的在作答。
查看说明示例
说明示例 按顺序运行 prepare.py → tokenizer.py(roundtrip: OK)→ engine.py 的检查和 model.py 的形状检查 → train.py(、step、、验证、checkpoints/model.json)→ generate.py → runner.py(、/generate)→ xchat.py,并展示每一步的输出。最后在 XChat 中提问并展示返回的回答;再展示关闭 时出现连接错误,重新启动后聊天又恢复。这样就能清楚表明回答来自你的检查点,而不是一句固定的句子。
追问 如果回答很奇怪,你会先检查什么?