770B与1M上下文实测:Hy4预览版长文档接入与成本边界
1. 先给结论:这个770B预览版到底值不值得折腾
先说观点:值得试,但别急着把生产链路迁上去。这个以 Hy4 为代号的预览版模型,同时抛出了“770B 参数规模”和“1M 上下文窗口”两个相当激进的数字,还挂着一个“免费”的钩子,很多人第一反应是“白嫖一个超大杯”,第二反应是“肯定有什么坑”。我花了两天时间,把长文档问答、代码库级理解、超长日志分析这三条典型链路各跑了一轮,结论是:能力是真的,免费是真的,但“免费用”和“随便用”之间隔着三道墙——速率限制、有效上下文、输出上限。
如果你平时要处理几十万字的标书、合同、财报、完整代码仓库、几天的服务端日志,那这个 1M 上下文确实能省掉大量切片和检索工程的麻烦;如果你只是做普通的对话、翻译、摘要,那 770B 的体量对你来说纯属浪费,免费的额度反而会被你的无效调用快速烧掉。下面我把整个过程拆开讲,包括架构上为什么会出现 770B 这个数字、1M 上下文在实测中的真实有效窗口有多大、接入时的参数怎么配、以及免费额度到底能撑多久。
1.1 三个数字背后的真实含义
“770B 参数”这个说法要先拆一层。业内报参数规模的时候,通常报的是总参数,而真正决定单次推理成本的是激活参数。一个 770B 级别的模型,如果是稠密结构,那单次前向要跑满 770B 的矩阵乘,这个成本高到普通团队根本没法碰;所以现实里这种量级基本都走 MoE(混合专家)路线,总参数摊在几十上百个专家上,每个 token 只激活其中一小部分,实际激活参数大概落在一个明显更小的量级。
这个区别对使用者的影响非常直接:总参数决定知识容量和上限,激活参数决定推理速度和单价。你可以把它理解成一家有 770 个专科医生的大医院,但你每次挂号只走其中 2 到 4 个科室,所以你的候诊时间取决于那几个科室的速度,而不是全院大夫的总数。这也是为什么有时候你会感觉一个“大模型”响应得比预期快——它压根没把所有参数跑一遍。
“1M 上下文”同理,它不是简单的“把窗口调大”就完事了。上下文长度直接决定 KV 缓存的显存占用,而显存是推理侧最硬的约束。后面我会给一个具体的估算,让你明白为什么 1M 窗口在工程上是个需要专门设计注意力机制才能做到的事,而不是改个配置文件。
1.2 免费额度的边界在哪里
免费这件事,我自己踩过的最大的坑就是把“模型能力上限”和“免费档能力上限”混为一谈。宣传页写的是 1M 上下文,但你拿免费额度去调的时候,很可能发现实际可用窗口被压到了一个小得多的数字,或者在超过某个长度之后直接被返回参数错误。
所以我在测试开始前做的第一件事,不是跑效果,而是探边界:用一个递增长度的输入,从 32K 一路往上试,记录第一次失败的长度点、报错类型、以及是否有明确的额度提示。这个过程大概花了二十分钟,但它决定了后面所有测试怎么设计。实测下来常见的几种限制形态我列在下面,你接入任何预览版模型时都可以按这个清单先摸一遍:
| 限制维度 | 常见表现 | 探测方式 |
|---|---|---|
| 单次输入长度 | 超长直接 400,提示上下文超限 | 递增长度二分探测 |
| 单次输出长度 | 输出被硬截断,finish 原因是长度 | 让它复述长文本并数 token |
| 每分钟请求数 | 429 集中出现,间歇性成功 | 小并发压一分钟看失败率 |
| 并发连接数 | 同时发多个请求,部分排队超时 | 逐步加并发直到出现超时 |
| 日/月总量 | 某天开始全部失败,提示额度耗尽 | 记录每次消耗,做累计 |
注意:探测边界这个动作本身要花额度,别拿最大的文档去撞。我的做法是先估算 token 数(中文大致 1 个字 ≈ 0.6 到 0.7 token,英文 1 词 ≈ 1.3 token),再用接近但略低于上限的长度去试,能省掉一半无效调用。
2. 770B到底大在哪:MoE结构与推理账本
很多人看到 770B 的第一反应是“我要不要搞几张卡本地跑”。这个问题我建议你先算完账再决定,因为 770B 这个量级在本地部署上是另一个世界的事,跟调用 API 完全不是一个游戏。这一节我把架构和成本摊开讲,你可以直接代入自己的场景。
2.1 总参数和激活参数是两码事
MoE 的核心是路由:每个 token 进来,先过一个小网络判断它该交给哪几个专家处理,然后只把这几条路径算完再合并。这带来两个后果,一个是好的,一个是麻烦的。
好的后果是推理成本按激活参数算。假设这个 770B 模型每次激活 40B 到 60B 量级的参数,那它的单 token 计算量就接近一个 40B 到 60B 的稠密模型,而不是 770B。这就是为什么你能在相对合理的延迟内拿到一个“超大杯”的输出质量。
麻烦的后果是显存占用按总参数算。所有专家的权重都得加载到显存或者能被快速换入的内存里,你不能因为这次没用上某个专家就不加载它。粗略估算,770B 参数用 FP8 存就是 770GB 左右,用 4bit 量化也要接近 400GB。这意味着哪怕你用最激进的量化,也需要一整套多卡节点,而不是一张消费级显卡能碰的事。
所以对于绝大多数团队,正确的姿势是云端调用 + 本地做编排,把本地算力花在检索、预处理、后处理上,而不是花在权重上。
2.2 一次1M上下文请求的算力估算
我习惯在做方案前把数量级算出来,不然很容易对延迟和价格产生错误预期。这里给一个可以直接套用的估算过程。
第一步,算预填充的计算量。前向传播的计算量近似等于 2 × 参数量 × token 数。取激活参数 40B,输入长度 1M token:
FLOPs ≈ 2 × 40e9 × 1e6 = 8e16 FLOPs第二步,换算成时间。一张主流训练卡的 FP16 峰值算力大致在 300 TFLOPS 量级,实际推理利用率按 40% 算就是 120 TFLOPS 左右:
时间 ≈ 8e16 / 120e12 ≈ 667 秒也就是说,单卡跑满要十分钟以上。用 8 卡并行做张量切分,能压到一分多钟,但这只是预填充,还没算生成。这就是为什么长上下文请求的“首字延迟”会明显偏高,而一旦开始吐字,速度又恢复正常——预填充是一次性的大计算,解码是逐 token 的小计算。
第三步,算 KV 缓存的显存。这部分才是 1M 上下文真正的魔鬼。粗算公式是:
KV 显存 = 2 × 层数 × KV头数 × 头维度 × 序列长度 × 每元素字节数假设 60 层、8 个 KV 头(GQA)、头维度 128、FP16 存储,单 token 的 KV 占用大约是:
2 × 60 × 8 × 128 × 2 字节 ≈ 245 KB/token乘以 1M token,就是245GB。这个数字足以说明问题:如果不做特殊处理,1M 上下文根本装不下。所以这类模型一定用了某种压缩或稀疏注意力机制,比如低秩压缩 KV、分块稀疏、滑动窗口加全局 token 的混合结构。你在使用时的体感就是:长上下文确实能塞进去,但“能塞”和“能精准用上”是两件事,下一节我会用实测说明这个差距。
2.3 自建与调用的分水岭
把上面两个账一算,自建的门槛就很清楚了。我给你一个粗略的判断标准:
- 日调用量在几百万 token 以内,云端调用几乎一定更划算,光是把运维、扩缩容、模型更新这些事省掉就值了。
- 日调用量上亿 token 且长期稳定,才需要认真考虑自建或者私有化,而且这时候你要算的不只是卡的钱,还有电力、机房、故障冗余、以及模型迭代跟不上导致的隐性损失。
- 有强数据合规要求,那没得选,只能自建或者走私有部署,但要做好“模型能力落后云端一个版本”的心理准备。
我见过不少团队在日调用量还不到十万 token 的时候就开始张罗自建,最后卡在“模型更新太快,刚部署好就落后了”这个问题上。预览版模型尤其如此,它的迭代节奏是按周算的,你自建的意义会被快速稀释。
3. 1M上下文实测设计:怎么测才算数
长上下文这件事,最容易被糊弄的地方就是“我塞进去了,它答出来了”。但答对和真正用上了是两回事。我用三组设计不同的测试来区分这两种情况,这套方法你也可以直接搬去测任何长窗口模型。
3.1 针尖测试的三个变体
经典的大海捞针测试是:在一大段无关文本里藏一句话,然后问模型那句话是什么。这个方法能测出“能不能找到”,但测不出“找到得有多稳”。我做了三个变体:
变体一:单针,位置扫描。藏一句带唯一标识的话(比如“记录编号 K-7742 的校验码是 91XQ”),然后把这个针分别放在文档的 5%、25%、50%、75%、95% 位置,每个位置跑三次,看命中率。这个测的是位置衰减。
变体二:多针,同类型干扰。藏五句格式几乎一样的话,只有一句的编号对得上,其余四句是干扰项。这个测的是区分能力,比单针难得多,因为模型不能靠“这段话风格突兀”来定位,必须真的读懂内容。
变体三:聚合推理。不给现成答案,而是把三个分散在文档不同位置的事实摆出来,要求模型做一次简单汇总,比如“把三个部门各自的预算加起来”。这个测的是跨位置的信息整合能力,也是实际业务里最常见的需求形态——财报分析、合同比对、代码库理解,全是这一类。
实测下来,变体一的表现在中短长度上很稳,长到极限位置时会有明显下滑;变体二在针的数量上去之后错误率抬头;变体三是最能拉开差距的,也是我判断“这个窗口到底能实用到多长”的主要依据。我的经验是:宣传的上下文长度打个对折,通常是能稳定工作的长度;再打个七折,是需要高准确率场景下的保守值。
3.2 位置衰减与有效注意力窗口
位置衰减这件事值得单独说。几乎所有长窗口模型都有这个现象:信息放在开头和结尾时召回率最高,放在中间偏后位置时最差。这不是模型“偷懒”,而是注意力机制在长序列上的固有特性——中间位置距离查询向量远,注意力权重容易被稀释。
我在实测里的具体做法是:不要只看总体命中率,要按位置分桶统计。如果 5% 位置和 95% 位置都是 100%,50% 位置掉到 70%,那你在设计 prompt 的时候就应该把最关键的信息往两头放。
这个规律直接指导了工程实践:给长文档做结构化重组时,把结论、约束条件、关键数字放最前面,把“请重点关注的原文摘录”放最后面,中间放背景材料。这一招我在合同审查和信息抽取两个场景里都用过,效果比单纯把文档原样塞进去好一大截,因为你在顺着模型的注意力分布走,而不是跟它对抗。
提示:如果你的任务是“从超长文档里找几个特定事实”,不要图省事直接把整篇扔进去。先在本地做一次关键词粗筛,把候选段落提到前面,准确率提升会比换模型更明显。
3.3 长上下文工程化的四条落地技巧
测完之后我总结了四条可以直接抄的做法,都是踩过坑换来的:
第一条,明确告诉模型“长度”这件事。输入开头加一句“以下文档共约 XX 字,分为 N 个章节”,模型对结构的感知会明显变好。这听起来像玄学,但实测有效,因为它给了模型一个位置参照系。
第二条,用显式分隔符切段。不要用空行分隔,用=== 第 3 节 开始 ===这种强标记。长文本里空行太容易被忽略,而强标记能当锚点用。
第三条,把输出格式约束写死。长上下文场景下模型容易“自由发挥”,导致你拿到的结果没法解析。要求它输出 JSON 并且给出 schema,稳定性会好很多。
第四条,超长输入一定要用流式。长上下文的首字延迟可能到几十秒,非流式请求很容易触发网关超时。这个问题我在第三节会详细讲怎么处理。
4. 接入实操:从零跑通一个长文档问答
这一节是给动手党准备的。我按最小可用路径写,你把 key 换掉就能跑。前面说了,本地算力花在编排上更划算,所以这里的思路是“本地做预处理 + 云端做理解”。
4.1 鉴权与最小请求体
先把最小请求跑通,确认 key、endpoint、模型代号三样东西都对。我建议用 curl 做第一次验证,因为报错信息最原始,不会被 SDK 包装掉。
export MODEL_API_KEY="your_key_here" export MODEL_ENDPOINT="https://your-endpoint.example.com/v1/chat/completions" curl -s "$MODEL_ENDPOINT" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $MODEL_API_KEY" \ -d '{ "model": "hy4-preview", "messages": [ {"role": "system", "content": "你是一个严谨的文档分析助手,只依据给定材料回答。"}, {"role": "user", "content": "用一句话说明你收到了请求。"} ], "max_tokens": 128, "temperature": 0 }'这一步能过,说明鉴权和通路段没问题。如果返回 401,检查 key 有没有多余空格;返回 404,多半是 endpoint 路径少了/v1或者多了个斜杠;返回 400 且提示模型不存在,那就是模型代号写错了,去看一眼文档里的准确字符串,预览版模型的代号经常带版本后缀,很容易抄漏。
4.2 关键参数怎么配
参数配置这块,我的原则是能固定就固定,减少不确定性。下面是我在长文档场景下用的一套:
| 参数 | 建议值 | 理由 |
|---|---|---|
| temperature | 0 到 0.2 | 抽取、比对类任务要确定性 |
| top_p | 0.9 左右 | 配合低温度,避免分布过窄导致重复 |
| max_tokens | 按需,别开太大 | 输出长度直接吃额度,且长输出更容易跑偏 |
| stream | true(长输入必开) | 规避网关超时,改善体感 |
| 思考/推理开关 | 按任务类型决定 | 复杂推理开,简单抽取关,关掉能省钱省时间 |
关于那个思考开关,我实测的体感是:结构化抽取、格式转换、翻译这类任务关掉它,效果几乎不掉,速度明显快;多步推理、数值计算、代码逻辑分析这类任务开着它,准确率提升明显。差别大概相当于“让我直接说答案”和“让我先打个草稿”的区别,草稿对难题有用,对简单题纯属浪费。
4.3 流式输出、超时与重试
长上下文的超时问题必须正面处理。我不止一次遇到过这种情况:请求发出去,客户端等了 60 秒没反应,连接被中间层掐断,但服务端其实还在算,额度已经扣了,结果没拿到。这属于最亏的一种失败。
流式能解决大部分问题,因为只要第一个 chunk 回来了,连接就是活的。但还有两个细节要处理:
import json, time, requests def stream_chat(payload, endpoint, api_key, max_retries=3, timeout=(10, 300)): headers = { "Content-Type": "application/json", "Authorization": f"Bearer {api_key}" } for attempt in range(max_retries): try: resp = requests.post( endpoint, headers=headers, json=payload, stream=True, timeout=timeout ) if resp.status_code == 429: wait = min(2 ** attempt * 2, 30) print(f"触发限流,等待 {wait}s 后重试") time.sleep(wait) continue if resp.status_code >= 500: time.sleep(2 ** attempt) continue resp.raise_for_status() buf = [] for line in resp.iter_lines(decode_unicode=True): if not line or not line.startswith("data:"): continue chunk = line[len("data:"):].strip() if chunk == "[DONE]": break try: delta = json.loads(chunk)["choices"][0]["delta"] except (json.JSONDecodeError, KeyError, IndexError): continue piece = delta.get("content") if piece: buf.append(piece) return "".join(buf) except requests.exceptions.ReadTimeout: print(f"第 {attempt + 1} 次读取超时") time.sleep(2 ** attempt) except requests.exceptions.ConnectionError: print(f"第 {attempt + 1} 次连接失败") time.sleep(2 ** attempt) raise RuntimeError("重试次数用尽,建议缩小输入长度后再试")这里有两个经验点。第一个,429 的退避时间要带随机抖动,不然多个 worker 会同时醒来再次撞墙,形成雪崩;上面为了简洁没加抖动,实际生产里建议加上。第二个,5xx 和超时的重试语义不同:5xx 通常可以安全重试,超时则可能是服务端已经算完了,重试会重复计费,所以超长的请求我倾向于“先降长度再重试”,而不是原样重发。
4.4 分块加检索的兜底链路
即使有 1M 上下文,我也不建议所有场景都直接把全文塞进去。原因有三个:贵、慢、且长上下文下的准确率并不等于短上下文。所以我保留了一条兜底链路:先检索后喂入。
具体的分工是这样的:
- 文档总量在几万字以内,直接全文喂,最简单,效果也最好。
- 文档在几万到几十万字,做一次粗粒度切块加关键词召回,把最相关的几段拼起来,控制在十几万 token 以内。
- 文档超大或者是一个持续增长的语料库,必须上向量检索,长窗口只用来装“召回的上下文”,而不是装整个库。
这个分层的判断依据是单次成本而不是能力上限。能力上限决定“能不能做”,成本决定“值不值得这么做”。我见过有团队为了省事,把一个几百 MB 的知识库每次全量塞进去,账单一出来就清醒了。
5. 成本核算:免费额度用光之前该做的事
这是标题里那个问号的核心。免费是真的,但“免费”不等于“零成本”,你的成本会以额度消耗、时间等待、工程复杂度的形式体现出来。这一节把账算清楚。
5.1 三种计费口径的差异
预览版的计费口径通常有这三种,差异很大,接之前一定要确认清楚:
| 计费口径 | 特点 | 对你的影响 |
|---|---|---|
| 输入输出分开计价 | 最常见,输入便宜输出贵 | 长文档场景下输入打头,要重点压输入 |
| 输入缓存命中折扣 | 重复前缀可打折 | 固定 system prompt 能省钱 |
| 阶梯或包月额度 | 有免费池,超了按量 | 免费额度是一次性还是每月刷新,差别巨大 |
输入输出分开计价这件事,很多人没算过它对长文档场景的影响。既然输入便宜、输出贵,那正确的策略就是让模型多做选择题、少做问答题:要求它输出结构化的短字段,而不是长篇分析;要求它引用原文位置,而不是复述原文。我实测过同一条任务的两种问法,输出 token 差了将近四倍,结果质量几乎一样。
缓存命中折扣是长文档场景的一个大红利。如果你的调用有稳定前缀——比如固定的系统指令、固定的文档模板——把这部分放最前面,后续调用能吃到折扣。注意这个折扣通常要求前缀完全一致且位置在最前面,你在中间插一句动态内容就全废了。
5.2 省额度的六个具体手法
下面这六条是我自己实打实在用的,按效果排序:
手法一,先在本地做长度压缩。长文档里的页眉页脚、重复的表头、无意义的目录,统统删掉。这一步不要小看,一份扫描版 PDF 转出来的文本里,光是重复页眉就能占掉十几个百分点。
手法二,把输出格式约束到极致。用 JSON schema 约束,要求只输出必要字段。禁止它输出“根据文档内容,我认为……”,这类过渡句纯粹在烧钱。
手法三,分阶段调用。不要一次性让它“读完文档然后给我完整分析报告”。先做一次抽取拿到关键事实,再做一次基于事实的推理。两次短调用加起来,往往比一次长调用便宜且准确。
手法四,用低成本的模型做粗筛。召回、分类、初筛这些任务不需要 770B,用小模型做完,只把难的部分交给它。这是最有效的成本控制手段,没有之一。
手法五,做好失败请求的记账。每次调用记录输入长度、输出长度、耗时、状态码。没有这本账,你永远不知道自己浪费在哪。我就是靠这本账发现某条链路上有个循环重试,一天白烧掉大量额度。
手法六,把免费额度当成“效果验证预算”而不是“生产预算”。用它来验证“这个任务它到底能不能做对”,验证通过之后再去谈生产方案。反过来做,等额度烧完了才发现方案不成立,那才是最亏的。
6. 常见问题与排查实录
这一节是我这两天踩过的坑的汇总,按“报错 → 原因 → 处理”的形式整理,方便你直接对照。
6.1 报错速查表
| 现象 | 最可能的原因 | 处理方式 |
|---|---|---|
| 400 上下文超限 | 输入真的超了,或免费档窗口被压缩 | 打印实际 token 数,别凭字数估 |
| 400 参数非法 | 某个参数不被支持,比如思考开关写法不对 | 先只留必填参数跑通,再逐个加回 |
| 413 请求体过大 | 网关层有大小限制,比模型限制更严 | 分块发送,或改走文件上传通道 |
| 429 限流 | 并发或频率超了 | 指数退避加随机抖动,检查是否多进程同时发 |
| 首字延迟几十秒 | 长输入预填充耗时 | 开流式,前端加骨架屏,别让用户干等 |
| 输出被截断 | 命中 max_tokens 上限 | 看 finish 原因,必要时分段请求 |
| 长文档问答答非所问 | 关键信息在中间位置被稀释 | 重排文档,关键信息前置,尾部再强调一次 |
| 同一请求结果差异大 | 温度没固定 | 抽取类任务一律温度设 0 |
表格里有一行我想单独展开:413 和“上下文超限”不是一回事。前者是网关层的包体大小限制,后者是模型的上下文长度限制,两者的阈值可能差好几倍。我就遇到过模型明明支持很长上下文,但网关在更小的长度上就返回 413 的情况,白折腾了半天以为是模型限制。排查方法是:把同一个请求分别走不同通道发,如果一条通道报 413 另一条能过,那就是网关问题。
6.2 输出质量的定位路径
比报错更麻烦的是“没报错但结果不对”。这种情况我按下面的顺序排查,基本能定位到问题:
第一步,看是不是检索环节的锅。把你实际喂进去的那段文本原样打印出来,人工读一遍,看答案在不在里面。八成的问题出在这里——你以为喂进去了,其实切块的时候把关键段切断了。
第二步,看是不是位置问题。把关键段落挪到开头,重跑一次。如果好了,那就是注意力衰减,按前面说的重排策略处理。
第三步,看是不是指令问题。把系统提示词精简到只剩最核心的两三条约束,再看结果。提示词越长越容易互相打架,我见过一条“请尽可能详细地回答”和一条“请只输出结果”同时存在,模型最后选择了一种奇怪的折中。
第四步,看是不是任务本身超纲。有些任务需要精确的数值计算或者多跳逻辑,这类任务再大的模型也会飘。这种时候正确的做法是把计算交出去,让模型只做信息提取,数值运算交给代码。
注意:排查时一定要固定其他变量,一次只改一个。我一开始图快,同时改了长度和提示词,结果好了也不知道是哪个起的作用,又得重跑一遍。
7. 把它放在正确的位置:适用与不适用
最后聊聊定位。一个 770B 加 1M 上下文的模型,能力上限确实高,但它不是万能药,用错地方反而比小模型更糟。我按自己的实测经验划一下边界。
7.1 值得上的三类任务
第一类,跨文档的信息整合。比如把一份几十页的合同和一份技术方案放在一起,让它指出两边的矛盾点。这类任务的难点不在单点理解,而在跨位置关联,正好是长窗口的主场。用分块加检索的做法反而容易漏掉关联,因为关联信息本来就分散在不同块里。
第二类,整仓代码的逻辑审查。把一批相关源文件一起喂进去,问“这个模块的状态在什么情况下会不一致”。这类问题需要看到多个文件的实现细节,短上下文模型只能靠检索片段猜,长窗口能直接看到全貌。我实测下来,对于几万行的局部模块,效果明显好于切片方案。
第三类,长时序日志的异常定位。几天的服务日志,中间夹着一条异常,短窗口方案基本靠运气。长上下文能把整段时间线摆进去,让它自己找“第一次出现异常特征的位置”。这类任务对位置衰减的容忍度反而高,因为异常特征通常会在后续反复出现。
7.2 别硬上的场景
高频低价值的调用不要上。分类、打标签、格式转换、简单翻译,这些任务用小模型成本能差一到两个数量级,效果差距却很小。我见过把每天的日志分类也交给大模型的,纯属浪费。
需要严格确定性的计算不要上。数值汇总、金额计算、日期推算,这类交给代码。模型的强项是理解和组织,不是精确运算,让它算数就是在给自己埋雷。正确姿势是让它输出结构化的中间结果,代码来算。
实时性要求高的场景要谨慎。长输入意味着预填充时间长,首字延迟上不去。如果你的场景要求几百毫秒内出首字,那要么控制输入长度,要么在架构上做异步处理,让用户先看到别的东西。
对成本不敏感但对可复现性敏感的场景要评估。预览版模型随时可能变更、下线、调整参数,如果结果需要长期可复现,你得把每次的输入输出完整存档,并且在方案里预留切换模型的抽象层。
我个人的经验是,这类预览版模型最好的用法是先当“能力探针”:用它告诉你这件事的上限能做到什么程度,然后你再决定生产环境是用它、用更稳定的小模型、还是用“小模型为主 + 大模型兜底”的混合架构。我在实际项目里最常用的就是这个混合套路,绝大部分请求走小模型,只有被判定为“复杂”的那一小部分才升级上来。这样既拿到了上限,又把平均成本压在了可接受的范围里。踩过几次“一刀切全用大模型”的坑之后,我对这个分层结构基本是深信不疑了。