一次调用里有什么
大约 3 分钟
一次调用里有什么
一次调用里模型实际看见什么?
模型看见的是一串 token,不是你的业务对象。一次请求里通常有系统指令、历史消息、工具定义、当前观察,以及你希望它遵守的输出格式。温度、最大生成长度这些参数改变的是采样,不改变它「知道什么」。
换供应商时,业务状态不要写进某个厂商的消息结构里。外面保留自己的消息和工具抽象,适配层只负责翻译成该厂商的请求。本地模型和托管 API 的差别主要是地址、鉴权和能否控制权重,循环本身不该因此重写。
和 Agent 有关的模型结构,面试要讲到哪?
不用推完整推导,讲清能力从哪来。
- N-gram 只统计局部共现,没有长距离依赖。
- RNN 能带着隐藏状态往下读,但长序列上梯度难传,也不能并行吃一整段上下文。
- Transformer 用自注意力让每个 token 看到上下文里的其他 token,训练可并行。代价是注意力随长度近似按平方增长,所以窗口既贵又会变钝。
- 词向量那层面试只需知道:语义接近的词在向量空间里接近,后面的嵌入检索是同一直觉。
Agent 开发真正绑定的是最后一跳:模型根据已经看见的 token 预测下一个 token。工具调用也是生成出来的文本,只是被解析成了结构化动作。
为什么对话模型多用 Decoder-Only?
解码器按从左到右的方式生成,天然适合「给定上文,继续写」。对话、推理链、工具参数都是这个动作。
编码器-解码器适合输入输出分明的翻译式任务。Agent 的输入本身就是越来越长的轨迹,下一步仍是继续往下生成,所以现主流对话模型走 Decoder-Only。不要把它讲成「编码器没用了」,只说这个产品形态不需要单独的编码器栈。
提示在 Agent 里至少要有哪些部分?
单轮文案和循环里的提示不是一回事。循环里每次调用至少要能分开这些块:
- 角色和边界:能做什么、不能做什么、什么时候停。
- 当前目标:这一轮要推进的任务,不是整段历史的复述。
- 输出协议:先思考再给动作,动作必须能被解析。
- 可用工具:名字、参数、什么时候不该用。
- 少量例子:覆盖正确调用和该停下来的情况,而不是堆边界。
思维链有用,是因为它把中间步骤显式写出来,方便解析和追责。它不保证事实正确。事实要靠观察,不靠把「请一步步思考」写得更长。
分词为什么会影响工具调用和成本?
模型的计费、窗口和生成上限都按 token,不按汉字或单词。BPE 一类算法把高频片段压成一个 token,罕见字符串、长 JSON、代码和数字可能被切得很碎。
后果有三个:同样一段工具结果,token 数比肉眼看起来大;参数名和格式如果切得不稳定,模型更难原样生成;上下文预算要按 tokenizer 算,不能按字符数估。
面试加一句:工具返回先裁剪再进模型,既是省钱,也是避免无关字段把格式带偏。