<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Huggingface on Wilson Wu</title><link>https://wilsonwu.me/zh/tags/huggingface/</link><description>Recent content in Huggingface on Wilson Wu</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Wed, 23 Sep 2026 00:00:00 -0400</lastBuildDate><atom:link href="https://wilsonwu.me/zh/tags/huggingface/index.xml" rel="self" type="application/rss+xml"/><item><title>Jev vs Laya：闭源与开源 System One 决策模型的对比与选型</title><link>https://wilsonwu.me/zh/blog/2026/jev-vs-laya/</link><pubDate>Wed, 23 Sep 2026 00:00:00 -0400</pubDate><guid>https://wilsonwu.me/zh/blog/2026/jev-vs-laya/</guid><description>&lt;p&gt;&lt;img alt="Jev vs Laya：闭源云端与开源本地的决策模型" loading="lazy" src="https://wilsonwu.me/zh/blog/2026/jev-vs-laya/1-jev-vs-laya.png"&gt;&lt;/p&gt;
&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;2026 年 9 月，AI 圈突然流行起一类“不会说话”的模型。&lt;/p&gt;
&lt;p&gt;9 月 15 日，由前 OpenAI 研究员 Diogo Almeida 创办的 TypeSafe AI 发布了 &lt;strong&gt;Jev&lt;/strong&gt;：它不聊天、不写文章、也不生成代码，只接收一段状态（state）和一组预先定义好的问题，然后直接返回带有校准概率的结构化决策。&lt;/p&gt;</description><content:encoded><![CDATA[<p><img alt="Jev vs Laya：闭源云端与开源本地的决策模型" loading="lazy" src="/zh/blog/2026/jev-vs-laya/1-jev-vs-laya.png"></p>
<h2 id="引言">引言</h2>
<p>2026 年 9 月，AI 圈突然流行起一类“不会说话”的模型。</p>
<p>9 月 15 日，由前 OpenAI 研究员 Diogo Almeida 创办的 TypeSafe AI 发布了 <strong>Jev</strong>：它不聊天、不写文章、也不生成代码，只接收一段状态（state）和一组预先定义好的问题，然后直接返回带有校准概率的结构化决策。</p>
<p>仅仅三天后，9 月 18 日，独立研究者 Nandakishor M（Convai Innovations）开源了 <strong>Laya</strong>。它同样是一个非自回归的 System 1 决策模型，采用 Apache 2.0 协议，权重可以直接从 Hugging Face 下载，三天内 GitHub 星标就超过了 6000，被社区称为“开源版 Jev”。</p>
<p>一边是背靠 4000 万美元种子轮、开箱即用的闭源 API，一边是 4.2 亿参数、一张 T4 甚至一台 MacBook 就能跑起来的开源模型。社交媒体上“Laya 反超 Jev”“Jev 的护城河只维持了两天”之类的说法很多，但如果把双方公开的资料仔细读一遍，就会发现结论远没有这么简单。</p>
<p>本文将从以下几个方面展开：</p>
<ol>
<li>什么是决策模型，它要解决什么问题</li>
<li>Jev 与 Laya 各自的技术路线</li>
<li>核心差异与基准数据解读</li>
<li>两者各自的优势与劣势</li>
<li>适用场景与选型建议</li>
</ol>
<h2 id="什么是决策模型system-one-model">什么是决策模型（System One Model）</h2>
<h3 id="1-名字的由来">1. 名字的由来</h3>
<p>“System One”来自丹尼尔·卡尼曼的《思考，快与慢》：System 1 是快速、直觉式的判断，System 2 是缓慢、审慎的推理。在这个比喻下，生成式大模型（尤其是推理模型）更像 System 2，而决策模型负责的是毫秒级的“直觉反应”。</p>
<p>顺带一提，Jev 这个名字来自经济学家威廉·斯坦利·杰文斯（William Stanley Jevons）。TypeSafe 认为机器智能会重演“杰文斯悖论”：就像蒸汽机效率提升反而带动了煤炭需求一样，智能的单价每下降一个数量级，都会解锁更多数量级的新用例。</p>
<h3 id="2-用大模型做选择题的痛点">2. 用大模型做“选择题”的痛点</h3>
<p>在真实的 AI 工程里，大量决策其实都是“小事”：</p>
<ul>
<li>这张工单应该分给哪个团队？</li>
<li>这封邮件是不是钓鱼邮件？</li>
<li>这段提示词有没有注入攻击？</li>
<li>Agent 下一步该调用哪个工具？上一步执行成功了吗？</li>
</ul>
<p>今天常见的做法，是把这些问题交给一个擅长写作的大模型，再从它生成的文本里把答案“抠”出来。这会带来一系列问题：</p>
<table>
	<thead>
			<tr>
					<th>问题</th>
					<th>表现</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>延迟高</td>
					<td>逐 token 生成，动辄几百毫秒到几秒，推理模型更慢</td>
			</tr>
			<tr>
					<td>成本高</td>
					<td>输入输出都要计费，输出 token 通常更贵</td>
			</tr>
			<tr>
					<td>需要解析</td>
					<td>要写 JSON 解析、Schema 校验和失败重试逻辑</td>
			</tr>
			<tr>
					<td>类型错误</td>
					<td>可能多输出一段解释，甚至返回一个根本不存在的选项</td>
			</tr>
			<tr>
					<td>置信度不可信</td>
					<td>模型写出的 <code>&quot;confidence&quot;: 0.95</code> 只是一段“听起来很自信”的文本，缺乏统计意义上的校准</td>
			</tr>
	</tbody>
</table>
<h3 id="3-决策模型的思路">3. 决策模型的思路</h3>
<p>决策模型干脆把“生成”这一步删掉了。TypeSafe 用一句话概括它：</p>

<blockquote>
  <p><strong>Unstructured state in, typed probabilistic decisions out.</strong></p>
<p>非结构化的状态输入，带概率的类型化决策输出。</p>

</blockquote>
<p><img alt="生成式大模型 vs System One 决策模型" loading="lazy" src="/zh/blog/2026/jev-vs-laya/2-llm-vs-system-one.png"></p>
<p>调用方只需要提交两部分内容：</p>
<ul>
<li><code>state</code>：需要判断的当前状态，可以是字符串、JSON 对象或文本数组</li>
<li><code>questions</code>：一组类型化问题，每个问题的候选答案都由调用方提前定义</li>
</ul>
<p>模型并行地回答所有问题，只返回数字和概率。Jev 与 Laya 采用了完全相同的三种问题原语：</p>
<table>
	<thead>
			<tr>
					<th>原语</th>
					<th>回答的问题</th>
					<th>返回内容</th>
					<th>典型用途</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>choice</code></td>
					<td>从给定选项中选一个</td>
					<td>选中项、各选项概率、confidence</td>
					<td>工单路由、意图识别、工具选择</td>
			</tr>
			<tr>
					<td><code>score</code></td>
					<td>在有序等级上打分</td>
					<td>概率加权的期望分数、等级分布、confidence</td>
					<td>紧急程度、情绪强度、风险等级</td>
			</tr>
			<tr>
					<td><code>noul</code></td>
					<td>是 / 否判断</td>
					<td>“是”的概率（0～1）</td>
					<td>钓鱼检测、越狱检测、是否申请退款</td>
			</tr>
	</tbody>
</table>
<p>由于输出空间被提前限定，模型<strong>不可能返回类型错误或凭空编造的选项</strong>。但需要注意：<strong>类型安全不等于判断正确</strong>，它仍然可能在合法的选项里选错，这一点后文会反复提到。</p>
<h3 id="4-它在系统中的位置">4. 它在系统中的位置</h3>
<p>决策模型并不是用来取代大模型的，而是把大模型从一些“本不该由它来做”的位置上挪开。一个比较合理的分工是：</p>
<pre tabindex="0"><code>代码（确定性逻辑）
  └─ 流程编排、权限控制、数学与日期计算、执行动作
        │  遇到需要语义理解的“模糊 if 语句”
        ▼
决策模型（System 1：Jev / Laya）
  └─ 分类、路由、打分、校验、护栏，返回类型化答案 + 概率
        │  置信度不足，或需要生成文本 / 复杂推理
        ▼
大模型（System 2：GPT / Claude / DeepSeek 等）
  └─ 长上下文理解、规划、写作、代码生成
</code></pre><p>有了校准过的置信度，程序的控制流就不再只有“是 / 否”两种状态，而可以分成三档：<strong>高置信度自动执行，中置信度交给更强的模型复核或请求用户确认，低置信度转人工</strong>。这也是决策模型真正的价值所在：速度只是表象，可以被写进 <code>if</code> 语句的置信度才是关键。</p>
<p><img alt="基于置信度的三档分流" loading="lazy" src="/zh/blog/2026/jev-vs-laya/3-confidence-routing.png"></p>
<h2 id="两位主角">两位主角</h2>
<h3 id="jevtypesafe-ai-的闭源云端服务">Jev：TypeSafe AI 的闭源云端服务</h3>
<p><strong>基本信息</strong></p>
<ul>
<li>发布时间：2026 年 9 月 15 日，以 early access 形式开放</li>
<li>团队背景：TypeSafe AI 是一家旧金山公司，创始人 Diogo Almeida 曾在 Google Brain 和 OpenAI 从事研究，是 InstructGPT 论文和 GPT-4 技术报告的作者之一。发布当天，公司同时宣布了由 DCVC 领投的 4000 万美元种子轮融资</li>
<li>产品形态：闭源，只提供 API（<code>POST https://api.typesafe.ai/v1/systemone</code>）以及 Python / JavaScript SDK</li>
<li>当前版本：Jev 1.13（<code>jev-1.13.0</code>），别名 <code>jev-latest</code></li>
</ul>
<p><strong>技术路线</strong></p>
<p>TypeSafe 声称为自动化场景重建了一整套技术栈：全新的模型架构、追求极致效率的并行采样器，以及一种名为 <strong>RLCD（Reinforcement Learning for Calibrated Decisions，面向校准决策的强化学习）</strong> 的训练方法。与 RLHF 优化“人类偏好”、RLVR 优化“可验证奖励”不同，RLCD 的目标是让模型在给出答案的同时，给出<strong>认知上诚实的概率</strong>。</p>
<p>不过，TypeSafe 目前并没有公开模型架构、参数规模和训练数据。社区有不少人认为它更接近 BERT 这类 encoder 模型，但这只是猜测。</p>
<p><strong>关键规格</strong></p>
<table>
	<thead>
			<tr>
					<th>项目</th>
					<th>规格</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>价格</td>
					<td>输入 $0.042 / 百万 token，输出免费</td>
			</tr>
			<tr>
					<td>延迟</td>
					<td>官方称端到端 70～500 ms</td>
			</tr>
			<tr>
					<td>上下文</td>
					<td>每个请求 64k token，其中 state 加最长的单个问题不超过 32k token</td>
			</tr>
			<tr>
					<td>输入</td>
					<td>仅支持文本（字符串、JSON 对象、文本数组），不支持图像、音频和视频</td>
			</tr>
			<tr>
					<td>选项数量</td>
					<td><code>choice</code> 最多支持 255 个选项</td>
			</tr>
			<tr>
					<td>速率限制</td>
					<td>250,000 token/秒、1,200 次请求/分钟（官方称会动态调整）</td>
			</tr>
			<tr>
					<td>语言</td>
					<td>英语是主要训练语言，中文等 CJK 文本可用，但准确率可能下降</td>
			</tr>
			<tr>
					<td>定制</td>
					<td>不支持微调或 LoRA，所有客户共用同一套权重</td>
			</tr>
	</tbody>
</table>
<p>按这个定价计算，如果每次判断平均消耗 1000 个输入 token，100 万次判断的费用只有约 42 美元。</p>
<p><strong>生态</strong></p>
<p>Jev 发布后迅速走红：LangChain 很快发布了集成指南，Vercel 把它接入了 AI Gateway，社区也涌现出不少实验项目，比如用 Jev 给 Claude Code 的工具调用输出做相关性打分、进而压缩上下文的 fast-jev-compaction。</p>
<h3 id="layaconvai-innovations-的开源本地模型">Laya：Convai Innovations 的开源本地模型</h3>
<p><strong>基本信息</strong></p>
<ul>
<li>发布时间：2026 年 9 月 18 日</li>
<li>作者：独立研究者 Nandakishor M（Convai Innovations）</li>
<li>开源协议：Apache 2.0，代码、权重、训练方法和微调 Notebook 全部公开</li>
<li>获取方式：<code>pip install laya</code>（要求 Python 3.10+），权重托管在 Hugging Face 的 <code>convaiinnovations/laya</code></li>
</ul>
<p>Laya 的诞生还有一段插曲。作者在 2025 年就先后发表过两篇相关论文（arXiv:2503.23303、arXiv:2510.01237），研究用强化学习训练非自回归的决策模型，最早用于预测销售对话的转化率。看到 Jev 以“突破”之名发布后，他把旧方案的架构缺陷全部修了一遍，做出了这个通用的开源版本。</p>
<p><strong>模型架构</strong></p>
<p>Laya 采用“双向编码器 + 决策头”的结构，总参数量 421M：</p>
<pre tabindex="0"><code>State（文本或 JSON）+ 类型化问题与选项
        │ 拼接为：[CLS] 问题 [SEP] [MASK] 选项1 [MASK] 选项2 ... [SEP] state [SEP]
        ▼
ModernBERT-large 编码器（395M，28 层双向注意力）
        ▼
决策头 Transformer（约 25M，2 层）
        ├─ 选项打分器：取每个 [MASK] 位置的隐状态 → logit → 温度缩放 → softmax
        └─ Act / Escalate 头：基于 [CLS] 与分布统计量，判断“自动执行”还是“升级处理”
</code></pre><p>每个选项前面放一个 <code>[MASK]</code> 标记，经过双向编码器之后，从这些标记的位置取出隐状态进行打分。同一个 state 上的多个问题会组成一个 batch，在一次前向传播中完成计算。</p>
<p><strong>三个检查点 + 路由器</strong></p>
<table>
	<thead>
			<tr>
					<th>检查点</th>
					<th>编码器</th>
					<th>参数量</th>
					<th>默认上下文</th>
					<th>用途</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>laya</code></td>
					<td>ModernBERT-large</td>
					<td>421M</td>
					<td>512</td>
					<td>英文</td>
			</tr>
			<tr>
					<td><code>laya-multilingual</code></td>
					<td>mmBERT-base</td>
					<td>322M</td>
					<td>1024</td>
					<td>100+ 种语言，速度约快 2 倍</td>
			</tr>
			<tr>
					<td><code>laya-typed-decisions</code></td>
					<td>ModernBERT-large</td>
					<td>421M</td>
					<td>1024</td>
					<td>针对 typed-decisions 工作流微调</td>
			</tr>
	</tbody>
</table>
<p>Laya 内置了一个纯 Python 实现的 <code>Router</code>，会在前向计算之前用不到 1 毫秒的时间检测文本的书写系统和语言，然后自动选择合适的检查点。之所以需要它，是因为英文检查点在非拉丁文字上会“自信地犯错”：在高棉语测试中，它的准确率为 0，置信度却高达 0.952。这种情况下，靠置信度阈值是拦不住的。</p>
<p><strong>开放的 RLCD 实现</strong></p>
<p>Laya 沿用了 RLCD 这个名字，并公开了具体做法：用<strong>严格适当评分规则</strong>（strictly proper scoring rules，由对数评分、球面评分和排序概率评分组合而成）作为奖励，采用 GRPO 风格的组内基线策略梯度进行训练，完全不使用监督交叉熵损失。严格适当评分规则的特点是：只有当模型报告真实的概率时，才能拿到最高的期望奖励，从而“逼”模型说实话。</p>
<p>Act / Escalate 头则用一个代价矩阵来训练：判对奖励 +1，判错惩罚 -3，升级人工惩罚 -0.5。由此可以推导出，只有当正确率超过 62.5% 时，自动执行才比升级人工更划算，模型也就学会了“没把握就上交”。</p>
<p>此外，Laya 还提供了开箱即用的工作流预设（模型路由、提示词护栏、内容审核、工单分诊），以及一个可以在 Kaggle 免费 2×T4 GPU 上运行的微调 Notebook：在约 3 万个问题上训练 4 个 epoch，耗时 4～5 小时。</p>
<h2 id="核心差异一览">核心差异一览</h2>
<p><img alt="Jev 云端 API vs Laya 本地部署" loading="lazy" src="/zh/blog/2026/jev-vs-laya/4-cloud-vs-local.png"></p>
<table>
	<thead>
			<tr>
					<th>维度</th>
					<th>Jev</th>
					<th>Laya</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>发布方</td>
					<td>TypeSafe AI（商业公司）</td>
					<td>Convai Innovations（独立研究者）</td>
			</tr>
			<tr>
					<td>开源</td>
					<td>闭源，仅提供 API</td>
					<td>Apache 2.0，权重与代码全部开放</td>
			</tr>
			<tr>
					<td>部署</td>
					<td>云端托管（服务目前位于美国西海岸）</td>
					<td>本地、私有云或离线环境，GPU / Mac MPS / CPU 均可运行</td>
			</tr>
			<tr>
					<td>架构</td>
					<td>未公开</td>
					<td>ModernBERT / mmBERT 编码器 + 决策头</td>
			</tr>
			<tr>
					<td>参数规模</td>
					<td>未公开</td>
					<td>322M～421M</td>
			</tr>
			<tr>
					<td>训练方法</td>
					<td>RLCD（细节未公开）</td>
					<td>RLCD（严格适当评分规则 + 组基线策略梯度，已公开）</td>
			</tr>
			<tr>
					<td>问题原语</td>
					<td>choice / score / noul</td>
					<td>choice / score / noul，请求格式几乎一致</td>
			</tr>
			<tr>
					<td>上下文长度</td>
					<td>64k token</td>
					<td>默认 512 / 1024 token（编码器最高支持 8192）</td>
			</tr>
			<tr>
					<td>选项数量</td>
					<td>最多 255 个</td>
					<td>超过 20 个时效果明显下降</td>
			</tr>
			<tr>
					<td>零样本能力</td>
					<td>强，开箱即用</td>
					<td>弱，基础检查点需要微调</td>
			</tr>
			<tr>
					<td>定制方式</td>
					<td>只能通过 state、instructions、criteria 调整</td>
					<td>可以在自有数据上微调，并拟合校准温度</td>
			</tr>
			<tr>
					<td>多语言</td>
					<td>以英语为主</td>
					<td>多语言检查点 + 自动路由，51 种语言中有 45 种达到可用水平</td>
			</tr>
			<tr>
					<td>单问题延迟</td>
					<td>官方 70～500 ms，第三方实测 p50 为 236～276 ms</td>
					<td>T4 GPU 上约 33～40 ms</td>
			</tr>
			<tr>
					<td>成本</td>
					<td>输入 $0.042 / 百万 token</td>
					<td>模型免费，只需自备算力</td>
			</tr>
			<tr>
					<td>数据合规</td>
					<td>数据需发送到 TypeSafe，企业版支持零数据保留</td>
					<td>数据不出本地</td>
			</tr>
			<tr>
					<td>运维</td>
					<td>免运维</td>
					<td>需要自行部署、扩缩容、监控和管理版本</td>
			</tr>
	</tbody>
</table>
<h2 id="基准数据怎么看">基准数据怎么看</h2>
<h3 id="1-laya-公布的对比数据">1. Laya 公布的对比数据</h3>
<p>Laya 的 README 中给出了一张与 Jev 1.13.0 的对比表（Laya 一侧为经过 Router 路由后的实测结果）：</p>
<table>
	<thead>
			<tr>
					<th>指标</th>
					<th>Jev 1.13.0</th>
					<th>Laya（路由）</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>typed-decisions 准确率（2000 个决策）</td>
					<td>0.727</td>
					<td><strong>0.766</strong></td>
			</tr>
			<tr>
					<td>AG News 准确率（4 类）</td>
					<td>0.910</td>
					<td><strong>0.950</strong></td>
			</tr>
			<tr>
					<td>DAIR Emotion 准确率（6 类）</td>
					<td>0.480</td>
					<td><strong>0.595</strong></td>
			</tr>
			<tr>
					<td>Banking77 准确率（72 / 77 类）</td>
					<td><strong>0.870</strong></td>
					<td>0.425</td>
			</tr>
			<tr>
					<td>ECE 校准误差（越低越好）</td>
					<td>0.246</td>
					<td><strong>0.081</strong></td>
			</tr>
			<tr>
					<td>单问题 p50 延迟</td>
					<td>236～276 ms</td>
					<td><strong>32.8 ms</strong></td>
			</tr>
			<tr>
					<td>成本</td>
					<td>$0.042 / 百万 token</td>
					<td>自托管 $0</td>
			</tr>
	</tbody>
</table>
<p>乍一看，Laya 几乎全面领先。但如果只看这张表就下结论，很容易踩坑。</p>
<h3 id="2-解读数据时必须注意的五点">2. 解读数据时必须注意的五点</h3>
<p><strong>第一，Jev 的数据并非同场实测。</strong> Laya 作者明确说明，自己没有 TypeSafe 的 API 权限，表中 Jev 的数字全部引用自第三方公开的结果，样本量和提示词都不相同。</p>
<p><strong>第二，Laya 的高分来自针对性微调。</strong> typed-decisions 上的 0.766 是 <code>laya-typed-decisions</code> 在该基准自己的训练集上微调后取得的成绩。未经微调的两个基础检查点只有 0.34～0.36，接近随机猜测（0.318），甚至低于“每题都猜最常见类别”的基线（0.461），而 Jev 不做任何训练就能拿到 0.727。作者自己也说得很直白：<strong>Laya 是一个适合特化的快速底座，而不是零样本决策引擎。</strong> 换句话说，这张表比的其实是“特化后的专才”和“零样本的通才”。</p>
<p><strong>第三，校准优势需要额外的温度拟合。</strong> 表中 0.081 的 ECE 是用领域留出数据重新拟合温度之后的结果，出厂时为 0.466。而在同一个 typed-decisions 基准上，Laya 微调检查点的 ECE 为 0.213，反而高于 Jev 的 0.144；在衡量概率分布与参考分布吻合程度的“软准确率”上，Jev 也以 0.580 领先 Laya 的 0.471。当然 Jev 也并非完美：Laya 作者引用的数据显示，在 DAIR Emotion 上，Jev 对 16% 的样本给真实标签分配了 0 概率，这对依赖置信度做分流的系统来说是个硬伤。</p>
<p><strong>第四，延迟对比的本质是部署方式的差异。</strong> Jev 的延迟包含从客户端到 TypeSafe 云端的网络往返（TypeSafe 的评测大多从美国西海岸发起），而 Laya 的 32.8 ms 是在本地 T4 GPU 上的推理耗时。对于国内或其他地区的用户，Jev 的实际延迟还要叠加跨境网络的开销；反过来，如果把 Laya 部署成远程服务，同样要算上网络开销。</p>
<p><strong>第五，Jev 自己的宣传数据同样需要打折。</strong> TypeSafe 官网上“快 193.6 倍、便宜 444.6 倍”的数字来自其团队设计的 4 套工作流评测，参考答案取自 GPT-6 Astra 和 Fable 5.1 两个前沿模型的平均结果，官方也坦言这些数字处于真实收益的上限。自动化服务公司 AY Automate 发布的第三方测试则显示：Jev 比几款对照模型快约 2～3.6 倍；成本方面，相比便宜的小模型约节省 4.7～7.5 倍，相比昂贵的前沿模型才能达到 40～49 倍。</p>
<h3 id="3-社区实测">3. 社区实测</h3>
<p>发布后短短几天，社区就做了不少对比测试，大多集中在高频交互场景：</p>
<ul>
<li><strong>贪吃蛇</strong>：在同一套决策逻辑下，本地运行的 421M Laya 在 30 秒内平均每秒决策 86.5 次，P50 延迟约 9 ms；云端 Jev 每秒只能决策 3.2 次，API 往返约 317 ms</li>
<li><strong>M5 Pro 测试</strong>：两者的中位耗时分别为 15.3 ms 和 298.1 ms，差距接近 20 倍</li>
<li><strong>Apple Silicon 移植</strong>：社区项目 laya-mlx 把模型移植到 MLX，运行时最高约占 1GB 内存，在 M3 Max 上运行贪吃蛇可以达到每秒 60 次决策</li>
</ul>
<p>这些测试体现的主要是“本地推理”与“云端往返”的差异。对于每秒需要几十次决策的实时场景，这个差距是决定性的；但对于一次工单分流来说，30 ms 和 300 ms 的区别，用户几乎感知不到。</p>
<h3 id="4-小结">4. 小结</h3>
<p>比较公允的结论是：<strong>在开箱即用、长上下文、选项复杂的场景下，Jev 更强；在有标注数据的垂直任务上，经过微调的 Laya 可以做到更快、更准、更便宜。</strong></p>
<h2 id="jev-的优势与劣势">Jev 的优势与劣势</h2>
<h3 id="优势">优势</h3>
<ol>
<li><strong>开箱即用，零样本能力强</strong>：不需要任何训练数据，写好 state 和问题就能直接使用。TypeSafe 称 Jev 在 System One 类任务上达到了与现有前沿 LLM 相近的智能水平；Karpathy 也评价说，它处在 LLM 帕累托曲线上一个长期被低估的位置：不需要复杂思考，只需要在低延迟下给出足够可靠的判断。</li>
<li><strong>长上下文与高基数选项</strong>：64k 的上下文可以直接放入长邮件串、合同条款或 Agent 执行轨迹；<code>choice</code> 最多支持 255 个选项，在 Banking77 这类细粒度意图分类上仍有 0.870 的准确率。</li>
<li><strong>出厂即校准</strong>：不需要自己拟合温度，返回的概率可以直接用于阈值分流；官方文档还给出了按风险等级设置不同阈值的最佳实践。</li>
<li><strong>免运维，生态成熟</strong>：托管服务加官方 SDK，已经接入 LangChain、Vercel AI Gateway 等生态，团队不需要操心 GPU、扩缩容和模型升级。</li>
<li><strong>单价极低</strong>：按每次 1000 个输入 token 估算，100 万次判断约 42 美元，对大多数业务来说，模型费用已经不是瓶颈。</li>
</ol>
<h3 id="劣势">劣势</h3>
<ol>
<li><strong>闭源黑盒</strong>：架构、参数量和训练数据都没有公开。决策模型本身也不输出解释，正如 Simon Willison 所提醒的，Jev 最终留给开发者的可能只有一个数字，判断出错时很难追问原因。</li>
<li><strong>数据必须出域</strong>：所有 state 都要发送到 TypeSafe 的云端，零数据保留（ZDR）仅面向企业客户，这对金融、医疗、政企等场景是硬伤。另据媒体报道，Jev 目前尚未面向中国大陆开放。</li>
<li><strong>网络延迟无法消除</strong>：几百毫秒的往返对于业务工作流已经足够快，但对于游戏 AI、实时风控这类每秒几十次决策的场景仍然太慢。</li>
<li><strong>无法微调</strong>：所有客户共用同一套权重，只能通过 state、instructions 和 criteria 来“调教”，在高度垂直的领域可能达不到专用模型的效果。</li>
<li><strong>英语优先</strong>：官方明确英语是主要训练语言，中文场景一定要先用自己的数据验证。</li>
<li><strong>早期产品的不确定性</strong>：速率限制仍在动态调整；官方预计价格只降不升，但也坦言暂时无法证明当前价格没有补贴；<code>jev-latest</code> 别名会随新版本移动，调好的阈值可能需要重新标定；此外还有厂商锁定的风险。</li>
<li><strong>已知的能力“锯齿”</strong>：官方文档专门列出了 Jev 1.13 的多种失效模式，包括过于字面地理解问题、不擅长计数和数学运算、日期比较不可靠、多跳的间接推理效果差、state 中无关内容过多会降低准确率、容易被 state 中的对抗内容（如提示词注入）带偏等。甚至一些“常识性”的一致性也无法保证：对同一个问题和它的否定分别提问，两个 noul 的概率之和可能是 1.19，而不是 1。</li>
</ol>
<h2 id="laya-的优势与劣势">Laya 的优势与劣势</h2>
<h3 id="优势-1">优势</h3>
<ol>
<li><strong>完全开源</strong>：Apache 2.0 协议，架构、训练方法、评测脚本和微调 Notebook 全部公开，可审计、可复现、可二次开发，没有厂商锁定。</li>
<li><strong>数据不出域</strong>：可以部署在本地、私有云甚至离线环境中，天然满足数据驻留和隐私合规的要求。</li>
<li><strong>极低延迟、高吞吐</strong>：T4 上单个问题约 33～40 ms，多语言检查点批量推理时每题约 7 ms，单卡吞吐约 100～330 题/秒，在实时交互类应用中优势明显。</li>
<li><strong>边际成本接近零</strong>：按单张 T4 每秒 100～300 题估算，100 万次判断只需要 1～3 个 GPU 小时。</li>
<li><strong>可微调、可特化</strong>：在自有数据上微调后可以超越 Jev（typed-decisions 上 0.766 对 0.727），而且整个流程在 Kaggle 的免费 GPU 上就能完成。</li>
<li><strong>多语言与自动路由</strong>：<code>laya-multilingual</code> 覆盖 100 多种语言，Router 会在推理前自动选择检查点，对中文等非英语场景更友好（但仍需自测）。</li>
<li><strong>面向生产的设计</strong>：Act / Escalate 头可以直接给出“自动执行还是升级人工”的建议；内置了护栏、审核、分诊等预设；文档还坦诚地列出了自身的各项短板。</li>
</ol>
<h3 id="劣势-1">劣势</h3>
<ol>
<li><strong>零样本能力弱</strong>：基础检查点在 typed-decisions 上接近随机水平，想要好的效果，就必须准备标注数据并进行微调。没有数据的团队拿到手的，基本上只是一个“待训练的底座”。</li>
<li><strong>上下文短</strong>：英文检查点默认只有 512 token（留给 state 的约 320 token），多语言和 typed-decisions 检查点为 1024 token（留给 state 的约 768 token）。长文档、长对话需要先做截断、摘要或分块。编码器最高支持 8192 token，但调大之后延迟会上升，效果也需要自行验证。</li>
<li><strong>高基数选项吃力</strong>：所有选项共享一个固定的 token 预算，77 个选项时每个选项只能分到 3～4 个 token，Banking77 的准确率随之跌到 0.425。需要调大 <code>head_max_len</code>、先用 embedding 做候选筛选（<code>predict_shortlist</code>），或者拆成“粗分类 + 细分类”两级问题。</li>
<li><strong>校准需要额外工作</strong>：出厂的检查点偏向“过度自信”，需要用领域内的留出数据拟合温度（ECE 可以从 0.466 降到 0.081）；多语言检查点出厂时则完全没有拟合温度。</li>
<li><strong>score 是最弱的原语</strong>：有序打分任务的表现最差，例如 SST-5 五级情感分类的准确率只有 0.372。</li>
<li><strong>语言陷阱</strong>：英文检查点在非拉丁文字上会高置信度地犯错，必须使用 Router 或手动选对检查点。另外，默认的懒加载模式下切换语言会触发 7～10 秒的模型重载，生产环境需要开启预加载。</li>
<li><strong>运维与项目成熟度</strong>：需要自己负责 GPU 资源、扩缩容、监控和模型版本管理；项目刚刚发布，主要由独立研究者维护，长期演进存在不确定性。</li>
</ol>
<h2 id="适用场景与选型建议">适用场景与选型建议</h2>
<h3 id="1-场景对照表">1. 场景对照表</h3>
<table>
	<thead>
			<tr>
					<th>场景</th>
					<th>推荐</th>
					<th>理由</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>快速验证 PoC，手上没有标注数据</td>
					<td>Jev</td>
					<td>零样本即可使用，几分钟就能接入</td>
			</tr>
			<tr>
					<td>细粒度意图分类（几十上百个选项）</td>
					<td>Jev</td>
					<td>最多支持 255 个选项；Laya 需要额外做候选筛选或分级设计</td>
			</tr>
			<tr>
					<td>长文本判断（合同、长邮件串、Agent 执行轨迹）</td>
					<td>Jev</td>
					<td>64k 上下文，而 Laya 默认只有 512 / 1024</td>
			</tr>
			<tr>
					<td>云端 Agent 的工具选择、完成判定、重试决策</td>
					<td>Jev</td>
					<td>通用性强，与 LangChain、Vercel 等生态集成度高</td>
			</tr>
			<tr>
					<td>数据不能出域（金融、医疗、政企、境内业务）</td>
					<td>Laya</td>
					<td>本地部署，数据不离开自己的环境</td>
			</tr>
			<tr>
					<td>高频实时决策（游戏 AI、实时风控、端侧应用）</td>
					<td>Laya</td>
					<td>毫秒级本地推理，没有网络往返</td>
			</tr>
			<tr>
					<td>超大规模批处理（海量分类、打标、特征提取）</td>
					<td>Laya</td>
					<td>边际成本接近零</td>
			</tr>
			<tr>
					<td>有大量标注数据的垂直任务（垃圾邮件、钓鱼检测、工单分诊、内容审核）</td>
					<td>Laya（微调后）</td>
					<td>特化之后更快、更准、更便宜</td>
			</tr>
			<tr>
					<td>多语言，尤其是中文等非拉丁文字</td>
					<td>Laya（多语言检查点 + Router）</td>
					<td>Jev 以英语为主；但两者都需要用自己的数据验证</td>
			</tr>
			<tr>
					<td>网关层的提示词护栏</td>
					<td>Laya</td>
					<td>本地低延迟，适合作为第一道过滤；但需要配合其他防护手段</td>
			</tr>
	</tbody>
</table>
<p>关于最后一点再多说一句：Laya 在未参与训练的提示词注入测试集上的准确率约为 0.698，Jev 的官方文档也承认 state 中的对抗内容可能带偏判断。决策模型可以作为一道低成本的前置过滤，但不能作为唯一的安全防线。</p>
<h3 id="2-选型时要回答的几个问题">2. 选型时要回答的几个问题</h3>
<p>可以按下面的顺序依次回答：</p>
<pre tabindex="0"><code>1. 数据能否发送到第三方云（以及境外）？
   └─ 不能 → Laya（硬约束，其他因素都要让路）
2. 是否有标注数据，并且愿意投入微调？
   └─ 没有 → Jev
3. 是否需要每秒几十次以上的实时决策，或者要在端侧运行？
   └─ 是 → Laya
4. state 是否很长（超过 1k token），或者选项是否很多（超过 20 个）？
   └─ 是 → Jev（或 Laya + 分块 / 候选筛选）
5. 月调用量是否达到数千万级？
   └─ 是 → 倾向 Laya；否则 Jev 的总拥有成本通常更低
</code></pre><p>关于成本，可以简单算一笔账：假设每次判断消耗 1000 个输入 token，Jev 每 100 万次判断约 42 美元；一台 T4 实例全天候运行，按每小时约 0.5 美元估算，每月约 360 美元，相当于 Jev 约 850 万次判断的费用，这还没算高可用冗余和运维人力。所以单纯从成本角度看，只有当调用量足够大时，自托管 Laya 才有明显优势。更多时候，选择 Laya 的理由应该是<strong>延迟、合规和可定制性</strong>，而不仅仅是省钱。</p>
<h3 id="3-组合使用不必二选一">3. 组合使用：不必二选一</h3>
<p>在实际项目中，两者完全可以组合使用：</p>
<ol>
<li><strong>阶段式迁移</strong>：先用 Jev 快速上线，验证问题拆解、选项设计和置信度阈值是否合理，同时沉淀真实数据和人工复核的标签；当调用量上来或合规要求收紧时，再用这些人工标签微调 Laya，迁移到自托管。由于两者的请求格式（state + questions，以及 choice / score / noul 的 instructions、criteria 结构）几乎一致，迁移成本很低。需要注意的是，如果打算直接把 Jev 的输出当作训练标签，请先确认 TypeSafe 的服务条款；Laya 作者也提醒过，用模型生成的标签来训练，只会把新模型校准到“老师”的错误上。</li>
<li><strong>分层级联</strong>：本地 Laya 处理高频、简单、短文本的判断；低置信度或长上下文的请求升级给 Jev；Jev 仍然拿不准的，再交给推理型大模型或人工处理。</li>
<li><strong>按数据敏感度路由</strong>：涉及个人隐私或敏感业务数据的请求走本地 Laya，其余请求走 Jev。</li>
</ol>
<h3 id="4-其他选择">4. 其他选择</h3>
<p>除了这两者，社区还出现了一条“零训练复刻”的路线：直接读取现成开源 LLM 在候选项上的 token 概率来模拟 Jev 的输出。例如 SemIf 用一个现成的 4B 开源模型直接读取概率，据称与 Jev 的结论一致率在 85% 左右；Kev 则基于 Qwen 3.5 制作了 0.8B、4B 和 9B 三个 Jev-like 模型。这类方案在门槛和效果上介于两者之间，适合想先低成本尝鲜的团队。</p>
<h2 id="代码示例同一组问题两种调用方式">代码示例：同一组问题，两种调用方式</h2>
<p>由于 Jev 和 Laya 的问题格式几乎一致，同一组 <code>state</code> 和 <code>questions</code> 可以同时用于两者：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>state <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;message&#34;</span>: <span style="color:#e6db74">&#34;I was charged twice for order A-104. Please refund the duplicate.&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;order&#34;</span>: {<span style="color:#e6db74">&#34;charges&#34;</span>: [<span style="color:#ae81ff">49</span>, <span style="color:#ae81ff">49</span>]},
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>questions <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;department&#34;</span>: {
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;choice&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;instructions&#34;</span>: <span style="color:#e6db74">&#34;Which team should handle this request?&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;criteria&#34;</span>: {
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;billing&#34;</span>: <span style="color:#e6db74">&#34;Payments, invoices, and refunds&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;technical&#34;</span>: <span style="color:#e6db74">&#34;Bugs and integrations&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;account&#34;</span>: <span style="color:#e6db74">&#34;Account access and profile issues&#34;</span>,
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;urgency&#34;</span>: {
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;score&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;instructions&#34;</span>: <span style="color:#e6db74">&#34;How urgent is this request?&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;criteria&#34;</span>: [<span style="color:#e6db74">&#34;Not urgent&#34;</span>, <span style="color:#e6db74">&#34;Soon&#34;</span>, <span style="color:#e6db74">&#34;Critical or blocking&#34;</span>],
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;refund_requested&#34;</span>: {
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;noul&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;instructions&#34;</span>: <span style="color:#e6db74">&#34;Does the message request a refund?&#34;</span>,
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>调用云端的 Jev（固定版本号，避免别名升级后调好的阈值失效）：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> os
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> requests
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>resp <span style="color:#f92672">=</span> requests<span style="color:#f92672">.</span>post(
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;https://api.typesafe.ai/v1/systemone&#34;</span>,
</span></span><span style="display:flex;"><span>    headers<span style="color:#f92672">=</span>{<span style="color:#e6db74">&#34;Authorization&#34;</span>: <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Bearer </span><span style="color:#e6db74">{</span>os<span style="color:#f92672">.</span>environ[<span style="color:#e6db74">&#39;TYPESAFE_API_KEY&#39;</span>]<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>},
</span></span><span style="display:flex;"><span>    json<span style="color:#f92672">=</span>{<span style="color:#e6db74">&#34;model&#34;</span>: <span style="color:#e6db74">&#34;jev-1.13.0&#34;</span>, <span style="color:#e6db74">&#34;state&#34;</span>: state, <span style="color:#e6db74">&#34;questions&#34;</span>: questions},
</span></span><span style="display:flex;"><span>    timeout<span style="color:#f92672">=</span><span style="color:#ae81ff">5</span>,
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>resp<span style="color:#f92672">.</span>raise_for_status()
</span></span><span style="display:flex;"><span>answers <span style="color:#f92672">=</span> resp<span style="color:#f92672">.</span>json()[<span style="color:#e6db74">&#34;answers&#34;</span>]
</span></span></code></pre></div><p>在本地运行 Laya：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> laya <span style="color:#f92672">import</span> Router
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 生产环境建议预加载，避免切换语言时重新加载模型</span>
</span></span><span style="display:flex;"><span>router <span style="color:#f92672">=</span> Router(preload<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>)
</span></span><span style="display:flex;"><span>answers <span style="color:#f92672">=</span> router<span style="color:#f92672">.</span>predict(state, questions)[<span style="color:#e6db74">&#34;answers&#34;</span>]
</span></span></code></pre></div><p>两者返回的结构基本相同：<code>choice</code> 包含 <code>choice</code>、<code>probabilities</code> 和 <code>confidence</code>，<code>score</code> 包含期望分数、等级概率分布和 <code>confidence</code>，<code>noul</code> 则直接返回“是”的概率。后续的置信度分流逻辑可以完全复用：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>dept <span style="color:#f92672">=</span> answers[<span style="color:#e6db74">&#34;department&#34;</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> dept[<span style="color:#e6db74">&#34;confidence&#34;</span>] <span style="color:#f92672">&gt;=</span> <span style="color:#ae81ff">0.9</span>:
</span></span><span style="display:flex;"><span>    route_to_team(dept[<span style="color:#e6db74">&#34;choice&#34;</span>])     <span style="color:#75715e"># 高置信度：自动执行</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">elif</span> dept[<span style="color:#e6db74">&#34;confidence&#34;</span>] <span style="color:#f92672">&gt;=</span> <span style="color:#ae81ff">0.6</span>:
</span></span><span style="display:flex;"><span>    review_with_llm(state, dept)      <span style="color:#75715e"># 中置信度：交给更强的模型复核</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>    send_to_human(state)              <span style="color:#75715e"># 低置信度：转人工</span>
</span></span></code></pre></div><p>这里的 0.9 和 0.6 只是示意，真实的阈值一定要用自己的数据来标定。</p>
<h2 id="落地时的共同注意事项">落地时的共同注意事项</h2>
<p>无论选择哪一个，以下几点都同样适用：</p>
<ol>
<li><strong>类型安全 ≠ 判断正确</strong>：校准描述的是一组预测的统计性质，并不保证单个答案正确，阈值必须用自己的数据标定。</li>
<li><strong>把问题拆小</strong>：不要问“这张工单该怎么处理”，而是拆成“是否申请退款”“紧急程度如何”“属于哪条业务线”等原子问题，再在代码里组合。</li>
<li><strong>计算交给代码</strong>：计数、数学运算、日期比较等确定性逻辑不要交给模型。</li>
<li><strong>精简 state</strong>：只放与问题相关的字段，无关内容会降低准确率；Laya 的上下文更短，这一点尤为关键。</li>
<li><strong>不可逆操作要兜底</strong>：付款、删除数据、医疗或合规审批等操作，不能仅凭一个概率就自动执行。</li>
<li><strong>防范注入</strong>：state 虽然是数据，但其中的恶意内容仍可能影响判断，不要把决策模型当作唯一的安全防线。</li>
<li><strong>固定版本，持续监控</strong>：固定模型版本（如 <code>jev-1.13.0</code> 或指定的 Laya 检查点），升级后重新标定阈值；上线后持续记录概率分布、抽样复核，并监控校准漂移。</li>
</ol>
<h2 id="总结">总结</h2>
<p>用一句话概括：</p>

<blockquote>
  <p><strong>Jev 是“开箱即用的云端通才”，Laya 是“可以特化的本地专才”。</strong></p>

</blockquote>
<p><img alt="开箱即用的通才 vs 可以特化的专才" loading="lazy" src="/zh/blog/2026/jev-vs-laya/5-generalist-vs-specialist.png"></p>
<ul>
<li>如果你追求快速上线、手上没有标注数据，或者面对长上下文和复杂的选项空间，Jev 是更省心的选择；</li>
<li>如果你有数据、有合规要求、需要毫秒级的实时决策或海量调用，并且有能力运维一个小模型，Laya 更值得投入。</li>
</ul>
<p>两者并不是替代关系，而是同一条“决策光谱”上的不同档位。更值得关注的是这场对决背后的趋势：AI 系统正在从“一个大模型包打天下”走向分工协作，<strong>代码负责骨架，决策模型负责快速判断，大模型负责深度思考</strong>。Jev 定义了这个品类，Laya 则在三天之内证明了开源社区可以迅速跟上。对开发者来说，这意味着工具箱里又多了一种更快、更便宜、也更可控的构建模块。</p>
<h2 id="参考资料">参考资料</h2>
<ul>
<li><a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev">TypeSafe AI：Introducing System One Models &amp; Jev</a></li>
<li><a href="https://docs.typesafe.ai/models">TypeSafe 文档：Models</a></li>
<li><a href="https://docs.typesafe.ai/model-jaggedness/jev-1.13">TypeSafe 文档：Jev 1.13 jaggedness</a></li>
<li><a href="https://docs.typesafe.ai/confidence">TypeSafe 文档：Confidence</a></li>
<li><a href="https://evals.typesafe.ai/">TypeSafe Workflow Evals</a></li>
<li><a href="https://github.com/NandhaKishorM/laya">Laya GitHub 仓库</a></li>
<li><a href="https://huggingface.co/convaiinnovations/laya">Laya Hugging Face 模型页</a></li>
<li><a href="https://dev.to/nandakishor_m_6cc0adfde9f/i-built-non-autoregressive-decision-models-a-year-ago-then-a-frontier-lab-called-it-a-18me">Nandakishor M：I Built Non-Autoregressive Decision Models a Year Ago. Then a Frontier Lab Called It a &ldquo;Breakthrough&rdquo;.</a></li>
<li><a href="https://www.huxiu.com/article/4893173.html">虎嗅：号称快200倍的Jev模型，拿不下LLM的大结果</a></li>
</ul>
]]></content:encoded></item><item><title>玩转大语言模型：基于 vLLM 框架的大模型推理优化实现参数 / 数据（P/D）分离</title><link>https://wilsonwu.me/zh/blog/2025/vllm-pd-separation/</link><pubDate>Mon, 29 Sep 2025 00:00:00 -0400</pubDate><guid>https://wilsonwu.me/zh/blog/2025/vllm-pd-separation/</guid><description>随着大语言模型规模的不断增长，推理部署面临显存紧张与并发受限的挑战。本文介绍如何借助 vLLM 框架，通过 参数（Parameter）/ 数据（Data）分离（P/D Separation）优化推理性能。我们将从原理、架构思路到配置与代码实例逐步展开，展示如何让参数长期驻留在专用 GPU，而输入序列与 KV Cache 等动态数据独立管理，从而提升吞吐率、降低成本并增强系统扩展性。</description><content:encoded><![CDATA[<p>大模型在推理部署时，往往存在<strong>显存瓶颈</strong>：</p>
<ul>
<li>模型参数（Parameters, P）动辄上百 GB，需要长期驻留显存。</li>
<li>输入/输出数据（Data, D）则随请求动态变化，但往往和参数耦合在同一设备上，导致显存占用不均衡，扩展性受限。</li>
</ul>
<p>为了解决这一问题，可以借助 <strong>vLLM 框架</strong>实现<strong>参数 / 数据（P/D）分离</strong>，提升推理系统的灵活性和吞吐。</p>
<h2 id="大模型推理的资源瓶颈">大模型推理的资源瓶颈</h2>
<p>以一个 70B 规模的 Transformer 模型为例：</p>
<ul>
<li>参数权重（FP16 存储）约需 <strong>140GB 显存</strong>；</li>
<li>每次请求输入的序列数据、KV Cache 会消耗额外显存，并随 batch size 增长而急剧膨胀。</li>
</ul>
<p>如果不加区分地将 P 与 D 放在同一块 GPU：</p>
<ol>
<li>参数长期驻留，挤压了用于动态数据的显存；</li>
<li>多实例并发时，数据显存不足，限制了吞吐。</li>
</ol>
<p>因此，在分布式推理系统中，业界逐渐采用 <strong>参数与数据分离（P/D Separation）</strong> 的架构思路。</p>
<h2 id="vllm-简介">vLLM 简介</h2>
<p><a href="https://vllm.ai/">vLLM</a> 是一个高性能的大模型推理引擎，核心优势包括：</p>
<ul>
<li><strong>PagedAttention</strong>：高效管理 KV Cache，支持大批量并发；</li>
<li><strong>高吞吐率</strong>：相较于 Hugging Face Transformers 推理，吞吐提升数倍；</li>
<li><strong>灵活的分布式支持</strong>：可结合 DeepSpeed、Megatron 等方案，支持参数/数据分布式存储与调度。</li>
</ul>
<p>vLLM 的模块化架构，使其天然适合实现 <strong>P/D 分离</strong>。</p>
<h2 id="pd-分离的实现思路">P/D 分离的实现思路</h2>
<p>在 vLLM 中，推理流程大致分为两个部分：</p>
<ol>
<li>
<p><strong>参数侧（P）</strong></p>
<ul>
<li>模型权重加载与存放；</li>
<li>可通过 <strong>ZeRO-3 / Tensor Parallel</strong> 等策略将参数分布在多 GPU 节点上；</li>
<li>参数在整个推理生命周期中保持常驻，不随请求波动。</li>
</ul>
</li>
<li>
<p><strong>数据侧（D）</strong></p>
<ul>
<li>动态输入序列、KV Cache、采样状态等；</li>
<li>可使用 <strong>PagedAttention</strong> 管理显存分页；</li>
<li>支持把部分 KV Cache 放到 CPU/Host 内存，再动态迁移到 GPU。</li>
</ul>
</li>
</ol>
<h2 id="核心机制">核心机制</h2>
<p>其核心机制是显存资源隔离：</p>
<ul>
<li><strong>权重（P）</strong> 固定驻留在专门的 GPU（参数节点）；</li>
<li><strong>数据（D）</strong> 可以按需分配到其他 GPU（数据节点），甚至利用 CPU 内存 / NVMe。</li>
</ul>
<p>这样：</p>
<ul>
<li>参数显存不与动态数据抢占空间；</li>
<li>数据可以根据请求动态扩展，提升并发能力。</li>
</ul>
<h2 id="在-vllm-中的实现路径">在 vLLM 中的实现路径</h2>
<p>实现 P/D 分离的常见方法：</p>
<ol>
<li>
<p><strong>参数分片（Parameter Sharding）</strong></p>
<ul>
<li>借助 vLLM 对 Megatron-LM / DeepSpeed 的支持，将模型参数按张量维度切分到多 GPU；</li>
<li>仅在推理计算时聚合，不需要在每个设备上完整存放参数。</li>
</ul>
</li>
<li>
<p><strong>KV Cache 分离（Data Sharding）</strong></p>
<ul>
<li>通过 vLLM 的 <strong>PagedAttention</strong>，可以把 KV Cache 存在独立的 GPU 或 Host 内存；</li>
<li>在推理过程中按需调页，类似操作系统的虚拟内存机制。</li>
</ul>
</li>
<li>
<p><strong>Pipeline 并行化</strong></p>
<ul>
<li>将模型计算划分为不同阶段，前几层专门占用参数节点，后几层在数据节点完成；</li>
<li>在流水线中，数据逐层传递，而参数保持分片驻留。</li>
</ul>
</li>
</ol>
<h2 id="基于-vllm-的-pd-分离实战">基于 vLLM 的 P/D 分离实战</h2>
<p>下面给出两部分内容：</p>
<ul>
<li><strong>配置示例</strong>：如何在多 GPU 环境下指定参数和数据分布；</li>
<li><strong>代码示例</strong>：如何加载模型并运行推理，展示参数常驻、数据动态分配。</li>
</ul>
<h2 id="配置示例">配置示例</h2>
<p>假设我们有 4 张 GPU：</p>
<ul>
<li><strong>GPU 0,1</strong>：专门存放模型参数（P）；</li>
<li><strong>GPU 2,3</strong>：主要承载 KV Cache 等动态数据（D）。</li>
</ul>
<p>我们可以在启动 vLLM 时设置：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>CUDA_VISIBLE_DEVICES<span style="color:#f92672">=</span>0,1,2,3 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>python -m vllm.entrypoints.api_server <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>    --model /path/to/llama-2-70b <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>    --tensor-parallel-size <span style="color:#ae81ff">2</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>    --gpu-memory-utilization 0.85 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>    --enable-chunked-prefill <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>    --enforce-eager <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>    --kv-cache-dtype fp16 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>    --max-num-batched-tokens <span style="color:#ae81ff">4096</span>
</span></span></code></pre></div><p>这里的关键点：</p>
<ul>
<li><code>--tensor-parallel-size 2</code>：只在 GPU 0,1 上做参数分片存放；</li>
<li><code>--gpu-memory-utilization</code>：控制参数占用的比例，留出余量给数据；</li>
<li><code>--kv-cache-dtype fp16</code>：降低 KV Cache 精度，减少数据显存占用；</li>
<li><strong>vLLM 内部的 PagedAttention</strong> 会自动把 KV Cache 分配到 GPU 2,3，如果溢出则回退到 CPU 内存。</li>
</ul>
<h2 id="代码示例">代码示例</h2>
<p>下面是一个 Python 调用示例：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> vllm <span style="color:#f92672">import</span> LLM, SamplingParams
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># -------- 参数（P）分离 --------</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># tensor_parallel_size=2 表示参数分布在前两张 GPU（0,1）</span>
</span></span><span style="display:flex;"><span>llm <span style="color:#f92672">=</span> LLM(
</span></span><span style="display:flex;"><span>    model<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/path/to/llama-2-70b&#34;</span>,
</span></span><span style="display:flex;"><span>    tensor_parallel_size<span style="color:#f92672">=</span><span style="color:#ae81ff">2</span>,
</span></span><span style="display:flex;"><span>    gpu_memory_utilization<span style="color:#f92672">=</span><span style="color:#ae81ff">0.85</span>,
</span></span><span style="display:flex;"><span>    enforce_eager<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>,       <span style="color:#75715e"># 避免显存碎片</span>
</span></span><span style="display:flex;"><span>    enable_chunked_prefill<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>,
</span></span><span style="display:flex;"><span>    kv_cache_dtype<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;fp16&#34;</span>     <span style="color:#75715e"># 数据（D）使用更轻量的缓存精度</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># -------- 数据（D）分离 --------</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># PagedAttention 会自动管理 KV Cache 的存放位置（GPU2, 3, 甚至 CPU 内存）</span>
</span></span><span style="display:flex;"><span>sampling_params <span style="color:#f92672">=</span> SamplingParams(
</span></span><span style="display:flex;"><span>    temperature<span style="color:#f92672">=</span><span style="color:#ae81ff">0.8</span>,
</span></span><span style="display:flex;"><span>    top_p<span style="color:#f92672">=</span><span style="color:#ae81ff">0.95</span>,
</span></span><span style="display:flex;"><span>    max_tokens<span style="color:#f92672">=</span><span style="color:#ae81ff">256</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>prompt <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;解释一下通过 vLLM 实现 P/D 分离的好处。&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 运行推理</span>
</span></span><span style="display:flex;"><span>outputs <span style="color:#f92672">=</span> llm<span style="color:#f92672">.</span>generate([prompt], sampling_params)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;模型输出：&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> output <span style="color:#f92672">in</span> outputs:
</span></span><span style="display:flex;"><span>    print(output<span style="color:#f92672">.</span>outputs[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">.</span>text)
</span></span></code></pre></div><h2 id="验证方式">验证方式</h2>
<p>运行时可以用 <code>nvidia-smi</code> 观察：</p>
<ul>
<li>GPU 0,1 显存几乎恒定，主要承载参数；</li>
<li>GPU 2,3 的显存随请求数量/序列长度波动，主要承载 KV Cache；</li>
<li>如果输入过大，KV Cache 会溢出到 CPU 内存，但仍可继续推理。</li>
</ul>
<h2 id="实际效果与收益">实际效果与收益</h2>
<p>通过 P/D 分离，可以得到以下好处：</p>
<ul>
<li><strong>提升 GPU 利用率</strong>：参数和数据分工明确，避免显存冲突；</li>
<li><strong>支持更大 batch size</strong>：数据显存可扩展，吞吐率提升显著；</li>
<li><strong>降低成本</strong>：参数可驻留在高端 GPU，而数据可放到中低端 GPU 或 CPU 内存，形成分层存储；</li>
<li><strong>灵活性</strong>：适配多种硬件资源组合（A100 + H100, GPU + CPU, GPU + NVMe）。</li>
</ul>
<p>在实践中，结合 vLLM 的 PagedAttention，P/D 分离的效果尤为明显，可让大模型推理在同样硬件下实现 <strong>数倍并发提升</strong>。</p>
<h2 id="总结">总结</h2>
<p>vLLM 框架凭借其高效的 KV Cache 管理和分布式能力，为 <strong>大模型推理的 P/D 分离</strong> 提供了坚实基础。
通过将 <strong>参数（P）</strong> 和 <strong>数据（D）</strong> 解耦，可以更好地利用硬件资源，提升推理性能与扩展性。</p>
<p>未来，随着 <strong>混合精度存储、分层缓存（GPU+CPU+NVMe）</strong> 的发展，P/D 分离架构将逐渐成为大模型推理的主流范式。</p>
]]></content:encoded></item><item><title>玩转大语言模型：微软最新开源长语音大模型 VibeVoice 入门</title><link>https://wilsonwu.me/zh/blog/2025/microsoft-vibevoice/</link><pubDate>Thu, 18 Sep 2025 00:00:00 -0400</pubDate><guid>https://wilsonwu.me/zh/blog/2025/microsoft-vibevoice/</guid><description>本文介绍使用微软最新开源的 VibeVoice 大模型，在本地进行推理实现长文本，多角色文字转语音。</description><content:encoded><![CDATA[<h2 id="什么是-vibevoice">什么是 VibeVoice？</h2>
<p><strong><a href="https://microsoft.github.io/VibeVoice/">VibeVoice</a></strong> 是 Microsoft Research 发布的一套面向<strong>长篇、多说话人、对话式</strong>语音合成的研究框架，目标场景例如整集播客、有声剧或访谈：能在单次生成中维持说话人一致性并处理自然的换手（turn-taking）。模型家族包含多个规模（例如 1.5B、7B 等），并在 Hugging Face 上以 <a href="https://huggingface.co/microsoft/VibeVoice-1.5B"><code>microsoft/VibeVoice-1.5B</code></a> 形式开放（模型卡、模型文件、model card 中有安装/使用与责任使用说明）。</p>
<p>它解决了传统 TTS（Text-To-Speech）系统的一些痛点，比如：</p>
<ul>
<li>难以维持<strong>长时间</strong>对话的语音一致性（speaker consistency）；</li>
<li>多说话人的切换自然性（turn-taking）差；</li>
<li>效率低 — 长文本 + 多说话人时，资源消耗大。</li>
</ul>
<h2 id="核心创新与架构">核心创新与架构</h2>
<p>VibeVoice 有几个比较新的或者关键的技术设计：</p>
<table>
	<thead>
			<tr>
					<th>组件</th>
					<th>功能 / 目的</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><strong>Continuous Speech Tokenizers</strong>（声学 + 语义两种）</td>
					<td>用来把音频压缩成低帧率（7.5 Hz）表示，同时保留语义与音质信息。声学 token 与语义 token 分别负责声音细节和内容表达。</td>
			</tr>
			<tr>
					<td><strong>LLM 基础模型</strong>（Large Language Model）</td>
					<td>在该版本里用的是 Qwen2.5-1.5B，用来处理文本、说话人信息以及上下文对话流。</td>
			</tr>
			<tr>
					<td><strong>Diffusion Head</strong></td>
					<td>对声学 VAE 的特征进行预测，是生成高保真声音细节的模块。这个模块较轻 (大致 4 层结构)，在推理阶段使用 diffusion 的技术（包括去噪等）。</td>
			</tr>
			<tr>
					<td><strong>上下文长度 &amp; 多说话人</strong></td>
					<td>支持高达 <strong>90 分钟</strong>语音生成，最多 <strong>4 个</strong>说话人。</td>
			</tr>
	</tbody>
</table>
<p>架构图如下：</p>
<p><img alt="VibeVoice 架构" loading="lazy" src="/zh/blog/2025/microsoft-vibevoice/vibevoice-arch.jpg"></p>
<h2 id="优点和局限">优点和局限</h2>
<h3 id="优点">优点</h3>
<ol>
<li><strong>长篇幅对话能力</strong> — 能生成近 90 分钟的连续对话，并维持说话人一致性。</li>
<li><strong>多说话人支持</strong> — 最多支持 4 个不同说话人的切换，且对话流程自然。</li>
<li><strong>压缩效率高</strong> — 用 7.5 Hz 帧率的 speech tokenizer，音频被高度压缩但仍保证质量。</li>
<li><strong>语义 + 声学分离</strong> — 语义 tokenizer（semantic）负责内容，声学 tokenizer（acoustic）负责声音细节，两者协同。</li>
</ol>
<h3 id="局限">局限</h3>
<ol>
<li><strong>语言支持有限</strong> — 目前主要是英语与中文，跨语言能力还在研究中。</li>
<li><strong>背景音乐 / 音效不支持</strong> — 当前专注纯语音合成，没有加入背景音或重叠说话人（speaker overlap）。</li>
<li><strong><a href="https://github.com/microsoft/VibeVoice">仓库暂时关闭</a></strong> — 官方声明因 “部分用途超出初衷 / 不符合责任使用” 的情况，仓库暂时被 disable。意味着可能无法立即拿到源码或全部功能。</li>
<li><strong>硬件要求 / 资源消耗</strong> — 虽然压缩效率高，但生成长篇语音 + 多说话人 + 高保真度仍需要较好的 GPU 资源。</li>
<li><strong>潜在滥用风险</strong> — 用来做语音克隆、假扮、deepfake 等可能的恶意用途。官方在文档中也提到要谨慎。</li>
</ol>
<h2 id="快速上手">快速上手</h2>
<p>下面给出具体实现步骤及上手流程。注意：由于官方仓库目前不包含完整脚本，实际推理通常依赖社区实现或 Hugging Face Spaces / Colab 示例。所列步骤已参考 Hugging Face 模型页与社区示例仓库。</p>
<h3 id="先决条件">先决条件</h3>
<ul>
<li>
<p>Python 3.8+；建议在隔离虚拟环境（venv / conda）中操作。</p>
</li>
<li>
<p>GPU：带 CUDA 的 NVIDIA GPU（具体 VRAM 与性能见第 5 节）。若使用 Apple Silicon / macOS，可参见社区讨论与专门脚本。</p>
</li>
<li>
<p>安装工具（示例）：</p>
<ul>
<li><code>pip install huggingface_hub transformers accelerate torch soundfile torchaudio numpy einops</code></li>
<li>本地需要 <code>ffmpeg</code>（用于音频切分/拼接与格式转换）。</li>
</ul>

<blockquote>
  <p>具体版本请按 PyTorch 官网或社区脚本说明选择（不同 CUDA 版本的 wheel 不同）。参考社区仓库的 requirements 列表以确保兼容。</p>

</blockquote>
</li>
</ul>
<h3 id="下载模型权重">下载模型权重</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> huggingface_hub <span style="color:#f92672">import</span> snapshot_download
</span></span><span style="display:flex;"><span>model_dir <span style="color:#f92672">=</span> snapshot_download(<span style="color:#e6db74">&#34;microsoft/VibeVoice-1.5B&#34;</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;模型已下载到&#34;</span>, model_dir)
</span></span></code></pre></div><p>注意：<code>snapshot_download</code> 会把 HF 模型文件和模型卡同步拉取到本地；若模型文件较大，请确保磁盘与网络条件。</p>
<h3 id="使用社区推理脚本">使用社区推理脚本</h3>
<p>很多社区仓库或 Hugging Face Spaces 提供了 <code>demo/inference_from_file.py</code> 之类的脚本。示例命令：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># 在 Colab / 本地环境中操作</span>
</span></span><span style="display:flex;"><span>git clone https://huggingface.co/technicalheist/vibevoice-1.5b
</span></span><span style="display:flex;"><span>cd vibevoice-1.5b
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 安装 Python 依赖（按模型页 “Requirements” 部分）</span>
</span></span><span style="display:flex;"><span>pip install torch transformers soundfile ffmpeg-python  <span style="color:#75715e"># plus 其他必要包</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 创建一个 transcript 文件，比如 transcript.txt</span>
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;Speaker 1: Hello, how are you doing?
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Speaker 2: I&#39;m good, thanks. What about you?&#34;</span> &gt; transcript.txt
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 用 demo 脚本生成语音</span>
</span></span><span style="display:flex;"><span>python demo/inference_from_file.py <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --model_path /path/to/technicalheist/vibevoice-1.5b <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --txt_path transcript.txt <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --speaker_names <span style="color:#e6db74">&#34;Alice,Bob&#34;</span>
</span></span></code></pre></div><p>社区实现（例如 <code>technicalheist/vibevoice-1.5b</code>、<code>shijincai/VibeVoice</code> 等）提供了可运行的示例与依赖说明；使用前请仔细阅读其 README 并依据其中的依赖和指引来配置环境。示例脚本名与参数在不同实现中可能不同，请以具体仓库中的文档为准。</p>
<h3 id="简单示例">简单示例</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-txt" data-lang="txt"><span style="display:flex;"><span>Speaker 1: Hello, welcome to our podcast.
</span></span><span style="display:flex;"><span>Speaker 2: Thanks — happy to be here. Let&#39;s talk about VibeVoice.
</span></span><span style="display:flex;"><span>Speaker 1: Sure, start with the key idea...
</span></span></code></pre></div><p>将上面保存为 <code>transcript.txt</code> 并传入 <code>--txt_path</code> 即可（脚本会解析说话人标记并输出对应音轨）。社区脚本通常会把每个说话人的音色/说话风格作为参数或示例内置。</p>
<h2 id="结论">结论</h2>
<p>微软的 VibeVoice 是当前 TTS / 语音合成领域一个非常令人兴奋的进展。它在<strong>长篇幅语音 + 多说话人</strong>上取得了突破，尤其是在对话流畅性和说话人一致性方面，技术设计（如低帧率的双 tokenizers + next-token diffusion + LLM 架构）也很前沿。</p>
<p>如果你正在做播客、有声书或者对话剧本的语音合成，这可能是一个非常有用的工具／研究基础。不过在商业部署或者包含敏感语音身份／法律边界用途时，需要格外注意责任使用，以及是否有完整的许可与风险评估。</p>
]]></content:encoded></item></channel></rss>