<?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>Microsoft on Wilson Wu</title><link>https://wilsonwu.me/zh/tags/microsoft/</link><description>Recent content in Microsoft on Wilson Wu</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sat, 10 Oct 2026 00:00:00 -0400</lastBuildDate><atom:link href="https://wilsonwu.me/zh/tags/microsoft/index.xml" rel="self" type="application/rss+xml"/><item><title>Microsoft-Decision-1 详解：微软入局决策模型，与 Jev、Laya 的三方对比</title><link>https://wilsonwu.me/zh/blog/2026/microsoft-decision-1/</link><pubDate>Sat, 10 Oct 2026 00:00:00 -0400</pubDate><guid>https://wilsonwu.me/zh/blog/2026/microsoft-decision-1/</guid><description>&lt;p&gt;&lt;img alt="Microsoft-Decision-1、Jev 与 Laya" loading="lazy" src="https://wilsonwu.me/zh/blog/2026/microsoft-decision-1/1-microsoft-decision-1.png"&gt;&lt;/p&gt;
&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;上个月我写了一篇 &lt;a href="https://wilsonwu.me/zh/blog/2026/jev-vs-laya/"&gt;Jev vs Laya&lt;/a&gt;，对比了 TypeSafe AI 的闭源决策模型 Jev 和社区开源的 Laya。那时“决策模型”还是一个刚刚诞生的新品类：9 月 15 日 Jev 发布，三天后 Laya 开源。&lt;/p&gt;</description><content:encoded><![CDATA[<p><img alt="Microsoft-Decision-1、Jev 与 Laya" loading="lazy" src="/zh/blog/2026/microsoft-decision-1/1-microsoft-decision-1.png"></p>
<h2 id="引言">引言</h2>
<p>上个月我写了一篇 <a href="/zh/blog/2026/jev-vs-laya/">Jev vs Laya</a>，对比了 TypeSafe AI 的闭源决策模型 Jev 和社区开源的 Laya。那时“决策模型”还是一个刚刚诞生的新品类：9 月 15 日 Jev 发布，三天后 Laya 开源。</p>
<p>仅仅三周之后，这个赛道就挤满了玩家：10 月 6 日，OpenAI 开放了基于 GPT-6 Luna 的 Decisions API；Liquid AI、Inception 等公司也陆续推出了自己的决策 API；第三方榜单 JevBench 上参与排名的开源权重系统已经超过 140 个。10 月 9 日，微软也正式入局，发布了 <strong>Microsoft-Decision-1</strong>。</p>
<p>和其他入局者相比，Microsoft-Decision-1 有几个特别值得关注的地方：</p>
<ul>
<li><strong>出自大厂，底座却是开源模型</strong>：它基于阿里开源的 Qwen3.5-9B 后训练而来，微软还表示后续会迁移到自家的 MAI 系列和 OpenAI 的模型上；</li>
<li><strong>价格与 Jev 完全一致</strong>：输入每百万 token 0.042 美元，输出免费；</li>
<li><strong>接口几乎与 Jev 兼容</strong>：同样是 state + questions，同样是 noul / choice / score 三种问题类型；</li>
<li><strong>官方数据很亮眼</strong>：在 36 项基准、近 15 万道题的对比中平均准确率最高，中位延迟比 GPT-6 Sol 快约 35 倍。</li>
</ul>
<p>但官方数据只是故事的一半。微软发布的第二天，第三方榜单 JevBench 就完成了独立实测，结论并不完全一致。本文将从以下几个方面展开：</p>
<ol>
<li>Microsoft-Decision-1 是什么，又是怎么做出来的</li>
<li>它与 Jev、Laya 的技术路线和接口有什么不同</li>
<li>官方基准与第三方实测应该怎么看</li>
<li>Microsoft-Decision-1 的优势与劣势</li>
<li>适用场景、选型建议与代码示例</li>
</ol>
<h2 id="一分钟回顾什么是决策模型">一分钟回顾：什么是决策模型</h2>
<p>决策模型（System One Model）不聊天，也不写文章，它只做一件事：<strong>接收一段状态（state）和一组预先定义好的问题（questions），直接返回带概率的类型化决策</strong>。三家都支持同样的三种问题原语：</p>
<table>
	<thead>
			<tr>
					<th>原语</th>
					<th>回答的问题</th>
					<th>返回内容</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>noul</code></td>
					<td>是不是？</td>
					<td>“是”的概率（0～1）</td>
			</tr>
			<tr>
					<td><code>choice</code></td>
					<td>选哪一个？</td>
					<td>选中的选项，以及每个选项的概率</td>
			</tr>
			<tr>
					<td><code>score</code></td>
					<td>有多少？</td>
					<td>有序等级上的分数，以及每个等级的概率</td>
			</tr>
	</tbody>
</table>
<p>由于答案空间被提前限定，模型不会返回格式错误或凭空编造的选项；校准过的概率则可以直接写进程序的 <code>if</code> 语句：高置信度自动执行，中置信度交给更强的模型复核，低置信度转人工。在一个 AI 系统里，比较合理的分工是：<strong>代码负责骨架，决策模型负责快速判断，大模型负责深度思考</strong>。</p>
<p>更详细的概念介绍和置信度分流的思路，可以参考上一篇，这里不再展开。</p>
<h2 id="microsoft-decision-1-是什么">Microsoft-Decision-1 是什么</h2>
<h3 id="1-基本信息">1. 基本信息</h3>
<p>2026 年 10 月 9 日，微软首席技术官办公室（Office of the CTO）软件工程副总裁 Achint Srivastava 在微软的技术博客 Command Line 上发布了 Microsoft-Decision-1。文章开头是这样定义决策模型的：</p>

<blockquote>
  <p>Unlike LLMs, which are designed to generate text or reason through complex problems, decision models are purpose-built to deliver structured outputs that software can immediately act on.</p>
<p>与生成文本、推理复杂问题的大模型不同，决策模型专门用来输出软件可以立即据此行动的结构化结果。</p>

</blockquote>
<p>微软给它的定位是一个“快速决策打分”（fast decision-scoring）模型，面向路由、分类、优先级排序、结果校验和工作流控制。主要信息如下：</p>
<table>
	<thead>
			<tr>
					<th>项目</th>
					<th>说明</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>发布时间</td>
					<td>2026 年 10 月 9 日</td>
			</tr>
			<tr>
					<td>发布方</td>
					<td>微软首席技术官办公室（Office of the CTO）</td>
			</tr>
			<tr>
					<td>底座模型</td>
					<td>Qwen3.5-9B（后训练），计划迁移到 MAI 和 OpenAI 的模型</td>
			</tr>
			<tr>
					<td>模型类型</td>
					<td>决策、文本分类、零样本分类</td>
			</tr>
			<tr>
					<td>问题类型</td>
					<td><code>noul</code>（是 / 否）、<code>choice</code>（多选一）、<code>score</code>（有序打分），以及基于评分细则（rubric）评估 AI 回答和 Agent 行为</td>
			</tr>
			<tr>
					<td>输入</td>
					<td>仅支持文本（字符串或 JSON），单次请求最多 32K token，不支持图像、音频和视频</td>
			</tr>
			<tr>
					<td>输出</td>
					<td>选中项和每个候选项的校准概率，不生成解释或理由</td>
			</tr>
			<tr>
					<td>获取方式</td>
					<td>Microsoft Foundry 模型目录（模型名 <code>Microsoft-Decision-1</code>，版本 <code>1</code>），也可以通过 OpenRouter 调用</td>
			</tr>
			<tr>
					<td>部署类型</td>
					<td><code>GlobalStandard</code>，部分区域支持 <code>DataZoneStandard</code></td>
			</tr>
			<tr>
					<td>调用端点</td>
					<td><code>{Foundry 资源端点}/providers/microsoft/v1/systemone</code></td>
			</tr>
			<tr>
					<td>认证方式</td>
					<td>Microsoft Entra ID（推荐）或 API Key</td>
			</tr>
			<tr>
					<td>价格</td>
					<td>输入 0.042 美元 / 百万 token，输出免费</td>
			</tr>
	</tbody>
</table>
<p>按这个价格，如果每次判断平均消耗 1000 个输入 token，100 万次判断的费用约为 42 美元，和 Jev 完全相同。</p>
<h3 id="2-它是怎么做出来的">2. 它是怎么做出来的</h3>
<p>微软公开的技术细节不多，但有几个关键点：</p>
<ul>
<li><strong>在开源底座上后训练</strong>：微软在 Qwen3.5-9B 上做了后训练（post-training），让它学会“单次前向完成决策打分”（fast, single-pass decision scoring）。给定一组固定的候选答案，模型直接为每个选项输出一个校准过的概率，而不是逐 token 生成文字。</li>
<li><strong>底座可以替换</strong>：微软明确表示，很快会把它迁移（rebase）到其他底座上，包括微软自研的 MAI 系列和 OpenAI 的模型。</li>
<li><strong>没有公开的部分</strong>：训练数据、后训练方法和打分机制的具体实现都没有公开，权重也没有开放，只能以托管 API 的形式使用。</li>
</ul>
<p><img alt="Microsoft-Decision-1 的工作方式" loading="lazy" src="/zh/blog/2026/microsoft-decision-1/2-how-decision-1-works.png"></p>
<p>微软在博客里把打造一个可靠决策模型的难点归纳为五个方面，并给出了相应的自测结果：</p>
<table>
	<thead>
			<tr>
					<th>挑战</th>
					<th>为什么重要</th>
					<th>微软的自测结果</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>速度</td>
					<td>Agent 工作流中的决策往往是串行的，每个决策多 100 毫秒，20 个串行决策就会多出 2 秒</td>
					<td>P50 延迟约为 GPT-6 Sol 的 1/35</td>
			</tr>
			<tr>
					<td>泛化</td>
					<td>模型很容易在单个基准上过拟合，必须验证它在没见过的任务上是否同样可靠</td>
					<td>在数十个对训练保密的基准（路由、排序、长上下文、多语言、分布外任务、推理、安全）上评测；与 JevBench 榜单上的头部模型在另外 36 个公开和私有基准上对比，平均准确率最高</td>
			</tr>
			<tr>
					<td>鲁棒性</td>
					<td>生产环境里，state 和指令会被改写，选项会被重排，字段名会变化，这些等价变化不应该改变决策</td>
					<td>对同一请求做 8 种扰动，平均决策翻转率为 1.3%；改写选项描述、颠倒或打乱选项顺序时，翻转率为 0</td>
			</tr>
			<tr>
					<td>校准</td>
					<td>概率本身就是 API 的一部分，应用要依据它决定是执行、推迟还是送审，“90% 的把握”应该在代表性样本上 10 次对 9 次</td>
					<td>36 项基准上的校准分为 92.2（满分 100），在参评的 7 个模型中排第三，比 Jev 低 1.5 分</td>
			</tr>
			<tr>
					<td>安全</td>
					<td>既要识别有害请求，又不能误伤正常请求</td>
					<td>在 11 个基准、5250 条请求（有害内容、越狱攻击、提示词注入）上测试，能够拒绝有害行为，同时保持较高的可用性</td>
			</tr>
	</tbody>
</table>
<h3 id="3-微软内部的四个试点">3. 微软内部的四个试点</h3>
<p>微软还公开了几个内部试用的案例（均为微软自测）：</p>
<table>
	<thead>
			<tr>
					<th>团队 / 场景</th>
					<th>任务</th>
					<th>结果</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Xbox Research：数据标注</td>
					<td>把来自问卷、Steam 和 Twitter/X 的 1 万多条开放式反馈，归入研究员预先定义好的主题</td>
					<td>质量与 GPT-6 Sol 相当，速度快 14 倍以上，成本低约 200 倍</td>
			</tr>
			<tr>
					<td>Copilot：质量控制</td>
					<td>评估聊天回答和 Agent 回答的质量</td>
					<td>与 GPT-5.6 Luna 表现相当，速度快约 100 倍</td>
			</tr>
			<tr>
					<td>事故响应</td>
					<td>值班工程师处理线上事故时，从日志、工单、通话和消息中检索相关知识</td>
					<td>比基于大模型的方案更准、更快</td>
			</tr>
			<tr>
					<td>Microsoft Discovery：科学研究</td>
					<td>Agent 按评分细则评估上一轮实验的结果，调整方案并反复迭代，直到完成目标</td>
					<td>打分一致性是大模型打分的 46 倍，速度是 3 倍，自适应重规划整体提速近 4 倍</td>
			</tr>
	</tbody>
</table>
<p>其中 Xbox 的三个数据集，微软给出了更详细的对比数据：</p>
<table>
	<thead>
			<tr>
					<th>数据集</th>
					<th>样本量</th>
					<th>平均每条耗时（GPT-6 Sol → Decision-1）</th>
					<th>跑完一遍的成本（GPT-6 Sol → Decision-1）</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>某赛车游戏的评论</td>
					<td>753 条</td>
					<td>2.8 秒 → 159 毫秒（约 18 倍）</td>
					<td>1.83 美元 → 0.009 美元（约 213 倍）</td>
			</tr>
			<tr>
					<td>某第一人称射击游戏的评论</td>
					<td>341 条</td>
					<td>2.6 秒 → 188 毫秒（约 14 倍）</td>
					<td>1.03 美元 → 0.005 美元（约 212 倍）</td>
			</tr>
			<tr>
					<td>某工作室直播的帖子</td>
					<td>1030 条</td>
					<td>2.6 秒 → 143 毫秒（约 18 倍）</td>
					<td>2.92 美元 → 0.013 美元（约 223 倍）</td>
			</tr>
	</tbody>
</table>
<p>按 100 万条文本折算，GPT-6 Sol 约需 2434 美元，Microsoft-Decision-1 约需 11 美元（微软注明成本为估算值）。两者读取的是同一份任务说明，输入 token 数相同，差距来自单价，以及 GPT-6 Sol 还需要为输出付费。</p>
<h3 id="4-适合哪些场景">4. 适合哪些场景</h3>
<p>微软在博客里列出了 16 个推荐场景，大致可以归为四类：</p>
<table>
	<thead>
			<tr>
					<th>类别</th>
					<th>场景</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Agent 控制</td>
					<td>评估 Agent 提出的下一步，决定继续、停止、重试，还是交给其他模型、工具或人；按照 Skill 中的规则选择下一步动作，而不必反复处理一长串指令；在电脑和界面操作中选择下一个 UI 动作；在机器人场景中从预定义的动作里做选择</td>
			</tr>
			<tr>
					<td>路由与分类</td>
					<td>模型路由、意图识别、事故分级与派单、内容分类与过滤、数据标注</td>
			</tr>
			<tr>
					<td>评估与校验</td>
					<td>AI 评审（按标准决定接受、修改还是拒绝一个回答）、数据校验、代码扫描、安全风险筛查（放行、拦截或升级）</td>
			</tr>
			<tr>
					<td>排序与推荐</td>
					<td>推荐、搜索相关性打分，以及在科学研究中筛选假设、化合物和实验</td>
			</tr>
	</tbody>
</table>
<p>其中最值得关注的是 <strong>Agent 控制</strong>。今天的 Agent 每走一步都要做大量“小判断”：上一步成功了吗？要不要重试？这个工具调用会不会动到生产数据？如果这些判断都交给大模型，延迟和成本会随着步数线性累积。用一个百毫秒级的决策模型给 Agent 加一道“闸门”，是这类模型最有想象空间的用法。微软还演示了一个电脑操作（computer use）的例子：在完成“买一个背包”的任务时，由 Microsoft-Decision-1 选择下一步界面操作，完成速度明显快于 GPT-6 Sol。</p>
<p><img alt="用决策模型给 Agent 加一道闸门" loading="lazy" src="/zh/blog/2026/microsoft-decision-1/3-agent-decision-gate.png"></p>
<p>另一个值得一提的场景是<strong>模型路由</strong>：根据请求的质量、成本和延迟要求，选择最合适的模型来处理。我之前写过一篇 <a href="/zh/blog/2026/llm-smart-router/">让模型自己选模型：Embedding 驱动的 LLM 智能路由机制</a>，决策模型提供了另一种思路：不再依赖向量相似度，而是直接把“该交给哪个模型”当成一道 <code>choice</code> 题来回答。</p>
<h2 id="三条技术路线">三条技术路线</h2>
<p><img alt="三种决策模型的技术路线" loading="lazy" src="/zh/blog/2026/microsoft-decision-1/4-three-architectures.png"></p>
<p>把三个模型放在一起，会发现它们代表了三条截然不同的技术路线：</p>
<table>
	<thead>
			<tr>
					<th>维度</th>
					<th>Jev</th>
					<th>Laya</th>
					<th>Microsoft-Decision-1</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>模型结构</td>
					<td>未公开（社区猜测接近 encoder 类模型）</td>
					<td>双向编码器（ModernBERT / mmBERT）+ 决策头</td>
					<td>解码器大模型 Qwen3.5-9B 后训练</td>
			</tr>
			<tr>
					<td>参数规模</td>
					<td>未公开</td>
					<td>322M～421M</td>
					<td>约 9B</td>
			</tr>
			<tr>
					<td>训练方法</td>
					<td>RLCD（面向校准决策的强化学习，细节未公开）</td>
					<td>RLCD（严格适当评分规则 + 组基线策略梯度，已公开）</td>
					<td>面向单次决策打分的后训练（细节未公开）</td>
			</tr>
			<tr>
					<td>推理方式</td>
					<td>自研的并行采样器</td>
					<td>每个选项前放一个 <code>[MASK]</code>，单次前向打分</td>
					<td>单次前向打分</td>
			</tr>
			<tr>
					<td>权重</td>
					<td>闭源</td>
					<td>Apache 2.0 开源</td>
					<td>不开放（底座开源）</td>
			</tr>
	</tbody>
</table>
<p>有几点值得展开说说：</p>
<ol>
<li><strong>规模相差一个数量级以上</strong>。Laya 用 4 亿参数的编码器换取极致的速度和本地部署能力；Microsoft-Decision-1 用 90 亿参数的解码器换取更强的零样本泛化能力，代价是对算力的要求高得多，而且目前只能以云端托管的方式使用。</li>
<li><strong>底座正在变成可替换的零件</strong>。从 JevBench 榜单看，排名靠前的开源决策模型大多也是在 Qwen 或 Gemma 上后训练出来的，比如基于 Qwen3.5-4B 的 H2O-Lightning-4B、基于 Gemma-4-31B 的 Quyet-1.0-Large。微软直接选用阿里的开源模型做底座，又公开表示后续会换成 MAI 或 OpenAI 的模型，说明这类模型的竞争力主要来自后训练数据、评测体系和校准方法，而不是底座本身。</li>
<li><strong>“单次前向”已经是共识</strong>。无论是 Laya 的编码器还是 Microsoft-Decision-1 的解码器，核心思路都一样：不生成文本，一次前向计算就给出所有候选项的概率。这也是决策模型能比通用大模型快一到两个数量级的根本原因。</li>
</ol>
<h2 id="同一套接口三种后端">同一套接口，三种后端</h2>
<p><img alt="同一组请求，三种后端" loading="lazy" src="/zh/blog/2026/microsoft-decision-1/5-same-api-three-backends.png"></p>
<p>对开发者来说，一个非常实用的变化是：<strong>三者的请求格式几乎一致</strong>。</p>
<ul>
<li>Jev 的官方 API 是 <code>POST https://api.typesafe.ai/v1/systemone</code>；</li>
<li>Microsoft-Decision-1 的端点是 Foundry 资源下的 <code>/providers/microsoft/v1/systemone</code>，微软文档也直接说明，它的请求模式与 System One API 类似；</li>
<li>Laya 也提供了 <code>laya-serve</code>，在本地以同样的 <code>POST /v1/systemone</code> 协议对外服务，返回结构与 Jev 一致，已有的 Jev 客户端只需要修改 <code>baseUrl</code>。</li>
</ul>
<p>三者在细节上的差异如下：</p>
<table>
	<thead>
			<tr>
					<th>项目</th>
					<th>Microsoft-Decision-1</th>
					<th>Jev</th>
					<th>Laya（laya-serve）</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>端点</td>
					<td><code>{Foundry 资源端点}/providers/microsoft/v1/systemone</code></td>
					<td><code>https://api.typesafe.ai/v1/systemone</code></td>
					<td><code>http://{主机}:8000/v1/systemone</code></td>
			</tr>
			<tr>
					<td>认证</td>
					<td>Entra ID 的 Bearer Token，或 <code>api-key</code> 请求头</td>
					<td><code>Authorization: Bearer {API Key}</code></td>
					<td>默认无认证，设置 <code>LAYA_API_KEY</code> 后使用 Bearer Token</td>
			</tr>
			<tr>
					<td><code>model</code> 字段</td>
					<td>部署名称（deployment name）</td>
					<td>模型版本或别名，如 <code>jev-1.13.0</code></td>
					<td>检查点名称，省略时由 Router 自动选择</td>
			</tr>
			<tr>
					<td>单次请求上限</td>
					<td>32K token</td>
					<td>64K token，其中 state 加最长的单个问题不超过 32K</td>
					<td>默认 512 / 1024 token，多语言检查点最高 8192</td>
			</tr>
			<tr>
					<td>批量</td>
					<td>同一个 state 可以带多个问题</td>
					<td>同左</td>
					<td>同左，另有 <code>/v1/systemone/batch</code>，一次最多 64 个 state</td>
			</tr>
	</tbody>
</table>
<p>这意味着 <code>state + questions</code> 风格的接口正在成为决策模型的事实标准，就像当年 OpenAI 的 Chat Completions 接口之于大模型。微软把价格定得和 Jev 一模一样、接口也几乎一致，很难不让人认为这是在刻意降低 Jev 用户的迁移门槛。对用户来说，切换成本越来越低；对厂商来说，护城河只能来自效果、延迟、单次成本、合规能力和生态。</p>
<h2 id="核心差异一览">核心差异一览</h2>
<table>
	<thead>
			<tr>
					<th>维度</th>
					<th>Microsoft-Decision-1</th>
					<th>Jev</th>
					<th>Laya</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>发布方</td>
					<td>微软</td>
					<td>TypeSafe AI（创业公司）</td>
					<td>Convai Innovations（独立研究者）</td>
			</tr>
			<tr>
					<td>发布时间</td>
					<td>2026 年 10 月 9 日</td>
					<td>2026 年 9 月 15 日</td>
					<td>2026 年 9 月 18 日</td>
			</tr>
			<tr>
					<td>开源</td>
					<td>权重不开放</td>
					<td>闭源</td>
					<td>Apache 2.0</td>
			</tr>
			<tr>
					<td>部署</td>
					<td>Azure 托管（Foundry），也可经 OpenRouter 调用</td>
					<td>TypeSafe 云端（美国西海岸）</td>
					<td>本地、私有云或离线环境</td>
			</tr>
			<tr>
					<td>架构与规模</td>
					<td>Qwen3.5-9B 后训练</td>
					<td>未公开</td>
					<td>编码器 + 决策头，322M～421M</td>
			</tr>
			<tr>
					<td>问题原语</td>
					<td>noul / choice / score + 评分细则</td>
					<td>noul / choice / score</td>
					<td>noul / choice / score</td>
			</tr>
			<tr>
					<td>上下文</td>
					<td>32K token</td>
					<td>64K token</td>
					<td>默认 512 / 1024 token</td>
			</tr>
			<tr>
					<td>零样本能力</td>
					<td>强</td>
					<td>强</td>
					<td>弱，需要微调</td>
			</tr>
			<tr>
					<td>定制方式</td>
					<td>调整 state、instructions 和选项</td>
					<td>调整 state、instructions 和 criteria</td>
					<td>可在自有数据上微调，并拟合校准温度</td>
			</tr>
			<tr>
					<td>官方延迟</td>
					<td>同区域 p50 约 85 ms</td>
					<td>70～500 ms</td>
					<td>T4 上单个问题约 33 ms</td>
			</tr>
			<tr>
					<td>价格</td>
					<td>输入 $0.042 / 百万 token，输出免费</td>
					<td>同左</td>
					<td>模型免费，自备算力</td>
			</tr>
			<tr>
					<td>企业集成</td>
					<td>Azure 订阅计费、Entra ID、RBAC、数据区域部署</td>
					<td>API Key，零数据保留仅面向企业客户</td>
					<td>完全自主可控</td>
			</tr>
			<tr>
					<td>多语言</td>
					<td>未列出支持的语言，评测中包含多语言任务</td>
					<td>以英语为主</td>
					<td>多语言检查点覆盖 100 多种语言</td>
			</tr>
	</tbody>
</table>
<h2 id="基准数据怎么看">基准数据怎么看</h2>
<h3 id="1-微软公布的对比数据">1. 微软公布的对比数据</h3>
<p>微软把 Microsoft-Decision-1 和 JevBench 榜单上的几个头部模型、Jev 以及 GPT-6 Sol 放在一起，在 36 个公开和私有基准、共 147,137 道题上做了对比（准确率和校准分越高越好，延迟越低越好）：</p>
<table>
	<thead>
			<tr>
					<th>模型</th>
					<th>平均准确率</th>
					<th>中位延迟（p50）</th>
					<th>校准分（100 为完美）</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><strong>Microsoft-Decision-1</strong></td>
					<td><strong>83.5%</strong></td>
					<td><strong>85 ms</strong></td>
					<td>92.2</td>
			</tr>
			<tr>
					<td>Jev 1.13.0</td>
					<td>82.3%</td>
					<td>240 ms</td>
					<td><strong>93.7</strong></td>
			</tr>
			<tr>
					<td>Quyet-1.0-Large</td>
					<td>81.9%</td>
					<td>380 ms</td>
					<td>93.1</td>
			</tr>
			<tr>
					<td>Surogate Rune 26B-A4B</td>
					<td>79.7%</td>
					<td>380 ms</td>
					<td>91.8</td>
			</tr>
			<tr>
					<td>GPT-6 Luna Decisions</td>
					<td>79.4%</td>
					<td>300 ms</td>
					<td>89.9</td>
			</tr>
			<tr>
					<td>deck-31B</td>
					<td>77.8%</td>
					<td>400 ms</td>
					<td>83.5</td>
			</tr>
			<tr>
					<td>H2O-Lightning-4B v1.1</td>
					<td>77.2%</td>
					<td>210 ms</td>
					<td>91.8</td>
			</tr>
			<tr>
					<td>GPT-6 Sol（参照）</td>
					<td>未参与排名</td>
					<td>3010 ms</td>
					<td>未评分</td>
			</tr>
	</tbody>
</table>
<p>注：Microsoft-Decision-1 的延迟是在 Foundry 同区域测得的，其余模型的延迟引用自 JevBench v1.6.1 的调整后中位延迟（10 月 7 日数据）。另外，AWS 的 Strands-Decider 2B 只能回答 36 个基准中的 23 个，平均准确率为 54.8%，未列入上表。微软的文章在发布后还专门更新了一次，补充了 Jev 的准确率和校准数据。</p>
<p>按这组数据，Microsoft-Decision-1 的平均准确率第一，速度最快：比第二快的 H2O-Lightning-4B v1.1 快 2.5 倍，比 Jev 快约 2.8 倍，比 GPT-6 Sol 快约 35 倍；校准分排第三。</p>
<p>需要注意的是，微软说的是 36 项基准的<strong>平均</strong>准确率最高，而不是每一项都排第一，一些报道中“36 项基准全部第一”的说法并不准确。</p>
<h3 id="2-第三方-jevbench-的实测">2. 第三方 JevBench 的实测</h3>
<p>JevBench 是一个独立于 TypeSafe 的社区榜单（个人维护的开源项目 Benchmark Heaven），用 1500 道决策题（1200 道封存题加 300 道公开题），从智能（Intelligence）、校准（Calibration）、速度和成本四个维度评测决策模型。Microsoft-Decision-1 发布的第二天（10 月 10 日），JevBench 就通过 Azure Foundry 的原生接口完成了完整测试。下面是 API 榜单上的部分结果：</p>
<table>
	<thead>
			<tr>
					<th>综合排名</th>
					<th>系统</th>
					<th>综合分</th>
					<th>能力分</th>
					<th>每千次决策成本</th>
					<th>中位延迟</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1</td>
					<td>Sage 1.3.0（Levanto Labs）</td>
					<td>74.0</td>
					<td>78.6</td>
					<td>约 $0.025</td>
					<td>0.15 s</td>
			</tr>
			<tr>
					<td>2</td>
					<td>d1（Liquid AI）</td>
					<td>73.0</td>
					<td>74.4</td>
					<td>$0.017</td>
					<td>0.27 s</td>
			</tr>
			<tr>
					<td>3</td>
					<td>Mercury Decide（Inception）</td>
					<td>72.4</td>
					<td>73.6</td>
					<td>约 $0.018</td>
					<td>0.33 s</td>
			</tr>
			<tr>
					<td>4</td>
					<td><strong>Jev 1.13.0</strong></td>
					<td><strong>71.5</strong></td>
					<td><strong>77.1</strong></td>
					<td>$0.032</td>
					<td>0.24 s</td>
			</tr>
			<tr>
					<td>5</td>
					<td>wity-1</td>
					<td>70.8</td>
					<td>79.1</td>
					<td>$0.024</td>
					<td>1.57 s</td>
			</tr>
			<tr>
					<td>6</td>
					<td><strong>Microsoft-Decision-1</strong></td>
					<td><strong>69.1</strong></td>
					<td><strong>70.8</strong></td>
					<td>$0.019</td>
					<td>0.46 s</td>
			</tr>
			<tr>
					<td>8</td>
					<td>OpenAI Decisions（gpt-6-luna）</td>
					<td>62.5</td>
					<td>73.5</td>
					<td>$0.052</td>
					<td>0.30 s</td>
			</tr>
	</tbody>
</table>
<p>把 Jev 和 Microsoft-Decision-1 单独拿出来比较：</p>
<table>
	<thead>
			<tr>
					<th>维度</th>
					<th>Jev 1.13.0</th>
					<th>Microsoft-Decision-1</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>智能分</td>
					<td><strong>63.6</strong></td>
					<td>57.2</td>
			</tr>
			<tr>
					<td>校准分</td>
					<td><strong>90.6</strong></td>
					<td>84.4</td>
			</tr>
			<tr>
					<td>每千次决策成本</td>
					<td>$0.032</td>
					<td><strong>$0.019</strong></td>
			</tr>
			<tr>
					<td>中位延迟</td>
					<td><strong>0.24 s</strong></td>
					<td>0.46 s</td>
			</tr>
	</tbody>
</table>
<p>JevBench 的智能分是扣除随机猜测之后的得分（0 表示和随机猜测相当，100 表示全部答对），能力分是智能分和校准分的平均值，综合分则把智能、校准、速度和成本四个维度放在一起计算。它们和微软表格里的“平均准确率”不是同一个指标，不能直接换算。</p>
<h3 id="3-解读数据时必须注意的五点">3. 解读数据时必须注意的五点</h3>
<p><strong>第一，自测与第三方的结论并不一致。</strong> 在微软的 36 项基准上，Microsoft-Decision-1 的平均准确率比 Jev 高 1.2 个百分点；但在 JevBench 上，Jev 的智能分（63.6 对 57.2）和能力分（77.1 对 70.8）都明显领先。两边的题目、评分方法和统计口径完全不同，谁也不能代表“绝对真相”。比较稳妥的理解是：Microsoft-Decision-1 已经进入第一梯队，但还谈不上全面超越 Jev。这也再次说明，<strong>最可靠的基准永远是你自己的数据</strong>。</p>
<p><strong>第二，校准仍是 Jev 的强项。</strong> 即使在微软自己的数据里，Microsoft-Decision-1 的校准分（92.2）也落后于 Jev（93.7）和 Quyet-1.0-Large（93.1）；在 JevBench 上差距更大（84.4 对 90.6）。对于依赖置信度阈值做分流的系统来说，校准质量往往比准确率高出一两个点更重要。</p>
<p><strong>第三，延迟主要取决于部署位置。</strong> 微软的 85 ms 是在 Foundry 同区域测得的，而表中其他模型的延迟来自 JevBench 自己的测试环境。JevBench 原生调用 Microsoft-Decision-1 测得的中位延迟是 459 ms，在同一个榜单上，Jev 是 240 ms。两组数字都没有错，只是测量条件不同。决策模型的计算本身只需要几十毫秒，真正决定体验的是网络距离：把 Foundry 资源建在离应用最近的区域，对数据驻留有要求时选择 <code>DataZoneStandard</code>，并且一定要用真实流量实测。</p>
<p><strong>第四，同样的单价，不同的单次成本。</strong> 两者的标价都是每百万输入 token 0.042 美元，但 JevBench 在同一批题目上实测的每千次决策成本，Microsoft-Decision-1 约为 0.019 美元，Jev 约为 0.032 美元，前者便宜约 40%。差异来自两者对同样的输入计出的 token 数不同。调用量很大时，这个差距值得算进总成本。</p>
<p><strong>第五，Laya 不在同一条赛道上。</strong> 微软的对比中没有 Laya。JevBench 对 Laya 的三个检查点做了零样本测试，智能分只有 0.3～5.5，几乎等同于随机猜测。这和 Laya 作者自己的定位是一致的：它是一个需要在自有数据上微调的快速底座，而不是零样本决策引擎。再加上默认只有 512 / 1024 token 的上下文，Laya 在 JevBench 这种包含长文本、覆盖开放领域的考卷上吃亏是必然的。它的价值在于本地部署，以及特化之后的速度和成本，这一点在上一篇中已经详细讨论过。</p>
<p>此外，JevBench 中有 23 道约 7.7 万～8.1 万 token 的超长题。Microsoft-Decision-1 有 21 道因为超出上下文限制而失败，Jev 也拒绝了这 23 道超出其输入范围的题目，它们都按答错计分。</p>
<h3 id="4-小结">4. 小结</h3>
<p>比较公允的结论是：<strong>Microsoft-Decision-1 进入了决策模型的第一梯队，优势在于同区域延迟、单次成本和微软生态；Jev 在校准和长上下文上仍然领先；Laya 则是另一条赛道上的选手，适合有数据、需要本地化的团队。</strong></p>
<h2 id="microsoft-decision-1-的优势与劣势">Microsoft-Decision-1 的优势与劣势</h2>
<h3 id="优势">优势</h3>
<ol>
<li><strong>企业级集成</strong>：作为 Azure 直接销售的 Foundry 模型，它通过 Azure 订阅计费，受 Azure SLA 保障并由微软提供支持；支持 Entra ID 认证和 RBAC 权限控制，可以和现有的 Azure 网络、监控、合规体系一起管理。对已经在用 Azure 的企业来说，几乎不需要引入新的供应商。</li>
<li><strong>同区域延迟低</strong>：微软在同区域测得的 p50 约为 85 ms、p95 约为 125 ms，加上决策只需要一次前向计算，适合放进 Agent 的多步循环里。</li>
<li><strong>零样本能力进入第一梯队</strong>：不需要任何训练数据就能使用；在微软的 36 项基准上平均准确率最高，在 JevBench 的 27 个 API 产品中综合排名第 6。</li>
<li><strong>鲁棒性好</strong>：对同一请求做 8 种等价扰动，平均翻转率只有 1.3%，选项改写或重排时不翻转。在提示词和选项不断演进的生产环境中，这一点很重要。</li>
<li><strong>单次成本更低</strong>：标价与 Jev 相同，按 JevBench 的实测，每千次决策的成本还要低约 40%。</li>
<li><strong>接口兼容，迁移成本低</strong>：请求格式与 Jev 的 System One 风格接口几乎一致，已有的问题设计和分流逻辑可以直接复用（阈值需要重新标定）。</li>
<li><strong>有具体的落地参考</strong>：Xbox、Copilot、事故响应、Microsoft Discovery 等内部试点给出了可以借鉴的用法，虽然这些同样是自测数据。</li>
</ol>
<h3 id="劣势">劣势</h3>
<ol>
<li><strong>以自测数据为主，第三方结果不如官方亮眼</strong>：在 JevBench 上，它的智能分和校准分都低于 Jev，在 API 榜单上综合排名第 6。</li>
<li><strong>校准不是最强</strong>：无论官方数据还是第三方数据，它的校准都落后于 Jev，上线前一定要用自己的数据标定阈值。</li>
<li><strong>上下文只有 32K</strong>：比 Jev 的 64K 短，长邮件串、长合同或 Agent 的长执行轨迹需要先截断、摘要或分块。</li>
<li><strong>权重不开放，也不能微调</strong>：虽然底座是开源的 Qwen3.5-9B，但模型本身只能以托管 API 的形式使用，无法本地或离线部署；目前文档只介绍了通过 state、instructions 和选项来调优，没有提供基于自有数据的微调。</li>
<li><strong>版本和底座都可能变化</strong>：目前只有版本 <code>1</code>，而微软已经表示会把它迁移到 MAI 或 OpenAI 的底座上。底座一换，概率分布很可能随之变化，调好的阈值需要重新标定。</li>
<li><strong>没有解释，且对措辞敏感</strong>：模型只返回数字，不给理由。官方文档也提醒：问题和选项的措辞、顺序会影响分数；校准在熟悉的任务类型上最可靠；模型的知识可能已经过时；作为安全过滤器时，它可能漏掉隐蔽的有害内容，也可能误拦正常内容。</li>
<li><strong>跨境与数据驻留</strong>：中国大陆的团队目前需要通过 Azure 全球版的 Foundry 调用它，要同时考虑跨境网络延迟和数据出境的合规要求；<code>GlobalStandard</code> 部署可能在任意区域处理推理请求，对数据驻留敏感的场景应选择 <code>DataZoneStandard</code>。</li>
</ol>
<h2 id="与-jevlaya-相比怎么选">与 Jev、Laya 相比，怎么选</h2>
<h3 id="1-场景对照表">1. 场景对照表</h3>
<table>
	<thead>
			<tr>
					<th>场景</th>
					<th>推荐</th>
					<th>理由</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>已经在用 Azure，需要统一计费、Entra ID 认证和企业合规</td>
					<td>Microsoft-Decision-1</td>
					<td>不引入新的供应商，和现有的 Azure 资源统一管理</td>
			</tr>
			<tr>
					<td>Agent 的多步控制（继续、重试、交接）、AI 评审、电脑操作中的下一步选择</td>
					<td>Microsoft-Decision-1</td>
					<td>同区域延迟低，官方明确支持评分细则类的问题</td>
			</tr>
			<tr>
					<td>云端的海量分类和打标，追求单次成本</td>
					<td>Microsoft-Decision-1</td>
					<td>单价相同，实测单次成本更低</td>
			</tr>
			<tr>
					<td>对置信度校准要求最高的阈值分流</td>
					<td>Jev</td>
					<td>官方和第三方数据中，校准都领先</td>
			</tr>
			<tr>
					<td>长文本判断（32K～64K token）</td>
					<td>Jev</td>
					<td>64K 上下文</td>
			</tr>
			<tr>
					<td>细粒度、选项很多的分类（几十到上百个选项）</td>
					<td>Jev</td>
					<td>最多支持 255 个选项，在 Banking77 这类细粒度意图分类上表现好</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（微调后）</td>
					<td>特化之后更快、更准、更便宜</td>
			</tr>
			<tr>
					<td>中文等非英语场景</td>
					<td>三者都需要自测</td>
					<td>Jev 以英语为主；Laya 要使用多语言检查点；Microsoft-Decision-1 没有公布支持语言的细节</td>
			</tr>
	</tbody>
</table>
<h3 id="2-选型时要回答的几个问题">2. 选型时要回答的几个问题</h3>
<p>可以按下面的顺序依次回答：</p>
<pre tabindex="0"><code>1. 数据能否离开自己的环境（以及境内）？
   └─ 不能 → Laya（硬约束，其他因素都要让路）
2. 是否已经在用 Azure，需要统一账单、Entra ID、RBAC 和数据区域部署？
   └─ 是 → 优先评估 Microsoft-Decision-1
3. 是否高度依赖置信度阈值，或者单次输入经常超过 32K token？
   └─ 是 → 优先评估 Jev
4. 是否有标注数据，并且需要每秒几十次以上的决策？
   └─ 是 → 微调 Laya，本地部署
5. 以上都不是硬约束？
   └─ 用同一组题目同时测试 Microsoft-Decision-1 和 Jev，
      按准确率、校准、延迟和单次成本综合选择
</code></pre><h3 id="3-组合使用不必三选一">3. 组合使用：不必三选一</h3>
<p>由于三者的接口几乎一致，组合使用的成本很低：</p>
<ol>
<li><strong>多供应商容灾</strong>：把 Microsoft-Decision-1 和 Jev 配置成互为备份的两个云端后端，一方限流或故障时自动切换。两者的概率分布不同，阈值需要分别标定。</li>
<li><strong>影子测试</strong>：生产流量走一个后端，同时把请求异步发给另一个后端，积累两者结论不一致的样本，再交给人工或大模型裁决，为后续的选型和阈值调整提供依据。</li>
<li><strong>分层级联</strong>：本地的 Laya 先处理高频、短文本、高置信度的请求；低置信度或长文本请求升级给 Microsoft-Decision-1 或 Jev；仍然拿不准的，再交给推理型大模型或人工处理。</li>
<li><strong>按数据敏感度路由</strong>：涉及敏感数据的请求只走本地的 Laya，其余请求走云端。</li>
</ol>
<h2 id="代码示例同一组问题三种后端">代码示例：同一组问题，三种后端</h2>
<h3 id="1-部署-microsoft-decision-1">1. 部署 Microsoft-Decision-1</h3>
<p>可以在 Foundry 门户的模型目录中搜索 Microsoft-Decision-1 并一键部署，也可以使用 Azure CLI：</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>az cognitiveservices account deployment create <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --name &lt;ACCOUNT_NAME&gt; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --resource-group &lt;RESOURCE_GROUP&gt; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --deployment-name decision-1 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --model-name <span style="color:#e6db74">&#34;Microsoft-Decision-1&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --model-format Microsoft <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --model-version <span style="color:#e6db74">&#34;1&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --sku-name GlobalStandard <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --sku-capacity <span style="color:#ae81ff">1</span>
</span></span></code></pre></div><p>如果需要把推理限制在某个数据区域内，可以把 <code>--sku-name</code> 换成 <code>DataZoneStandard</code>（需要所在区域支持）。</p>
<h3 id="2-启动本地的-laya-服务">2. 启动本地的 Laya 服务</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-bash" data-lang="bash"><span style="display:flex;"><span>pip install <span style="color:#e6db74">&#34;laya[serve]&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 只监听本机；如需对外提供服务，请设置 LAYA_API_KEY 并放在网关后面</span>
</span></span><span style="display:flex;"><span>LAYA_HOST<span style="color:#f92672">=</span>127.0.0.1 LAYA_DEVICE<span style="color:#f92672">=</span>cuda LAYA_PRELOAD<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span> laya-serve
</span></span></code></pre></div><h3 id="3-用同一组问题调用三个后端">3. 用同一组问题调用三个后端</h3>
<p>下面的示例使用 <code>requests</code> 和 <code>azure-identity</code>（<code>pip install requests azure-identity</code>）。注意 <code>team</code> 问题里加了一个 <code>cannot_tell</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><span style="color:#f92672">import</span> os
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> requests
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> azure.identity <span style="color:#f92672">import</span> DefaultAzureCredential
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>payload <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;state&#34;</span>: {
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;message&#34;</span>: <span style="color:#e6db74">&#34;Checkout is down again. This is my third request.&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;customer_contact_count&#34;</span>: <span style="color:#ae81ff">3</span>,
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;questions&#34;</span>: {
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;team&#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;Charges, invoices, and refunds&#34;</span>,
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#34;engineering&#34;</span>: <span style="color:#e6db74">&#34;Bugs, errors, and outages&#34;</span>,
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#34;support&#34;</span>: <span style="color:#e6db74">&#34;How-to and account questions&#34;</span>,
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#34;cannot_tell&#34;</span>: <span style="color:#e6db74">&#34;The message does not say enough to decide&#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;severity&#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 severe is this issue?&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;criteria&#34;</span>: [<span style="color:#e6db74">&#34;Cosmetic&#34;</span>, <span style="color:#e6db74">&#34;Minor&#34;</span>, <span style="color:#e6db74">&#34;Major&#34;</span>, <span style="color:#e6db74">&#34;Critical&#34;</span>],
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;repeat_contact&#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;Has the customer contacted support before?&#34;</span>,
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><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:#66d9ef">def</span> <span style="color:#a6e22e">decide</span>(url: str, headers: dict, model: str <span style="color:#f92672">|</span> <span style="color:#66d9ef">None</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">None</span>) <span style="color:#f92672">-&gt;</span> dict:
</span></span><span style="display:flex;"><span>    body <span style="color:#f92672">=</span> {<span style="color:#f92672">**</span>payload, <span style="color:#e6db74">&#34;model&#34;</span>: model} <span style="color:#66d9ef">if</span> model <span style="color:#66d9ef">else</span> payload
</span></span><span style="display:flex;"><span>    resp <span style="color:#f92672">=</span> requests<span style="color:#f92672">.</span>post(url, headers<span style="color:#f92672">=</span>headers, json<span style="color:#f92672">=</span>body, timeout<span style="color:#f92672">=</span><span style="color:#ae81ff">10</span>)
</span></span><span style="display:flex;"><span>    resp<span style="color:#f92672">.</span>raise_for_status()
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> resp<span style="color:#f92672">.</span>json()[<span style="color:#e6db74">&#34;answers&#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:#75715e"># 1) Microsoft-Decision-1（Foundry）：model 填部署名称，推荐使用 Entra ID 认证</span>
</span></span><span style="display:flex;"><span>token <span style="color:#f92672">=</span> DefaultAzureCredential()<span style="color:#f92672">.</span>get_token(<span style="color:#e6db74">&#34;https://cognitiveservices.azure.com/.default&#34;</span>)<span style="color:#f92672">.</span>token
</span></span><span style="display:flex;"><span>answers <span style="color:#f92672">=</span> decide(
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>os<span style="color:#f92672">.</span>environ[<span style="color:#e6db74">&#39;AZURE_ENDPOINT&#39;</span>]<span style="color:#f92672">.</span>rstrip(<span style="color:#e6db74">&#39;/&#39;</span>)<span style="color:#e6db74">}</span><span style="color:#e6db74">/providers/microsoft/v1/systemone&#34;</span>,
</span></span><span style="display:flex;"><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>token<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>},
</span></span><span style="display:flex;"><span>    os<span style="color:#f92672">.</span>environ[<span style="color:#e6db74">&#34;DEPLOYMENT_NAME&#34;</span>],
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;decision-1:&#34;</span>, answers[<span style="color:#e6db74">&#34;team&#34;</span>][<span style="color:#e6db74">&#34;choice&#34;</span>])
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 2) Jev（TypeSafe）：固定版本号，避免别名升级后调好的阈值失效</span>
</span></span><span style="display:flex;"><span>answers <span style="color:#f92672">=</span> decide(
</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>    {<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>    <span style="color:#e6db74">&#34;jev-1.13.0&#34;</span>,
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;jev:&#34;</span>, answers[<span style="color:#e6db74">&#34;team&#34;</span>][<span style="color:#e6db74">&#34;choice&#34;</span>])
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 3) Laya（本地 laya-serve）：省略 model，由 Router 按语言自动选择检查点</span>
</span></span><span style="display:flex;"><span>answers <span style="color:#f92672">=</span> decide(<span style="color:#e6db74">&#34;http://127.0.0.1:8000/v1/systemone&#34;</span>, {})
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;laya:&#34;</span>, answers[<span style="color:#e6db74">&#34;team&#34;</span>][<span style="color:#e6db74">&#34;choice&#34;</span>])
</span></span></code></pre></div><p>如果使用 API Key 调用 Microsoft-Decision-1，把请求头换成 <code>{&quot;api-key&quot;: os.environ[&quot;AZURE_API_KEY&quot;]}</code> 即可。</p>
<p>三个后端返回的 <code>answers</code> 都以问题名为键，但有几个细节需要留意：</p>
<ul>
<li>Jev 和 Laya 的 <code>choice</code> 结果都包含 <code>choice</code>、<code>probabilities</code> 和 <code>confidence</code>，不过 Laya 的 <code>confidence</code> 计算方式和 Jev 不同，所以它额外提供了一个按 Jev 公式计算的 <code>x_jev_confidence</code>，方便沿用 Jev 上调好的阈值；</li>
<li>Microsoft-Decision-1 的文档说明会返回选中项和每个选项的概率，接入时建议先打印一次完整的响应，确认字段名之后再编写阈值逻辑；</li>
<li>Microsoft-Decision-1 的 <code>score</code> 返回的是各等级下标的概率加权平均值（四级量表的取值范围是 0～3，可能落在两个等级之间），文档建议把它用于相对排序和阈值判断，而不是当作绝对的校准评分。</li>
</ul>
<h2 id="落地注意事项">落地注意事项</h2>
<p>Microsoft-Decision-1 的官方文档给出了不少实用的建议，它们同样适用于 Jev 和 Laya：</p>
<ol>
<li><strong>先用代表性数据验证</strong>：用自己的标注样本测试准确率和延迟，再决定是否上线。</li>
<li><strong>按误判代价设置阈值</strong>：根据误报和漏报的代价分别设置置信度阈值；不应该强行选择时，加一个“无法判断”的选项。</li>
<li><strong>使用中性措辞，随机化选项顺序</strong>：测试改变选项顺序是否会影响结果。</li>
<li><strong>用 Coding Agent 迭代问题设计</strong>：让 Coding Agent 生成多组候选的 state、instructions 和选项，在标注集上评估、对比，人工审核之后再上线。</li>
<li><strong>涉及个人的重大决策必须有人参与</strong>：在信贷、招聘、住房、医疗、法律等场景中，只能把模型作为决策辅助，并告知受影响的用户有 AI 参与了决策；不要使用不必要的敏感属性，并持续监控不同群体之间的结果差异。</li>
<li><strong>阈值不能跨后端照搬</strong>：三个模型的概率分布不同，置信度的计算方式也可能不同，切换或混用后端时要分别标定。</li>
<li><strong>固定版本，持续监控</strong>：固定部署的模型版本，升级（包括底座迁移）之后重新标定阈值，并持续监控概率分布和校准漂移。</li>
</ol>
<h2 id="总结">总结</h2>
<p>用一句话概括三者：</p>

<blockquote>
  <p><strong>Microsoft-Decision-1 是“Azure 里的企业级决策组件”，Jev 是“开箱即用的云端通才”，Laya 是“可以特化的本地专才”。</strong></p>

</blockquote>
<p><img alt="三者的不同定位" loading="lazy" src="/zh/blog/2026/microsoft-decision-1/6-three-positions.png"></p>
<ul>
<li>如果你已经在用 Azure，需要统一的计费、身份认证和合规体系，或者想给 Agent 加一道低延迟的“决策闸门”，Microsoft-Decision-1 是最省事的选择；</li>
<li>如果你最看重置信度校准和长上下文，Jev 目前仍然更稳；</li>
<li>如果数据不能离开本地，或者需要毫秒级、海量的决策，并且有能力准备标注数据，Laya 依然不可替代。</li>
</ul>
<p>从更大的视角看，Microsoft-Decision-1 的意义不只是“又多了一个决策模型”。微软带着开源底座、与 Jev 相同的价格和几乎一致的接口入局，说明了两件事：一是 <code>state + questions</code> 风格的决策接口正在成为事实标准，用户的迁移成本越来越低；二是底座正在变成可替换的零件，竞争的焦点转向了后训练数据、评测体系、校准质量和分发渠道。对开发者来说这是好消息：<strong>把决策从大模型里拆出来，已经从创业公司和开源社区的尝试，变成了大厂也认可的工程实践。</strong></p>
<h2 id="参考资料">参考资料</h2>
<ul>
<li><a href="https://commandline.microsoft.com/microsoft-decision-1-model-foundry/">Microsoft Command Line：Introducing Microsoft-Decision-1, our model for fast decision-making</a></li>
<li><a href="https://learn.microsoft.com/en-us/azure/foundry/foundry-models/how-to/use-foundry-models-microsoft-decision">Microsoft Learn：Deploy and use Microsoft-Decision-1 in Microsoft Foundry</a></li>
<li><a href="https://learn.microsoft.com/en-us/azure/foundry/foundry-models/concepts/models-sold-directly-by-azure">Microsoft Learn：Foundry Models sold by Azure</a></li>
<li><a href="https://ai.azure.com/catalog/models/Microsoft-Decision-1">Microsoft Foundry 模型目录：Microsoft-Decision-1</a></li>
<li><a href="https://benchmarkheaven.com/jev-models/api">JevBench：Hosted decision API benchmark</a></li>
<li><a href="https://benchmarkheaven.com/jev-models">JevBench：Open-weights decision model leaderboard</a></li>
<li><a href="https://docs.typesafe.ai/models">TypeSafe 文档：Models</a></li>
<li><a href="https://github.com/NandhaKishorM/laya">Laya GitHub 仓库</a></li>
<li><a href="/zh/blog/2026/jev-vs-laya/">Jev vs Laya：闭源与开源 System One 决策模型的对比与选型</a></li>
</ul>
]]></content:encoded></item><item><title>用 Microsoft Web IQ 增强 OpenWebUI：零代码实现联网搜索与链接自动读取</title><link>https://wilsonwu.me/zh/blog/2026/microsoft-web-iq-in-openwebui/</link><pubDate>Mon, 28 Sep 2026 00:00:00 -0400</pubDate><guid>https://wilsonwu.me/zh/blog/2026/microsoft-web-iq-in-openwebui/</guid><description>&lt;p&gt;&lt;img alt="OpenWebUI 接入 Microsoft Web IQ" loading="lazy" src="https://wilsonwu.me/zh/blog/2026/microsoft-web-iq-in-openwebui/1-openwebui-web-iq.png"&gt;&lt;/p&gt;
&lt;p&gt;在&lt;a href="https://wilsonwu.me/zh/blog/2026/migrate-openwebui-to-azure-pg/"&gt;上一篇文章&lt;/a&gt;中，我把 OpenWebUI 的数据库迁移到了 Azure 托管 PostgreSQL。在日常使用 OpenWebUI 的过程中，我经常遇到两个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;问不到最新的信息&lt;/strong&gt;：模型有知识截止时间，问到最近的版本发布、新闻或价格，要么答不上来，要么答错。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;贴进去的链接不会被打开&lt;/strong&gt;：把文章、文档或 GitHub 页面的 URL 贴进对话框，想让模型总结、翻译或对比，模型却不会去读这个链接，有时甚至会根据 URL 猜出一段“看起来很像”的内容。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这两个问题都可以靠 OpenWebUI 的联网能力解决。本文使用微软新推出的 &lt;strong&gt;Microsoft Web IQ&lt;/strong&gt; 作为联网搜索引擎，并让模型自动识别消息中的 URL、读取网页后再回答。整个过程只需要在 Azure 门户中创建一个 Web IQ 资源，再到 OpenWebUI 的管理界面中完成配置，&lt;strong&gt;不需要写代码，也不需要部署额外的服务&lt;/strong&gt;。&lt;/p&gt;</description><content:encoded><![CDATA[<p><img alt="OpenWebUI 接入 Microsoft Web IQ" loading="lazy" src="/zh/blog/2026/microsoft-web-iq-in-openwebui/1-openwebui-web-iq.png"></p>
<p>在<a href="/zh/blog/2026/migrate-openwebui-to-azure-pg/">上一篇文章</a>中，我把 OpenWebUI 的数据库迁移到了 Azure 托管 PostgreSQL。在日常使用 OpenWebUI 的过程中，我经常遇到两个问题：</p>
<ol>
<li><strong>问不到最新的信息</strong>：模型有知识截止时间，问到最近的版本发布、新闻或价格，要么答不上来，要么答错。</li>
<li><strong>贴进去的链接不会被打开</strong>：把文章、文档或 GitHub 页面的 URL 贴进对话框，想让模型总结、翻译或对比，模型却不会去读这个链接，有时甚至会根据 URL 猜出一段“看起来很像”的内容。</li>
</ol>
<p>这两个问题都可以靠 OpenWebUI 的联网能力解决。本文使用微软新推出的 <strong>Microsoft Web IQ</strong> 作为联网搜索引擎，并让模型自动识别消息中的 URL、读取网页后再回答。整个过程只需要在 Azure 门户中创建一个 Web IQ 资源，再到 OpenWebUI 的管理界面中完成配置，<strong>不需要写代码，也不需要部署额外的服务</strong>。</p>

<blockquote>
  <p>本文基于 Open WebUI v0.11.4（2026 年 9 月发布），界面名称以英文界面为准。文中的 API Key 均为占位符。</p>

</blockquote>
<h2 id="最终效果">最终效果</h2>
<p>配置完成后：</p>
<ul>
<li>提问涉及最新信息时，模型会自己调用 <code>search_web</code>，由 Web IQ 返回搜索结果，回答附带参考链接；</li>
<li>消息中出现 <code>http://</code> 或 <code>https://</code> 链接时，模型会自己调用 <code>fetch_url</code>，通过 Web IQ 读取页面正文后再回答，读取过的页面会出现在引用来源中；</li>
<li>两者可以在同一次回答中组合使用，例如先读取你给出的文档，再搜索最新的变更说明做对比。</li>
</ul>
<h2 id="为什么选择-microsoft-web-iq">为什么选择 Microsoft Web IQ</h2>
<p><img alt="Bing Search v7、Grounding with Bing Search 与 Web IQ 的接入方式对比" loading="lazy" src="/zh/blog/2026/microsoft-web-iq-in-openwebui/2-bing-vs-web-iq.png"></p>
<p>打开 OpenWebUI 的 <strong>Settings → Admin → Web Search</strong>，在 <strong>Web Search Engine</strong> 中可以找到 <code>bing</code>。选中后需要填写 <strong>Bing Search V7 Endpoint</strong> 和 <strong>Bing Search V7 Subscription Key</strong>，看起来只要填上 Azure 上 Bing 资源的密钥就能用，但这条路已经走不通了：</p>
<ul>
<li>Bing Search v7 API（包括 Bing Custom Search）已于 <strong>2025 年 8 月 11 日退役</strong>，已有实例全部下线，也无法再创建新资源；</li>
<li>现在 Azure 上能创建的 Bing 资源是 <strong>Grounding with Bing Search</strong>，它只能作为 Microsoft Foundry 智能体的工具使用，不能拿密钥直接调用搜索接口。想接入 OpenWebUI，就得自己开发一个桥接服务。</li>
</ul>
<p><strong>Microsoft Web IQ</strong> 是微软在 2026 年 6 月发布的一组面向 AI 应用的 API，用来为模型提供实时的网络信息（grounding），可以理解为“给 AI 智能体用的搜索引擎”：</p>
<ul>
<li>基于 Bing 的全球索引构建，并针对智能体的多轮检索重新设计；</li>
<li>返回的不只是链接列表，而是带来源的相关段落，可以直接放进模型上下文，用更少的 token 得到更好的回答；</li>
<li>覆盖网页、新闻、图片、视频等内容，支持 100 多种语言和市场。</li>
</ul>
<p>更重要的是，OpenWebUI 已经内置了 <code>microsoft_web_iq</code> 引擎。它既可以作为<strong>搜索引擎</strong>，也可以作为读取网页的<strong>网页加载引擎</strong>，只需要一个 API Key。</p>
<table>
	<thead>
			<tr>
					<th>方案</th>
					<th>在 OpenWebUI 中接入</th>
					<th>现状</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Bing Search v7</td>
					<td>内置 <code>bing</code> 引擎</td>
					<td>已退役，不可用</td>
			</tr>
			<tr>
					<td>Grounding with Bing Search</td>
					<td>自己开发桥接服务，通过 Foundry 调用</td>
					<td>主要面向 Foundry 智能体</td>
			</tr>
			<tr>
					<td>Microsoft Web IQ</td>
					<td>内置 <code>microsoft_web_iq</code> 引擎，填写 API Key 即可</td>
					<td>2026 年 6 月发布，目前为有限访问</td>
			</tr>
	</tbody>
</table>
<h2 id="工作原理">工作原理</h2>
<p><img alt="OpenWebUI 通过 Web IQ 搜索和读取网页" loading="lazy" src="/zh/blog/2026/microsoft-web-iq-in-openwebui/3-how-it-works.png"></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-text" data-lang="text"><span style="display:flex;"><span>用户消息
</span></span><span style="display:flex;"><span>  │
</span></span><span style="display:flex;"><span>  ▼
</span></span><span style="display:flex;"><span>OpenWebUI（模型以原生工具调用方式工作）
</span></span><span style="display:flex;"><span>  │
</span></span><span style="display:flex;"><span>  ├── search_web：联网搜索
</span></span><span style="display:flex;"><span>  │     └── Web IQ /search/web：返回标题、链接和相关段落
</span></span><span style="display:flex;"><span>  │
</span></span><span style="display:flex;"><span>  └── fetch_url：读取消息中的链接
</span></span><span style="display:flex;"><span>        └── Web IQ /browse：读取网页，返回 Markdown 格式的正文
</span></span></code></pre></div><p>几点说明：</p>
<ul>
<li><code>search_web</code> 和 <code>fetch_url</code> 是 OpenWebUI 的两个内置工具，同属 Web Search 类别，由模型自己决定何时调用；</li>
<li>这两个工具依赖原生工具调用（Native Function Calling），这是 v0.10.0 起的默认模式；</li>
<li>网页加载引擎也设为 Web IQ 之后，网页由 Web IQ 读取，需要 JavaScript 渲染的页面也能读到内容。PDF 等文件仍然由 OpenWebUI 下载后自行解析。</li>
</ul>
<h2 id="第一步创建-web-iq-资源并获取-api-key">第一步：创建 Web IQ 资源并获取 API Key</h2>
<p>Web IQ 以 Azure 资源的形式提供。在 Azure 门户中搜索 <strong>Microsoft Web IQ</strong>，进入 <strong>Microsoft Web IQ resources</strong>，点击 <strong>Create</strong>，在 <strong>Basics</strong> 页填写：</p>
<ul>
<li><strong>Subscription</strong> 和 <strong>Resource group</strong>：选择用于管理和计费的订阅与资源组；</li>
<li><strong>Name</strong>：资源名称；</li>
<li><strong>Region</strong>：固定为 <strong>Global</strong>，这是一个可以跨 Azure 区域使用的全局资源。</li>
</ul>
<p><img alt="在 Azure 门户中创建 Microsoft Web IQ 资源" loading="lazy" src="/zh/blog/2026/microsoft-web-iq-in-openwebui/4-create-web-iq-resource.png"></p>
<p>点击 <strong>Review + create</strong> 完成创建，然后在资源页面中复制 API Key，下一步会用到。</p>
<p>Web IQ 目前仍处于<strong>有限访问</strong>（limited access）阶段。如果在 Azure 门户中找不到或者无法创建这个资源，可以先到 <a href="https://www.microsoft.com/en-us/WebIQ">Microsoft Web IQ 官网</a> 点击 <strong>Join the waitlist</strong> 申请。</p>
<h2 id="第二步配置-web-iq-搜索和网页读取">第二步：配置 Web IQ 搜索和网页读取</h2>
<p>以管理员身份登录 OpenWebUI，点击左下角的头像，进入 <strong>Settings → Admin → Web Search</strong>。</p>
<h3 id="1-search-部分">1. Search 部分</h3>
<table>
	<thead>
			<tr>
					<th>设置项</th>
					<th>值</th>
					<th>说明</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Web Search</td>
					<td>开启</td>
					<td>全局开关</td>
			</tr>
			<tr>
					<td>Web Search Engine</td>
					<td><code>microsoft_web_iq</code></td>
					<td>选中后会出现下面三项</td>
			</tr>
			<tr>
					<td>Microsoft Web IQ API Base URL</td>
					<td><code>https://api.microsoft.ai/v3</code></td>
					<td>保持默认值</td>
			</tr>
			<tr>
					<td>Microsoft Web IQ API Key</td>
					<td><code>&lt;WEB_IQ_API_KEY&gt;</code></td>
					<td>第一步获取的 API Key</td>
			</tr>
			<tr>
					<td>Language</td>
					<td><code>en</code></td>
					<td>搜索结果的语言代码，默认为 <code>en</code></td>
			</tr>
			<tr>
					<td>Search Result Count</td>
					<td><code>5</code></td>
					<td>每次搜索返回的结果数量</td>
			</tr>
			<tr>
					<td>Fetch URL Content Length Limit</td>
					<td><code>50000</code></td>
					<td><code>fetch_url</code> 最多返回的字符数，留空表示不限制</td>
			</tr>
	</tbody>
</table>
<p>几点说明：</p>
<ul>
<li><strong>Microsoft Web IQ API Base URL</strong>：OpenWebUI 已经预先填好，一般不需要修改；如果 Web IQ 资源页面显示了其他终结点，以资源页面为准；</li>
<li><strong>Language</strong>：技术类内容用 <code>en</code> 通常效果更好；如果主要查询中文资讯，可以改为 <code>zh</code>（以 Web IQ 支持的语言代码为准）；</li>
<li><strong>Fetch URL Content Length Limit</strong>：默认不截断，遇到很长的页面会占用大量上下文，建议设置上限；</li>
<li><strong>Web Search Confirmation</strong>：可选。开启后，用户在对话中使用联网搜索前会先看到确认提示，例如默认的 “Your query will be sent to the configured web search provider.”，提醒用户查询内容会发送到外部服务。</li>
</ul>
<h3 id="2-loader-部分">2. Loader 部分</h3>
<table>
	<thead>
			<tr>
					<th>设置项</th>
					<th>值</th>
					<th>说明</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Web Loader Engine</td>
					<td><code>microsoft_web_iq</code></td>
					<td>读取网页也交给 Web IQ，与搜索共用上面的 API Key</td>
			</tr>
	</tbody>
</table>
<p>点击 <strong>Save</strong> 保存，配置立即生效，不需要重启容器。</p>
<p>Web Loader Engine 也可以保持 <strong>Default</strong>，由 OpenWebUI 服务器自己抓取网页。但默认加载器读不到需要 JavaScript 渲染的内容，它的 User-Agent 也容易被部分网站拦截，交给 Web IQ 读取会省心很多。</p>
<h2 id="第三步让模型自动识别并读取消息中的-url">第三步：让模型自动识别并读取消息中的 URL</h2>
<p><img alt="没有 fetch_url 时模型只能猜，有 fetch_url 时先读后答" loading="lazy" src="/zh/blog/2026/microsoft-web-iq-in-openwebui/5-read-before-answer.png"></p>
<h3 id="1-模型设置">1. 模型设置</h3>
<p>进入 <strong>Settings → Admin → Models</strong>，编辑对话使用的模型：</p>
<table>
	<thead>
			<tr>
					<th>位置</th>
					<th>设置</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Capabilities</td>
					<td>勾选 <strong>Web Search</strong>、<strong>Builtin Tools</strong>、<strong>Citations</strong>、<strong>Status Updates</strong></td>
			</tr>
			<tr>
					<td>Builtin Tools</td>
					<td>确认 <strong>Web Search</strong>（Search the web and fetch URLs）已勾选</td>
			</tr>
			<tr>
					<td>Default Features</td>
					<td>勾选 <strong>Web Search</strong>，新对话默认打开联网开关</td>
			</tr>
			<tr>
					<td>Advanced Params</td>
					<td><strong>Function Calling</strong> 设为 <strong>Native</strong>（默认值）</td>
			</tr>
	</tbody>
</table>
<p>其中 <strong>Default Features</strong> 很关键：原生模式下，只有模型启用了 Web Search 能力，并且当前对话打开了联网开关，<code>search_web</code> 和 <code>fetch_url</code> 才会提供给模型。不勾选的话，用户每次都要在输入框的 <strong>+</strong> 菜单中手动打开联网搜索，否则贴进来的链接不会被读取。</p>
<p>原生模式要求模型具备可靠的工具调用能力，建议使用较新的模型，太小或太旧的模型可能不会正确调用工具。</p>
<h3 id="2-系统提示词">2. 系统提示词</h3>
<p>是否调用 <code>fetch_url</code> 由模型自己决定。为了让行为更稳定，在同一个页面的 <strong>System Prompt</strong> 中加入以下规则：</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-text" data-lang="text"><span style="display:flex;"><span>你可以使用 search_web 和 fetch_url 两个工具：
</span></span><span style="display:flex;"><span>1. 用户消息中出现以 http:// 或 https:// 开头的链接时，先调用 fetch_url 读取链接内容，再根据读取结果回答；有多个链接时逐个读取。
</span></span><span style="display:flex;"><span>2. 问题涉及最新动态、版本、价格等时效性信息，或者你不确定答案时，调用 search_web 搜索；搜索结果中的摘要不够时，再用 fetch_url 打开最相关的结果。
</span></span><span style="display:flex;"><span>3. 链接无法访问或内容为空时，如实告诉用户，不要根据链接地址推测页面内容。
</span></span><span style="display:flex;"><span>4. 在回答末尾列出参考链接。
</span></span></code></pre></div><p>第 3 条用来防止模型在读取失败后“编”一段内容；第 4 条则是因为原生模式下，<code>search_web</code> 的结果不会出现在引用来源中，只有 <code>fetch_url</code> 读取过的页面才会，所以需要模型在回答中写出来。</p>
<h3 id="3-手动附加网页">3. 手动附加网页</h3>
<p>如果希望某个链接一定被读取，也可以手动附加：</p>
<ul>
<li>在输入框中输入 <code>#</code> 后粘贴链接，然后选择该网页；</li>
<li>或者通过输入框的 <strong>+ → Attach Webpage</strong> 添加链接。</li>
</ul>
<p>这两种方式由 OpenWebUI 直接读取页面（同样使用上面配置的网页加载引擎），不依赖模型的判断。</p>
<h2 id="效果验证">效果验证</h2>
<h3 id="1-读取链接">1. 读取链接</h3>
<p>新建一个对话，输入：</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-text" data-lang="text"><span style="display:flex;"><span>帮我总结这篇文档的要点：https://docs.openwebui.com/features/chat-conversations/web-search/providers/microsoft-web-iq
</span></span></code></pre></div><p>预期：</p>
<ul>
<li>回答过程中显示模型调用了 <code>fetch_url</code>；</li>
<li>回答下方的引用来源中出现这篇文档；</li>
<li>回答内容与文档一致，而不是泛泛而谈。</li>
</ul>
<h3 id="2-联网搜索">2. 联网搜索</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-text" data-lang="text"><span style="display:flex;"><span>Open WebUI 最新发布的版本是多少？有哪些主要更新？
</span></span></code></pre></div><p>预期：</p>
<ul>
<li>模型调用 <code>search_web</code>，结果来自 Web IQ；</li>
<li>如果摘要不够，模型会继续调用 <code>fetch_url</code> 打开发布说明页面；</li>
<li>回答末尾列出参考链接。</li>
</ul>
<h3 id="3-组合使用">3. 组合使用</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-text" data-lang="text"><span style="display:flex;"><span>先读取 https://github.com/open-webui/open-webui/releases 的内容，再搜索一下社区对最新版本的反馈，最后给我一个是否升级的建议。
</span></span></code></pre></div><p>预期模型会先读取给出的链接，再根据需要多次搜索，最后综合两部分信息给出建议。</p>
<h3 id="4-排查问题">4. 排查问题</h3>
<p>如果没有达到预期效果，可以先查看 OpenWebUI 的日志：</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>docker logs --since 10m open-webui 2&gt;&amp;<span style="color:#ae81ff">1</span> |
</span></span><span style="display:flex;"><span>grep -Ei <span style="color:#e6db74">&#39;web iq|microsoft browse|fetch_url|blocked&#39;</span>
</span></span></code></pre></div><p>常见的日志：</p>
<ul>
<li><code>Error searching with Microsoft Web IQ API</code>：搜索请求失败，通常是 API Key 不正确或者尚未开通；</li>
<li><code>Error browsing ... with Microsoft Web IQ</code>：Web IQ 读取网页失败；</li>
<li><code>Blocked ...</code>：链接指向内网地址或者在过滤列表中，被 OpenWebUI 拦截。</li>
</ul>
<p>也可以直接用 curl 验证 API Key，下面的请求格式与 OpenWebUI 实际发送的一致：</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>curl -sS https://api.microsoft.ai/v3/search/web <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -H <span style="color:#e6db74">&#34;x-apikey: </span>$WEB_IQ_API_KEY<span style="color:#e6db74">&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -H <span style="color:#e6db74">&#34;Content-Type: application/json&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -d <span style="color:#e6db74">&#39;{&#34;query&#34;: &#34;Open WebUI&#34;, &#34;maxResults&#34;: 3, &#34;language&#34;: &#34;en&#34;, &#34;contentFormat&#34;: &#34;passage&#34;}&#39;</span>
</span></span></code></pre></div><p>正常情况下会返回包含 <code>webResults</code> 的 JSON，每条结果都有 <code>url</code>、<code>title</code> 和 <code>content</code>。</p>
<h2 id="注意事项">注意事项</h2>
<ul>
<li><strong>数据会发送到 Web IQ</strong>：搜索词和需要读取的链接会发送到 Web IQ API（<code>api.microsoft.ai</code>），数据如何处理以 Web IQ 的服务条款为准。敏感对话可以关闭联网开关，或者开启 Web Search Confirmation 提醒用户。</li>
<li><strong>请求中会附带用户信息</strong>：从 v0.11.4 的源码看，调用 Web IQ 搜索时，OpenWebUI 会在请求头中附带当前用户的名称、ID、邮箱和角色（<code>X-OpenWebUI-User-*</code>），目前无法通过配置关闭。如果组织对此有要求，上线前需要评估。</li>
<li><strong>内网链接无法读取</strong>：读取链接之前，OpenWebUI 会先校验 URL，默认禁止访问内网地址和云元数据地址。这些防护默认开启，无需额外配置，Web IQ 本身也访问不到内网页面。</li>
<li><strong>调用次数与成本</strong>：每次 <code>search_web</code> 和 <code>fetch_url</code> 都是一次 Web IQ 调用，原生模式下模型还可能为一个问题连续调用多次。建议 Search Result Count 保持在 3～5，只在需要联网的模型上把 Web Search 设为默认功能。Web IQ 的费用计入创建资源时选择的 Azure 订阅，可以为资源组设置预算告警。</li>
</ul>
<h2 id="常见问题">常见问题</h2>
<table>
	<thead>
			<tr>
					<th>现象</th>
					<th>可能原因</th>
					<th>处理方法</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>贴了链接，模型说无法访问网页</td>
					<td>对话没有打开联网开关，或者模型没有启用 Web Search 能力和内置工具</td>
					<td>检查模型的 Capabilities、Default Features 和对话中的联网开关</td>
			</tr>
			<tr>
					<td>模型根据 URL 编造内容</td>
					<td>没有调用 <code>fetch_url</code></td>
					<td>确认 Function Calling 为 Native，并加入系统提示词</td>
			</tr>
			<tr>
					<td>普通用户看不到联网开关</td>
					<td>用户组没有 Web Search 功能权限</td>
					<td>在用户组的功能权限中允许 Web Search</td>
			</tr>
			<tr>
					<td>搜索始终没有结果</td>
					<td>API Key 错误或者尚未开通</td>
					<td>查看日志，并用 curl 验证 API Key</td>
			</tr>
			<tr>
					<td>搜索结果的语言不符合预期</td>
					<td>Language 与查询的语言不一致</td>
					<td>修改 Language</td>
			</tr>
			<tr>
					<td>部分网页读取失败</td>
					<td>页面需要登录、禁止抓取，或者链接指向内网</td>
					<td>换一个可以公开访问的链接，或者直接把正文粘贴到对话中</td>
			</tr>
	</tbody>
</table>
<h2 id="总结">总结</h2>
<p>Bing Search API 退役之后，OpenWebUI 内置的 <code>bing</code> 引擎已经无法使用。借助 OpenWebUI 内置的 <code>microsoft_web_iq</code> 引擎，只需要在 Azure 上创建一个 Web IQ 资源并拿到 API Key，就可以在管理界面中完成联网搜索的接入：</p>
<ul>
<li>搜索和网页读取都交给 Web IQ，返回的是适合直接放进模型上下文的段落和正文；</li>
<li>在原生工具调用模式下，<code>search_web</code> 负责搜索，<code>fetch_url</code> 负责读取消息中的链接；</li>
<li>通过模型的 Default Features 和系统提示词，让模型自动识别 URL、先读后答，并在回答中给出参考链接。</li>
</ul>
<p>整个过程不需要写一行代码。无论是询问最新的信息，还是直接丢一个链接让模型总结，现在都可以在 OpenWebUI 中完成。</p>
<h2 id="参考资料">参考资料</h2>
<ul>
<li><a href="https://blogs.bing.com/search/2026/6/Announcing-Microsoft-Web-IQ/">Announcing Microsoft Web IQ</a></li>
<li><a href="https://www.microsoft.com/en-us/WebIQ">Microsoft Web IQ</a></li>
<li><a href="https://docs.openwebui.com/features/chat-conversations/web-search/providers/microsoft-web-iq">Open WebUI: Microsoft Web IQ</a></li>
<li><a href="https://docs.openwebui.com/features/chat-conversations/web-search/agentic-search">Open WebUI: Agentic Web Search &amp; URL Fetching</a></li>
<li><a href="https://docs.openwebui.com/features/chat-conversations/web-search/providers/bing">Open WebUI: Bing</a></li>
<li><a href="https://docs.openwebui.com/getting-started/advanced-topics/hardening">Open WebUI: Hardening</a></li>
</ul>
]]></content:encoded></item><item><title>Fara-7B：微软推出的高效电脑操作代理模型</title><link>https://wilsonwu.me/zh/blog/2025/microsoft-fara-7b/</link><pubDate>Fri, 28 Nov 2025 00:00:00 -0500</pubDate><guid>https://wilsonwu.me/zh/blog/2025/microsoft-fara-7b/</guid><description>介绍微软最新发布的 Fara-7B 模型，这是一个专为电脑操作设计的 7B 参数模型，以及如何通过 vLLM 进行部署和使用。</description><content:encoded><![CDATA[<p><img alt="Fara-7B" loading="lazy" src="/zh/blog/2025/microsoft-fara-7b/1-fara-7b.png"></p>
<p>微软研究院最近发布了 <strong>Fara-7B</strong>，这是一款专为电脑操作（Computer Use）设计的代理小语言模型（Agentic SLM）。与传统的聊天模型不同，Fara-7B 旨在通过像人类一样使用鼠标和键盘来完成任务。</p>
<h2 id="什么是-fara-7b">什么是 Fara-7B？</h2>
<p>Fara-7B 是一个拥有 70 亿参数的模型，基于 <a href="https://arxiv.org/abs/2502.13923">Qwen2.5-VL-7B</a> 构建。它的主要特点包括：</p>
<ul>
<li><strong>视觉感知</strong>：它通过视觉感知网页（截图）来操作，不需要依赖辅助功能树（Accessibility Trees）或额外的解析模型。</li>
<li><strong>高效紧凑</strong>：尽管只有 7B 参数，但在同类模型中实现了最先进的性能，甚至在某些基准测试中可以与更大的模型竞争。</li>
<li><strong>端侧运行</strong>：由于体积小，它可以在设备上本地运行，从而降低延迟并提高隐私安全性。</li>
</ul>
<p><img alt="使用" loading="lazy" src="/zh/blog/2025/microsoft-fara-7b/2-usage.png"></p>
<h2 id="核心技术">核心技术</h2>
<p>Fara-7B 的训练利用了微软开发的合成数据生成管道，该管道基于 <a href="https://www.microsoft.com/en-us/research/articles/magentic-one-a-generalist-multi-agent-system-for-solving-complex-tasks/">Magentic-One</a> 框架。它通过“观察-思考-行动”（observe-think-act）的循环来执行任务。</p>
<p>在每个步骤中，模型会接收：</p>
<ol>
<li>用户指令</li>
<li>完整的操作历史</li>
<li>最近的三张屏幕截图</li>
</ol>
<p>然后，它会输出一个推理信息（“思考”下一步行动），随后调用工具（如 <code>click(x,y)</code>、<code>type()</code> 等）来执行操作。</p>
<p><img alt="工作流程" loading="lazy" src="/zh/blog/2025/microsoft-fara-7b/3-workflow.png"></p>
<h2 id="性能表现">性能表现</h2>
<p>在 WebVoyager、Online-Mind2Web 等基准测试中，Fara-7B 展现了强大的性能。例如在 WebVoyager 上，它的任务成功率达到了 73.5%，超过了 UI-TARS-1.5-7B (66.4%) 和 GPT-4o (SoM Agent, 65.1%)。</p>
<h2 id="如何通过-vllm-使用-fara-7b">如何通过 vLLM 使用 Fara-7B</h2>
<p>Fara-7B 已经发布在 <a href="https://huggingface.co/microsoft/Fara-7B">Hugging Face</a> 上。由于它是基于 Qwen2.5-VL 的，我们可以使用 vLLM 来高效地部署和推理。</p>
<h3 id="安装-vllm">安装 vLLM</h3>
<p>首先确保你安装了最新版本的 <code>vllm</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>pip install vllm
</span></span></code></pre></div><h3 id="python-代码示例">Python 代码示例</h3>
<p>以下是一个使用 vLLM 加载 Fara-7B 并进行推理的 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 style="color:#f92672">from</span> PIL <span style="color:#f92672">import</span> Image
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> requests
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> io <span style="color:#f92672">import</span> BytesIO
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">run_fara_7b</span>():
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># 模型名称</span>
</span></span><span style="display:flex;"><span>    model_name <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;microsoft/Fara-7B&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># 初始化 LLM</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Fara-7B 基于 Qwen2.5-VL，因此使用类似的配置</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>model_name,
</span></span><span style="display:flex;"><span>        trust_remote_code<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>,
</span></span><span style="display:flex;"><span>        max_model_len<span style="color:#f92672">=</span><span style="color:#ae81ff">4096</span>,  <span style="color:#75715e"># 根据显存大小调整</span>
</span></span><span style="display:flex;"><span>        limit_mm_per_prompt<span style="color:#f92672">=</span>{<span style="color:#e6db74">&#34;image&#34;</span>: <span style="color:#ae81ff">1</span>},
</span></span><span style="display:flex;"><span>        mm_processor_kwargs<span style="color:#f92672">=</span>{
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;min_pixels&#34;</span>: <span style="color:#ae81ff">28</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">28</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;max_pixels&#34;</span>: <span style="color:#ae81ff">1280</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">28</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">28</span>,
</span></span><span style="display:flex;"><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"># 加载示例图片（这里仅作演示，实际使用中应为屏幕截图）</span>
</span></span><span style="display:flex;"><span>    image_url <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg&#34;</span>
</span></span><span style="display:flex;"><span>    response <span style="color:#f92672">=</span> requests<span style="color:#f92672">.</span>get(image_url)
</span></span><span style="display:flex;"><span>    image <span style="color:#f92672">=</span> Image<span style="color:#f92672">.</span>open(BytesIO(response<span style="color:#f92672">.</span>content))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># 构建 Prompt</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># 注意：Fara-7B 使用特定的 Prompt 格式</span>
</span></span><span style="display:flex;"><span>    prompt <span style="color:#f92672">=</span> (
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;&lt;|im_start|&gt;system</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">You are a helpful assistant.&lt;|im_end|&gt;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;&lt;|im_start|&gt;user</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&lt;|vision_start|&gt;&lt;|image_pad|&gt;&lt;|vision_end|&gt;&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Describe this image in detail.&lt;|im_end|&gt;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;&lt;|im_start|&gt;assistant</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#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:#75715e"># 准备输入</span>
</span></span><span style="display:flex;"><span>    inputs <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;prompt&#34;</span>: prompt,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;multi_modal_data&#34;</span>: {
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;image&#34;</span>: image
</span></span><span style="display:flex;"><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"># 采样参数</span>
</span></span><span style="display:flex;"><span>    sampling_params <span style="color:#f92672">=</span> SamplingParams(temperature<span style="color:#f92672">=</span><span style="color:#ae81ff">0.2</span>, max_tokens<span style="color:#f92672">=</span><span style="color:#ae81ff">512</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([inputs], sampling_params<span style="color:#f92672">=</span>sampling_params)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> o <span style="color:#f92672">in</span> outputs:
</span></span><span style="display:flex;"><span>        print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Generated text: </span><span style="color:#e6db74">{</span>o<span style="color:#f92672">.</span>outputs[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">.</span>text<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;__main__&#34;</span>:
</span></span><span style="display:flex;"><span>    run_fara_7b()
</span></span></code></pre></div><h3 id="命令行启动-api-服务">命令行启动 API 服务</h3>
<p>如果你想启动一个兼容 OpenAI API 的服务，可以使用以下命令：</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>vllm serve microsoft/Fara-7B <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --trust-remote-code <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --limit-mm-per-prompt image<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  --mm-processor-kwargs <span style="color:#e6db74">&#39;{&#34;min_pixels&#34;: 784, &#34;max_pixels&#34;: 1003520}&#39;</span>
</span></span></code></pre></div><p>注意：<code>min_pixels</code> 对应 28x28，<code>max_pixels</code> 对应 1280x28x28。</p>
<h2 id="总结">总结</h2>
<p>Fara-7B 是微软在代理小模型领域的一次重要尝试，它证明了小模型在复杂的电脑操作任务中也能有出色的表现。通过开源权重，开发者可以更轻松地探索和构建基于 GUI 的自动化代理。</p>
]]></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><item><title>Azure 101 系列课程：Microsoft Azure 概览</title><link>https://wilsonwu.me/zh/blog/azure-101/overview/</link><pubDate>Wed, 19 Jun 2024 00:00:00 -0400</pubDate><guid>https://wilsonwu.me/zh/blog/azure-101/overview/</guid><description>Azure 101 系列课程囊括了最全面的 Microsoft Azure 功能及服务介绍，涵盖了平台的各个方面的能力，本文主要阐述 Azure 整体概述，帮助用户熟悉和了解 Azure 整体能力。</description><content:encoded><![CDATA[<p>Azure 是由 Microsoft 提供的云计算平台和服务。它提供了一系列的基础设施即服务（Infrastructure as a Service，IaaS）、平台即服务（Platform as a Service，PaaS）和软件即服务（Software as a Service，SaaS）解决方案，用于构建、部署和管理各种类型的应用程序和服务。</p>
<h2 id="overview">总览</h2>
<p>Azure 提供了广泛的功能和服务，包括虚拟机、存储、数据库、人工智能、机器学习、区块链、物联网、容器、Serverless 计算等。它还提供了全球范围的数据中心网络，使用户能够在全球范围内部署和扩展应用程序。</p>
<p>Azure 拥有数百项自身提供或合作伙伴提供的服务，截止至 2024 年 6 月 19 日，其拥有 19 个大分类，共计 413 项服务：</p>
<p><img alt="All Service" loading="lazy" src="/zh/blog/azure-101/overview/all-services.png"></p>
<p>使用 Azure，您可以轻松地创建和管理虚拟机，存储和管理数据，构建和部署 Web 应用程序，进行大规模数据分析，实现自动化和监控等。Azure 还提供了强大的安全性和合规性功能，以确保您的数据和应用程序的安全性。</p>
<p>无论您是个人开发者、创业公司还是大型企业，Azure 都提供了灵活的定价模型，以满足不同规模和需求的项目。您可以根据实际使用情况付费，避免了高额的固定成本。</p>
<p>以下将总体介绍 19 个大分类的服务概述。</p>
<h3 id="ai-machine-learning">AI + Machine Learning</h3>
<p>Azure 提供了强大的 AI + 机器学习功能，使用户能够构建和部署智能应用程序和解决方案。通过 Azure 的 AI + 机器学习服务，您可以利用先进的机器学习算法和模型来处理和分析大规模数据，从而获得有价值的洞察和预测能力。</p>
<p><img alt="AI and ML" loading="lazy" src="/zh/blog/azure-101/overview/ai-ml.png"></p>
<p>通过这些 AI + 机器学习服务，您可以实现各种应用场景，如智能推荐、欺诈检测、情感分析、语音识别和自动化决策等。无论您是初学者还是专业人士，Azure 的 AI + 机器学习功能都能帮助您轻松构建和部署智能应用程序。</p>
<h3 id="analytics">Analytics</h3>
<p>Azure Analytics 是 Azure 平台下的一个重要分类，提供了一系列强大的数据分析和洞察服务。这些服务可以帮助用户从海量数据中提取有价值的信息，并进行深入的数据分析和可视化展示。</p>
<p><img alt="Analytics" loading="lazy" src="/zh/blog/azure-101/overview/analytics.png"></p>
<p>Azure Analytics 提供了丰富的数据分析和洞察服务，帮助用户从海量数据中提取有价值的信息，并进行深入的数据分析和可视化展示。无论是处理结构化数据还是非结构化数据，无论是批处理还是实时处理，Azure Analytics 都能满足用户的各种数据分析需求。</p>
<h3 id="compute">Compute</h3>
<p>Compute 计算服务是 Azure 平台下的一个庞大分类，提供了各种计算资源和服务，用于构建、部署和管理应用程序和服务。</p>
<p><img alt="Compute" loading="lazy" src="/zh/blog/azure-101/overview/compute.png"></p>
<p>Azure Compute 提供了多种计算选项，包括虚拟机、容器、Serverless 计算和批处理等。您可以根据应用程序的需求选择适合的计算资源，并根据实际使用情况进行弹性扩展和收缩。</p>
<h3 id="containers">Containers</h3>
<p>Containers 容器分类，提供了一系列容器相关的服务和工具，用于构建、部署和管理容器化应用程序。</p>
<p><img alt="Containers" loading="lazy" src="/zh/blog/azure-101/overview/containers.png"></p>
<p>Azure Containers 提供了强大的容器编排和管理功能，使用户能够轻松地创建、部署和扩展容器化应用程序。通过 Azure 的容器服务，您可以使用 Docker 容器技术来打包应用程序及其依赖项，并在云端或本地环境中运行。</p>
<p>Azure Containers 提供了多种容器服务选项，包括 Azure Kubernetes Service (AKS)、Azure Container Instances (ACI) 和 Azure Container Registry (ACR) 等。这些服务提供了灵活的容器部署和管理方式，适用于不同规模和需求的项目。</p>
<p>使用 Azure Containers，您可以实现容器化应用程序的高可用性、弹性扩展和自动化管理。无论是单个容器应用程序还是复杂的微服务架构，Azure Containers 都能提供可靠的容器化解决方案。</p>
<h3 id="databases">Databases</h3>
<p>Databases 数据库服务提供了多种数据库服务和解决方案，用于存储和管理结构化数据。</p>
<p><img alt="Databases" loading="lazy" src="/zh/blog/azure-101/overview/databases.png"></p>
<p>Azure Databases 提供了多种数据库选项，包括关系型数据库、NoSQL 数据库和缓存服务等。您可以根据应用程序的需求选择适合的数据库类型，并根据实际使用情况进行弹性扩展和收缩。</p>
<p>无论您是需要传统的关系型数据库、灵活的 NoSQL 数据库还是高性能的缓存服务，Azure Databases 都能提供适合您的数据库服务和解决方案。
通过 Azure Databases，您可以轻松地创建和管理数据库实例，进行数据的读写和查询，实现高可用性和数据的持久性。Azure Databases 还提供了强大的安全性和合规性功能，以确保您的数据的安全性和隐私保护。</p>
<h3 id="devops">DevOps</h3>
<p>在 DevOps 中提供了一系列强大的工具和服务，用于实现持续交付和持续集成的 DevOps 实践。</p>
<p><img alt="DevOps" loading="lazy" src="/zh/blog/azure-101/overview/devops.png"></p>
<p>DevOps 中提供了全面的 DevOps 解决方案，包括混沌测试，持续集成、持续交付、测试自动化、应用程序监控和故障排除等。</p>
<h3 id="general">General</h3>
<p>Azure General 分类提供了一系列通用的云服务和工具，是使用 Azure 整个平台的最基础功能。</p>
<p><img alt="General" loading="lazy" src="/zh/blog/azure-101/overview/general.png"></p>
<p>通过 Azure General，您可以找到一系列帮助您快速熟悉和使用 Azure 的工具，并且有效的管理您的各类资源以及计划您的支出，如果您对云计算服务不是特别熟悉或刚刚开始从事相关工作，在 General 中获取帮助是您的很好选择。</p>
<h3 id="hybrid-multicloud">Hybrid + Multicloud</h3>
<p>Azure Hybrid + Multicloud 分类提供了一系列强大的混合云和多云解决方案，帮助用户在不同的云环境中构建、部署和管理应用程序和服务。</p>
<p><img alt="Hybrid + Multicloud" loading="lazy" src="/zh/blog/azure-101/overview/hybrid-mc.png"></p>
<p>Azure Hybrid + Multicloud 提供了多种混合云和多云服务选项，包括混合云连接、数据集成、应用程序迁移和多云管理等。这些服务使用户能够在不同的云环境中灵活地部署和管理应用程序，实现资源的共享和协同工作。</p>
<p>通过 Azure Hybrid + Multicloud，您可以实现混合云环境中的数据集成和应用程序迁移，实现跨云平台的协同工作和资源的共享。Azure Hybrid + Multicloud 还提供了强大的多云管理功能，帮助用户统一管理和监控不同云环境中的资源和服务。</p>
<h3 id="identity">Identity</h3>
<p>Azure Identity 分类提供了一系列身份验证和访问管理服务，用于保护应用程序和数据的安全性。</p>
<p><img alt="Identity" loading="lazy" src="/zh/blog/azure-101/overview/identity.png"></p>
<p>Azure Identity 提供了多种身份验证和访问管理服务选项，包括 Azure Active Directory (Azure AD)、Azure AD B2C 和 Azure AD Domain Services 等。这些服务提供了全面的身份验证和访问管理解决方案，帮助用户建立安全的身份验证和访问控制机制。</p>
<p>通过 Azure Identity，您可以实现用户身份验证和访问管理，保护应用程序和数据的机密性和完整性。Azure Identity 还提供了强大的身份验证和访问管理功能，如多因素身份验证、单一登录、角色基于访问控制和身份联合等，帮助用户确保只有授权的用户能够访问应用程序和数据。</p>
<h3 id="integration">Integration</h3>
<p>Azure Integration 提供了一系列强大的集成服务和工具，用于实现应用程序和系统之间的无缝集成和数据交换。</p>
<p><img alt="Integration" loading="lazy" src="/zh/blog/azure-101/overview/integration.png"></p>
<p>Azure Integration 提供了多种集成服务选项，包括消息队列、事件网格、逻辑应用程序和数据工厂等。这些服务使用户能够轻松地构建、部署和管理应用程序和系统之间的集成解决方案。</p>
<p>通过 Azure Integration，您可以实现应用程序和系统之间的实时数据交换和协同工作。Azure Integration 还提供了强大的消息传递和事件处理功能，帮助用户实现高效的数据流和业务流程。</p>
<h3 id="iot">Internet of Things</h3>
<p>Azure Internet of Things (IoT) 分类提供了一系列强大的物联网服务和解决方案，用于连接、监控和管理物理设备和传感器。</p>
<p><img alt="Internet of Things" loading="lazy" src="/zh/blog/azure-101/overview/iot.png"></p>
<p>Azure IoT 提供了多种物联网服务选项，包括设备连接、数据采集、实时分析和远程监控等。这些服务使用户能够轻松地构建、部署和管理物联网解决方案，实现设备之间的互联和数据的实时处理。</p>
<p>通过 Azure IoT，您可以实现设备的连接和管理，监控设备的状态和性能，并进行实时数据分析和预测。Azure IoT 还提供了强大的远程监控和控制功能，帮助用户实现远程设备管理和操作。</p>
<p>使用 Azure IoT，您可以构建各种物联网应用场景，如智能家居、智能工厂、智能农业和智能城市等。无论是个人用户还是企业客户，Azure IoT 都能提供可靠的物联网解决方案，帮助您实现设备的互联和数据的实时处理。</p>
<h3 id="management-governance">Management and Governance</h3>
<p>Azure Management and Governance 分类提供了一系列强大的管理和治理服务，帮助用户有效地管理和监控 Azure 资源和应用程序。</p>
<p><img alt="Management and Governance" loading="lazy" src="/zh/blog/azure-101/overview/mng-gov.png"></p>
<p>Azure Management and Governance 提供了多种管理和治理服务选项，包括资源管理、访问控制、成本管理、策略和合规性等。这些服务使用户能够轻松地管理和监控 Azure 资源和应用程序，实现资源的优化和合规性的保证。</p>
<p>通过 Azure Management and Governance，您可以实现资源的集中管理和监控，优化资源的使用和成本的控制。Azure Management and Governance 还提供了强大的访问控制和权限管理功能，帮助用户确保只有授权的用户能够访问和操作资源。</p>
<p>使用 Azure Management and Governance，您可以定义和实施策略和合规性规则，确保应用程序和数据的合规性和安全性。Azure Management and Governance 还提供了丰富的监控和报告功能，帮助用户实时了解资源的状态和性能。</p>
<h3 id="migration">Migration</h3>
<p>Azure Migration 分类提供了一系列强大的迁移服务和工具，帮助用户将现有应用程序和数据迁移到 Azure 平台上。</p>
<p><img alt="Migration" loading="lazy" src="/zh/blog/azure-101/overview/migration.png"></p>
<p>Azure Migration 提供了多种迁移服务选项，包括虚拟机迁移、数据库迁移、应用程序迁移和数据迁移等。这些服务使用户能够轻松地将现有的应用程序和数据迁移到 Azure 平台上，实现平滑的迁移过程和无缝的应用程序转换。</p>
<p>通过 Azure Migration，您可以实现虚拟机的迁移和转换，将现有的虚拟机环境迁移到 Azure 虚拟机中。Azure Migration 还提供了强大的数据库迁移功能，帮助用户将现有的数据库迁移到 Azure 数据库服务中，实现数据的平滑迁移和无缝连接。</p>
<p>使用 Azure Migration，您可以轻松地将现有的应用程序迁移到 Azure 平台上，实现应用程序的云化和弹性扩展。Azure Migration 还提供了强大的数据迁移功能，帮助用户将现有的数据迁移到 Azure 存储服务中，实现数据的安全存储和高可用性。</p>
<h3 id="mixed-reality">Mixed Reality</h3>
<p>Azure Mixed Reality 分类提供了一系列强大的混合现实服务和解决方案，用于构建、部署和管理混合现实应用程序和体验。</p>
<p><img alt="Mixed Reality" loading="lazy" src="/zh/blog/azure-101/overview/mr.png"></p>
<p>Azure Mixed Reality 提供了多种混合现实服务选项，包括混合现实开发工具、混合现实内容管理和分发、混合现实设备管理和监控等。这些服务使用户能够轻松地构建、部署和管理混合现实应用程序和体验，实现沉浸式的交互和创新的用户体验。</p>
<p>通过 Azure Mixed Reality，您可以利用先进的混合现实技术和工具来创建逼真的虚拟场景和交互体验。Azure Mixed Reality 还提供了强大的混合现实内容管理和分发功能，帮助用户将混合现实应用程序和体验推送到不同的设备和平台上。</p>
<p>使用 Azure Mixed Reality，您可以构建各种混合现实应用场景，如虚拟培训、虚拟会议、虚拟展览和虚拟旅游等。无论是个人用户还是企业客户，Azure Mixed Reality 都能提供创新的混合现实解决方案，帮助您实现沉浸式的交互和创新的用户体验。</p>
<h3 id="monitor">Monitor</h3>
<p>Azure Monitor 分类提供了一系列强大的监控和日志管理服务，帮助用户实时监测和分析应用程序和基础设施的性能和健康状况。</p>
<p><img alt="Monitor" loading="lazy" src="/zh/blog/azure-101/overview/monitor.png"></p>
<p>Azure Monitor 提供了多种监控和日志管理服务选项，包括应用程序性能监视、基础设施监视、日志分析和警报管理等。这些服务使用户能够实时监测和分析应用程序和基础设施的性能和健康状况，及时发现和解决潜在的问题。</p>
<p>通过 Azure Monitor，您可以实时监测应用程序的性能和可用性，了解应用程序的负载和响应时间。Azure Monitor 还提供了强大的基础设施监视功能，帮助用户监控服务器、虚拟机和容器等基础设施的性能和资源使用情况。</p>
<p>使用 Azure Monitor，您可以收集和分析应用程序和基础设施的日志数据，了解应用程序的运行状况和事件发生情况。Azure Monitor 还提供了灵活的警报管理功能，帮助用户设置和管理警报规则，及时通知和响应关键事件。</p>
<h3 id="networking">Networking</h3>
<p>Azure Networking 提供了一系列强大的网络服务和解决方案，用于构建、部署和管理网络基础设施和连接。</p>
<p><img alt="Networking" loading="lazy" src="/zh/blog/azure-101/overview/networking.png"></p>
<p>Azure Networking 提供了多种网络服务选项，包括虚拟网络、负载均衡、应用网关、VPN 网关和 ExpressRoute 等。这些服务使用户能够轻松地构建和管理灵活、可靠的网络架构，实现应用程序和服务之间的高速连接和通信。</p>
<p>通过 Azure Networking，您可以创建和管理虚拟网络，定义网络拓扑和子网划分，实现应用程序和服务之间的隔离和安全性。Azure Networking 还提供了强大的负载均衡和应用网关功能，帮助用户实现应用程序的高可用性和性能优化。</p>
<p>使用 Azure Networking，您可以轻松地创建和管理 VPN 网关和 ExpressRoute 连接，实现安全、可靠的远程连接和混合云环境的扩展。Azure Networking 还提供了强大的网络安全和防火墙功能，帮助用户保护网络和应用程序的安全性和隐私保护。</p>
<h3 id="security">Security</h3>
<p>在 Azure Security 分类中提供了一系列强大的安全性和合规性服务。这些服务可以帮助用户保护应用程序和数据的安全性，防止恶意攻击和数据泄露。</p>
<p><img alt="Security" loading="lazy" src="/zh/blog/azure-101/overview/security.png"></p>
<p>Azure Security 提供了多种安全性和合规性服务选项，包括身份验证和访问管理、数据保护和加密、威胁检测和防御、安全监控和审计等。这些服务提供了全面的安全性解决方案，帮助用户建立安全的云环境和应用程序。</p>
<p>通过 Azure Security，您可以实现身份验证和访问管理，保护应用程序和数据的机密性和完整性。Azure Security 还提供了强大的威胁检测和防御功能，帮助用户及时发现和应对安全威胁。</p>
<h3 id="storage">Storage</h3>
<p>Azure Storage 提供了可扩展的云存储解决方案，用于存储和管理大规模的结构化和非结构化数据。</p>
<p><img alt="Storage" loading="lazy" src="/zh/blog/azure-101/overview/storage.png"></p>
<p>Azure Storage 提供了多种存储服务选项，包括 Blob 存储、文件存储、表存储和队列存储等。这些服务使用户能够轻松地存储和访问各种类型的数据，实现数据的持久性和可靠性。</p>
<p>通过 Azure Storage，您可以存储和管理大规模的结构化和非结构化数据，如图像、视频、文档和日志等。Azure Storage 还提供了强大的数据复制和备份功能，帮助用户保护数据的安全性和可用性。</p>
<p>使用 Azure Storage，您可以实现数据的高可用性和弹性扩展，根据实际使用情况进行存储容量的调整。Azure Storage 还提供了灵活的访问控制和权限管理功能，帮助用户控制数据的访问和使用权限。</p>
<h3 id="web-mobile">Web + Mobile</h3>
<p>Azure Web + Mobile 分类提供了一系列强大的云服务和工具，用于构建、部署和管理 Web 和移动应用程序。</p>
<p><img alt="Web + Mobile" loading="lazy" src="/zh/blog/azure-101/overview/web-mobile.png"></p>
<p>Azure Web + Mobile 提供了多种服务选项，包括 Web 应用程序、移动应用程序、API 管理和通知服务等。这些服务使用户能够轻松地构建和部署高性能、可扩展的 Web 和移动应用程序。</p>
<p>使用 Azure Web + Mobile，您可以构建各种 Web 和移动应用场景，如电子商务网站、社交媒体应用、企业门户和移动客户端等。无论是个人开发者还是企业客户，Azure Web + Mobile 都能提供可靠的云服务和工具，帮助您构建和部署高性能、可扩展的 Web 和移动应用程序。</p>
<h2 id="conclusion">总结</h2>
<p>本文介绍了 Azure 101 系列课程中的 Microsoft Azure 概览。Azure 是由 Microsoft 提供的云计算平台和服务，提供了广泛的功能和服务，包括虚拟机、存储、数据库、人工智能、机器学习、区块链、物联网、容器、Serverless 计算等。Azure 还提供了全球范围的数据中心网络，使用户能够在全球范围内部署和扩展应用程序。本文还介绍了 Azure 19 个大分类的服务概述，包括 AI + 机器学习、数据分析、计算、容器、数据库、DevOps、通用云服务、混合云和多云、身份验证和访问管理、集成、物联网、管理和治理、迁移、混合现实、监控、网络、安全、存储、Web 和移动应用程序。这些服务和解决方案可以帮助用户构建、部署和管理各种类型的应用程序和服务，并提供了强大的安全性和合规性功能。无论是个人开发者、创业公司还是大型企业，Azure 都提供了灵活的定价模型，以满足不同规模和需求的项目。</p>
]]></content:encoded></item></channel></rss>