<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>哔哩哔哩技术</title>
    <link>https://wechat2rss.xlab.app/feed/434235d4815fdb8447ff3127fc053ceb8b3aada6.xml</link>
    <description>提供B站相关技术的介绍和讲解&#xA;(wechat feed made by @ttttmr https://wechat2rss.xlab.app)</description>
    <managingEditor> (哔哩哔哩技术)</managingEditor>
    <image>
      <url>https://wx.qlogo.cn/mmhead/VHU8bI7BOJAmaJ0o4FjqrnRrcK84tvX1kNLl9NibQnTdzvIicOAAicZrqXxKzAkPuxcUibe6PEVCmzg/0</url>
      <title>哔哩哔哩技术</title>
      <link>https://wechat2rss.xlab.app/feed/434235d4815fdb8447ff3127fc053ceb8b3aada6.xml</link>
    </image>
    <item>
      <title>bili-fe-workflow —商业化智能开发工作流实践</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247504231&amp;idx=1&amp;sn=bea903410681034074d405e4c8ac6aa2</link>
      <description>我们从 prompt 工程演进 Harness Engineering，做了一系列智能开发工作流，让AI能够帮助我们执行跨越整个研发生命周期的长任务。</description>
      <content:encoded><![CDATA[<p>原创 <span>AI</span> <span>2026-05-15 12:02</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=d9d5c9d0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FtY0ozQev6SSoo2I4ltK0E0q0jibickEszQl1ibAbvTM5MHoaGegRo3SjrqOFO9kcibUxlMVTZlt5bxDTZGvicoSKkLguPyYngHn1mMOyiaJeEXuZ4%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>我们从 prompt 工程演进 Harness Engineering，做了一系列智能开发工作流，让AI能够帮助我们执行跨越整个研发生命周期的长任务。</p>
  <div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);"><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">背景</span></b></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">AI发展迅速，曾经 AI 只能帮我们补全下一行代码，到现在 AI 几乎已经可以在我们工作的各个阶段都提供帮助。创建需求、分析需求、分析技术方案、编写代码、调试bug、测试、性能优化 等等，几乎都有了AI的介入。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">但这些零散的节点，都需要开发者去自行选择使用，有的开发者可能还停留在传统编码，不同开发者用的不同 AI 方案。没有一个统一的工具将从TAPD到提测整个链路串起来，没有标准化的流程能够推动所有人都高效的利用 AI。</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">对于一些简单工作，如果没有开发者的介入，AI 是否可以自己从头到尾完成。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">对于一些复杂的工作，如果有标准化的流程，开发者可以在固定的节点使用 AI，充分利用 AI 加速需求完成。</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">因此，我们从 prompt 工程演进 Harness Engineering，做了一系列智能开发工作流，让AI能够帮助我们执行跨越整个研发生命周期的长任务。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.975" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=63859c72&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SToricjXcrD9EJphzu2YLe1UqstbTLAVR89wsic1icnx973iciaQW1kpAOGnPQoIKhzGmyqx1Q2WJ5pPibiayDZhZXUryPgRPt39lpl7c%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">工作流总览</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.27870370370370373" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=67d53e54&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSDn9tVs6YHgj8FAaJoDn8cFNWosSe92NKWLOehMzP5KVUofK4jIZtmEKAddzhkdX7pFRJ11mDkV2u3LEicU7kH3DUjpicDgVE18%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">整体架构</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.1296296296296295" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=c074429e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6STn0tibZQibTlRXLc471y0FMKkrHdfejdlYmEKO69JMNX4hZXwaA3Snu0XZIzyicjFekPAL5Zn2icmKKiaeQbYjqBtCAmVRZiaLteiav4%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">详细设计</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">智能知识库</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">为什么需要项目知识库？</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">AI 虽然能够理解代码，但它缺少对项目整体的结构化认知：</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">缺乏项目全貌：AI 每次对话都是全新开始，不知道项目的技术栈、目录结构、编码规范</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">无法复用经验：之前的分析结果无法持久化，每次都需要重新分析</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">上下文受限：无法一次读取所有项目文件来建立完整认知</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">规范不一致：生成的代码可能与项目现有风格不一致</span></p></li></ol><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">`.workflow` 知识库正是为了解决这些问题。它是一套结构化的项目元信息文档，让 AI 能够：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">快速了解项目的技术栈和架构</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">遵循项目现有的编码规范和命名约定</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">复用已有的组件和工具函数</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">按照项目惯例进行 API 调用</span></p></li></ul></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">.workflow 知识库架构</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">目录结构</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6983695652173914" data-s="300,640" data-w="736" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=a5eef375&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQib6hgd6O1wWQEBG5ibbkK1iaLNQX4RoWicWRG7kMe3X4OSBlQlJA63VnXkBQ8yibjGviatva6WEMVCWq3CjQrP0BHf6WepOPGZSy3U%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">知识库与开发流程的协作</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">`.workflow` 知识库是整个 AI 辅助开发流程的基础设施，与其他命令形成完整的协作链路：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.695054945054945" data-s="300,640" data-w="728" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=855c0953&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SThHaz4SbwenUrbxBa2rjx5HQEKIRMyMthVicQa9CEYvjNiaicKL73JibzBpvibrfOFtt3wkQc6pgtHv3l8Ek07gQFej5cTJKFN3noY%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">协作流程详解</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3564245810055866" data-s="300,640" data-w="895" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=2503489a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SRkRK4F8XykcYfz63iaO6CvGZGiaDCs7R5twdPDe2nbB1mkaFYO6j06T3ygJoDxKdhPTtzStl2D7JSdK819oWGibntSJwvtgrs10o%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">具体协作方式</span></strong></p></div></div></div><div style="color: rgb(255, 102, 149);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1. prd-preprocess 如何使用知识库</span></strong></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="bash"><code><span leaf="">prd-preprocess 命令:</span></code><br/><code><span leaf="">  │</span></code><br/><code><span leaf="">  ├─→ 读取 knowledge/business.md</span></code><br/><code><span leaf="">  │     └─→ 理解业务模块划分，识别涉及模块</span></code><br/><code><span leaf="">  │</span></code><br/><code><span leaf="">  ├─→ 读取 knowledge/components.md</span></code><br/><code><span leaf="">  │     └─→ 了解现有组件，避免重复开发</span></code><br/><code><span leaf="">  │</span></code><br/><code><span leaf="">  ├─→ 读取 rules/tech-stack.md</span></code><br/><code><span leaf="">  │     └─→ 确认技术栈约束</span></code><br/><code><span leaf="">  │</span></code><br/><code><span leaf="">  └─→ 输出: 结构化 PRD + 技术可行性分析</span></code><br/><code></code><br/></pre></p><div style="color: rgb(255, 102, 149);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2. dev-workflow-plan 如何使用知识库</span></strong></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="bash"><code><span leaf="">dev-workflow-plan 命令:</span></code><br/><code><span leaf="">  │</span></code><br/><code><span leaf="">  ├─→ 读取 knowledge/api.md</span></code><br/><code><span leaf="">  │     └─→ 遵循 API 调用规范生成代码</span></code><br/><code><span leaf="">  │</span></code><br/><code><span leaf="">  ├─→ 读取 knowledge/components.md</span></code><br/><code><span leaf="">  │     └─→ 复用现有组件，遵循 CSS 变量</span></code><br/><code><span leaf="">  │</span></code><br/><code><span leaf="">  ├─→ 读取 rules/code-style.md</span></code><br/><code><span leaf="">  │     └─→ 生成符合项目规范的代码</span></code><br/><code><span leaf="">  │</span></code><br/><code><span leaf="">  ├─→ 读取 rules/naming.md</span></code><br/><code><span leaf="">  │     └─→ 遵循命名约定</span></code><br/><code><span leaf="">  │</span></code><br/><code><span leaf="">  ├─→ 读取 template/ (如有匹配模板)</span></code><br/><code><span leaf="">  │     └─→ 基于模板生成代码</span></code><br/><code><span leaf="">  │</span></code><br/><code><span leaf="">  └─→ 输出: 符合项目规范的代码</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3. archive 如何使用知识库</span></strong></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="nginx"><code><span leaf=""><span class="code-snippet__attribute">archive</span> 命令:</span></code><br/><code><span leaf="">  │</span></code><br/><code><span leaf="">  ├─→ 读取 tech/ 目录</span></code><br/><code><span leaf="">  │     └─→ 收集该需求的所有技术方案</span></code><br/><code><span leaf="">  │</span></code><br/><code><span leaf="">  └─→ 输出: 整合到 archive/ 目录</span></code><br/><code><span leaf="">        │</span></code><br/><code><span leaf="">        └─→ 归档文档成为知识库的一部分</span></code><br/><code><span leaf="">              可被 RAG 搜索用于后续开发</span></code><br/></pre></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">命令介绍</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1. workflow-init：知识库初始化</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">作用：</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">深度分析项目，生成完整的 `.workflow/` 知识库</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">使用方式：</span></strong></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="cs"><code><span leaf=""><span class="code-snippet__meta"># 基本用法</span></span></code><br/><code><span leaf="">mcp__bgent__bili-fe-workflow-<span class="code-snippet__keyword">init</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__meta"># 强制覆盖已有知识库</span></span></code><br/><code><span leaf="">mcp__bgent__bili-fe-workflow-<span class="code-snippet__keyword">init</span> forceOverwrite=<span class="code-snippet__literal">true</span></span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">执行流程：</span></strong></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.27685185185185185" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=f882ded7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSgCQIqfguodniaYKwwlLic14AKPETB1EK4mw3RfhgXeryEd2AIEIB0ZnpjJ8y5RvGDBq4pK68rU6ySBK6wkiaOo3BVIe4TW9IfwY%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">支持的项目类型：</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">单项目：标准的单页应用</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">多项目：Monorepo、Vue 多页应用</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2. knowledge-update：知识库更新</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">作用：</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">当项目代码变化后，增量更新指定的知识库文件</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">使用方式：</span></strong></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="apache"><code><span leaf=""><span class="code-snippet__comment"># 更新 API 文档</span></span></code><br/><code><span leaf=""><span class="code-snippet__attribute">mcp__bgent__bfw</span>-knowledge-update knowledgeFile=<span class="code-snippet__string">&#34;.workflow/knowledge/api.md&#34;</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment"># 更新组件文档</span></span></code><br/><code><span leaf=""><span class="code-snippet__attribute">mcp__bgent__bfw</span>-knowledge-update knowledgeFile=<span class="code-snippet__string">&#34;.workflow/knowledge/components.md&#34;</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment"># 更新全部知识库</span></span></code><br/><code><span leaf=""><span class="code-snippet__attribute">mcp__bgent__bfw</span>-knowledge-update knowledgeFile=<span class="code-snippet__string">&#34;.workflow/knowledge/index.md&#34;</span></span></code><br/><code></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">执行流程：</span></strong></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.11944444444444445" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=49f2961c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6STsicKgARUOSibWQ2qq5Ypcibj5ZViahQx8mdY0ND5XZAYod3GyibNz9Ez7vGe7wkKEXoORQ5bDq4dibcrCE2uN5C3rB7zp8FmLJPLwE%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">更新策略：</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">内置知识库：使用特定的分析指令，确保分析质量一致</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">自定义知识库：使用通用更新流程，根据文档内容确定分析范围</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">差异对比示例：</span></strong></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="markdown"><code><span leaf=""><span class="code-snippet__section">## 差异对比报告</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__section">### 新增内容 (New)</span></span></code><br/><code><span leaf=""><span class="code-snippet__bullet">-</span> [API] 新增接口: <span class="code-snippet__code">`GET /api/v2/user/profile`</span></span></code><br/><code><span leaf=""><span class="code-snippet__bullet">-</span> [组件] 新增业务组件: <span class="code-snippet__code">`UserAvatarUploader.vue`</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__section">### 修改内容 (Modified)</span></span></code><br/><code><span leaf=""><span class="code-snippet__bullet">-</span> [API] 修改响应结构: <span class="code-snippet__code">`getUserList`</span> 返回数据路径从 <span class="code-snippet__code">`response.data`</span> 改为 <span class="code-snippet__code">`response.result`</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__section">### 删除内容 (Removed)</span></span></code><br/><code><span leaf=""><span class="code-snippet__bullet">-</span> [API] 废弃接口: <span class="code-snippet__code">`GET /api/v1/user/old-list`</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__section">### 保持不变 (Unchanged)</span></span></code><br/><code><span leaf=""><span class="code-snippet__bullet">-</span> [API] 基础架构: Service Layer 模式保持不变</span></code><br/></pre></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">需求文档澄清</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">为什么需要预处理？</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们知道光有一个 PRD 是不足以直接开始需求的。原因有下：</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">PRD 是以产品角度对需求的描述，无法直接映射到代码模块</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">PRD 需要经过需求评审来进一步澄清补充</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">PRD 如果涉及到多个项目，前端PC、H5、后端，我们需要提取出当前项目的改动</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">前端开发还需要交互稿和视觉稿</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">前端开发需要后端的技术方案</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">其他问题</span></p></li></ol><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">因此，只拿到一份 PRD 是完全不够的，我们还需要进行二次处理。当然，人工整理是完全ok的，但这需要花费我们较多的时间。相比人工，AI 可能更具以下优势：</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">AI 分析文档、分析代码的速度更快</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">据粗略统计，AI 编写的文档长度是人写的 &gt;=7 倍，更加适合拿来作为 prompt</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">AI 能检测到一些人会忽略的模块</span></p></li></ol><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">模仿我们自己开发需求的流程，产品出TAPD -&gt; 需求评审对齐 -&gt; 技术方案对齐 -&gt; 写代码。其中需求评审是非常重要的，通过评审去明确一些不确定的需求点、对齐产品和技术上的理解差异。但问题是，往往需求评审讨论的内容，我们并不会落实到文档里，而是口头上的信息传递。为了让这一部分信息能让AI获取到，需要 prd-preprocess 命令。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">命令介绍</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">命令的大致流程是：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.19172113289760348" data-s="300,640" data-w="918" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=7592868b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SS6EQghrtu60t42MamWcpHTlSicqeX1GPPKxPXyJa9gWSLROibbicn6W0mmE9ib0Evno9Ent0VoJlg0amAsHeHtsOAfRRlY793TEGk%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">需求文档、设计稿、接口文档收集 -&gt; 代码涉及模块匹配 -&gt; 代码现状和需求对比 -&gt; 澄清 -&gt; 落实文档。这其实是对 产品出TAPD -&gt; 需求评审对齐 这一个步骤的AI化模仿，即通过拆分更加详细的步骤，让AI模仿真实开发的流程。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">核心作用</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">/prd-preprocess 是一个需求文档预处理工具，帮助开发者将原始的产品需求文档（PRD、设计稿、技术方案）转换为结构化、可执行的开发 PRD 文档。</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">减少需求理解偏差</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">自动分析涉及的代码模块</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">提前发现需求中的问题和歧义</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">生成标准化的开发文档</span></p></li></ol><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">使用示例</span></strong></span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="bash"><code><span leaf=""><span class="code-snippet__comment"># 基本用法</span></span></code><br/><code><span leaf="">/prd-preprocess</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment"># 指定需求目录</span></span></code><br/><code><span leaf="">/prd-preprocess prd/20251217-new-feature/</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment"># 通过 @ 选择文件（自动识别父目录）</span></span></code><br/><code><span leaf="">/prd-preprocess @prd/20251217-new-feature/original-prd.md</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">执行后生成的文件结构：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="cs"><code><span leaf="">prd/<span class="code-snippet__number">20251217</span>-<span class="code-snippet__keyword">new</span>-feature/</span></code><br/><code><span leaf="">├── README.md                           <span class="code-snippet__meta"># 需求概览</span></span></code><br/><code><span leaf="">├── clarification.md                    <span class="code-snippet__meta"># 澄清记录</span></span></code><br/><code><span leaf="">├── <span class="code-snippet__number">20251217</span>-<span class="code-snippet__keyword">new</span>-feature-module-a-prd.md   <span class="code-snippet__meta"># 子需求1</span></span></code><br/><code><span leaf="">├── <span class="code-snippet__number">20251217</span>-<span class="code-snippet__keyword">new</span>-feature-module-b-prd.md   <span class="code-snippet__meta"># 子需求2</span></span></code><br/><code><span leaf="">├── images/                             <span class="code-snippet__meta"># 设计稿截图</span></span></code><br/><code><span leaf="">│   ├── design<span class="code-snippet__number">-1.</span>png</span></code><br/><code><span leaf="">│   └── design<span class="code-snippet__number">-2.</span>png</span></code><br/><code><span leaf="">├── backend-api.md                      <span class="code-snippet__meta"># 后端接口文档</span></span></code><br/><code><span leaf="">└── original-prd/                       <span class="code-snippet__meta"># 原始文档</span></span></code><br/><code><span leaf="">    └── document.md</span></code><br/></pre></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">prd-preprocess 命令使用介绍</span></strong></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">前置条件: 先安装 mcp tool @bilibili-business/mcp-server-sdk,  或者安装 Claude Code 插件 Fugue</span></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在 Claude Code 中输入 /prd-preprocess 会出现命令选项，下图中：</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">第一个是我自己在当前项目下创建的命令：.claude/commands/prd-preprocess.md</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">第二个是我发布在 Claude Code 插件 Fugue 上的 command</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">第三个是我发布在 mcp 工具的 prompt</span></p></li></ol><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">哪一个更好？这三个目前来说效果是一样的，我们也在对比探索 mcp vs plugin 的效果那个更好。</span><span style="color: rgb(12, 182, 242);box-sizing: border-box;"><span leaf="">目前，建议大家使用 mcp 的版本</span></span><span leaf="">。如果大家看到前缀跟我的 &#39;mcp-router:workflow&#39; 不一样，不用担心，因为我本地安装了 mcp-router 来托管。有关 mcp-router 的使用见（todo）</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.2779255319148936" data-s="300,640" data-w="752" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=14f0f8bb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6STQZyC0cKNfgEe1zlT4kibHQxJlLIUMIuPL67MFx71LY81KMOUAnb8YVzJOvMnkfh33hk3tb77iciaGbXJOicbqKf3hH47AGhP0HQw%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="color: rgb(255, 102, 149);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">阶段一：prd、技术方案、设计稿的资源获取</span></strong></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.23903508771929824" data-s="300,640" data-w="912" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=5a74af8e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQicvxhWWdhaPArSxUhwuYstRCG2LXdshHIxkvLEnpoFwr7lU92ApkicVtXDJ5oW8rCfqLicjibP7kNS5PUEuYgzcic4mYUibb4mfDBc%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们可以不带任何参数直接执行，工作流没有接收到任何的需求文档，会询问用户需要使用的需求应该存放在哪个目录。这个目录会作为工作流执行过程中，prd、技术方案、预处理生成最终文档的存放地址。默认情况下，会在项目/prd/20251217-xxx/ 目录下进行：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3473684210526316" data-s="300,640" data-w="760" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=b40a9b60&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSugCwHVK1sjO6Mg6xCoOnStNIEvQ1D9c4FEo3BGq9sQ4YHL4micxHibZvZ33XRuYMCEtdBCFLictfFwkdxia4Vqs7icyaMRrawicXhs%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">工作流会询问你是否有 设计稿链接 、技术方案文档：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5356662180349933" data-s="300,640" data-w="743" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=b5543240&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6ST9icP18CPvpmSXS5YqPuyB5HvYEzxrn7DPcicdicibzAIxMl42VoliciaeQiaXEc75UpkFJ7fSwXib6EbdVw9AuwM3RPyTmJZ7AW1vvjM%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们再把准备好的 技术方案 贴过来，这里的演示没有 figma 设计稿。然后工作流就可以进入到下一步了：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.43621399176954734" data-s="300,640" data-w="972" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=d97895be&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6STrWFgMAH99S76fbuiacHBIVSs0hS5IJ2JgRqFUE3KD3WrbOEatIaSTJWneK6VcJwdj1icH7nibqCInBAWw01YK6BXaCpGV5ibOxjs%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="color: rgb(255, 102, 149);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">阶段二：分析需求和代码</span></strong></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4491150442477876" data-s="300,640" data-w="904" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=585ef311&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSPhxzUrsa1Ygd2AAMticktzJM4oM89m5rAbsskEEbWU7pRERkzlEeej5oM8S33NcTlmsh9WtRC6pj7DxU93fQFibAZmib9nRibuPI%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">提取需求</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">工作流会先提取需求中与前端相关的功能点并整理出来。提取需求时，会按照以下四个方向进行：</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">界面改动：</span></strong><span leaf="">新增页面、修改现有页面、删除页面</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">功能改动：</span></strong><span leaf="">新增功能、修改功能、删除功能</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">交互改动：</span></strong><span leaf="">用户操作流程、状态变化、动画效果</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">数据改动：</span></strong><span leaf="">新增接口、修改接口参数、数据格式变化</span></p></li></ol><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这四个方向也是我们平时自己开发需求的时候，会从前端考虑的点。这符合工作流的两个原则 </span><strong style="box-sizing: border-box;"><span leaf="">模仿 </span></strong><span leaf="">和 </span><strong style="box-sizing: border-box;"><span leaf="">拆解</span></strong><span leaf="">。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.1826809015421116" data-s="300,640" data-w="843" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=b7a8bc6a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSicYsUR7drG7Vh3RibeesXxBBWMYsVIk63DHMKawicbNzu87wxFAYD1zrfPBx5H1hCmxNmtnR5j8dasRWzh23bu6ia5qUibxKakDbQ%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">分析涉及代码</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">分析会从两个方向下手：</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">一个是会使用 </span><strong style="box-sizing: border-box;"><span leaf="">mcp tool rag-knowledge-search</span></strong><span leaf=""> 进行知识库的查询，如果此前有相同模块的需求改动，并且通过工作流生成过相关的 prd\tech\archive 文档，那么 rag search 能够快速定位到涉及模块。工作流和知识库可以互补完善。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">使用 </span><strong style="box-sizing: border-box;"><span leaf="">Explore Glob Grep </span></strong><span leaf="">等工具直接进行代码筛查</span></p></li></ol><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">同样的，生成最终模块时，也会拆分成不同的方向。这些方向基本上会涵盖到一个前端需求所需要的所有代码了。</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">主页面</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">相关组件</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">路由配置</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">API 接口</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">工具和类型定义</span></p></li></ol></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7249255213505462" data-s="300,640" data-w="1007" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=b78e442b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6STyw2KmYwhDnTIrHmxmTJ6sjE77tmrBMsbouSJYgHiaWXuqZeecbj0m8ES6xGUPL217sB7stZAokAWia9ibXgyFR7s9UdeXuNVTUQ%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="color: rgb(255, 102, 149);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">阶段三：需求澄清</span></strong></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.237045203969129" data-s="300,640" data-w="907" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=d39e0276&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQONbLRYFHJicvRo3qE6clNL2M7An44DxOUjU5LVOHibuDnn6ZbNtuKEs5GKyJia5c4Q8YKOWxqibOLIbdDtoq6Q4mICkwPG5RAEh4%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在这一步中，工作流会对比 prd 和项目的代码现状，分别从：</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">完整性</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">一致性</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">明确性</span></p></li></ol><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">三个角度来进行需求的澄清，这是非常重要的一步。我们需求将在需求评审时口头讨论的内容，明确的告知给 AI，只有这样，才能消除模糊，减少AI的幻觉产生。并且，AI 也能发现一些此前需求评审时没有讨论到的问题，通过澄清来补全。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">其实站在前端的角度，有非常多的交互细节，产品都不会再prd里描述的，往往是我们自己哼哧哼哧开发完了，然后产品一看发现不好，然后再返工改。通过AI澄清明确性，能更早的把问题暴露出来，比如，下图中提到的，基本上全都是prd未明确的细节。</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">选择&#34;自定义&#34;后输入 X 天，X 的取值范围是多少？是否有最小值/最大值限制？</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">当用户从&#34;等于&#34;切换到&#34;匹配&#34;或&#34;为空&#34;时，已选择的枚举值如何处理？保留还是清空？</span></p></li></ol></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7482993197278912" data-s="300,640" data-w="882" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=70e682e5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSwSiaL8EBCUZMZR6VjoT4semjiaP4rbj5vxicrQJA98che2p1I8IUe0YZ9sS2VvVvica8DXdEJrOgwd4DqicgHAociafHdlroevK0DM%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="color: rgb(255, 102, 149);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">阶段四：需求拆解</span></strong></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.19132369299221358" data-s="300,640" data-w="899" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=543a5fe0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSkVbZNlUibPAvNXBmpTibEZ5a0URfJXFD3JlZzOWY9lmQnH2SpvuDyU9nPNW8iby1LqfzbwmmeHMkj9UicQWQZJ3e8icY2CBSwQn08%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">整理澄清内容，生成 <a href="https://clarification.md" target="_blank">https://clarification.md</a> 文档，并且拆分子需求。就像我们自己开发的时候，也不会一次性就把整个需求写完，而是会先写一块，再写另一块。对于AI来说也是一样，由于上下文的限制AI也不能一次性就将整个需求写完，通过将一整个大需求拆分成几个小型需求，能够让 AI 生成的更加准确。这也属于 模仿和拆解 的思路。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.416289592760181" data-s="300,640" data-w="663" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=6a0ba718&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6STSTtuia5kxB7CbsDmvyvW4whz0UXmXcZZjmibam1cfGXHIKf2TrA7EWNSvzFjSicQv1pNbFUkB9LkuKLTEy6qhEbAJx4iaddBYkdY%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">当然，我们可以自行修改拆解的范围，比如说我认为 维度条件配置和指标条件配置 可以一起实现，那么可以手动调整。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6061151079136691" data-s="300,640" data-w="556" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=b246b1a0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SRXhQQOpgOUAiafG3LguelV16j3J8Ld3Gj2YgRYdzJqBE7SrMWBjEUdf3tVaS2Mcl94XbyyVFMpqaC0BkibRE4iaIGYw5Fh683fzU%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">生成多份 prd 文档，并整理各个模块的依赖关系，给出后续开发建议。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6090373280943026" data-s="300,640" data-w="1018" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=25abf09b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSQyOGQvGXa1mAUPaa65jMXyFjKcUvkFjIbS7S7BsqWw2ddmN4Vc1cLicQiaQnbhibDZ6viam9wzQkzRcHZZFbwSjFbNI9ibibaBbItY%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">智能开发工作流</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在上一步 需求文档澄清中中，我们将原始的 prd 整理拆分，一共拆分出了多个子需求 prd。接下来需要开始开发。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们常规的一个开发流程一般是： </span><strong style="box-sizing: border-box;"><span leaf="">prd -&gt; 技术方案选型 -&gt; 技术方案设计 -&gt; 代码编写</span></strong><span leaf="">。一般来说，我们都是自己项目的负责人，对项目的很多细节比较熟悉，因此我们经常不会将 技术方案选型 -&gt; 技术方案设计落实成文档，而是在头脑风暴直接开始写代码。按照</span><strong style="box-sizing: border-box;"><span leaf="">模仿+拆解</span></strong><span leaf="">的思路，我们将这个流程拆解成 AI 可以执行的流程，编排了智能开发工作流。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">智能开发工作流主要是一个顶层工作流调度器，负责分析需求文档中的 Figma 解析策略，分三条路径执行，如下图所示</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.587037037037037" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=f54c00e9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SQiakzTrgiaNnGiak5ia0yL1rVRSLPibnAgXvYCo4UkxXEeQNMIsrdI2c4vR9ticDrQ7ibUYSQgcHwnN8JjxliarGwt50Bz2C9TNHJ9gTM%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">两大Skill的定位非常清晰，并且通过 d2c-logic-hints-generator进行衔接</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">D2C</span></strong><span leaf=""> = 视觉驱动，设计稿 → UI 代码→ 逻辑补全提示</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Dev</span></strong><span leaf=""> = 逻辑驱动，需求 → 完整可运行代码</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">整体调用的Skill列表如下</span></p></div><div style="text-align: center;box-sizing: border-box;"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="0.44351851851851853" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="100020578" src="https://wechat2rss.xlab.app/img-proxy/?k=cbd4e943&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6STJkBThmJ9pWqiaH26ibVHIic5b8MeF0AL2OH3lIibHNom7a5lEYadk1iad6U7jKYVpgNqGZtpdRympVXhvshHgUxibuBH13He1kcLiao%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">D2C</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">核心理念</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">“设计驱动代码” — 从 Figma 设计稿自动生成高还原度的 UI 代码，将视觉还原工作自动化。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">传统工作流分析</span></strong></span></p></div><div style="text-align: center;box-sizing: border-box;"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="0.34517203107658156" data-s="300,640" data-type="png" data-w="901" type="block" data-imgfileid="100020579" src="https://wechat2rss.xlab.app/img-proxy/?k=bad43838&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SRVjtswXm8nibc4oKlnPh00QOPLicOsAFaqc8lcO0htXrADpriaiamolwYm5NSOBwggbPYqK5IPuYbyjsxQN7xXe7onQjdibO5VbqDA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">技能组成（6 个 Skill）</span></strong></span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">对于传统工作流进行拆解，实现设计稿分析和UI还原</span></p></div><div style="text-align: center;box-sizing: border-box;"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="0.49166666666666664" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="100020580" src="https://wechat2rss.xlab.app/img-proxy/?k=ecd3db13&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6STQ35xIoxGRkMMlr2wSKVpCwpT2uHI81ibodNQwvmARDC5qVBUOPuY4uskAG3RXRibWkQYJ0appoic6HrDwU974QiaNWY67rv4OTic4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="color: rgb(255, 102, 149);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">七步流水线</span></strong></p></div><div style="text-align: center;box-sizing: border-box;"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="0.5574074074074075" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="100020581" src="https://wechat2rss.xlab.app/img-proxy/?k=847d6ede&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SROUCH2iaVK9bDB88CziaGuB99SMFfTb2Nj1ezCZbbFw6j3rvVFdKib93PLt6EoLtIRvwyHOT5V5MEkyYf0NibXPI6phiaWyMAbRgcY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这个阶段的产出是两样东西：</span><strong style="box-sizing: border-box;"><span leaf="">可运行的 UI 代码</span></strong><span leaf="">和一份 </span><strong style="box-sizing: border-box;"><span leaf="">logic-hints.md</span></strong><span leaf="">。UI 已经还原，但按钮点击事件是空的、接口调用是 mock 的、表单校验还没写——这些都被精确地标记在 logic-hints.md 中。</span></p><p style="margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">关键设计点</span></strong></span></p><p style="margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1) 并行 MCP 调用</span></strong><span leaf="">：所有 Figma API 调用在单条消息中并行发起，大幅缩短总耗时</span></p><p style="margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2) 单 Task 批处理</span></strong><span leaf="">：组件识别和图标匹配各用一个 Task（子代理）完成全部项目，避免逐个启动子代理的开销</span></p><p style="margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3) 预计算样式映射</span></strong><span leaf="">：figma-design-analyzer 在提取阶段生成 tw-to-css.json，code-generator 直接查表，不重复解析 Tailwind</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4) 渐进式数据持久化：</span></strong></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="bash"><code><span leaf="">.workflow/temp/d2c/[需求名]/</span></code><br/><code><span leaf="">├── manifest.md          <span class="code-snippet__comment"># 步骤5 确认后生成（防止上下文压缩导致丢失）</span></span></code><br/><code><span leaf="">├── raw/                 <span class="code-snippet__comment"># 原始 Figma JSON（完整备份，用于追溯）</span></span></code><br/><code><span leaf="">├── extracted/           <span class="code-snippet__comment"># 提取后的结构化数据（代码生成时按需读取）</span></span></code><br/><code><span leaf="">│   ├── code.html, styles.json, components.json</span></code><br/><code><span leaf="">│   ├── assets.json, tw-to-css.json</span></code><br/><code><span leaf="">└── screenshots/</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">5) 子代理上下文隔离：D2C 在独立子代理中运行，完成后上下文自动释放，不污染主代理的上下文窗口</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Dev</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">核心理念</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">“需求驱动，动态编排” — 分析 PRD 复杂度和特征，自动规划最优的 Skill 执行序列。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">技能组成（7 个 Skill）</span></strong></p></div><div style="text-align: center;box-sizing: border-box;"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="0.8268518518518518" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="100020582" src="https://wechat2rss.xlab.app/img-proxy/?k=14c9cc2a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQL9KkfO8pibAQWL6UyNBKMqdVGIeh57c0BFViaiblT02YQYMIYic81dWgf3fSR31aM7oLxaS8gic1dIjDRjHo7HlPpWxGkBkt7KJes%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">动态规划</span></strong></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">Dev 的核心设计是 Step 0 的动态计划生成：对需求特征和其他输入进行分析-&gt; Skill 选择 -&gt; 用户确认，具体 SKill 动态选择规则如下</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.37037037037037035" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=9aee8c6c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SRcia4PBskcg0ibv6Cs66e1GQecRavKL5UPzYpoNfia16aSektm9biaYgL831NrkenPliat5FHaNlicS2w8ULEO11botNXciaRPQ6ibX7Q%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">技术要点提取→学习→方案 的三级流水线</span></strong></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这是 Dev 最核心的设计 — 三个 Skill 形成递进式知识构建：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.29259259259259257" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=b1547761&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQVdVxrGnunf01QnDcBKv7v0Cajbt7uVMzWRgXrico71ad1Uqu6IR3SRRTU3FhqumHibBGA2f0P7icV4PIovCgkD4iaqMwLcI1ic9GA%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">设计精髓：</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">需求驱动过滤：</span></strong><span leaf="">只提取与当前需求相关的技术点，不过度学习</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">三级优先级</span></strong><span leaf="">（🔴🟡⚪）从提取阶段贯穿到学习阶段，控制学习深度</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">覆盖度校验：</span></strong><span leaf="">tech-architect 验证方案中使用的所有技术是否都已被学习，发现缺口则补学</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3大执行策略</span></strong></span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在full模式的执行策略下，两大子系统的协作关系如下</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.1" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=9c87b7ac&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQNk2CNEJGKg77ZLAkyOBJrywvp2xy7pSfKQ5wBMz3rFibf8iaeAI5ChfNUr5BaZpGibw61anRpzUhdibicwK3tHCjGjLEaCrZQibCEA%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">D2C Phase 1 生成</span><strong style="box-sizing: border-box;"><span leaf=""> logic-hints.md </span></strong><span leaf="">内容如下：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="swift"><code><span leaf="">logic<span class="code-snippet__operator">-</span>hints.md 内容:</span></code><br/><code><span leaf=""><span class="code-snippet__operator">├──</span> 已生成文件列表</span></code><br/><code><span leaf=""><span class="code-snippet__operator">├──</span> 已完成项（<span class="code-snippet__type">UI骨架</span><span class="code-snippet__regexp">/组件配置/</span>样式）</span></code><br/><code><span leaf=""><span class="code-snippet__operator">├──</span> 待补全清单（<span class="code-snippet__type">API调用</span><span class="code-snippet__regexp">/事件处理/</span>数据源<span class="code-snippet__operator">/</span>路由）</span></code><br/><code><span leaf=""><span class="code-snippet__operator">├──</span> 已使用组件列表</span></code><br/><code><span leaf=""><span class="code-snippet__operator">└──</span> 补全建议</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">Dev 根据logic-hints.md 内容进入逻辑补全模式，各个Skill的行为调整如下：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.21851851851851853" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=8c6f2b4c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQwIcWgpic121oPKQjUgtib0Bbv2w7d0jrprP4m1jlSoNRjiaU8ktI8Lyib33mjUC62beU8LXYjRh81zyNl8SSosibCZBPcQ9BicPic4I%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">layout-only / none 策略下直接进入 Dev 标准模式，动态规划 Skill 执行序列。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">自动化测试</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">使用流程概览</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.0444444444444445" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=79431908&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSkaO5ic3aF9ibF4SJBeaosjze5jibncjJldicFPtM6RGdMvU8R1C3H8qiaE4P8yV1QA93Uc0URBUm3QgbJWyVxH1wPyicls7dIjHWZA%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">实现方案</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">完整工作流设计</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Step1：调用测试工作流</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">调用测试工作流有多种方式(输入/找到</span><strong style="box-sizing: border-box;"><span leaf=""> /bili-fe-test-workflow </span></strong><span leaf="">)，自然语言输入，可按需调整: 根据用户输入生成规范且详细的测试计划，包括frontmatter基本信息、执行要求、每个测试用例的基本信息（ones caseid(如果有的话)， 初始URL, 前置条件(包含3A造数信息)，测试步骤(越详细越好，小学生也能按照步骤一步步点下去🤔)，预期结果等），常见使用举例：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">商业部门需求正常可直接贴ones链接或者onesid, 如：</span></p></li></ul></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7074074074074074" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=400439ee&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SS2poyw5nIQSLVkw1AZU0SNKgGLGOSj8qibfqyPNMmiaUhpCdgibH368NZOTxY1YXaTHSe8cN1zLeELCiaibQjEs2XSUHvZuh4B0Xl8%2F640%3Fwx_fmt%3Dpng"/></p></div><p style="padding: 0px 8px;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">或者说：&#34;onesid:16751&#34;</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">可额外 &#34;@xxx-prd.md&#34;, &#34;tech.md&#34; 等</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">随意添加自定义要求，简单的需求也可以直接tapd/企微复制过来贴给工作流</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第一遍生成后可按需调整修改，人工Review一遍，避免开始测试时ai走偏或找不到实际内容，以免浪费大量时间和Token</span></strong></p></li></ul></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Step2：运行测试计划</span></strong></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">当你觉得测试计划修改的比较详细且完善后，就可以让ai继续开始测试了:</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9805555555555555" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=35e681dc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6STs29g2mMXArKRtR8UrCb6ys88hEfklph3FQ4O3dACKia9EXXc19H838alNTnHicAYIIYesxhibl78kWnALI4ibeHyye4BMIYnic44M%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Step3：生成测试报告</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">AI测试完可以让AI生成详细的测试报告以供校验追溯</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Step4：生成Playwright测试脚本</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">然后可以基于之前的测试上下文生成playwright测试脚本, 项目playwright初始化可使用我们MCP里的&#34;/bili-fe-test-workflow-setup&#34;来快速初始化</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Step5：测试脚本修复</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">生成脚本后，需要先本地运行测试脚本，AI调试/人工调试，跑通后就可以提交git了</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Step6：UI自动化平台重复跑测试</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">代码提交后可以在UI自动化平台上跑跑看能不能通过，后续的需求、回归用例就可以定时重复的跑了</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Step7：CI流水线配置</span></strong></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">UI自动化平台接入成功后，就可以开始配置CI流水线，以便于在release前发MR时进行回归测试，提升上线稳定性</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.45740740740740743" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=9b656096&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SR9njatde10hIBIlOOeqoOoNiaxQseJ437OCYfbLRM8cPWhwuOF9nSYuzA4SbicDJjCccpia1YYFzzMXchDh8jhqdQxe2agl8z5ibY%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">🔄 完整AI交互流程：</span></strong></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.4583333333333333" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=6d815c4a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQzqB1TNq0Diag5dAWG5aNL9Of8cQLmtiae918BiaibuHJZrCqHicia30J0D1Tkpib7WpjmRa7x1IwBF5vELBEwv7TAdib9C1KG1tgYiaac%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">可选工作流程</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">以上为走完一个完整的测试工作流的过程，当然我们也可以根据实际情况按需跳过某些步骤，不同情况的适合场景（Ai在生成测试计划后，下一步之前会提示使用哪种模式）:</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">完整流程(传统)</span></strong><span leaf="">：适合用例在15个以内的场景，基本可以在可接受的范围内执行完</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">渐进式</span></strong><span leaf="">：AI测试完一个用例，立即生成测试脚本，并验证可运行性；以此循环进入下一个用例(一定程度上减少第一种方式的上下文丢失)</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">代码优先</span></strong><span leaf="">(适合vibe coding者)：基于plan直接生成完整的测试脚本代码，然后一个个运行并修复</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">对于50+用例的场景，建议跑一部分测试，生成脚本，调通后让AI依葫芦画瓢</span></p></li></ul></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5935185185185186" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=e5b23f4b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6STMoRGno96aK8OfmefiaicRVgqpACOTOgwak3NksMNUNibxw4cIKv8BtkDaaiaHgS2lT3SXpgCOlkvwv79fI6OhD1ebnyBvMttzRas%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">复杂用例场景处理</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  登录态解决</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">a.  本地</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">b.  平台</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  用例前置数据准备</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">a.  已支付订单相关行为测试(3A造数)</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">后续迭代方向</span></strong></p></div></div></div><p style="padding: 0px 8px;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">基于上面的Plugin &amp; Skill 探索分发测试工作流的各部分</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">减少AI测试的等待时间，提升生成测试脚本的准确性以及减少过程中的token消耗</span></p></li></ul></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">AI Mock工作流</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">实现方案</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3888888888888889" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=733536fd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SR74PEFI2DRgujDXibZ5AKyIhrqibpoRo1JVibBbQsTEgyIEjmOtlTS4ukMf3H2CudguOkwOqYej7GU3FEcneiambC2lkAlstweiag8%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">核心优势</span></strong></p></div></div></div><p style="padding: 0px 8px;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">AI帮你完成配置：调用&#34;/bili-fe-mock-workflow-setup&#34;即可</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">无需额外代理软件配置，集成在你的前端项目里，且不影响业务代码</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">与你本地的AI Agent无缝集成，任意Mock逻辑(mock本身即代码)</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3种模式任选：AI通过MCP动态添加(不改本地文件)，AI修改本地custom-handlers(gitignored), 基于Swagger</span></p></li></ul></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">使用场景</span></strong></p></div></div></div><p style="padding: 0px 8px;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">适合在开发过过程中无实际接口时Mock</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">已有接口，但需要调整不同的数据返回来测试不同的UI场景</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">本地UI测试时，临时Mock一下</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">减少AI操作浏览器消耗的token</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">发挥你的想象力...🤯</span></p></li></ul></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">使用方式</span></strong></p></div></div></div><p style="padding: 0px 8px;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">调用&#34;</span><strong style="box-sizing: border-box;"><span leaf="">/bili-fe-mock-workflow-setup</span></strong><span leaf="">&#34;初始化</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">mcp_server_sdk 配置</span><strong style="box-sizing: border-box;"><span leaf=""> &#34;--enable-mock&#34; </span></strong><span leaf="">arg，以及额外可选选项(刷新页面保留添加arg: &#34;</span><strong style="box-sizing: border-box;"><span leaf="">--mock-persist-handlers</span></strong><span leaf="">&#34;)</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">首次可以调用&#34;</span><strong style="box-sizing: border-box;"><span leaf="">/bili-fe-mock-workflow 你的mock需求</span></strong><span leaf="">&#34;, 不明确时AI会引导你使用哪种mock方式：</span></p></li></ul></p><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6435185185185185" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=b7ba5a1d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSXKtlopF8LUhRzeBYoGRnLxMLUxo9l5d2iaBymgn7viayqpOb1vZ9hAKF02iasdgDFgslTa15RUyYklayr8p5G0HpQQhGUCZwq6o%2F640%3Fwx_fmt%3Dpng"/></p></div><p style="padding: 0px 8px;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">前2个直接开始mock, 当选择swagger时，会引导你使用定制的&#34;</span><strong style="box-sizing: border-box;"><span leaf="">/bili-fe-swagger-mock-workflow</span></strong><span leaf="">&#34; 来完成swagger mock</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">后续的mock或者你已经很了解要怎么mock, 可以直接告诉AI要求，无需每次都调工作流</span></p></li></ul></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">总结思考</span></b></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">过去一年的实践验证了方法论的有效性，但这只是开始。AI 时代的前端正在经历根本性的范式变革。过去我们依赖个人经验推动需求落地，未来则会更多依赖规范化的工作流、可复用的上下文资产，以及人与 AI 的协同生产机制。Harness Engineering 的意义，不只是提供一套更高效的开发流程，更是在团队内部建立一种新的工程共识: 先定义清楚问题，再约束生成过程，最后通过标准化验证确保结果可交付、可维护、可复用。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这意味着，前端工程师的价值正在从“单点编码产出”转向“问题抽象、方案设计、规则沉淀与质量把控”。谁能更好地组织需求、编排上下文、制定约束、验证结果，谁就能更有效地放大 AI 的能力。工作流的价值也不只体现在一次提效上，而在于它是否能够沉淀为团队能力，帮助更多同学以更低门槛、更稳定质量完成复杂交付。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">因此，这份文档的目标不是给出一套固定答案，而是提供一个可实践、可迭代的起点。希望大家在使用的过程中，持续补充案例、沉淀模板、优化规则，把零散的个人经验逐步升级为团队共享的智能开发体系。这套体系一旦建立，提效就不再是偶发结果，而会成为组织层面的稳定能力。</span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨梦园、远书</span></p></div><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/0?wx_fmt=png" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/0?wx_fmt=png" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-service_type="2" data-verify_status="2"></mp-common-profile></p></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=06b126c3&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247504231%26idx%3D1%26sn%3Dbea903410681034074d405e4c8ac6aa2">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 15 May 2026 12:02:00 +0800</pubDate>
    </item>
    <item>
      <title>GPU隔离技术的分析与改进</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247504182&amp;idx=1&amp;sn=bc1a7cd1fca0ef7a0525423120a531bf</link>
      <description>本文基于NVIDIA场景，通过分析阐述业内隔离技术方案，引出他们的优势与缺陷，进而提出B站在隔离技术上的改进思路。</description>
      <content:encoded><![CDATA[<p>原创 <span>通用工程</span> <span>2026-04-29 12:00</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=3f285090&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FtY0ozQev6SQ92KqoeGPiaq5EWrJuF1D1yokOngqC4FXzMOJMtPoHuJiaPpsjFDiaWia8brUTuCHQF6INDgNJ58Zb5mmgzfib4icenuLdoQaCpnJ5Q%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>本文基于NVIDIA场景，通过分析阐述业内隔离技术方案，引出他们的优势与缺陷，进而提出B站在隔离技术上的改进思路。</p>
  <div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);"><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一 背景</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">随着AI技术的快速发展，对GPU的需求也日益增加；但是，在实际生产环境中，受限于业务的模型特点及SLA等，GPU利用率普遍比较低，硬件算力被严重浪费。在这种情况下，GPU隔离能力对于最大化利用硬件资源就至关重要，本文基于NVIDIA场景，通过分析阐述业内隔离技术方案，引出他们的优势与缺陷，进而提出B站在隔离技术上的改进思路。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">二 隔离思路</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2.1 两种维度</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">如图1所示，假设有A、B、C这3个不同模型大小的任务在GPU上混跑。在空间维度上，一次调度上GPU运行的任务，并不能充分利用全部的GPU资源，GPU资源的饱和度利用不高。在时间维度上，多个任务之间交替运行，存在切换和等待开销，所以在实际使用时，为了保障业务的SLA，对于延迟敏感的高优业务就需要独占GPU资源，GPU利用率就会比较低下。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img class="rich_pages wxw-img" data-aistatus="1" data-ratio="0.39814814814814814" data-s="300,640" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=6f22c4e7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SRFFcds5NbfYBy4GZX02ib5wApP4LCymxhJ4WbU4XhEk5pWKzynygx1FUOsokia8hhXtbv8hqs4Sty5KF50zI3YiaxrclweIibALbs%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图1 GPU运行示意图</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">为提升 GPU 资源利用率，可以从空间和时间两个维度切分GPU算力资源来实现多任务的高效并行与资源复用。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在空间维度上切分算力，即空分方案，该方案着眼于在GPU资源核心的极致挖掘，通过实现多个任务并行运行，目的是充分利用图1中的idle部分的算力，提升GPU资源的饱和度利用。这种方案往往由硬件厂商实现，通常为各种虚拟化方案，这类切分往往是静态的，不同虚设备之间无法共享资源，容易出现资源浪费，并且实现通常是黑盒的，难以根据业务实际需求进行适配。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在时间维度上切分算力，即时分方案，该方案聚焦于任务的时间管理，通过对时间片的拦截，有效地减少任务切换所需要的等待时间，从而保障业务Qos的高标准。由于弹性特质，相对于空分方案，能更好的利用空闲资源，但官方往往不提供这类解决方案，或提供的方案很难产品化，因此，业界通常需要自主开发相应的解决方案。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2.2 CUDA计算软件栈</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">为了理解下文业界隔离方案是怎么实现的，我们需要先掌握整个资源分配过程中，都会涉及哪些软件栈。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.2951289398280803" data-s="300,640" data-w="698" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=bf63f838&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQ5XvYwZFMYP4O66ZXZVf3YRYgagdzWzRDtbH9w31WbzYOud4m9lPqHCo8DG4MoBm6XgZo5de7fseRolZwsZcvwAWwlejudgbM%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图2 cuda计算软件栈</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">如图2所示，CUDA计算主要包括以下几个方面：从顶层的应用程序开始，依次经过CUDA库（包括CUDA RUNTIME和CUDA DRIVER层），再到底层的内核驱动，最终到达GPU硬件本身。在此架构中，</span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">用户层：包括应用程序和CUDA库，其中CUDA API细分为两个主要层次</span><sup style="box-sizing: border-box;"><span leaf="">[1][2]</span></sup><span leaf="">：</span></p></li></ul><ul style="list-style-type: circle;" class="list-paddingleft-1"><li><p style="word-break: break-all;margin: 0px 8px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">CUDA Runtime API: higher-level抽象层，通过cudart动态库提供，其所有入口点都以cuda为前缀，易于使用，为CUDA开发者在编程时提供了便利。</span></p></li><li><p style="word-break: break-all;margin: 0px 8px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">CUDA Driver API: low-level，通过 cuda 动态库提供，其所有入口点都以 cu 为前缀，提供了更精细的控制，尤其是对上下文和模块加载的控制。</span></p></li></ul><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">内核层：主要就是NVIDIA GPU的驱动程序，负责管理GPU资源，处理与操作系统的交互，并提供基本的硬件抽象；</span></p></li><li><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">硬件层：主要就是NVIDIA的GPU硬件，它提供了并行处理能力。</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">从API库到最终的GPU硬件，每一个阶段的转发都有被拦截的可能性，于是，业界基于上述的计算软件栈，实现了各式各样的GPU隔离共享方案。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">三 业界方案</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">目前空分方案主要是NVIDIA提供的MPS和MIG方案，时分方案主要是以CUDA劫持方案和内核拦截方案为主，以下简要介绍下几种方案上的区别。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.1 NVIDIA官方</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">NVIDIA提供了一些黑盒逻辑的隔离功能，其中，针对容器共享GPU的技术，以MPS和MIG相对比较常见。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.1.1 MPS</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">通常在GPU上执行多个任务时，采用的是”单任务”的工作模式，即同一个时刻只有一个任务（用不同的context区分）在GPU上执行。MPS技术则通过整合多个任务的CUDA context至一个CUDA context，这些任务共享GPU算力，共同使用显存，据此充分利用GPU资源。原理示意如图3所示</span><sup style="box-sizing: border-box;"><span leaf="">[3]</span></sup><span leaf="">：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9064814814814814" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=5b1b9243&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SS3XOibEu7YuyFYBCXouWDTicRDc0aciaM9CiaoXpP9nDpIlQYwRXHwEMZR1xXfiaT8WAMiaVEWeAXnJyicaH8JficODuPNRBMA1hYeXfA%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图3 MPS原理示意图</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">但是，由于是多个任务context的整合，一个任务失败，不免会影响到其他任务，存在故障传播的问题，并且由于是黑盒逻辑，故障诊断也是一个难题。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.1.2 MIG</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">自NVIDIA A100系列GPU起，引入了MIG（Multi-Instance GPU）技术，它实现了硬件级别的空间分割复用和隔离。如图4所示</span><sup style="box-sizing: border-box;"><span leaf="">[4]</span></sup><span leaf="">，MIG允许将单个GPU分割成多个独立的实例，每个实例拥有自己的资源配额，从而在硬件层面上实现了资源的隔离。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7046296296296296" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=99fc2b8b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSCzlSg4uptsmBgWPJGD2vRhxUv67fmdT1TUoZ10GN5zUTzdkCDsib10euvDP4lGh1ssiaNMUtUibVLjA5qKlfXDyGPunUFian9uds%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图4 MIG原理示意图</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">然而，这项技术存在一定的局限性，首先，并非所有型号的GPU都支持这一功能，仅在一些高端的GPU上提供支持；其次，MIG最多仅支持7个独立实例的创建，这限制了MIG在更多实例数量的场景中的应用；并且，GPU资源的切分是静态的，一旦GPU资源被分配给某个任务，就无法在运行时更改这些资源的分配，缺乏灵活性。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.2 CUDA 劫持</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">CUDA劫持方案发生在CUDA Runtime和CUDA Driver之间，通过劫持对CUDA Driver API的调用来做到资源隔离，例如，腾讯早期开发的GaiaGPU方案</span><sup style="box-sizing: border-box;"><span leaf="">[5]</span></sup><sup style="box-sizing: border-box;"><span leaf="">[6]</span></sup><span leaf="">。这类方案在算力隔离方面，在launch kernel时，会评估这次内核发射对GPU使用率的影响。如果发现该kernel会使得GPU使用率超标，则推迟下发kernel运行的API，直到 GPU 使用率下降至允许本次 CUDA kernel 的运行之后，据此达到算力隔离的目标。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8422222222222222" data-s="300,640" data-w="900" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=5e2e6622&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SRGswlCR2ca4HAMAV9icfmqnncpAu8ZX3LziaypPQpMVx22MwYMRCQX4l3qkZ4xsMMPcANGC2YxRKadiazTc9ERS52RicZz67uric7E%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图5 GaiaGPU架构图</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">由于API的功能是公开的，通过劫持特定调用，可以简单的拒绝或延后任务对于资源的申请行为，但这里存在两个问题，一是算力消耗缺乏反馈机制，依赖轮询造成浪费，二是申请下发后便失去了控制权，容易超算力配额引入误差。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.3 内核拦截</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">内核拦截发生在Cuda driver API和Nvidia Driver之间，也是业界比较成熟的方案。不管是腾讯的qGPU</span><sup style="font-size: 12px;box-sizing: border-box;"><span leaf="">[2]</span></sup><span leaf="">、阿里的cGPU</span><sup style="font-size: 12px;box-sizing: border-box;"><span leaf="">[7]</span></sup><span leaf="">、还是百度的GPU隔离方案</span><sup style="box-sizing: border-box;"><span leaf="">[8]</span></sup><span leaf="">，在实现上基本是类似的。如图6，以百度的隔离方案为例：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9324074074074075" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=042d5d8b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SROg95LoXzWCJ637zH7cz9MiaT564lsYSMuUQGnlddxriazGAC5XXFlbibSDWQSS7iag2vIEoXwaUh2QvecHIge5vSRHOmevCZXx8s%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图6 百度双引擎GPU虚拟化内核态原理图</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">具体拦截设计如下：</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">在没有拦截驱动的时候, 用户程序APP-&gt;CUDA RUNTIME-&gt;CUDA DRIVER，底层库通过设备文件来访问真实的设备驱动；如图6，是通过GPU驱动的提供的设备如/dev/nvidia0来访问驱动的。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">做了拦截之后，可以提供假的设备文件（/dev/gpu0)。有了假的设备文件，APP调用时会进入到拦截驱动里，拦截驱动就会把对GPU的访问进行一个拦截，解析信息，然后再把访问发给真实的GPU驱动，GPU处理完之后，再做一次拦截，把信息做解析和修改，注入给APP。</span></p></li></ol><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">该方案需要深入理解CUDA和GPU之间交互的方式，并对其中的关键参数进行修正，但该交互行为本身是黑盒，版本迭代后还可能会失效，并不易于维护。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">四 内核隔离方案</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在分析了B站的业务场景后，我们发现具备弹性能力的时分方案最为合适。然而纵观业内，官方没有提供这类手段，非官方的劫持方案又由于黑盒问题，存在各种隐患，一度让我们陷入困境，最终NVIDIA驱动的开源为我们打开了新的思路。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">相对于各类劫持，直接在驱动层进行参数和结果的修正，无疑是更加透明和高效的。通过分析驱动代码，结合GPU运行原理知识，我们验证了这条路径是可行的，并基于此设计实现了一套内核隔离方案，完美契合了B站业务场景的需求。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">接下来我们将从NVIDIA开源驱动出发，解析GPU运行机制，并和大家分享一下我们内核隔离方案的设计思路。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.1 驱动视角</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">根据驱动代码及相关文献</span><sup style="box-sizing: border-box;"><span leaf="">[10][11][12]</span></sup><span leaf="">，我们可以从驱动角度上展示CUDA任务到GPU上运行的详细过程，如图7所示：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7324074074074074" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=3df8636f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6STic7e3mj68Ffhd9qohdop13iaTarfQsphRxAicPLV6r8xcepBlPY28tO5FHKVExgMVTibT2icZLE1NCZx3l0trYbcpV3CibZv41A00E%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图7 多个GPU程序混跑运行机制</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">GPU 内部由多个功能单元组成，在驱动中称为 Engine，主要包含：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">Compute/Graphics Engine：包含通用处理核心，负责 CUDA 计算和图形渲染；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">Copy Engine：专门处理 GPU 与 CPU 之间的异步数据拷贝；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">NVENC/NVDEC Engine：用于视频编解码等特定任务等。</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">GPU Host 是 CPU 与 GPU 之间的桥梁，由 runlist processor 和 context switcher 组成：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">runlist processor 负责扫描 runlist，选择下一个待运行的 channel</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">在选择 channel 后，如果该 channel 的 context 与当前正在运行的 context 不同，就需要 context switcher 执行上下文切换操作。</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">具体调度流程如下：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1)  从驱动角度看，为了向 GPU 提交计算或数据拷贝等请求，会为每个程序创建一个或多个 channels；</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2)  这些 channels 被组织到 TSG（Time Slice Group） 中，同一 TSG 内的 channels 共享相同的 GPU context 信息；</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">3)  TSG会根据分配的Engine type找到自己的runlist</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">4)  GPU Host 通过读取runlist以查找下游Engine要完成的工作，具体地，GPU HOST识别到有待处理命令的channel，会从相应runlist上按照时间片轮转的方式摘取一个TSG，再从TSG选择相应的channel，将其调度到特定的Engine上运行。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">5)  Engine 执行 channel 中提交的命令，完成计算或数据拷贝任务。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">根据我们在x86_64的A10机器上的trace结果来看，会为一个常见的CUDA程序默认创建共16个channels，3个TSG以及3个runlist。其中，8个计算的channels会被加到一个TSG，这个TSG默认分配Compute/Graphics Engine；8个用于数据拷贝的channels会被分别加到两个TSG中，分别对应两种COPY Engine。A10卡上默认的映射如表1所示：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sub style="box-sizing: border-box;"><span leaf="">表1 A10机器CUDA程序映射关系</span></sub></p></div><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="0.18703703703703703" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="100020532" src="https://wechat2rss.xlab.app/img-proxy/?k=175fa3c4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6STFLKvgtq6FC8dRhHMqNSLjc28ArOicZsj7TUciaLGQ7icJwFdwMX8o5qYxK7h8vZSia8UtoRkd22ZT8eVtWtbTT14O4AEKictMfXFg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">每种Engine会被绑定到一个runlist，在A10机器上，CUDA程序用到的Engine和runlist的对应关系，通常如表2所示：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sub style="box-sizing: border-box;"><span leaf="">表2 A10机器上Engine类型和runlist对应关系</span></sub></p></div><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="0.1824074074074074" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="100020533" src="https://wechat2rss.xlab.app/img-proxy/?k=eea2080a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SQBZrk9icovt6RyWYRkR7DicbnjiaoVuuFK2HH6vCZodVZuSdic6TebyXiadFiaohs3E5PAmjOoVT6qH6TgicEEPaeaWy4LQ6J5A5NUWI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在表2中，Timeslice指代了runlist中每个条目（即TSG）一次调度默认最多可执行的时间。以runlist0上的TSG为例，时间片为2ms，即在不发生抢占的情况下，runlist0上一个TSG调度到Compute/Graphics Engine上，默认最多可运行时间为2ms。这意味着，只有TSG用完了2ms的时间片或者TSG在2ms以内就执行完了，TSG之间才会发生调度切换。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">由此可知，在单个GPU上跑混多个任务时，TSG之间的切换以及上下文切换是影响任务延迟的主要因素。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.2 隔离设计</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">4.1节主要阐述了驱动在算力资源方面是如何进行管理的，在定位到驱动代码的具体实现后，就可以对下发到设备的显存和算力请求做出调整。我们引入bilibili GPU Manager（以下简称BGM）内核模块来联动Cgoup子系统和显卡驱动实现隔离。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">显存隔离的设计原理框图，如图8所示：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5962962962962963" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=3d28a2ba&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SRnaibuUhVWfuJlXkic6bqicEQWibD7qaJcWIRLEtKhdsSBMd7F7dHVBKicdwWFI489ppibnelpybxIiaCRDhibckweXfksP2n8nibEXqPI%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图8 bilibili gpu manager显存隔离设计框图</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">具体地，显存隔离步骤如下：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1）用户通过cgroup接口配置显存信息，用于限制业务可用的显存上限，记为limit；</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2）当驱动在获取设备可用的显存总量信息时，会调用BGM模块的显存限制API获取用户配置的limit，得到一个假的显存总量；</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">3）在获取设备剩余可用显存信息时，会调用BGM模块显存剩余API，更新limit在不断分配之后的剩余显存量，记为left；</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">4）在驱动分配显存时，会先判断剩余显存量left是否满足本次分配size要求，满足要求则进行分配，不满足则报NO MEMORY;</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">5）每次显存的分配和释放，都将通过分配统计和释放统计API计入任务组的显存使用，记为used。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">基于此，达到显存隔离以及cgroup统计显存使用的目标。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">算力隔离的设计原理框图，如图9所示：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.37962962962962965" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=f36c8335&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSpiaK2qxud3b6H6djo8ib1YajUic46prVygdwmiaTMLfbATIjCUg1TNeNp1E6Ncl6o6q6OLk3sCib1RzjbWTnN8ucOqHViaRuPopFvk%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图9 bilibili gpu manager算力隔离设计框图</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">具体地，算力隔离步骤如下：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1)  用户通过cgoup接口中配置算力（slice）信息；</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2)  CUDA程序运行时，经驱动调用相关方法设置TSG的时间片时，会调用BGM模块的时间片限制API获取用户通过cgoup接口配置的slice，用这个slice替换默认的时间片，作为TSG的时间片；</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">于是，用户通过配置slice，就可以控制TSG调度上Engine一次可执行的时间片上限，据此达到算力隔离的目的。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">举个例子说明本隔离方案在算力隔离方面可以达到的效果，假设存在3种业务在一张GPU卡上混跑，并且业务对应的TSG都能跑满2ms。那么，不同时间片配置下的业务切换示意如图10所示：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.14351851851851852" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=9cdaa533&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6ST09zQNakGw0nhtRhm3fcI36IibOEPVCGLalevdN5ibETbtibVPdxWHGctQdpiatGsxVyszO3QcfxGbCFibPfjLeBSB19hUSYsMK0s8%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图10.1 默认2ms业务切换示意图</span></sup></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.1574074074074074" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=f85b0b0c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6ST1e5406hFPXia9Mk3fP2P8sicDevreBgNgEchQrAdf2B2nT6pZGq69nicsBQWPjVkk3eicMmbSLABacjBYA0Ukk1tQGFCmOicwEVL4%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图10.2 时间片1ms业务切换示意图</span></sup></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.14722222222222223" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=9a80e834&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSVxrh0ZZVBia0jCPTn0iaL6Zibu8IeiaxDMRbPIicqxhTbZ9v3q1Rpv6666V0f9v0cVvP7ScFNiahVhvmR9BfrriaibqS3R3J98QY9a88%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图10.3 不同时间片业务切换示意图</span></sup></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图10 不同时间片配置下应用切换示意图</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">如图10.1所示，在默认（无算力隔离）情况下混部多个业务，一个任务用完了2ms的时间片，才会切换到另一个任务。计入上下文切换损耗的时间，那么，APP0业务至少要等4ms才能再次被调度执行。如果GPU上混部更多个业务，等待的时间将会更长。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">如图10.2所示，同样是均分算力，但是通过隔离手段限制TSG的时间片为1ms，即这些应用一次调度最多可运行1ms，那么，相较于默认情况，APP0业务得到再次调度的等待时长将会减半。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">如图10.3所示，不均分算力，通过隔离手段，限制APP0对应TSG时间片为4ms，APP1和APP2的为1ms，即APP0一次调度最多可运行4ms，APP1和APP2最多可运行1ms。通过给高优任务大的时间片，低优任务小的时间片，一方面可以实现让高优任务尽可能在一个时间片完成任务；另一方面，也可以减小高优任务等待切换的时间；这样，可以有效地提升高优任务的性能，并减小受干扰程度。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这样，用户可以根据实际需求合理分配不同业务的时间片，达到切分算力和保障高优的目标。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.3 效果验证</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">针对TensorFlow的一个benchmark</span><sup style="box-sizing: border-box;"><span leaf="">[13]</span></sup><span leaf="">，resnet50模型，我们在A10卡上对不同的batchsize，做了如下测试：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">混跑2pod</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">算力比为1:3，两个pods的吞吐比如图11所示：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5437881873727087" data-s="300,640" data-w="982" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=f8214f9e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SRibk3ng7icIxfLpaxqjZYgia0eDwZn5N5F8NXs1hPwUDnyS3CYFepib16j2W8ASKtciaqctA7ibxWfDpAh5sYN2ef3ibnAlKefaPJAjw%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图11 不同算力2pods混跑的Qos表现</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">混跑4pod</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">算力比为1:2:3:4，不同算力pods的吞吐信息如图12所示：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5543933054393305" data-s="300,640" data-w="956" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=a1228de8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSS1u6AQ8ib6ZTKJgSjLoOTFA9ZnkDZJichG3A0zZcrZIsTIibp1541qribC7lYaPAhm7CqeUkDWkOf3icmgic8v01LW6WYJbZb1iaBvg%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图12 不同算力4pods混跑的Qos表现</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">如图11和图12所示，配置2个不同算力的pods(1:3)进行混跑，吞吐比在不同batchsize的情况下，基本都在理论值3附近；配置4个不同算力的pods(1:2:3:4)进行混跑，吞吐比在不同batchsize的情况下，表现和算力配置基本一致。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在后面做了平台化适配之后，我们也上实际业务进行了相关验证，总体可以满足GPU混部隔离的需求。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">五 总结与展望</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">本文探讨了NVIDIA GPU结合CUDA计算在实际生产中面临的利用率低下问题，并介绍了一系列基于CUDA软件栈的隔离共享解决方案。特别地，bilibili GPU Manager项目借助NVIDIA驱动开源的优势，通过BGM模块联动Linux内核和NVIDIA驱动，成功实现了算力和显存的精细隔离。通过调整Time Slice Group的时间片配置，可优化多业务场景下的任务等待时间，保障多个业务在GPU上混部的运行性能。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">bilibili GPU Manager虽然在内核层实现了隔离，但该方案本质上还是时分复用，高优任务对离线业务的抢占，还是会有所受限，同时不同任务的切换也存在损耗。然而，一方面，随着NV驱动的进一步开放，在抢占模式以及interleave Frequency等细节上可以继续深挖，做到更细致的隔离；另一方面，如果对延迟实在比较敏感，也可以同时在用户态同时做一些调度策略上的调整，做到更好的隔离效果。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">通过该项隔离技术，我们希望在GPU混部中能够做到更可控、更灵活的应对不同的业务环境。由于CUDA内部的某些逻辑并不透明，文中阐述不当之处，欢迎业界专家提出宝贵意见和纠正，也请大家继续关注我们的进展~~</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">六 参考文献</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[1] CUDA Toolkit Documentation 12.4 Update 1（</span><span style="text-decoration: underline;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf=""><a href="https://docs.nvidia.com/cuda/index.html" target="_blank">https://docs.nvidia.com/cuda/index.html</a></span></em></span><span leaf="">）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[2] GPU虚拟化，算力隔离，和qGPU - 知乎（</span><span style="text-decoration: underline;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf=""><a href="https://zhuanlan.zhihu.com/p/377073683" target="_blank">https://zhuanlan.zhihu.com/p/377073683</a></span></em></span><span leaf="">）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[3]Multi-Process Service :: GPU Deployment and Management Documentation（</span><span style="text-decoration: underline;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf=""><a href="https://docs.nvidia.com/deploy/mps/index.html" target="_blank">https://docs.nvidia.com/deploy/mps/index.html</a></span></em></span><span leaf="">）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[4]<a href="https://docs.nvidia.com/datacenter/tesla/mig-user-guide/index.html（" target="_blank">https://docs.nvidia.com/datacenter/tesla/mig-user-guide/index.html（</a></span><span style="text-decoration: underline;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf=""><a href="https://docs.nvidia.com/datacenter/tesla/mig-user-guide/index.html" target="_blank">https://docs.nvidia.com/datacenter/tesla/mig-user-guide/index.html</a></span></em></span><span leaf="">）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[5] J. Gu, S. Song, Y. Li and H. Luo, &#34;GaiaGPU: Sharing GPUs in Container Clouds,&#34; 2018 IEEE Intl Conf on Parallel &amp; Distributed Processing with Applications, Ubiquitous Computing &amp; Communications, Big Data &amp; Cloud Computing, Social Computing &amp; Networking, Sustainable Computing &amp; Communications (ISPA/IUCC/BDCloud/SocialCom/SustainCom), Melbourne, Australia, 2018, pp. 469-476, doi: 10.1109/BDCloud.2018.00077.</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[6] GitHub - tkestack/vcuda-controller（</span><span style="text-decoration: underline;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf=""><a href="https://github.com/tkestack/vcuda-controller" target="_blank">https://github.com/tkestack/vcuda-controller</a></span></em></span><span leaf="">）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[7] GPU容器共享技术cGPU的优势及架构_GPU云服务器(EGS)-阿里云帮助中心（</span><span style="text-decoration: underline;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf=""><a href="https://help.aliyun.com/zh/egs/what-is-cgpu" target="_blank">https://help.aliyun.com/zh/egs/what-is-cgpu</a></span></em></span><span leaf="">）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[8] </span><span style="text-decoration: underline;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf=""><a href="https://xie.infoq.cn/article/64df7b9a6606c139753658758" target="_blank">https://xie.infoq.cn/article/64df7b9a6606c139753658758</a></span></em></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[9] </span><span style="text-decoration: underline;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf=""><a href="https://github.com/NVIDIA/open-gpu-kernel-modules" target="_blank">https://github.com/NVIDIA/open-gpu-kernel-modules</a></span></em></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[10] </span><span style="text-decoration: underline;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf=""><a href="https://nvidia.github.io/open-gpu-doc/manuals/ampere/ga100/dev_ram.ref.txt" target="_blank">https://nvidia.github.io/open-gpu-doc/manuals/ampere/ga100/dev_ram.ref.txt</a></span></em></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[11] J. Bakita and J. H. Anderson. Demystifying NVIDIA GPU Internals to Enable Reliable GPU Management[J].</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[12] S. H. Duncan, L. V. Shah, S. J. Treichler, D. E. Wexler, J. F. Duluk Jr, P. B. Johnson, and J. S. R. Evans, “Concurrent execution of independent streams in multi-channel time slice groups,” U.S. Patent 9,442,759, Sep.,2016</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">[13] GitHub - tensorflow/benchmarks: A benchmark framework for Tensorflow（</span><span style="text-decoration: underline;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf=""><a href="https://github.com/tensorflow/benchmarks" target="_blank">https://github.com/tensorflow/benchmarks</a></span></em></span><span leaf="">）</span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨糖冬青</span></p></div><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/0?wx_fmt=png" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-service_type="2" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/0?wx_fmt=png" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=b1e28a8a&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247504182%26idx%3D1%26sn%3Dbc1a7cd1fca0ef7a0525423120a531bf">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Wed, 29 Apr 2026 12:00:00 +0800</pubDate>
    </item>
    <item>
      <title>世界知识产权日 | 2026年度哔哩哔哩技术专利评选结果出炉！</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247504160&amp;idx=1&amp;sn=b4da51e5f5b3d2ca0ce8af1b9d41cd4c</link>
      <description>10项优秀技术专利火热出炉！</description>
      <content:encoded><![CDATA[<p>原创 <span>哔哩哔哩技术</span> <span>2026-04-24 12:05</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=d2c6f979&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FtY0ozQev6SQ4QL1SgX4DwrTgRcLPwNbCtalKWnvtzAiaHtMYR96cziaExTx1LtqJBSXe5PEMriavUqCQHH7JKgmTJHeqdnAic7dlavOzLiaf0qUo%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>10项优秀技术专利火热出炉！</p>
  <div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);"><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><p style="display: inline-block;box-sizing: border-box;"><span style="display: block;padding: 0.3em 0.5em;border-radius: 0.8em 0.8em 0px 0px;background-color: rgb(12, 182, 242);font-size: 14px;color: rgb(255, 255, 255);box-sizing: border-box;" title=""><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">哔哩哔哩技术</span></p></span></p><div style="border: 1px solid rgb(12, 182, 242);border-radius: 0px 0px 0.8em 0.8em;padding: 10px;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2026年4月26日是第24个世界知识产权日，每年4月20日-4月26日是全国知识产权宣传周。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在这期间，哔哩哔哩公司内部发起了2026年度哔哩哔哩技术专利投票活动。最终根据票选结果决出10个优秀技术专利。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们希望可以通过本次活动加强B站同学对于知识产权的认知和投入，同样B站也会在中国向知识产权强国迈进的征程中，勇担使命，发掘潜能，创造不凡。</span></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(255, 102, 149);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2026年度哔哩哔哩技术专利评选</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">直播互动玩法面板热更新</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">将第三方互动程序的更新面板发送至开放平台，生成地址并进行更新通知，观众端通过刷新页面获取更新面板，在主播不重启直播间的情况下动态更新互动玩法面板内容。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">基于时间片分割统计违规时长</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">存储多个主播各自关联的违规时间点，根据主播标识和时间区间计算违规时长，减少服务器维护历史违规数据的负担，支持主播实时查询违规时长以及任务实时进度。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">AI经纪人资源匹配系统</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">通过多智能体的分工协作，自动完成资源匹配请求的意图识别、候选筛选、交互谈判和进度监控全流程，实现AI驱动的经纪人业务自动化，大幅提升资源匹配效率与准确性。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">结合异常指标与观众反馈的直播间巡检</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">根据秒退率、互动量等指标的趋势，筛选出潜在异常直播间，根据潜在异常直播间的观众反馈信息（如弹幕、问卷）进一步确定异常直播间，提高了异常直播间的处理效率和准确性。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">代码知识图谱构建系统</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在代码提交中绑定需求文档URL，自动解析产品需求文档并进行语义匹配，构建代码知识图谱，解决了代码与需求文档的语义隔离问题，提升了研发效率和上下文理解，支持需求变更影响分析和历史记录推荐。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">智能服务快速封装与跨端调用</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">获取待接入服务的服务描述内容，基于结构化规范信息注册交互封装接口，并利用大语言模型进行自动化调用，支持对用户自然语言请求的解析和响应，实现快速、安全的服务接入和调用。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">多模态大语言模型检测广告</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">获取视频的图像帧和音频数据，提取文字内容、音频文本信息和画面内容的文本摘要，利用预设学习模型进行时间对齐后输入前述信息以识别广告，从而实现结合场景切换点进行准确切分并通过大语言模型进行语义级广告识别。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">RAG检索增强的测试用例自动生成</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">从待测需求中提取功能点和特征，通过多维度检索词召回相关历史测试用例，结合业务目录匹配的测试模板自动生成目标测试用例，显著提升RAG检索召回率和测试覆盖率。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">多模态回归模型的封面质量评估</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">融合封面图像内容、用户观看行为及上传者与观看者关联度，通过多模态动态回归模型生成综合评分，引入关联度修正因子，实现视频封面质量的客观评估。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">基于ASR与LLM的视频搜索方法</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">通过获取查询文本，基于查询文本和预设视频库中视频的元信息和文本内容，利用ASR和LLM进行稀疏密集检索，生成相关性高的搜索结果，快速提供精准的搜索结果，提升了用户体验。</span></p></div><div style="font-size: 12px;padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">*注：以上排名不区分先后顺序。</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">以上是2026年度哔哩哔哩技术专利评选活动中获奖的十组专利项目，你pick哪一组呢？</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">哔哩哔哩技术一直致力于提升公司技术氛围，鼓励公司员工进行技术创新，期待下一年有更多的专利项目大放异彩。</span></p></div></div></div><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/0?wx_fmt=png" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/0?wx_fmt=png" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-service_type="2" data-verify_status="2"></mp-common-profile></p></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=637b6e3c&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247504160%26idx%3D1%26sn%3Db4da51e5f5b3d2ca0ce8af1b9d41cd4c">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 24 Apr 2026 12:05:00 +0800</pubDate>
    </item>
    <item>
      <title>ICLR 2026 ｜用“信息增益-冲突惩罚”把数据选择做成可控的大模型微调加速器</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247504153&amp;idx=1&amp;sn=4ab9e661a84dd783d1ae89145c2d5723</link>
      <description>指令微调（Instruction Tuning）已经成为大语言模型落地前的“最后一公里”。</description>
      <content:encoded><![CDATA[<p>原创 <span>AI</span> <span>2026-04-14 12:06</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=691e218f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FtY0ozQev6STz1xUd8BV4DiaINxOBOsBKSwvv884lahl8LzX2qn1xmsqMstkyD2IfENoS96KczGltUZRTSeMtnrmEnPP596llNT9FUSVbiax4I%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>指令微调（Instruction Tuning）已经成为大语言模型落地前的“最后一公里”。</p>
  <div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);"><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">前言</span></b></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">指令微调（Instruction Tuning）已经成为大语言模型落地前的“最后一公里”。在这一阶段，我们通常使用大量</span><strong style="box-sizing: border-box;"><span leaf=""> (指令，回复)</span></strong><span leaf=""> 样本对模型进行再训练，让模型更擅长对话、执行任务，并更符合人类偏好。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">但一个越来越常见、也让算法团队颇为头疼的现象是：</span><strong style="box-sizing: border-box;"><span leaf="">数据并不是越多越好</span></strong><span leaf="">。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在真实的指令数据池中，冗余样本、噪声数据、格式不一致以及任务类型混杂都非常普遍。更反直觉的是，越来越多的研究发现：</span><strong style="box-sizing: border-box;"><span leaf="">只使用 10%–20% 的训练数据，模型效果就可以接近甚至超过使用全部数据训练的结果。</span></strong><span leaf="">这意味着一件非常重要的事情：</span><strong style="box-sizing: border-box;"><span leaf="">更大的微调数据规模，并不一定带来更好的模型效果。</span></strong><span leaf="">相反，当数据规模不断扩大时，训练成本迅速上升，而样本之间的相互干扰反而可能拖慢模型学习。因此，一个非常自然的问题出现了：</span><strong style="box-sizing: border-box;"><span leaf="">如果我们能从大数据池中挑选出一小部分“最有价值”的样本，是否可以用更少的数据训练出更好的模型？</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">近年来，学术界提出了一条非常优雅的思路：利用 </span><strong style="box-sizing: border-box;"><span leaf="">Fisher 信息矩阵（Fisher Information Matrix, FIM）</span></strong><span leaf=""> 来衡量每个样本能够为模型参数提供多少“信息量”。直观来说，如果一个样本的梯度能够为参数更新提供更多独立信息，那么它就更值得被选入训练集。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">基于这一思想，可以通过最大化</span></p></div><div style="text-align: center;box-sizing: border-box;"><p data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;font-family: Optima, &#39;Microsoft YaHei&#39;, PingFangSC-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;overflow-wrap: break-word;text-align: left;" data-pm-slice="0 0 []"><span style="cursor:pointer;" data-tool="mdnice编辑器"><p data-formula="\log \det (I + \alpha F_S)
" style="text-align: center;overflow-x: auto;overflow-y: auto;display: block;"><svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewBox="0 -750 7127.2 1000" aria-hidden="true" style="vertical-align: -0.566ex;width: 16.125ex;height: 2.262ex;max-width: 300% !important;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z"></path><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(278, 0)"></path><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" transform="translate(778, 0)"></path></g><g data-mml-node="mo" transform="translate(1278, 0)"><path data-c="2061" d=""></path></g><g data-mml-node="mo" transform="translate(1444.7, 0)"><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z"></path><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(556, 0)"></path><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(1000, 0)"></path></g><g data-mml-node="mo" transform="translate(2833.7, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(3222.7, 0)"><path data-c="49" d="M43 1Q26 1 26 10Q26 12 29 24Q34 43 39 45Q42 46 54 46H60Q120 46 136 53Q137 53 138 54Q143 56 149 77T198 273Q210 318 216 344Q286 624 286 626Q284 630 284 631Q274 637 213 637H193Q184 643 189 662Q193 677 195 680T209 683H213Q285 681 359 681Q481 681 487 683H497Q504 676 504 672T501 655T494 639Q491 637 471 637Q440 637 407 634Q393 631 388 623Q381 609 337 432Q326 385 315 341Q245 65 245 59Q245 52 255 50T307 46H339Q345 38 345 37T342 19Q338 6 332 0H316Q279 2 179 2Q143 2 113 2T65 2T43 1Z"></path></g><g data-mml-node="mo" transform="translate(3948.9, 0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="mi" transform="translate(4949.1, 0)"><path data-c="3B1" d="M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z"></path></g><g data-mml-node="msub" transform="translate(5589.1, 0)"><g data-mml-node="mi"><path data-c="46" d="M48 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H742Q749 676 749 669Q749 664 736 557T722 447Q720 440 702 440H690Q683 445 683 453Q683 454 686 477T689 530Q689 560 682 579T663 610T626 626T575 633T503 634H480Q398 633 393 631Q388 629 386 623Q385 622 352 492L320 363H375Q378 363 398 363T426 364T448 367T472 374T489 386Q502 398 511 419T524 457T529 475Q532 480 548 480H560Q567 475 567 470Q567 467 536 339T502 207Q500 200 482 200H470Q463 206 463 212Q463 215 468 234T473 274Q473 303 453 310T364 317H309L277 190Q245 66 245 60Q245 46 334 46H359Q365 40 365 39T363 19Q359 6 353 0H336Q295 2 185 2Q120 2 86 2T48 1Z"></path></g><g data-mml-node="mi" transform="translate(643, -150) scale(0.707)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g></g><g data-mml-node="mo" transform="translate(6738.2, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g><g></g></svg></p></span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这样的信息体积指标来选择数据子集。这个目标函数具有一个非常漂亮的性质——</span><strong style="box-sizing: border-box;"><span leaf="">次模性（submodularity）</span></strong><span leaf="">：意味着即使使用简单的贪心算法，也能获得接近最优解的理论保证。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">然而，在实际工程中，我们经常会看到另一面。当仅依据 Fisher 信息进行贪心选择时，</span><strong style="box-sizing: border-box;"><span leaf="">边际信息增益往往会非常快地衰减</span></strong><span leaf="">：随着选择过程继续进行，新加入样本带来的信息越来越少，最终导致数据子集的质量不稳定，下游模型效果也会出现波动。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">进一步分析后，我们发现，一个被忽略的重要因素是：</span><strong style="box-sizing: border-box;"><span leaf="">样本之间的梯度冲突（gradient conflict）</span></strong><span leaf="">。简单来说，不同样本在训练时会产生不同方向的梯度更新，如果这些更新方向彼此不一致，甚至互相对抗，那么即使每个样本单独来看都“信息量很高”，它们组合在一起时，也可能互相抵消，从而加速信息增益的衰减。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">从更广义的角度看，</span><strong style="box-sizing: border-box;"><span leaf="">数据选择其实包含两个层面的关系</span></strong><span leaf="">：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">一是</span><strong style="box-sizing: border-box;"><span leaf=""> 样本与模型之间的关系</span></strong><span leaf="">——每个样本能为模型参数带来多少有效信息；</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">二是</span><strong style="box-sizing: border-box;"><span leaf=""> 样本与样本之间的关系</span></strong><span leaf="">——不同样本在训练过程中是相互协同，还是彼此冲突。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">过去的大多数方法主要关注第一点，而我们的工作则尝试把这两个关键因素联系起来：</span><strong style="box-sizing: border-box;"><span leaf="">在最大化样本信息量的同时，显式建模样本之间的梯度</span></strong><strong style="box-sizing: border-box;"><span leaf="">冲突</span></strong><span leaf="">。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们的论文</span><strong style="box-sizing: border-box;"><span leaf=""> SPICE（Submodular Penalized Information-Conflict Selection） </span></strong><span leaf="">正是为了解决这个问题。该论文已被</span><strong style="box-sizing: border-box;"><span leaf=""> ICLR 2026 </span></strong><span leaf="">接收（arXiv:2601.23155）。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.29814814814814816" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=c0971056&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSQKjK4HKhcx5lnMOKuv11lWQia4yOrs60DicMviabTochrypmvddUx2K5Lb73diaXl6WJNYy9MDoia3nrTyhriajI1XNoxe57m6ykr0%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">SPICE 的核心思想是：在保持</span><strong style="box-sizing: border-box;"><span leaf=""> Fisher 信息最大化</span></strong><span leaf=""> 这一理论框架的同时，把 </span><strong style="box-sizing: border-box;"><span leaf="">样本之间的梯度冲突（gradient conflict）</span></strong><span leaf=""> 也纳入数据选择目标。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这样一来，算法在选择样本时不仅考虑“信息量有多大”，还会考虑“这些信息是否彼此一致”。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">最终的效果是：在不牺牲 </span><strong style="box-sizing: border-box;"><span leaf="">次模贪心算法效率</span></strong><span leaf=""> 的前提下，我们能够选出 </span><strong style="box-sizing: border-box;"><span leaf="">信息量更高、冲突更低</span></strong><span leaf=""> 的数据子集，让 </span><strong style="box-sizing: border-box;"><span leaf="">10% 的数据真正训练出接近甚至超过全量数据的效果</span></strong><span leaf="">。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4324074074074074" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=9d547e87&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SRgIb0VhlWbTbxaMibV827eOkkNoA3u4laUmBiamdH9EhWAiaf0bIP6uwbIaiaRhRuZ1LkGeOkc1Ul6x2WfkaiaoPfqBQrWOriaLID6w%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="font-size: 12px;box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf="">图1：边际信息增益 Δ 衰减越慢，同等预算下累计信息越大；实证上低冲突子集往往衰减更慢，信息更“耐用”。</span></em></sup></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">动机：为什么 Fisher 贪心</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">会越选越没用？</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在 Fisher 视角下，数据选择可以理解为一个非常直观的问题：</span><strong style="box-sizing: border-box;"><span leaf="">每个样本都会产生一个梯度信号，告诉模型参数应该往哪个方向更新</span></strong><span leaf="">。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">设第 i 个样本产生的梯度为：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;font-family: Optima, &#39;Microsoft YaHei&#39;, PingFangSC-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;overflow-wrap: break-word;text-align: left;" data-pm-slice="0 0 []"><span style="cursor:pointer;" data-tool="mdnice编辑器"><p data-formula="g_i = \nabla_\theta \ell_i
" style="text-align: center;overflow-x: auto;overflow-y: auto;display: block;"><svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewBox="0 -705 4030.1 910" aria-hidden="true" style="vertical-align: -0.464ex;width: 9.118ex;height: 2.059ex;max-width: 300% !important;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="67" d="M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"></path></g><g data-mml-node="mi" transform="translate(477, -150) scale(0.707)"><path data-c="69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(1048.7, 0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="msub" transform="translate(2104.5, 0)"><g data-mml-node="mi"><path data-c="2207" d="M46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596Z"></path></g><g data-mml-node="mi" transform="translate(833, -150) scale(0.707)"><path data-c="3B8" d="M35 200Q35 302 74 415T180 610T319 704Q320 704 327 704T339 705Q393 701 423 656Q462 596 462 495Q462 380 417 261T302 66T168 -10H161Q125 -10 99 10T60 63T41 130T35 200ZM383 566Q383 668 330 668Q294 668 260 623T204 521T170 421T157 371Q206 370 254 370L351 371Q352 372 359 404T375 484T383 566ZM113 132Q113 26 166 26Q181 26 198 36T239 74T287 161T335 307L340 324H145Q145 321 136 286T120 208T113 132Z"></path></g></g><g data-mml-node="msub" transform="translate(3319.1, 0)"><g data-mml-node="mi"><path data-c="2113" d="M345 104T349 104T361 95T369 80T352 59Q268 -20 206 -20Q170 -20 146 3T113 53T99 104L94 129Q94 130 79 116T48 86T28 70Q22 70 15 79T7 94Q7 98 12 103T58 147L91 179V185Q91 186 91 191T92 200Q92 282 128 400T223 612T336 705Q397 705 397 636V627Q397 453 194 233Q185 223 180 218T174 211T171 208T165 201L163 186Q159 142 159 123Q159 17 208 17Q228 17 253 30T293 56T335 94Q345 104 349 104ZM360 634Q360 655 354 661T336 668Q328 668 322 666T302 645T272 592Q252 547 229 467T192 330L179 273Q179 272 186 280T204 300T221 322Q327 453 355 590Q360 612 360 634Z"></path></g><g data-mml-node="mi" transform="translate(417, -150) scale(0.707)"><path data-c="69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g></g></g><g></g></svg></p></span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">如果我们选择一个数据子集 S，那么对应的经验 Fisher 信息矩阵可以写成：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;font-family: Optima, &#39;Microsoft YaHei&#39;, PingFangSC-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;overflow-wrap: break-word;text-align: left;" data-pm-slice="0 0 []"><span style="cursor:pointer;" data-tool="mdnice编辑器"><p data-formula="F_S=\sum_{i\in S} g_i g_i^\top
" style="text-align: center;overflow-x: auto;overflow-y: auto;display: block;"><svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewBox="0 -950 5941.4 2193.8" aria-hidden="true" style="vertical-align: -2.814ex;width: 13.442ex;height: 4.963ex;max-width: 300% !important;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="46" d="M48 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H742Q749 676 749 669Q749 664 736 557T722 447Q720 440 702 440H690Q683 445 683 453Q683 454 686 477T689 530Q689 560 682 579T663 610T626 626T575 633T503 634H480Q398 633 393 631Q388 629 386 623Q385 622 352 492L320 363H375Q378 363 398 363T426 364T448 367T472 374T489 386Q502 398 511 419T524 457T529 475Q532 480 548 480H560Q567 475 567 470Q567 467 536 339T502 207Q500 200 482 200H470Q463 206 463 212Q463 215 468 234T473 274Q473 303 453 310T364 317H309L277 190Q245 66 245 60Q245 46 334 46H359Q365 40 365 39T363 19Q359 6 353 0H336Q295 2 185 2Q120 2 86 2T48 1Z"></path></g><g data-mml-node="mi" transform="translate(643, -150) scale(0.707)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g></g><g data-mml-node="mo" transform="translate(1426.9, 0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="munder" transform="translate(2482.6, 0)"><g data-mml-node="mo"><path data-c="2211" d="M60 948Q63 950 665 950H1267L1325 815Q1384 677 1388 669H1348L1341 683Q1320 724 1285 761Q1235 809 1174 838T1033 881T882 898T699 902H574H543H251L259 891Q722 258 724 252Q725 250 724 246Q721 243 460 -56L196 -356Q196 -357 407 -357Q459 -357 548 -357T676 -358Q812 -358 896 -353T1063 -332T1204 -283T1307 -196Q1328 -170 1348 -124H1388Q1388 -125 1381 -145T1356 -210T1325 -294L1267 -449L666 -450Q64 -450 61 -448Q55 -446 55 -439Q55 -437 57 -433L590 177Q590 178 557 222T452 366T322 544L56 909L55 924Q55 945 60 948Z"></path></g><g data-mml-node="TeXAtom" transform="translate(136.2, -1115.5) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mo" transform="translate(345, 0)"><path data-c="2208" d="M84 250Q84 372 166 450T360 539Q361 539 377 539T419 540T469 540H568Q583 532 583 520Q583 511 570 501L466 500Q355 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H568Q583 262 583 250T568 230H124V228Q124 207 134 177T167 112T231 48T328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 446 -40T417 -41Q262 -41 172 45Q84 127 84 250Z"></path></g><g data-mml-node="mi" transform="translate(1012, 0)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g></g></g><g data-mml-node="msub" transform="translate(4093.3, 0)"><g data-mml-node="mi"><path data-c="67" d="M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"></path></g><g data-mml-node="mi" transform="translate(477, -150) scale(0.707)"><path data-c="69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="msubsup" transform="translate(4864.3, 0)"><g data-mml-node="mi"><path data-c="67" d="M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"></path></g><g data-mml-node="mi" transform="translate(477, 413) scale(0.707)"><path data-c="22A4" d="M55 642T55 648T59 659T66 666T71 668H708Q723 660 723 648T708 628H409V15Q402 2 391 0Q387 0 384 1T379 3T375 6T373 9T371 13T369 16V628H71Q70 628 67 630T59 637Z"></path></g><g data-mml-node="mi" transform="translate(477, -247) scale(0.707)"><path data-c="69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g></g></g><g></g></svg></p></span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">直观来说，这个矩阵描述的是：</span><strong style="box-sizing: border-box;"><span leaf="">这些样本一共为模型参数提供了多少“可学习的信息方向”</span></strong><span leaf="">。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">常见的数据选择目标是最大化以下信息量：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;font-family: Optima, &#39;Microsoft YaHei&#39;, PingFangSC-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;overflow-wrap: break-word;text-align: left;" data-pm-slice="0 0 []"><span style="cursor:pointer;" data-tool="mdnice编辑器"><p data-formula="F(S)= \log \det (I + \alpha F_S)
" style="text-align: center;overflow-x: auto;overflow-y: auto;display: block;"><svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewBox="0 -750 10632.8 1000" aria-hidden="true" style="vertical-align: -0.566ex;width: 24.056ex;height: 2.262ex;max-width: 300% !important;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="46" d="M48 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H742Q749 676 749 669Q749 664 736 557T722 447Q720 440 702 440H690Q683 445 683 453Q683 454 686 477T689 530Q689 560 682 579T663 610T626 626T575 633T503 634H480Q398 633 393 631Q388 629 386 623Q385 622 352 492L320 363H375Q378 363 398 363T426 364T448 367T472 374T489 386Q502 398 511 419T524 457T529 475Q532 480 548 480H560Q567 475 567 470Q567 467 536 339T502 207Q500 200 482 200H470Q463 206 463 212Q463 215 468 234T473 274Q473 303 453 310T364 317H309L277 190Q245 66 245 60Q245 46 334 46H359Q365 40 365 39T363 19Q359 6 353 0H336Q295 2 185 2Q120 2 86 2T48 1Z"></path></g><g data-mml-node="mo" transform="translate(749, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(1138, 0)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="mo" transform="translate(1783, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(2449.8, 0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mi" transform="translate(3505.6, 0)"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z"></path><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(278, 0)"></path><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" transform="translate(778, 0)"></path></g><g data-mml-node="mo" transform="translate(4783.6, 0)"><path data-c="2061" d=""></path></g><g data-mml-node="mo" transform="translate(4950.2, 0)"><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z"></path><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(556, 0)"></path><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(1000, 0)"></path></g><g data-mml-node="mo" transform="translate(6339.2, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(6728.2, 0)"><path data-c="49" d="M43 1Q26 1 26 10Q26 12 29 24Q34 43 39 45Q42 46 54 46H60Q120 46 136 53Q137 53 138 54Q143 56 149 77T198 273Q210 318 216 344Q286 624 286 626Q284 630 284 631Q274 637 213 637H193Q184 643 189 662Q193 677 195 680T209 683H213Q285 681 359 681Q481 681 487 683H497Q504 676 504 672T501 655T494 639Q491 637 471 637Q440 637 407 634Q393 631 388 623Q381 609 337 432Q326 385 315 341Q245 65 245 59Q245 52 255 50T307 46H339Q345 38 345 37T342 19Q338 6 332 0H316Q279 2 179 2Q143 2 113 2T65 2T43 1Z"></path></g><g data-mml-node="mo" transform="translate(7454.4, 0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="mi" transform="translate(8454.7, 0)"><path data-c="3B1" d="M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z"></path></g><g data-mml-node="msub" transform="translate(9094.7, 0)"><g data-mml-node="mi"><path data-c="46" d="M48 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H742Q749 676 749 669Q749 664 736 557T722 447Q720 440 702 440H690Q683 445 683 453Q683 454 686 477T689 530Q689 560 682 579T663 610T626 626T575 633T503 634H480Q398 633 393 631Q388 629 386 623Q385 622 352 492L320 363H375Q378 363 398 363T426 364T448 367T472 374T489 386Q502 398 511 419T524 457T529 475Q532 480 548 480H560Q567 475 567 470Q567 467 536 339T502 207Q500 200 482 200H470Q463 206 463 212Q463 215 468 234T473 274Q473 303 453 310T364 317H309L277 190Q245 66 245 60Q245 46 334 46H359Q365 40 365 39T363 19Q359 6 353 0H336Q295 2 185 2Q120 2 86 2T48 1Z"></path></g><g data-mml-node="mi" transform="translate(643, -150) scale(0.707)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g></g><g data-mml-node="mo" transform="translate(10243.8, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g><g></g></svg></p></span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这个目标函数具有一个非常好的性质：</span><strong style="box-sizing: border-box;"><span leaf="">次模性（submodularity）</span></strong><span leaf="">。简单理解就是——</span><strong style="box-sizing: border-box;"><span leaf="">越往后选择新样本，能够带来的新增信息通常会越来越少</span></strong><span leaf="">。因此，使用简单的</span><strong style="box-sizing: border-box;"><span leaf="">贪心算法</span></strong><span leaf="">逐步选择样本，理论上就能得到接近最优的结果。但在真实的指令微调数据上，我们却经常观察到一个现象：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">边际信息增益并不是“平滑下降”，而是会出现“断崖式掉速”</span></strong><span leaf="">。换句话说，在选择到某个阶段之后，新加入的样本几乎不再提供新的有效信息，对模型训练的帮助也变得非常有限。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这显然超出了经典次模理论所描述的“渐进递减”行为。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">针对这种实践问题：SPICE 的关键观察是：这种“边际信息断崖式衰减”，往往会与</span><strong style="box-sizing: border-box;"><span leaf=""> gradient conflict（梯度冲突）</span></strong><span leaf=""> 同步出现。所谓梯度冲突，指的是不同样本在参数空间中产生</span><strong style="box-sizing: border-box;"><span leaf="">方向不一致甚至相反的更新信号</span></strong><span leaf="">。当这种情况发生时，就会出现一种现象：</span><strong style="box-sizing: border-box;"><span leaf="">单个样本的信息量看起来很大，但它们提供的新方向却很少</span></strong><span leaf="">。结果就是：Fisher 信息仍在增长，但</span><strong style="box-sizing: border-box;"><span leaf="">真正可累积的有效信息却越来越少</span></strong><span leaf="">。于是，贪心算法的边际增益会被迅速“消耗”，导致后续选择的样本对训练几乎没有帮助。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">基于这一观察，我们重新审视了 Fisher 数据选择的机制，并提出了三个关键问题：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Fisher 的边际信息增益到底由哪些项决定？</span></strong></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">其中哪些项在实际数据中会被梯度冲突放大，从而导致增益快速衰减？</span></strong></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">如果冲突确实是关键因素，能否把它做成一个可测量、可控制的惩罚项，并直接加入到贪心选择中？</span></strong></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">回答这些问题，正是 </span><strong style="box-sizing: border-box;"><span leaf="">SPICE 方法设计的出发点</span></strong><span leaf="">。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""> 方法：SPICE = 信息增益 − 冲突惩罚</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">SPICE 的核心思想其实非常简单：</span><strong style="box-sizing: border-box;"><span leaf="">在 Fisher 信息最大化的基础上，引入一个“梯度冲突惩罚项”</span></strong><span leaf="">。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这样，算法在选择样本时不仅会考虑</span><strong style="box-sizing: border-box;"><span leaf=""> 信息量有多大</span></strong><span leaf="">，还会考虑 </span><strong style="box-sizing: border-box;"><span leaf="">这些信息是否彼此一致</span></strong><span leaf="">。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">从方法设计的角度看，SPICE 的思路可以概括为三步：</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">把 Fisher 的边际信息增益拆解，找出真正导致增益衰减的因素；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">用一个工程上可计算的指标度量梯度冲突；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">在原有 Fisher 贪心算法上加入一个“软惩罚”，并配合自适应早停和 proxy 选择机制。</span></p></li></ol><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">下面我们依次来看。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1.边际增益的分解：衰减来自交互项</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在 Fisher 贪心选择中，我们关心的是每个候选样本的</span><strong style="box-sizing: border-box;"><span leaf="">边际信息增益</span></strong><span leaf="">：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;font-family: Optima, &#39;Microsoft YaHei&#39;, PingFangSC-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;overflow-wrap: break-word;text-align: left;" data-pm-slice="0 0 []"><span style="cursor:pointer;" data-tool="mdnice编辑器"><p data-formula="\Delta_x(S) = F(S \cup \{x\}) - F(S)
" style="text-align: center;overflow-x: auto;overflow-y: auto;display: block;"><svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewBox="0 -750 12293.9 1000" aria-hidden="true" style="vertical-align: -0.566ex;width: 27.814ex;height: 2.262ex;max-width: 300% !important;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="394" d="M51 0Q46 4 46 7Q46 9 215 357T388 709Q391 716 416 716Q439 716 444 709Q447 705 616 357T786 7Q786 4 781 0H51ZM507 344L384 596L137 92L383 91H630Q630 93 507 344Z"></path></g><g data-mml-node="mi" transform="translate(833, -150) scale(0.707)"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g></g><g data-mml-node="mo" transform="translate(1287.5, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(1676.5, 0)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="mo" transform="translate(2321.5, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(2988.2, 0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mi" transform="translate(4044, 0)"><path data-c="46" d="M48 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H742Q749 676 749 669Q749 664 736 557T722 447Q720 440 702 440H690Q683 445 683 453Q683 454 686 477T689 530Q689 560 682 579T663 610T626 626T575 633T503 634H480Q398 633 393 631Q388 629 386 623Q385 622 352 492L320 363H375Q378 363 398 363T426 364T448 367T472 374T489 386Q502 398 511 419T524 457T529 475Q532 480 548 480H560Q567 475 567 470Q567 467 536 339T502 207Q500 200 482 200H470Q463 206 463 212Q463 215 468 234T473 274Q473 303 453 310T364 317H309L277 190Q245 66 245 60Q245 46 334 46H359Q365 40 365 39T363 19Q359 6 353 0H336Q295 2 185 2Q120 2 86 2T48 1Z"></path></g><g data-mml-node="mo" transform="translate(4793, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(5182, 0)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="mo" transform="translate(6049.2, 0)"><path data-c="222A" d="M591 598H592Q604 598 611 583V376Q611 345 611 296Q610 162 606 148Q605 146 605 145Q586 68 507 23T333 -22Q268 -22 209 -1T106 66T56 173Q55 180 55 384L56 585Q66 598 75 598Q85 598 95 585V378L96 172L98 162Q112 95 181 57T332 18Q415 18 487 58T570 175Q571 180 571 383V583Q579 598 591 598Z"></path></g><g data-mml-node="mo" transform="translate(6938.5, 0)"><path data-c="7B" d="M434 -231Q434 -244 428 -250H410Q281 -250 230 -184Q225 -177 222 -172T217 -161T213 -148T211 -133T210 -111T209 -84T209 -47T209 0Q209 21 209 53Q208 142 204 153Q203 154 203 155Q189 191 153 211T82 231Q71 231 68 234T65 250T68 266T82 269Q116 269 152 289T203 345Q208 356 208 377T209 529V579Q209 634 215 656T244 698Q270 724 324 740Q361 748 377 749Q379 749 390 749T408 750H428Q434 744 434 732Q434 719 431 716Q429 713 415 713Q362 710 332 689T296 647Q291 634 291 499V417Q291 370 288 353T271 314Q240 271 184 255L170 250L184 245Q202 239 220 230T262 196T290 137Q291 131 291 1Q291 -134 296 -147Q306 -174 339 -192T415 -213Q429 -213 431 -216Q434 -219 434 -231Z"></path></g><g data-mml-node="mi" transform="translate(7438.5, 0)"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(8010.5, 0)"><path data-c="7D" d="M65 731Q65 745 68 747T88 750Q171 750 216 725T279 670Q288 649 289 635T291 501Q292 362 293 357Q306 312 345 291T417 269Q428 269 431 266T434 250T431 234T417 231Q380 231 345 210T298 157Q293 143 292 121T291 -28V-79Q291 -134 285 -156T256 -198Q202 -250 89 -250Q71 -250 68 -247T65 -230Q65 -224 65 -223T66 -218T69 -214T77 -213Q91 -213 108 -210T146 -200T183 -177T207 -139Q208 -134 209 3L210 139Q223 196 280 230Q315 247 330 250Q305 257 280 270Q225 304 212 352L210 362L209 498Q208 635 207 640Q195 680 154 696T77 713Q68 713 67 716T65 731Z"></path></g><g data-mml-node="mo" transform="translate(8510.5, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(9121.7, 0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mi" transform="translate(10121.9, 0)"><path data-c="46" d="M48 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H742Q749 676 749 669Q749 664 736 557T722 447Q720 440 702 440H690Q683 445 683 453Q683 454 686 477T689 530Q689 560 682 579T663 610T626 626T575 633T503 634H480Q398 633 393 631Q388 629 386 623Q385 622 352 492L320 363H375Q378 363 398 363T426 364T448 367T472 374T489 386Q502 398 511 419T524 457T529 475Q532 480 548 480H560Q567 475 567 470Q567 467 536 339T502 207Q500 200 482 200H470Q463 206 463 212Q463 215 468 234T473 274Q473 303 453 310T364 317H309L277 190Q245 66 245 60Q245 46 334 46H359Q365 40 365 39T363 19Q359 6 353 0H336Q295 2 185 2Q120 2 86 2T48 1Z"></path></g><g data-mml-node="mo" transform="translate(10870.9, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(11259.9, 0)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="mo" transform="translate(11904.9, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g><g></g></svg></p></span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">SPICE 的第一步，是把这个增益拆解为两部分：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;font-family: Optima, &#39;Microsoft YaHei&#39;, PingFangSC-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;overflow-wrap: break-word;text-align: left;" data-pm-slice="0 0 []"><span style="cursor:pointer;" data-tool="mdnice编辑器"><p data-formula="\Delta_x(S) = \underbrace{\log\!\left(1 + \alpha \lVert g_x \rVert_2^{2}\right)}_{\text{base: 单点强度}} +\underbrace{\varepsilon_x(S)}_{\text{interaction: 交互扰动}}
" style="text-align: center;overflow-x: auto;overflow-y: auto;display: block;"><svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewBox="0 -883.9 18516.6 2852.2" aria-hidden="true" style="vertical-align: -4.453ex;width: 41.893ex;height: 6.453ex;max-width: 300% !important;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="394" d="M51 0Q46 4 46 7Q46 9 215 357T388 709Q391 716 416 716Q439 716 444 709Q447 705 616 357T786 7Q786 4 781 0H51ZM507 344L384 596L137 92L383 91H630Q630 93 507 344Z"></path></g><g data-mml-node="mi" transform="translate(833, -150) scale(0.707)"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g></g><g data-mml-node="mo" transform="translate(1287.5, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(1676.5, 0)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="mo" transform="translate(2321.5, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(2988.2, 0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="munder" transform="translate(4044, 0)"><g data-mml-node="TeXAtom" data-mjx-texclass="OP"><g data-mml-node="munder"><g data-mml-node="mrow"><g data-mml-node="mi"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z"></path><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(278, 0)"></path><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" transform="translate(778, 0)"></path></g><g data-mml-node="mstyle" transform="translate(1444.7, 0)"><g data-mml-node="mspace"></g></g><g data-mml-node="mrow" transform="translate(1278, 0)"><g data-mml-node="mo"><path data-c="28" d="M152 251Q152 646 388 850H416Q422 844 422 841Q422 837 403 816T357 753T302 649T255 482T236 250Q236 124 255 19T301 -147T356 -251T403 -315T422 -340Q422 -343 416 -349H388Q359 -325 332 -296T271 -213T212 -97T170 56T152 251Z"></path></g><g data-mml-node="mn" transform="translate(458, 0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mo" transform="translate(1180.2, 0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="mi" transform="translate(2180.4, 0)"><path data-c="3B1" d="M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z"></path></g><g data-mml-node="mo" transform="translate(2820.4, 0)"><path data-c="2016" d="M133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739Z"></path></g><g data-mml-node="msub" transform="translate(3320.4, 0)"><g data-mml-node="mi"><path data-c="67" d="M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"></path></g><g data-mml-node="mi" transform="translate(477, -150) scale(0.707)"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g></g><g data-mml-node="msubsup" transform="translate(4251.9, 0)"><g data-mml-node="mo"><path data-c="2016" d="M133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739Z"></path></g><g data-mml-node="TeXAtom" transform="translate(500, 413) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g></g><g data-mml-node="mn" transform="translate(500, -247) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g></g><g data-mml-node="mo" transform="translate(5155.5, 0)"><path data-c="29" d="M305 251Q305 -145 69 -349H56Q43 -349 39 -347T35 -338Q37 -333 60 -307T108 -239T160 -136T204 27T221 250T204 473T160 636T108 740T60 807T35 839Q35 850 50 850H56H69Q197 743 256 566Q305 425 305 251Z"></path></g></g></g><g data-mml-node="mo" transform="translate(0, -729.5)"><path data-c="E152" d="M-24 327L-18 333H-1Q11 333 15 333T22 329T27 322T35 308T54 284Q115 203 225 162T441 120Q454 120 457 117T460 95V60V28Q460 8 457 4T442 0Q355 0 260 36Q75 118 -16 278L-24 292V327Z"></path><path data-c="E153" d="M-10 60V95Q-10 113 -7 116T9 120Q151 120 250 171T396 284Q404 293 412 305T424 324T431 331Q433 333 451 333H468L474 327V292L466 278Q375 118 190 36Q95 0 8 0Q-5 0 -7 3T-10 24V60Z" transform="translate(6441.5, 0)"></path><g data-c="E156" transform="translate(2995.7, 0)"><path data-c="E151" d="M-10 60Q-10 104 -10 111T-5 118Q-1 120 10 120Q96 120 190 84Q375 2 466 -158L474 -172V-207L468 -213H451H447Q437 -213 434 -213T428 -209T423 -202T414 -187T396 -163Q331 -82 224 -41T9 0Q-4 0 -7 3T-10 25V60Z"></path><path data-c="E150" d="M-18 -213L-24 -207V-172L-16 -158Q75 2 260 84Q334 113 415 119Q418 119 427 119T440 120Q454 120 457 117T460 98V60V25Q460 7 457 4T441 0Q308 0 193 -55T25 -205Q21 -211 18 -212T-1 -213H-18Z" transform="translate(450, 0)"></path></g><svg width="2745.7" height="720" x="350" y="-300" viewBox="686.4 -300 2745.7 720" style="max-width: 300% !important;"><path data-c="E154" d="M-10 0V120H410V0H-10Z" transform="scale(10.296, 1)"></path><g></g></svg><svg width="2745.7" height="720" x="3795.7" y="-300" viewBox="686.4 -300 2745.7 720" style="max-width: 300% !important;"><path data-c="E154" d="M-10 0V120H410V0H-10Z" transform="scale(10.296, 1)"></path><g></g></svg></g></g></g><g data-mml-node="TeXAtom" transform="translate(1267.7, -1726.8) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mtext"><path data-c="62" d="M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z"></path><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(556, 0)"></path><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(1056, 0)"></path><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1450, 0)"></path><path data-c="3A" d="M78 370Q78 394 95 412T138 430Q162 430 180 414T199 371Q199 346 182 328T139 310T96 327T78 370ZM78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60Z" transform="translate(1894, 0)"></path><path data-c="20" d="" transform="translate(2172, 0)"></path><text data-variant="normal" transform="translate(2422, 0) matrix(1 0 0 -1 0 0)" font-size="934.6px" font-family="serif"><tspan leaf="">单</tspan></text><text data-variant="normal" transform="translate(3356.6, 0) matrix(1 0 0 -1 0 0)" font-size="934.6px" font-family="serif"><tspan leaf="">点</tspan></text><text data-variant="normal" transform="translate(4291.2, 0) matrix(1 0 0 -1 0 0)" font-size="934.6px" font-family="serif"><tspan leaf="">强</tspan></text><text data-variant="normal" transform="translate(5225.9, 0) matrix(1 0 0 -1 0 0)" font-size="934.6px" font-family="serif"><tspan leaf="">度</tspan></text></g></g></g><g data-mml-node="mo" transform="translate(11157.7, 0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="munder" transform="translate(12157.9, 0)"><g data-mml-node="TeXAtom" data-mjx-texclass="OP" transform="translate(2007.6, 0)"><g data-mml-node="munder"><g data-mml-node="mrow"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="3B5" d="M190 -22Q124 -22 76 11T27 107Q27 174 97 232L107 239L99 248Q76 273 76 304Q76 364 144 408T290 452H302Q360 452 405 421Q428 405 428 392Q428 381 417 369T391 356Q382 356 371 365T338 383T283 392Q217 392 167 368T116 308Q116 289 133 272Q142 263 145 262T157 264Q188 278 238 278H243Q308 278 308 247Q308 206 223 206Q177 206 142 219L132 212Q68 169 68 112Q68 39 201 39Q253 39 286 49T328 72T345 94T362 105Q376 103 376 88Q376 79 365 62T334 26T275 -8T190 -22Z"></path></g><g data-mml-node="mi" transform="translate(466, -150) scale(0.707)"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g></g><g data-mml-node="mo" transform="translate(920.5, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(1309.5, 0)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="mo" transform="translate(1954.5, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g><g data-mml-node="mo" transform="translate(0, -630)"><path data-c="E152" d="M-24 327L-18 333H-1Q11 333 15 333T22 329T27 322T35 308T54 284Q115 203 225 162T441 120Q454 120 457 117T460 95V60V28Q460 8 457 4T442 0Q355 0 260 36Q75 118 -16 278L-24 292V327Z"></path><path data-c="E153" d="M-10 60V95Q-10 113 -7 116T9 120Q151 120 250 171T396 284Q404 293 412 305T424 324T431 331Q433 333 451 333H468L474 327V292L466 278Q375 118 190 36Q95 0 8 0Q-5 0 -7 3T-10 24V60Z" transform="translate(1893.5, 0)"></path><g data-c="E156" transform="translate(721.7, 0)"><path data-c="E151" d="M-10 60Q-10 104 -10 111T-5 118Q-1 120 10 120Q96 120 190 84Q375 2 466 -158L474 -172V-207L468 -213H451H447Q437 -213 434 -213T428 -209T423 -202T414 -187T396 -163Q331 -82 224 -41T9 0Q-4 0 -7 3T-10 25V60Z"></path><path data-c="E150" d="M-18 -213L-24 -207V-172L-16 -158Q75 2 260 84Q334 113 415 119Q418 119 427 119T440 120Q454 120 457 117T460 98V60V25Q460 7 457 4T441 0Q308 0 193 -55T25 -205Q21 -211 18 -212T-1 -213H-18Z" transform="translate(450, 0)"></path></g><svg width="471.7" height="720" x="350" y="-300" viewBox="117.9 -300 471.7 720" style="max-width: 300% !important;"><path data-c="E154" d="M-10 0V120H410V0H-10Z" transform="scale(1.769, 1)"></path><g></g></svg><svg width="471.7" height="720" x="1521.7" y="-300" viewBox="117.9 -300 471.7 720" style="max-width: 300% !important;"><path data-c="E154" d="M-10 0V120H410V0H-10Z" transform="scale(1.769, 1)"></path><g></g></svg></g></g></g><g data-mml-node="TeXAtom" transform="translate(0, -1627.3) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mtext"><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z"></path><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(278, 0)"></path><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(834, 0)"></path><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1223, 0)"></path><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(1667, 0)"></path><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(2059, 0)"></path><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" transform="translate(2559, 0)"></path><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(3003, 0)"></path><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(3392, 0)"></path><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(3670, 0)"></path><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(4170, 0)"></path><path data-c="3A" d="M78 370Q78 394 95 412T138 430Q162 430 180 414T199 371Q199 346 182 328T139 310T96 327T78 370ZM78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60Z" transform="translate(4726, 0)"></path><path data-c="20" d="" transform="translate(5004, 0)"></path><text data-variant="normal" transform="translate(5254, 0) matrix(1 0 0 -1 0 0)" font-size="934.6px" font-family="serif"><tspan leaf="">交</tspan></text><text data-variant="normal" transform="translate(6188.6, 0) matrix(1 0 0 -1 0 0)" font-size="934.6px" font-family="serif"><tspan leaf="">互</tspan></text><text data-variant="normal" transform="translate(7123.2, 0) matrix(1 0 0 -1 0 0)" font-size="934.6px" font-family="serif"><tspan leaf="">扰</tspan></text><text data-variant="normal" transform="translate(8057.9, 0) matrix(1 0 0 -1 0 0)" font-size="934.6px" font-family="serif"><tspan leaf="">动</tspan></text></g></g></g></g></g><g></g></svg></p></span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">直观理解：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第一项（base）</span></strong><span leaf="">只反映这个样本本身的梯度强度，也就是它单独能提供多少信息。</span><strong style="box-sizing: border-box;"><span leaf="">第二项（interaction）</span></strong><span leaf="">描述这个样本与当前已选集合 S 的</span><strong style="box-sizing: border-box;"><span leaf="">交互影响</span></strong><span leaf="">。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">关键在于：</span><strong style="box-sizing: border-box;"><span leaf="">真正导致信息增益快速衰减的，其实是这个交互项</span></strong><span leaf="">。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">当当前集合已经覆盖了相似的梯度方向，或者不同样本之间存在方向冲突时，新样本能够提供的“新方向信息”就会迅速减少。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2.冲突度量：用平均梯度方向做代理</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">既然交互项与梯度方向有关，一个自然的问题是：</span><strong style="box-sizing: border-box;"><span leaf="">如何高效度量样本之间的梯度冲突？</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">如果直接计算所有样本两两之间的关系，计算成本会非常高。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">SPICE 采用了一种更工程友好的近似方法。我们维护当前集合的</span><strong style="box-sizing: border-box;"><span leaf="">平均梯度方向</span></strong><span leaf="">：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;font-family: Optima, &#39;Microsoft YaHei&#39;, PingFangSC-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;overflow-wrap: break-word;text-align: left;" data-pm-slice="0 0 []"><span style="cursor:pointer;" data-tool="mdnice编辑器"><p data-formula="\bar{g} = \frac{1}{|S|} \sum_{x \in S} g_x
" style="text-align: center;overflow-x: auto;overflow-y: auto;display: block;"><svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewBox="0 -1342 6211.2 2585.8" aria-hidden="true" style="vertical-align: -2.814ex;width: 14.052ex;height: 5.85ex;max-width: 300% !important;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi" transform="translate(11.5, 0)"><path data-c="67" d="M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"></path></g><g data-mml-node="mo" transform="translate(27.8, -42)"><path data-c="AF" d="M69 544V590H430V544H69Z"></path></g></g></g><g data-mml-node="mo" transform="translate(805.6, 0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mfrac" transform="translate(1861.4, 0)"><g data-mml-node="mn" transform="translate(570.5, 676)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g><g data-mml-node="mrow" transform="translate(220, -709.5)"><g data-mml-node="mo"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></g><g data-mml-node="mi" transform="translate(278, 0)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="mo" transform="translate(923, 0)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></g></g><rect width="1401" height="60" x="120" y="220"></rect></g><g data-mml-node="munder" transform="translate(3669, 0)"><g data-mml-node="mo"><path data-c="2211" d="M60 948Q63 950 665 950H1267L1325 815Q1384 677 1388 669H1348L1341 683Q1320 724 1285 761Q1235 809 1174 838T1033 881T882 898T699 902H574H543H251L259 891Q722 258 724 252Q725 250 724 246Q721 243 460 -56L196 -356Q196 -357 407 -357Q459 -357 548 -357T676 -358Q812 -358 896 -353T1063 -332T1204 -283T1307 -196Q1328 -170 1348 -124H1388Q1388 -125 1381 -145T1356 -210T1325 -294L1267 -449L666 -450Q64 -450 61 -448Q55 -446 55 -439Q55 -437 57 -433L590 177Q590 178 557 222T452 366T322 544L56 909L55 924Q55 945 60 948Z"></path></g><g data-mml-node="TeXAtom" transform="translate(55.9, -1115.5) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(572, 0)"><path data-c="2208" d="M84 250Q84 372 166 450T360 539Q361 539 377 539T419 540T469 540H568Q583 532 583 520Q583 511 570 501L466 500Q355 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H568Q583 262 583 250T568 230H124V228Q124 207 134 177T167 112T231 48T328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 446 -40T417 -41Q262 -41 172 45Q84 127 84 250Z"></path></g><g data-mml-node="mi" transform="translate(1239, 0)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g></g></g><g data-mml-node="msub" transform="translate(5279.7, 0)"><g data-mml-node="mi"><path data-c="67" d="M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"></path></g><g data-mml-node="mi" transform="translate(477, -150) scale(0.707)"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g></g></g></g><g></g></svg></p></span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">然后用</span><strong style="box-sizing: border-box;"><span leaf="">余弦相似度</span></strong><span leaf="">衡量新样本与当前更新方向的对齐程度：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;font-family: Optima, &#39;Microsoft YaHei&#39;, PingFangSC-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;overflow-wrap: break-word;text-align: left;" data-pm-slice="0 0 []"><span style="cursor:pointer;" data-tool="mdnice编辑器"><p data-formula="\mathrm{Align}(g_i) = \frac{g_i^\top \bar{g}} {\lVert g_i \rVert \, \lVert \bar{g} \rVert + \eta}
" style="text-align: center;overflow-x: auto;overflow-y: auto;display: block;"><svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewBox="0 -1587.5 10869.4 2547.5" aria-hidden="true" style="vertical-align: -2.172ex;width: 24.591ex;height: 5.764ex;max-width: 300% !important;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="41" d="M255 0Q240 3 140 3Q48 3 39 0H32V46H47Q119 49 139 88Q140 91 192 245T295 553T348 708Q351 716 366 716H376Q396 715 400 709Q402 707 508 390L617 67Q624 54 636 51T687 46H717V0H708Q699 3 581 3Q458 3 437 0H427V46H440Q510 46 510 64Q510 66 486 138L462 209H229L209 150Q189 91 189 85Q189 72 209 59T259 46H264V0H255ZM447 255L345 557L244 256Q244 255 345 255H447Z"></path></g><g data-mml-node="mi" transform="translate(750, 0)"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z"></path></g><g data-mml-node="mi" transform="translate(1028, 0)"><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z"></path></g><g data-mml-node="mi" transform="translate(1306, 0)"><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z"></path></g><g data-mml-node="mi" transform="translate(1806, 0)"><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z"></path></g></g><g data-mml-node="mo" transform="translate(2362, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msub" transform="translate(2751, 0)"><g data-mml-node="mi"><path data-c="67" d="M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"></path></g><g data-mml-node="mi" transform="translate(477, -150) scale(0.707)"><path data-c="69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(3522, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(4188.7, 0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mfrac" transform="translate(5244.5, 0)"><g data-mml-node="mrow" transform="translate(2010, 752.2)"><g data-mml-node="msubsup"><g data-mml-node="mi"><path data-c="67" d="M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"></path></g><g data-mml-node="mi" transform="translate(477, 363) scale(0.707)"><path data-c="22A4" d="M55 642T55 648T59 659T66 666T71 668H708Q723 660 723 648T708 628H409V15Q402 2 391 0Q387 0 384 1T379 3T375 6T373 9T371 13T369 16V628H71Q70 628 67 630T59 637Z"></path></g><g data-mml-node="mi" transform="translate(477, -284.4) scale(0.707)"><path data-c="69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(1077.1, 0)"><g data-mml-node="mover"><g data-mml-node="mi" transform="translate(11.5, 0)"><path data-c="67" d="M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"></path></g><g data-mml-node="mo" transform="translate(27.8, -42)"><path data-c="AF" d="M69 544V590H430V544H69Z"></path></g></g></g></g><g data-mml-node="mrow" transform="translate(220, -710)"><g data-mml-node="mo"><path data-c="2016" d="M133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739Z"></path></g><g data-mml-node="msub" transform="translate(500, 0)"><g data-mml-node="mi"><path data-c="67" d="M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"></path></g><g data-mml-node="mi" transform="translate(477, -150) scale(0.707)"><path data-c="69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(1271, 0)"><path data-c="2016" d="M133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739Z"></path></g><g data-mml-node="mstyle" transform="translate(1771, 0)"><g data-mml-node="mspace"></g></g><g data-mml-node="mo" transform="translate(1937.6, 0)"><path data-c="2016" d="M133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739Z"></path></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(2437.6, 0)"><g data-mml-node="mover"><g data-mml-node="mi" transform="translate(11.5, 0)"><path data-c="67" d="M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"></path></g><g data-mml-node="mo" transform="translate(27.8, -42)"><path data-c="AF" d="M69 544V590H430V544H69Z"></path></g></g></g><g data-mml-node="mo" transform="translate(2965.4, 0)"><path data-c="2016" d="M133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739Z"></path></g><g data-mml-node="mo" transform="translate(3687.6, 0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="mi" transform="translate(4687.9, 0)"><path data-c="3B7" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q156 442 175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336V326Q503 302 439 53Q381 -182 377 -189Q364 -216 332 -216Q319 -216 310 -208T299 -186Q299 -177 358 57L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g><rect width="5384.9" height="60" x="120" y="220"></rect></g></g></g><g></g></svg></p></span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">冲突则定义为：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;font-family: Optima, &#39;Microsoft YaHei&#39;, PingFangSC-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;overflow-wrap: break-word;text-align: left;" data-pm-slice="0 0 []"><span style="cursor:pointer;" data-tool="mdnice编辑器"><p data-formula="\mathrm{Conflict}(g_i) = \max\!\left(0,\,-\mathrm{Align}(g_i)\right)
" style="text-align: center;overflow-x: auto;overflow-y: auto;display: block;"><svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewBox="0 -750 15305.2 1000" aria-hidden="true" style="vertical-align: -0.566ex;width: 34.627ex;height: 2.262ex;max-width: 300% !important;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="43" d="M56 342Q56 428 89 500T174 615T283 681T391 705Q394 705 400 705T408 704Q499 704 569 636L582 624L612 663Q639 700 643 704Q644 704 647 704T653 705H657Q660 705 666 699V419L660 413H626Q620 419 619 430Q610 512 571 572T476 651Q457 658 426 658Q322 658 252 588Q173 509 173 342Q173 221 211 151Q232 111 263 84T328 45T384 29T428 24Q517 24 571 93T626 244Q626 251 632 257H660L666 251V236Q661 133 590 56T403 -21Q262 -21 159 83T56 342Z"></path></g><g data-mml-node="mi" transform="translate(722, 0)"><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z"></path></g><g data-mml-node="mi" transform="translate(1222, 0)"><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z"></path></g><g data-mml-node="mi" transform="translate(1778, 0)"><path data-c="66" d="M273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273Z"></path></g><g data-mml-node="mi" transform="translate(2150, 0)"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z"></path></g><g data-mml-node="mi" transform="translate(2428, 0)"><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z"></path></g><g data-mml-node="mi" transform="translate(2706, 0)"><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z"></path></g><g data-mml-node="mi" transform="translate(3150, 0)"><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z"></path></g></g><g data-mml-node="mo" transform="translate(3539, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msub" transform="translate(3928, 0)"><g data-mml-node="mi"><path data-c="67" d="M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"></path></g><g data-mml-node="mi" transform="translate(477, -150) scale(0.707)"><path data-c="69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(4699, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(5365.7, 0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mo" transform="translate(6421.5, 0)"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z"></path><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(833, 0)"></path><path data-c="78" d="M201 0Q189 3 102 3Q26 3 17 0H11V46H25Q48 47 67 52T96 61T121 78T139 96T160 122T180 150L226 210L168 288Q159 301 149 315T133 336T122 351T113 363T107 370T100 376T94 379T88 381T80 383Q74 383 44 385H16V431H23Q59 429 126 429Q219 429 229 431H237V385Q201 381 201 369Q201 367 211 353T239 315T268 274L272 270L297 304Q329 345 329 358Q329 364 327 369T322 376T317 380T310 384L307 385H302V431H309Q324 428 408 428Q487 428 493 431H499V385H492Q443 385 411 368Q394 360 377 341T312 257L296 236L358 151Q424 61 429 57T446 50Q464 46 499 46H516V0H510H502Q494 1 482 1T457 2T432 2T414 3Q403 3 377 3T327 1L304 0H295V46H298Q309 46 320 51T331 63Q331 65 291 120L250 175Q249 174 219 133T185 88Q181 83 181 74Q181 63 188 55T206 46Q208 46 208 23V0H201Z" transform="translate(1333, 0)"></path></g><g data-mml-node="mstyle" transform="translate(8449.2, 0)"><g data-mml-node="mspace"></g></g><g data-mml-node="mrow" transform="translate(8282.5, 0)"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mn" transform="translate(389, 0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path></g><g data-mml-node="mo" transform="translate(889, 0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"></path></g><g data-mml-node="mstyle" transform="translate(1333.7, 0)"><g data-mml-node="mspace"></g></g><g data-mml-node="mo" transform="translate(1722.6, 0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(2722.8, 0)"><g data-mml-node="mi"><path data-c="41" d="M255 0Q240 3 140 3Q48 3 39 0H32V46H47Q119 49 139 88Q140 91 192 245T295 553T348 708Q351 716 366 716H376Q396 715 400 709Q402 707 508 390L617 67Q624 54 636 51T687 46H717V0H708Q699 3 581 3Q458 3 437 0H427V46H440Q510 46 510 64Q510 66 486 138L462 209H229L209 150Q189 91 189 85Q189 72 209 59T259 46H264V0H255ZM447 255L345 557L244 256Q244 255 345 255H447Z"></path></g><g data-mml-node="mi" transform="translate(750, 0)"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z"></path></g><g data-mml-node="mi" transform="translate(1028, 0)"><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z"></path></g><g data-mml-node="mi" transform="translate(1306, 0)"><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z"></path></g><g data-mml-node="mi" transform="translate(1806, 0)"><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z"></path></g></g><g data-mml-node="mo" transform="translate(5084.8, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msub" transform="translate(5473.8, 0)"><g data-mml-node="mi"><path data-c="67" d="M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"></path></g><g data-mml-node="mi" transform="translate(477, -150) scale(0.707)"><path data-c="69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g></g><g data-mml-node="mo" transform="translate(6244.7, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(6633.7, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g></g><g></g></svg></p></span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这个度量非常直观：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">同方向（对齐）</span></strong><span leaf="">：不惩罚</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">反方向（冲突）</span></strong><span leaf="">：产生惩罚</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">计算复杂度低</span></strong><span leaf="">：只需要对每个候选样本计算一次</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">因此在大规模数据池中也可以高效运行。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4527777777777778" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=e5fc080f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SRsRicIykaTNzCyubKibyX0EacIVl9oyBAHFPob2BULRBEPiapQVYiagANHPloLXiaJMonNSfvsJ00Hbwldnyd938vPwPbFAVS2tyMI%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf="">图2：论文展示冲突统计量与边际增益衰减/交互项之间存在系统相关性，为“用冲突解释掉速”提供证据。</span></em></sup></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.冲突感知贪心：不丢信息，只降低冲突</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在得到冲突度量之后，SPICE 对原有 Fisher 贪心做了一个非常克制的修改：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;font-family: Optima, &#39;Microsoft YaHei&#39;, PingFangSC-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;overflow-wrap: break-word;text-align: left;" data-pm-slice="0 0 []"><span style="cursor:pointer;" data-tool="mdnice编辑器"><p data-formula="\mathrm{score}(x \mid S) = \Delta_x(S)-\lambda \cdot \mathrm{Conflict}(x \mid S)
" style="text-align: center;overflow-x: auto;overflow-y: auto;display: block;"><svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewBox="0 -750 17942 1000" aria-hidden="true" style="vertical-align: -0.566ex;width: 40.593ex;height: 2.262ex;max-width: 300% !important;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z"></path></g><g data-mml-node="mi" transform="translate(394, 0)"><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z"></path></g><g data-mml-node="mi" transform="translate(838, 0)"><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z"></path></g><g data-mml-node="mi" transform="translate(1338, 0)"><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z"></path></g><g data-mml-node="mi" transform="translate(1730, 0)"><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z"></path></g></g><g data-mml-node="mo" transform="translate(2174, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(2563, 0)"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(3412.8, 0)"><path data-c="2223" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></g><g data-mml-node="mi" transform="translate(3968.6, 0)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="mo" transform="translate(4613.6, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(5280.3, 0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="msub" transform="translate(6336.1, 0)"><g data-mml-node="mi"><path data-c="394" d="M51 0Q46 4 46 7Q46 9 215 357T388 709Q391 716 416 716Q439 716 444 709Q447 705 616 357T786 7Q786 4 781 0H51ZM507 344L384 596L137 92L383 91H630Q630 93 507 344Z"></path></g><g data-mml-node="mi" transform="translate(833, -150) scale(0.707)"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g></g><g data-mml-node="mo" transform="translate(7623.6, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(8012.6, 0)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="mo" transform="translate(8657.6, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(9268.8, 0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mi" transform="translate(10269, 0)"><path data-c="3BB" d="M166 673Q166 685 183 694H202Q292 691 316 644Q322 629 373 486T474 207T524 67Q531 47 537 34T546 15T551 6T555 2T556 -2T550 -11H482Q457 3 450 18T399 152L354 277L340 262Q327 246 293 207T236 141Q211 112 174 69Q123 9 111 -1T83 -12Q47 -12 47 20Q47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657Q166 657 166 673Z"></path></g><g data-mml-node="mo" transform="translate(11074.2, 0)"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z"></path></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(11574.5, 0)"><g data-mml-node="mi"><path data-c="43" d="M56 342Q56 428 89 500T174 615T283 681T391 705Q394 705 400 705T408 704Q499 704 569 636L582 624L612 663Q639 700 643 704Q644 704 647 704T653 705H657Q660 705 666 699V419L660 413H626Q620 419 619 430Q610 512 571 572T476 651Q457 658 426 658Q322 658 252 588Q173 509 173 342Q173 221 211 151Q232 111 263 84T328 45T384 29T428 24Q517 24 571 93T626 244Q626 251 632 257H660L666 251V236Q661 133 590 56T403 -21Q262 -21 159 83T56 342Z"></path></g><g data-mml-node="mi" transform="translate(722, 0)"><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z"></path></g><g data-mml-node="mi" transform="translate(1222, 0)"><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z"></path></g><g data-mml-node="mi" transform="translate(1778, 0)"><path data-c="66" d="M273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273Z"></path></g><g data-mml-node="mi" transform="translate(2150, 0)"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z"></path></g><g data-mml-node="mi" transform="translate(2428, 0)"><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z"></path></g><g data-mml-node="mi" transform="translate(2706, 0)"><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z"></path></g><g data-mml-node="mi" transform="translate(3150, 0)"><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z"></path></g></g><g data-mml-node="mo" transform="translate(15113.5, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(15502.5, 0)"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(16352.2, 0)"><path data-c="2223" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></g><g data-mml-node="mi" transform="translate(16908, 0)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="mo" transform="translate(17553, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g><g></g></svg></p></span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">其中：</span></p><div data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;font-family: Optima, &#39;Microsoft YaHei&#39;, PingFangSC-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;overflow-wrap: break-word;text-align: left;" data-pm-slice="0 0 []"><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">●</span><span style="cursor:pointer;" data-formula="\Delta_x(S)"><span data-formula="\Delta_x(S)"><svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewBox="0 -750 2710.5 1000" aria-hidden="true" style="vertical-align: -0.566ex;width: 6.132ex;height: 2.262ex;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="394" d="M51 0Q46 4 46 7Q46 9 215 357T388 709Q391 716 416 716Q439 716 444 709Q447 705 616 357T786 7Q786 4 781 0H51ZM507 344L384 596L137 92L383 91H630Q630 93 507 344Z"></path></g><g data-mml-node="mi" transform="translate(833, -150) scale(0.707)"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g></g><g data-mml-node="mo" transform="translate(1287.5, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(1676.5, 0)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="mo" transform="translate(2321.5, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g><g></g></svg></span></span><span leaf="">：信息增益</span></p><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">●</span><span style="cursor:pointer;" data-formula="\mathrm{Conflict}(x \mid S)"><span data-formula="\mathrm{Conflict}(x \mid S)"><svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewBox="0 -750 6367.6 1000" aria-hidden="true" style="vertical-align: -0.566ex;width: 14.406ex;height: 2.262ex;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="43" d="M56 342Q56 428 89 500T174 615T283 681T391 705Q394 705 400 705T408 704Q499 704 569 636L582 624L612 663Q639 700 643 704Q644 704 647 704T653 705H657Q660 705 666 699V419L660 413H626Q620 419 619 430Q610 512 571 572T476 651Q457 658 426 658Q322 658 252 588Q173 509 173 342Q173 221 211 151Q232 111 263 84T328 45T384 29T428 24Q517 24 571 93T626 244Q626 251 632 257H660L666 251V236Q661 133 590 56T403 -21Q262 -21 159 83T56 342Z"></path></g><g data-mml-node="mi" transform="translate(722, 0)"><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z"></path></g><g data-mml-node="mi" transform="translate(1222, 0)"><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z"></path></g><g data-mml-node="mi" transform="translate(1778, 0)"><path data-c="66" d="M273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273Z"></path></g><g data-mml-node="mi" transform="translate(2150, 0)"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z"></path></g><g data-mml-node="mi" transform="translate(2428, 0)"><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z"></path></g><g data-mml-node="mi" transform="translate(2706, 0)"><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z"></path></g><g data-mml-node="mi" transform="translate(3150, 0)"><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z"></path></g></g><g data-mml-node="mo" transform="translate(3539, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="mi" transform="translate(3928, 0)"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mo" transform="translate(4777.8, 0)"><path data-c="2223" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></g><g data-mml-node="mi" transform="translate(5333.6, 0)"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="mo" transform="translate(5978.6, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g><g></g></svg></span></span><span leaf="">：梯度冲突</span></p><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">●</span><span style="cursor:pointer;" data-formula="\lambda"><span data-formula="\lambda"><svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewBox="0 -694 583 706" aria-hidden="true" style="vertical-align: -0.027ex;width: 1.319ex;height: 1.597ex;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="3BB" d="M166 673Q166 685 183 694H202Q292 691 316 644Q322 629 373 486T474 207T524 67Q531 47 537 34T546 15T551 6T555 2T556 -2T550 -11H482Q457 3 450 18T399 152L354 277L340 262Q327 246 293 207T236 141Q211 112 174 69Q123 9 111 -1T83 -12Q47 -12 47 20Q47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657Q166 657 166 673Z"></path></g></g></g><g></g></svg></span></span><span leaf="">：冲突惩罚强度</span></p></div><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们特别强调，这是一种</span><strong style="box-sizing: border-box;"><span leaf="">软惩罚（soft penalty）</span></strong><span leaf="">。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这意味着：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">如果一个样本</span><strong style="box-sizing: border-box;"><span leaf="">信息量很大</span></strong><span leaf="">，即使存在冲突，仍然可能被选中</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">算法只是降低冲突样本的优先级，而不会直接删除</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这是因为在真实数据中，确实存在一些</span><strong style="box-sizing: border-box;"><span leaf="">信息量很高但梯度方向不稳定的困难样本</span></strong><span leaf="">。如果简单过滤掉它们，反而会损失数据覆盖度。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.自适应早停：边际增益不值得时就停止</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">传统数据选择通常会预先设定一个固定预算 k，比如选 10% 数据。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">SPICE 则采用一种更灵活的策略：</span><strong style="box-sizing: border-box;"><span leaf="">根据边际增益的衰减情况自动停止选择</span></strong><span leaf="">。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">具体来说，当第 t 步的最优边际增益满足：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: left;background-position-y: top;background-repeat: no-repeat;background-size: auto;width: auto;font-family: Optima, &#39;Microsoft YaHei&#39;, PingFangSC-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;overflow-wrap: break-word;text-align: left;" data-pm-slice="0 0 []"><span style="cursor:pointer;" data-tool="mdnice编辑器"><p data-formula="\Delta_{x_t}(S_{t-1}) \le \omega \cdot \Delta_{x_1}(S_0)
" style="text-align: center;overflow-x: auto;overflow-y: auto;display: block;"><svg xmlns="http://www.w3.org/2000/svg" role="img" focusable="false" viewBox="0 -750 10148.6 1011.6" aria-hidden="true" style="vertical-align: -0.592ex;width: 22.961ex;height: 2.289ex;max-width: 300% !important;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="394" d="M51 0Q46 4 46 7Q46 9 215 357T388 709Q391 716 416 716Q439 716 444 709Q447 705 616 357T786 7Q786 4 781 0H51ZM507 344L384 596L137 92L383 91H630Q630 93 507 344Z"></path></g><g data-mml-node="TeXAtom" transform="translate(833, -150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mi" transform="translate(572, -150) scale(0.707)"><path data-c="74" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(1503.3, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msub" transform="translate(1892.3, 0)"><g data-mml-node="mi"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="TeXAtom" transform="translate(613, -150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="74" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path></g><g data-mml-node="mo" transform="translate(361, 0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mn" transform="translate(1139, 0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g></g></g><g data-mml-node="mo" transform="translate(3714.3, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g><g data-mml-node="mo" transform="translate(4381, 0)"><path data-c="2264" d="M674 636Q682 636 688 630T694 615T687 601Q686 600 417 472L151 346L399 228Q687 92 691 87Q694 81 694 76Q694 58 676 56H670L382 192Q92 329 90 331Q83 336 83 348Q84 359 96 365Q104 369 382 500T665 634Q669 636 674 636ZM84 -118Q84 -108 99 -98H678Q694 -104 694 -118Q694 -130 679 -138H98Q84 -131 84 -118Z"></path></g><g data-mml-node="mi" transform="translate(5436.8, 0)"><path data-c="3C9" d="M495 384Q495 406 514 424T555 443Q574 443 589 425T604 364Q604 334 592 278T555 155T483 38T377 -11Q297 -11 267 66Q266 68 260 61Q201 -11 125 -11Q15 -11 15 139Q15 230 56 325T123 434Q135 441 147 436Q160 429 160 418Q160 406 140 379T94 306T62 208Q61 202 61 187Q61 124 85 100T143 76Q201 76 245 129L253 137V156Q258 297 317 297Q348 297 348 261Q348 243 338 213T318 158L308 135Q309 133 310 129T318 115T334 97T358 83T393 76Q456 76 501 148T546 274Q546 305 533 325T508 357T495 384Z"></path></g><g data-mml-node="mo" transform="translate(6281, 0)"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z"></path></g><g data-mml-node="msub" transform="translate(6781.3, 0)"><g data-mml-node="mi"><path data-c="394" d="M51 0Q46 4 46 7Q46 9 215 357T388 709Q391 716 416 716Q439 716 444 709Q447 705 616 357T786 7Q786 4 781 0H51ZM507 344L384 596L137 92L383 91H630Q630 93 507 344Z"></path></g><g data-mml-node="TeXAtom" transform="translate(833, -150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path></g><g data-mml-node="mn" transform="translate(572, -150) scale(0.707)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path></g></g></g></g><g data-mml-node="mo" transform="translate(8354.1, 0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path></g><g data-mml-node="msub" transform="translate(8743.1, 0)"><g data-mml-node="mi"><path data-c="53" d="M308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24Z"></path></g><g data-mml-node="mn" transform="translate(613, -150) scale(0.707)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path></g></g><g data-mml-node="mo" transform="translate(9759.6, 0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path></g></g></g><g></g></svg></p></span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">算法就会停止。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">直觉上，这相当于在：</span><strong style="box-sizing: border-box;"><span leaf="">“新增样本的性价比已经明显下降”时及时刹车</span></strong><span leaf="">。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这样可以避免把预算浪费在信息增益很低的尾部样本上。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">5.Proxy 选择：让选择成本可控</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">最后一个工程问题是：</span><strong style="box-sizing: border-box;"><span leaf="">在大模型上计算所有样本的梯度本身就很昂贵</span></strong><span leaf="">。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">SPICE 的解决办法是：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">使用</span><strong style="box-sizing: border-box;"><span leaf="">同架构的小模型</span></strong><span leaf="">作为 proxy 来计算梯度</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">用合理的更新间隔来减少重复计算</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这种方法利用了一个经验观察：</span><strong style="box-sizing: border-box;"><span leaf="">数据选择模式在不同规模模型之间往往具有可迁移性</span></strong><span leaf="">。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">因此，我们可以在小模型上完成数据选择，再把选出的子集用于大模型训练，从而实现：</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">选择成本可控，同时保持效果</span></strong><span leaf="">。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">实验结果：只用约 10% 数据，</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">也能匹配甚至超过全量微调</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">为了验证 SPICE 的效果，我们在约 </span><strong style="box-sizing: border-box;"><span leaf="">97.5K 条指令数据</span></strong><span leaf="">上进行了系统实验。数据覆盖多个典型场景，包括：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">数学推理任务</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">代码生成任务</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">通用指令跟随任务</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在模型设置上，我们使用</span><strong style="box-sizing: border-box;"><span leaf=""> LLaMA2-7B </span></strong><span leaf="">和 </span><strong style="box-sizing: border-box;"><span leaf="">Qwen2-7B</span></strong><span leaf=""> 作为基座模型，并与多种主流数据选择方法进行了对比实验。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">实验结果可以总结为两个核心发现。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1. 梯度冲突确实解释了信息增益“掉速”</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">实验分析发现，当数据选择序列中的 </span><strong style="box-sizing: border-box;"><span leaf="">梯度冲突更低</span></strong><span leaf=""> 时，会出现两个明显变化：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">边际信息增益衰减更慢</span></strong></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">累计 Fisher 信息更大</span></strong></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">换句话说，如果样本之间的梯度方向更加一致，新的样本就更容易提供“真正的新信息”。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">而当冲突较高时，不同样本会在参数空间中产生相互抵消的更新，导致信息增益被快速消耗，从而出现我们在实践中常见的</span><strong style="box-sizing: border-box;"><span leaf=""> “越选越没用”</span></strong><span leaf=""> 的现象。这一观察与 SPICE 的理论分析高度一致。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2. SPICE 让“小数据”真正变强</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在仅使用</span><strong style="box-sizing: border-box;"><span leaf=""> 约 10% 的训练数据</span></strong><span leaf=""> 时，SPICE 选出的数据子集在多个 benchmark 上：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">能够匹配甚至超过全量数据微调的效果</span></strong></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">同时</span><strong style="box-sizing: border-box;"><span leaf=""> 显著降低训练成本</span></strong></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这意味着，通过合理的数据选择，小规模高质量数据集可以替代大规模原始数据，从而实现 </span><strong style="box-sizing: border-box;"><span leaf="">更高的数据效率和更低的训练成本</span></strong><span leaf="">。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4537037037037037" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=f7583e55&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SRmMlzh0W8UCZqUTsfdj0icqwic1oT2kXqXLOY7AaaicHyHUeE5rxRKloDWUrBdsvyB9MThvzL8ynG29rNqliaqmVur0sxD67DAW7E%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.47129629629629627" data-s="300,640" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=5faf5647&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6STXG7nC1dxPy3unR0Hibxphn2yfgmFiaAUSg1EI6AIbkDqGLOEn1Ld0gycuQBibT6O1h1fv2CQ0OCFiaSmZrImXdia4s4VuIVIOkpnA%2F640%3Fwx_fmt%3Dpng"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf="">表1（Qwen2-7B/LLaMA2-7B）：在仅用 10% 指令数据时，SPICE 在 GSM8K/MMLU/IFEval/HumanEval 等多类基准上整体优于多数选择基线，平均分也超过 Full/Random 等对照</span></em></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">一个有意思的现象出现在训练动态中：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">SPICE 选出的数据子集往往“起点更难”（初始 loss 更高），但训练下降得更快、也更稳定。</span></strong></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这与 SPICE 的选择机制非常一致——它更倾向于选择 </span><strong style="box-sizing: border-box;"><span leaf="">信息量更高、同时彼此不发生梯度冲突的样本序列</span></strong><span leaf="">。这些样本虽然更具挑战性，但能够为模型提供更加一致和有效的学习信号。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">总结</span></b></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">SPICE 的核心贡献，并不是再提出一个复杂的数据选择算法，而是把一个长期存在却常被忽视的问题讲清楚，并给出一个</span><strong style="box-sizing: border-box;"><span leaf="">简单而可落地的解决方案</span></strong><span leaf="">。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">具体来说，这项工作做了三件事情：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">从理论上</span></strong><span leaf="">，我们指出 Fisher 次模目标中常见的“边际信息增益快速衰减”，实际上来自样本之间的交互项，而不仅仅是经典次模理论中的“递减收益”。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">从经验上</span></strong><span leaf="">，我们进一步发现，这个交互项与 </span><strong style="box-sizing: border-box;"><span leaf="">梯度冲突（gradient conflict）</span></strong><span leaf=""> 之间存在稳定的统计关联——当样本之间的梯度方向冲突更少时，信息增益的衰减也会明显变慢。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">从算法上</span></strong><span leaf="">，SPICE 用一个非常克制的方式改造了传统的 Fisher 贪心选择：通过在目标函数中加入 </span><strong style="box-sizing: border-box;"><span leaf="">“信息增益 − 冲突惩罚” </span></strong><span leaf="">的简单结构，并配合 </span><strong style="box-sizing: border-box;"><span leaf="">自适应早停 </span></strong><span leaf="">和</span><strong style="box-sizing: border-box;"><span leaf=""> proxy 选择机制</span></strong><span leaf="">，使这一方法能够在真实的大规模指令微调场景中高效运行。</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">对于正在进行</span><strong style="box-sizing: border-box;"><span leaf=""> 指令微调加速 </span></strong><span leaf="">或 </span><strong style="box-sizing: border-box;"><span leaf="">数据治理</span></strong><span leaf=""> 的团队，这项工作带来的启发是：</span><strong style="box-sizing: border-box;"><span leaf="">数据选择不仅要挑“信息量大的样本”，还要避免选择那些彼此“互相拆台”的样本</span></strong><span leaf="">。当我们把样本之间的冲突关系也纳入选择目标时，小规模的数据子集也能够更加稳定地把信息转化为真正的训练收益。</span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨争气尾流、zbw</span></p></div><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/0?wx_fmt=png" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-service_type="2" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/0?wx_fmt=png" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p></div><p style="display: none;"><mp-style-type data-value="10000"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=f1e73213&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247504153%26idx%3D1%26sn%3D4ab9e661a84dd783d1ae89145c2d5723">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Tue, 14 Apr 2026 12:06:00 +0800</pubDate>
    </item>
    <item>
      <title>使用Compose Navigation3进行屏幕适配</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247504142&amp;idx=1&amp;sn=305433f230b634c8b3d3215cd4b962d1</link>
      <description>这篇文章将介绍B站是怎么使用 Compose Navigation3 进行页面的宽屏适配，并解决其中遇到的问题的。</description>
      <content:encoded><![CDATA[<p>原创 <span>大前端</span> <span>2026-04-03 12:02</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=064f47c3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FtY0ozQev6SR7U8S9LCDjpVpIq56KPc2zQXnoiag5icaULl0Wv9d9O5mXWMyq7wnyC7WtKJpXZhImNmuQZo7fIibzZrz165gHN8nTlbDvlCEf30%2F0%3Fwx_fmt%3Djpeg"/></p>
  
  <div style="font-size: 16px;font-style: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: auto;text-indent: 0px;text-transform: none;white-space: normal;widows: auto;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration: none;box-sizing: border-box;text-align: justify;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这篇文章将介绍B站是怎么使用 Compose Navigation3 进行页面的宽屏适配，并解决其中遇到的问题的。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本文所涉及到的 Compose 页面均已完成了 CMP 跨平台化适配，内容中基于安卓习惯所提的 “Activity” 如无额外说明均代表各平台的页面容器，即可以直接替换为iOS的UIViewController理解。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom-width: 1px;border-bottom-style: dashed;border-bottom-color: rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Navigation3 简介</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Navigation3 是 Google 在 2025 年推出的全新 Compose 导航库，与之前的 Navigation Compose 有本质区别。它不再内置导航图（NavGraph）和 NavHost，而是将导航栈的管理权完全交给开发者，框架只负责&#34;根据栈内容渲染 UI&#34;，将 f(data)=UI 的理念扩展到了页面导航栈上。得益于这新的精简的框架概念，使得 Navigation3 能很轻松地跟现有大型app的路由系统搭配整合使用，不像之前的 Navigation 库那样需要将现有路由完全迁移到导航图（NavGraph）声明上。开发者完全可以在单模块内进行 Nav3 的接入使用，同时保持整体的路由声明方式。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">虽然使用Compose编写的页面，因其声明式的特性，已经有良好的响应屏幕宽度变化的能力。但是近期出现的超宽、折叠屏手机，包括鸿蒙平台的平板、桌面等设备，会让仅支持响应式布局的页面在超宽显示模式下给用户带来不好的视觉和交互体验。与Navigation3 库同时提出的“WindowSizeClass”中，将屏幕根据宽度划分为小、中、大等各个档位。这种“断点式”的屏幕划分可以指导我们知道在怎么样的情况下将应用的界面显示编排成全屏页面还是分屏页面的形式，显著提高在折叠屏、平板、桌面等“非传统手机”屏幕下的用户呈现能力。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">为什么需要纯Compose的导航框架</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在b站深入推进业务 CMP 跨平台化的过程中，我们发现缺少一个适配 CMP 属性的页面导航框架是深入业务使用的一大阻碍。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在先前的页面方案中，我们仿照安卓原生实现，选择了为每个导航节点嵌套一个原生window容器，即每打开一个个 Composable 页面都对应一个安卓 Activity 、iOS UIViewController 和 鸿蒙 entry 的创建与展现。这个方案能让我们快速地将 Compose 页面集成到现有工程中，但随后带来了更多其他的问题。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">首要面临的问题是内存压力。在 iOS 和鸿蒙中，每打开一个新的原生容器来承载Compose页面，都意味着一个 CAMetalLayer/NativeWindow 被创建，对应3倍大小的render buffer也会被创建在内存中，内存占用就会相应提升。根据我们测算，使用三缓冲区渲染的 iOS，每一个 CAMetalLayer 都会占用约40M的内存。随着接入Compose的页面越来越多、用户打开的页面越来越多，内存压力会不断增长，影响我们的CMP推进进程。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">另一个问题是，Compose 上下文内使用的 Lifecycle 系统是基于安卓生命周期概念设计的，在 iOS 和鸿蒙系统中多少有些水土不服，需要 ComposeView 的宿主层进行额外的配置工作，例如将 UIViewController 的 willAppear didAppear等回调桥接到 androidx 生命周期的相应事件上。在“标准容器”无法满足页面展现需求，需要做业务定制的时候，这些额外配置将成为开发过程的摩擦，在接入者不熟悉/没有意识到需要做这些配置的时候，将严重拖慢review和交付进度。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">并且，这样的桥接总会丢失准确信息，特别是在页面切换的时候，总会错过准确的生命周期回调，导致在后台执行了额外的工作，引起卡顿、发热等问题；</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">同时，不正确的生命周期事件会让开发有不正确的预期，这一点会在本文后面详细描述。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">基于以上问题的考量，我们得出结论，至少在纯Compose世界内的页面导航切换范围内，我们需要一个纯Compose的导航框架。而刚刚推出正式版、其结构思想契合现代代码开发思路的Navigation3成为我们的首选方案。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">路由与导航的区别和联系</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在之前的开发理念中，我们往往将&#34;路由&#34;和&#34;导航&#34;混为一谈：一个 URI 既是页面的标识，也是跳转的触发方式。我们将URI标注在一个 Fragment/Activity 上之后，调用“路由”跳转这个URI将直接打开这个页面实例。</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="swift"><code><span leaf=""><span class="code-snippet__meta">@Route</span>(<span class="code-snippet__string">&#34;bilibili://some/page&#34;</span>)</span></code><br/><code><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">SomePageActivity</span>: <span class="code-snippet__title">Activity</span>()</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__title">Router</span>.route<span class="code-snippet__title">To</span>(&#34;bilibili://<span class="code-snippet__keyword">some</span>/page&#34;) // == start<span class="code-snippet__title">Activity</span>(<span class="code-snippet__title">SomePageActivity</span>.class)</span></code><br/><code></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">然而，在后续的开发和迭代过程中，我们逐渐意识到，这一次跳转动作应当分为两个具体步骤：使用“路由”寻找这个 URI 对应的页面信息，然后使用“导航”组件将这个页面展现在用户面前。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在我们的项目 CMP 化推进过程中，基架团队已经将这个理念应用到了b站的 CMP 版路由组件中，允许业务方在复用公共路由表的查找逻辑和结果的前提下，根据不同页面需要自定义自己的“路由结果导航”行为，为这次的 Nav3 快速接入提供了合适切入点。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">数据驱动的声明式导航栈展现</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">Navigation3 的核心理念是：导航栈就是一个普通的 List&lt;NavKey&gt;，UI 是这个 list 的函数。</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="kotlin"><code><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">MyBackStack</span>&lt;<span class="code-snippet__type">K : NavKey</span>&gt;(<span class="code-snippet__keyword">private</span> <span class="code-snippet__keyword">val</span> list: SnapshotStateList&lt;K&gt;) : SnapshotStateList&lt;K&gt; <span class="code-snippet__keyword">by</span> list {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">override</span> <span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">add</span></span><span class="code-snippet__function"><span class="code-snippet__params">(item: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">K</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">)</span></span>{</span></code><br/><code><span leaf="">        <span class="code-snippet__comment">// 可以在这里提前处理冲突元素的清理</span></span></code><br/><code><span leaf="">        list.add(item)</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">}</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__meta">@Composable</span></span></code><br/><code><span leaf=""><span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">NavPage</span></span><span class="code-snippet__function"><span class="code-snippet__params">(modifier: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">Modifier</span></span></span><span class="code-snippet__function"><span class="code-snippet__params"> = Modifier)</span></span>{</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> backStack = remember {</span></code><br/><code><span leaf="">        mutableStateListOf(HomeNavKey)</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    NavDisplay(</span></code><br/><code><span leaf="">        backStack = backStack,           <span class="code-snippet__comment">// 数据：当前栈内容</span></span></code><br/><code><span leaf="">        sceneStrategy = ...,             <span class="code-snippet__comment">// 策略：如何将栈内容映射为布局</span></span></code><br/><code><span leaf="">        entryDecorators = listOf(...),   <span class="code-snippet__comment">// 装饰器：为每个 entry 注入能力</span></span></code><br/><code><span leaf="">        entryProvider = entryProvider {   <span class="code-snippet__comment">// 注册：NavKey → Composable 的映射</span></span></code><br/><code><span leaf="">            entry&lt;SomeNavKey&gt; { key -&gt; SomePage(key) }</span></code><br/><code><span leaf="">        },</span></code><br/><code><span leaf="">    )</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">开发者只需要按照自己的页面逻辑操作 backStack ，例如添加、移除，或者“在特定页面入栈时清除其他页面”用来实现“最多只有一个详情页被打开”的情况。NavDisplay 会自动响应变化并重新计算布局。不需要手动调用 navigate()、popBackStack() 等命令式 API，更加贴合 Compose 生态中的开发习惯。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom-width: 1px;border-bottom-style: dashed;border-bottom-color: rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">在实际业务中接入使用</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在实际的业务场景中使用 Navigation3 ，当然不像其他网络示例那样简单调用。我们将需要深入使用 Nav3 库提供的各种 api ，定制自己的业务功能。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">NavKey 与路由发现</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在 Nav3 中，NavKey 是描述页面的最小独立元素，每一个 NavKey 类型都跟一个页面绑定，描述了期望被打开的页面的基础信息，例如请求这个页面所需的唯一ID：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="kotlin"><code><span leaf=""><span class="code-snippet__meta">@Serializable</span></span></code><br/><code><span leaf=""><span class="code-snippet__meta">@Route(</span><span class="code-snippet__meta"><span class="code-snippet__string">&#34;bilibili://some/nav3/page/with/id/{id}&#34;</span></span><span class="code-snippet__meta">)</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">data</span> <span class="code-snippet__keyword">class</span> <span class="code-snippet__title">SomeIdPageNavKey</span>(</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> id: String,</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> paramFromQuery: String,</span></code><br/><code><span leaf="">) : NavKey</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__meta">@Route(</span><span class="code-snippet__meta"><span class="code-snippet__string">&#34;bilibili://some/page/with/id/{id}&#34;</span></span><span class="code-snippet__meta">)</span></span></code><br/><code><span leaf=""><span class="code-snippet__meta">@Composable</span></span></code><br/><code><span leaf=""><span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">SomePage</span></span><span class="code-snippet__function"><span class="code-snippet__params">(id: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">String</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">, modifier: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">Modifier</span></span></span><span class="code-snippet__function"><span class="code-snippet__params"> = Modifier, paramFromQuery: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">String</span></span></span><span class="code-snippet__function"><span class="code-snippet__params"> = </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__string">&#34;&#34;</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">)</span></span>{}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">因为一个 NavKey 可以跟一个路由严格对应，所以以上这段声明代码完全可以交给路由的 KSP 处理器自动生成。在子页面发起正常的路由跳转请求时，通过拦截器模式拦截此次路由的查找过程，如果找到匹配的 NavKey 类型，则将一个实例添加到backStack栈顶，将普通的导航行为桥接到 Nav3 的导航中。</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="kotlin"><code><span leaf=""><span class="code-snippet__comment">// 路由拦截器：将普通路由请求桥接到 Nav3 的 backStack</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">Nav3RouteInterceptor</span>&lt;<span class="code-snippet__type">KEY : NavKey</span>&gt;(</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">private</span> <span class="code-snippet__keyword">val</span> onNavKeyFound: (KEY) -&gt; <span class="code-snippet__built_in">Boolean</span>,</span></code><br/><code><span leaf="">) : Interceptor {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">override</span> <span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">intercept</span></span><span class="code-snippet__function"><span class="code-snippet__params">(chain: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">Interceptor</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">.</span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">Chain</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">)</span></span>: Response {</span></code><br/><code><span leaf="">        <span class="code-snippet__keyword">val</span> originUri = chain.uri</span></code><br/><code><span leaf="">        <span class="code-snippet__comment">// 将原始 URI 转换为 Nav3 专用的查找格式</span></span></code><br/><code><span leaf="">        <span class="code-snippet__comment">// 例如 bilibili://some/page/123 → bilibili://some/nav3/page/123</span></span></code><br/><code><span leaf="">        <span class="code-snippet__keyword">val</span> navUri = convertToNav3Uri(originUri) ?: <span class="code-snippet__keyword">return</span> chain.proceed()</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">        <span class="code-snippet__comment">// 在路由表中查找这个 URI 对应的 NavKey 工厂函数</span></span></code><br/><code><span leaf="">        <span class="code-snippet__keyword">val</span> target = chain.find(navUri) <span class="code-snippet__keyword">as</span>? SomeIdPageNavKey</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">        returnif (key != <span class="code-snippet__literal">null</span> &amp;&amp; onNavKeyFound(key)) {</span></code><br/><code><span leaf="">            Response.Done  <span class="code-snippet__comment">// 拦截成功，阻止后续的默认导航行为（如 startActivity）</span></span></code><br/><code><span leaf="">        } <span class="code-snippet__keyword">else</span> {</span></code><br/><code><span leaf="">            chain.proceed() <span class="code-snippet__comment">// 未匹配，交给下一个拦截器或默认处理</span></span></code><br/><code><span leaf="">        }</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">}</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment">// 在 Nav3 宿主页面中组装拦截器</span></span></code><br/><code><span leaf=""><span class="code-snippet__meta">@Composable</span></span></code><br/><code><span leaf=""><span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">Nav3HostPage</span></span><span class="code-snippet__function"><span class="code-snippet__params">()</span></span> {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> backStack = remember { mutableStateListOf&lt;MyNavKey&gt;(HomeNavKey) }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 创建拦截器，拦截成功时将 NavKey 推入栈</span></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> interceptor = remember {</span></code><br/><code><span leaf="">        Nav3RouteInterceptor&lt;MyNavKey&gt; { key -&gt;</span></code><br/><code><span leaf="">            backStack.add(key)</span></code><br/><code><span leaf="">        }</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 在原有 Router 上叠加拦截器，生成新的 Router 实例</span></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> localRouter = LocalRouter.current</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> nav3Router = remember(localRouter, interceptor) {</span></code><br/><code><span leaf="">        localRouter.newBuilder().addInterceptor(interceptor).build()</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    NavDisplay(</span></code><br/><code><span leaf="">        backStack = backStack,</span></code><br/><code><span leaf="">        entryDecorators = listOf(</span></code><br/><code><span leaf="">            <span class="code-snippet__comment">// 通过 Decorator 将带拦截器的 Router 注入到所有子页面</span></span></code><br/><code><span leaf="">            <span class="code-snippet__comment">// 这样子页面内发起的路由请求也会经过拦截器</span></span></code><br/><code><span leaf="">            remember { Nav3RouterDecorator(nav3Router) },</span></code><br/><code><span leaf="">            ...</span></code><br/><code><span leaf="">        ),</span></code><br/><code><span leaf="">        ...</span></code><br/><code><span leaf="">    )</span></code><br/><code><span leaf="">}</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment">// Decorator 实现：通过 CompositionLocal 注入 Router</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">Nav3RouterDecorator</span>(</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">private</span> <span class="code-snippet__keyword">val</span> router: Router,</span></code><br/><code><span leaf="">) : NavEntryDecorator&lt;MyNavKey&gt;(</span></code><br/><code><span leaf="">    onPop = {},</span></code><br/><code><span leaf="">    decorate = { entry -&gt;</span></code><br/><code><span leaf="">        CompositionLocalProvider(LocalRouter provides router) {</span></code><br/><code><span leaf="">            entry.Content()</span></code><br/><code><span leaf="">        }</span></code><br/><code><span leaf="">    },</span></code><br/><code><span leaf="">)</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">NavKey 需要支持序列化（用于 backStack 的保存/恢复），因此都标注了 @Serializable；当然，也可以选择统一保存原始跳转链接的string内容，在需要恢复时重新走一次路由查找。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">NavKey 与 entry 注册</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">NavKey 仅能表示“有一个页面”，在 Nav3 中，还需要通过 entryProvider 的方式将“这个 NavKey 对应的页面如何显示” 注册到当前的 NavDisplay 中：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="xml"><code><span leaf="">NavDisplay(</span></code><br/><code><span leaf="">    backStack = backStack,</span></code><br/><code><span leaf="">    entryProvider = entryProvider {</span></code><br/><code><span leaf="">        entry<span class="code-snippet__tag">&lt;</span><span class="code-snippet__tag"><span class="code-snippet__name">SomeIdPageNavKey</span></span><span class="code-snippet__tag">&gt;</span>(metadata = BiliListDetailSceneStrategy.detailPane()) { key -&gt; SomePage(key.id, Modifier, key.paramFromQuery) }</span></code><br/><code><span leaf="">    },</span></code><br/><code><span leaf=""> )</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">当然，这一段注册代码也可以抽象为 EntryProviderScope&lt;NavKey&gt;.() -&gt; Unit 的函数，由路由 KSP 处理器统一生成，页面只需要按需注册即可。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">SceneStrategy 与 Scene</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">SceneStrategy 是 Navigation3 中最关键的扩展点。它接收当前 backStack 中所有 entry，返回一个 Scene 来描述如何布局。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在我们的宽屏适配实践中，我们实现了 BiliDetailSceneStrategy：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="kotlin"><code><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">BiliDetailSceneStrategy</span>&lt;<span class="code-snippet__type">K : NavKey</span>&gt;(</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> windowSizeClass: WindowSizeClass,</span></code><br/><code><span leaf="">) : SceneStrategy&lt;K&gt; {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">override</span> <span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"> SceneStrategyScope</span><span class="code-snippet__function"><span class="code-snippet__type">&lt;K&gt;</span></span><span class="code-snippet__function">.</span><span class="code-snippet__function"><span class="code-snippet__title">calculateScene</span></span><span class="code-snippet__function"><span class="code-snippet__params">(entries: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">List</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">&lt;</span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">NavEntry</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">&lt;</span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">K</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">&gt;&gt;)</span></span>: Scene&lt;K&gt;? {</span></code><br/><code><span leaf="">        <span class="code-snippet__keyword">if</span> (windowSizeClass.isAtLeastMedium(...)) {</span></code><br/><code><span leaf="">            <span class="code-snippet__comment">// 宽屏：从栈中找到最后一个 List entry 和最后一个 Detail entry</span></span></code><br/><code><span leaf="">            <span class="code-snippet__keyword">val</span> listEntry = entries.findLast { it.metadata.containsKey(LIST_KEY) }</span></code><br/><code><span leaf="">                ?: <span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">null</span></span></code><br/><code><span leaf="">            <span class="code-snippet__keyword">val</span> detailEntry = entries.findLast {</span></code><br/><code><span leaf="">                it.metadata.containsKey(DETAIL_KEY)</span></code><br/><code><span leaf="">            }</span></code><br/><code><span leaf="">            <span class="code-snippet__keyword">return</span> BiliListDetailScene(</span></code><br/><code><span leaf="">                listEntry = listEntry,</span></code><br/><code><span leaf="">                detailEntry = detailEntry,</span></code><br/><code><span leaf="">                listWidth = <span class="code-snippet__keyword">if</span> (windowSizeClass.widthLargeCompat()) <span class="code-snippet__number">375.</span>dp else300.dp,</span></code><br/><code><span leaf="">            )</span></code><br/><code><span leaf="">        }</span></code><br/><code><span leaf="">        <span class="code-snippet__keyword">return</span> <span class="code-snippet__literal">null</span>  <span class="code-snippet__comment">// 非宽屏的情况：返回 null，表示当前 Strategy 不处理这个情况，NavDisplay 将使用默认单页 Strategy</span></span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">BiliListDetailScene 的布局结构：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="javascript"><code><span leaf=""><span class="code-snippet__title">Row</span>(modifier = <span class="code-snippet__title">Modifier</span>.<span class="code-snippet__title">fillMaxSize</span>()) {</span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 左栏：列表</span></span></code><br/><code><span leaf="">    <span class="code-snippet__title">Box</span>(modifier = <span class="code-snippet__title">Modifier</span>.<span class="code-snippet__title">width</span>(listWidth)) {</span></code><br/><code><span leaf="">        listEntry.<span class="code-snippet__title">Content</span>()</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">    <span class="code-snippet__title">VerticalDivider</span>(...)</span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 右栏：详情或占位图</span></span></code><br/><code><span leaf="">    <span class="code-snippet__title">Box</span>(modifier = <span class="code-snippet__title">Modifier</span>.<span class="code-snippet__title">weight</span>(1f)) {</span></code><br/><code><span leaf="">        <span class="code-snippet__keyword">if</span> (detailEntry != <span class="code-snippet__literal">null</span>) {</span></code><br/><code><span leaf="">            <span class="code-snippet__title">CompositionLocalProvider</span>(<span class="code-snippet__title">LocalBackIconVisibility</span> provides <span class="code-snippet__literal">false</span>) {</span></code><br/><code><span leaf="">                detailEntry.<span class="code-snippet__title">Content</span>()</span></code><br/><code><span leaf="">            }</span></code><br/><code><span leaf="">        } <span class="code-snippet__keyword">else</span> {</span></code><br/><code><span leaf="">            <span class="code-snippet__title">DefaultDetailPlaceholder</span>()</span></code><br/><code><span leaf="">        }</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">每个 entry 通过 metadata 标记自己属于哪个区域。metadata 在注册 entry 时通过 BiliListDetailSceneStrategy.listPane() / detailPane() 设置：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="kotlin"><code><span leaf=""><span class="code-snippet__keyword">companion</span> <span class="code-snippet__keyword">object</span> {</span></code><br/><code><span leaf="">    <span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">listPane</span></span><span class="code-snippet__function"><span class="code-snippet__params">()</span></span>= mapOf(<span class="code-snippet__string">&#34;BiliListDetailScene-List&#34;</span> to <span class="code-snippet__literal">true</span>)</span></code><br/><code><span leaf="">    <span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">detailPane</span></span><span class="code-snippet__function"><span class="code-snippet__params">()</span></span>= mapOf(<span class="code-snippet__string">&#34;BiliListDetailScene-Detail&#34;</span> to <span class="code-snippet__literal">true</span>)</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">SceneStrategy 的 calculateScene 在每次 backStack 变化时都会被调用。如果设备发生折叠/展开，windowSizeClass 变化会触发 BiliListDetailSceneStrategy 的重建（通过 remember(windowSizeClass)），从而自动切换单栏/双栏布局。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom-width: 1px;border-bottom-style: dashed;border-bottom-color: rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">踩过的一些坑</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">从原生导航模式迁移到 Nav3 ，页面的导航方式将发生重大变化，其中有不少在往常开发过程中注意不到的地方。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">生命周期、页面重入、状态保存</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">首先最大的一个变化，是之前每一次导航到一个 Composable 函数页面，都将打开一个全新的 Activity 来承载这个函数体，因此开发们会有一个错误认知：Compose Scope = Activity Scope = ViewModel Scope，在副作用处理上容易出现错误和遗漏，例如：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="kotlin"><code><span leaf=""><span class="code-snippet__comment">// ViewModel 中，将 toast 信息作为 State 的一部分暴露</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">data</span> <span class="code-snippet__keyword">class</span> <span class="code-snippet__title">PageState</span>(</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> items: List&lt;Item&gt; = emptyList(),</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> toast: ToastContent? = <span class="code-snippet__literal">null</span>,  <span class="code-snippet__comment">// 一次性事件，混在持久状态中</span></span></code><br/><code><span leaf="">)</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">SomeViewModel</span> : <span class="code-snippet__type">ViewModel</span>(){</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> state: StateFlow&lt;PageState&gt; = ...</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">onAction</span></span><span class="code-snippet__function"><span class="code-snippet__params">(action: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">Action</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">)</span></span> {</span></code><br/><code><span leaf="">        <span class="code-snippet__comment">// 某些操作会产生 toast</span></span></code><br/><code><span leaf="">        _state.update { it.copy(toast = ToastContent(<span class="code-snippet__string">&#34;操作成功&#34;</span>)) }</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">}</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__meta">@Composable</span></span></code><br/><code><span leaf=""><span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">SomePage</span></span><span class="code-snippet__function"><span class="code-snippet__params">(viewModel: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">SomeViewModel</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">)</span></span> {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> state <span class="code-snippet__keyword">by</span> viewModel.state.collectAsState()</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> toaster = LocalToaster.current</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">var</span> otherState = remember { mutableStateOf(<span class="code-snippet__string">&#34;&#34;</span>) }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 通过 snapshotFlow 监听 state 变化来显示 toast</span></span></code><br/><code><span leaf="">    LaunchedEffect(<span class="code-snippet__built_in">Unit</span>) {</span></code><br/><code><span leaf="">        snapshotFlow { state.toast }</span></code><br/><code><span leaf="">            .filterNotNull()</span></code><br/><code><span leaf="">            .distinctUntilChanged()</span></code><br/><code><span leaf="">            .collect { toaster.showToast(it.content) }</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 或者直接判断内容进行显示，都会引发同样的问题。</span></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// LaunchedEffect(state.toast) {</span></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">//    state.toast?.let { toaster.showToast(it.content) }</span></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// }</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// ... 页面内容</span></span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在独立的 Activity 中，这段代码运行起来不会有问题；但是在 Navigation3 的单Activity导航栈模式下，从这个页面跳转到其他页面之后，这个页面将暂时“退出组合”，在返回这个页面之后，重新“进入组合”。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在这个过程中，并不算一次“重组”，而是一次全新的组合事件，上面的代码将会出现：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  不管 LaunchedEffect 的key是什么，都会进入一次执行，snapshotFlow中记录的前值也将被清空，导致 toast 被重复显示；</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  通过 remember 保存的状态也被清空，依赖 remember 做的逻辑将回到空态。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">针对以上问题，修复思路其实很简单。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">对于第一个问题，首先需要开发者确认什么内容该属于“状态”，什么内容该属于“事件”。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在示例代码中，val items: List&lt;Item&gt; 属于需要在页面上一直显示的内容，属于业务状态的一部分，使用 StateFlow 和 collectAsState 是很恰当的；而对于 toast 来说，已经显示过一次的toast内容在任何情况下都不该重新出现，因此它该属于“事件流”的一部分，每次消费后都不再重放，因此可以使用 sharedFlow 承载toast的传递，或者每次显示完主动将这个字段清空。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">而第二个问题则更简单了，首先区分被 remember 的数据是否能接受丢失，如果是可以丢失的状态（例如，播放中的动画进度）则完全可以不处理；对于真正需要保存的数据，可以通过实现自定义 Saver 使用 rememberSavable 的方式，或者将数据委托给 ViewModel 中保存。</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="kotlin"><code><span leaf=""><span class="code-snippet__keyword">data</span> <span class="code-snippet__keyword">class</span> <span class="code-snippet__title">PageState</span>(</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> items: List&lt;Item&gt; = emptyList(),</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> toast: ToastContent? = <span class="code-snippet__literal">null</span>,</span></code><br/><code><span leaf="">)</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">SomeViewModel</span> : <span class="code-snippet__type">ViewModel</span>(){</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">private</span> <span class="code-snippet__keyword">val</span> _state = MutableStateFlow(PageState())</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> state: StateFlow&lt;PageState&gt; = _state.asStateFlow()</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 将 state 中的 toast 字段转换为事件流（replay=0，重新订阅不重放历史事件）</span></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> toastEvent: SharedFlow&lt;ToastContent&gt; = state</span></code><br/><code><span leaf="">        .map { it.toast }</span></code><br/><code><span leaf="">        .filterNotNull()</span></code><br/><code><span leaf="">        .shareIn(viewModelScope, SharingStarted.Eagerly, replay = <span class="code-snippet__number">0</span>)</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">onAction</span></span><span class="code-snippet__function"><span class="code-snippet__params">(action: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">Action</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">)</span></span> {</span></code><br/><code><span leaf="">        _state.update { it.copy(toast = ToastContent(<span class="code-snippet__string">&#34;操作成功&#34;</span>)) }</span></code><br/><code><span leaf="">        <span class="code-snippet__comment">// 也可以选择显示后立即清空，确保 toast 状态不会被持久持有</span></span></code><br/><code><span leaf="">        <span class="code-snippet__comment">// _state.update { it.copy(toast = null) }</span></span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">}</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__meta">@Composable</span></span></code><br/><code><span leaf=""><span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">SomePage</span></span><span class="code-snippet__function"><span class="code-snippet__params">(viewModel: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">SomeViewModel</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">)</span></span> {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> state <span class="code-snippet__keyword">by</span> viewModel.state.collectAsState()</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> toaster = LocalToaster.current</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 需要跨页面跳转保留的状态，改用 rememberSaveable</span></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">var</span> otherState <span class="code-snippet__keyword">by</span> rememberSaveable { mutableStateOf(<span class="code-snippet__string">&#34;&#34;</span>) }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 消费事件流：重新进入组合时重新订阅，replay=0 保证不会重放已消费的事件</span></span></code><br/><code><span leaf="">    LaunchedEffect(<span class="code-snippet__built_in">Unit</span>) {</span></code><br/><code><span leaf="">        viewModel.toastEvent.collect { toast -&gt;</span></code><br/><code><span leaf="">            toaster.showToast(toast.content)</span></code><br/><code><span leaf="">        }</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// ... 页面内容</span></span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 5px 0px 10px;width: 784px;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);width: 734px;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 734px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">Navigation3使用额外依赖中的 rememberViewModelStoreNavEntryDecorator() 来提供“页面在pop时清空相应viewmodel”的能力。并且在未来这个依赖和ViewModelStore的能力和api将会发生变化，带来更加强大的定制能力。</span></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">屏幕状态感知与返回按钮</span></b></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">宽屏模式下，右栏的页面不需要显示返回按钮（因为左栏始终可见）。可以通过自定义 LocalBackIconVisibility 这个 CompositionLocal 控制：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="java"><code><span leaf=""><span class="code-snippet__type">val</span> <span class="code-snippet__variable">LocalBackIconVisibility</span> <span class="code-snippet__operator">=</span> compositionLocalOf { <span class="code-snippet__literal">true</span> }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment">// 右栏渲染</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">if</span> (detailEntry != <span class="code-snippet__literal">null</span>) {</span></code><br/><code><span leaf="">    CompositionLocalProvider(LocalBackIconVisibility provides <span class="code-snippet__literal">false</span>) {</span></code><br/><code><span leaf="">        detailEntry.Content()</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">子页面中通过读取这个值来决定是否显示返回图标：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="java"><code><span leaf=""><span class="code-snippet__type">val</span> <span class="code-snippet__variable">showBackButton</span> <span class="code-snippet__operator">=</span> LocalBackIconVisibility.current</span></code></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">窄屏模式下 LocalBackIconVisibility 保持默认值 true，页面正常显示返回按钮。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">状态栏的控制</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在单 Activity 页面导航框架中， SystemUI 配置（如状态栏颜色）如果允许每个页面、每个组件自由控制，将很容易出现UI闪烁等情况。我们通过 SystemUiConfiguration 收集机制解决：每个 entry 通过 collectSystemUiConfiguration Modifier 上报自己的配置，NavDisplay所在的宿主页面 取栈顶 entry 的配置应用到宿主：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="kotlin"><code><span leaf=""><span class="code-snippet__comment">// ① 定义：持有状态栏配置的可观察容器</span></span></code><br/><code><span leaf=""><span class="code-snippet__meta">@Stable</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">StableSystemUiConfiguration</span> {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">var</span> statusBarDarkIcons: <span class="code-snippet__built_in">Boolean</span>? <span class="code-snippet__keyword">by</span> mutableStateOf(<span class="code-snippet__literal">null</span>)</span></code><br/><code><span leaf="">}</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment">// ② 宿主：为每个 NavKey 分配一个 config 对象，并将&#34;锚点 modifier&#34;传给 entry</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">val</span> configurationMap = remember { mutableStateMapOf&lt;MyNavKey, StableSystemUiConfiguration&gt;() }</span></code><br/><code><span leaf=""><span class="code-snippet__keyword">val</span> topConfiguration <span class="code-snippet__keyword">by</span> remember {</span></code><br/><code><span leaf="">    derivedStateOf { backStack.lastOrNull()?.let { configurationMap[it] } }</span></code><br/><code><span leaf="">}</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">val</span> getCollectorModifier: (MyNavKey) -&gt; Modifier = { key -&gt;</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> config = configurationMap.getOrPut(key) { StableSystemUiConfiguration() }</span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// collectSystemUiConfiguration 在 modifier 链中埋入&#34;锚点&#34;，持有 config 的引用</span></span></code><br/><code><span leaf="">    Modifier.collectSystemUiConfiguration(config)</span></code><br/><code><span leaf="">}</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">NavDisplay(</span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 将栈顶 entry 的配置应用到 Window（状态栏颜色等）</span></span></code><br/><code><span leaf="">    modifier = Modifier.applySystemUiConfiguration(topConfiguration),</span></code><br/><code><span leaf="">    entryProvider = entryProvider {</span></code><br/><code><span leaf="">        <span class="code-snippet__comment">// 在构建 entryProvider 时将 collector modifier 传入页面</span></span></code><br/><code><span leaf="">        entry&lt;SomeNavKey&gt; { key -&gt;</span></code><br/><code><span leaf="">            SomePage(modifier = getCollectorModifier(key))</span></code><br/><code><span leaf="">        }</span></code><br/><code><span leaf="">    },</span></code><br/><code><span leaf="">    ...</span></code><br/><code><span leaf="">)</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment">// ③ 子页面：将自己期望的状态栏配置追加到 modifier 链上</span></span></code><br/><code><span leaf=""><span class="code-snippet__meta">@Composable</span></span></code><br/><code><span leaf=""><span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">SomePage</span></span><span class="code-snippet__function"><span class="code-snippet__params">(modifier: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">Modifier</span></span></span><span class="code-snippet__function"><span class="code-snippet__params"> = Modifier)</span></span> {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> isDarkTheme = LocalDarkTheme.current</span></code><br/><code><span leaf="">    Box(</span></code><br/><code><span leaf="">        <span class="code-snippet__comment">// statusBarDarkIcons 会沿 modifier 链向上查找&#34;锚点&#34;，找到后将值写入宿主的 config 对象</span></span></code><br/><code><span leaf="">        <span class="code-snippet__comment">// 节点 attach 时写入，detach 时自动清空，生命周期安全</span></span></code><br/><code><span leaf="">        modifier = modifier.statusBarDarkIcons(darkIcons = !isDarkTheme)</span></code><br/><code><span leaf="">    ) {</span></code><br/><code><span leaf="">        <span class="code-snippet__comment">// 页面内容</span></span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 784px;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7148148148148148" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 784px;box-sizing: border-box;height: auto !important;" data-imgfileid="100020493" src="https://wechat2rss.xlab.app/img-proxy/?k=cab4d308&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SQ4bxFQaKhTDZBEdsHcW4tJxckTic1Q28OzGuYNG0rkLC4EjtxmY0XDHSlxu060nnnqU6PnakekyTYRWibic6icoqAWia4NHCgHKCcs%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">而 NavDisplay 本身所在的页面中，框架已经传入了一个collectSystemUiConfiguration，并且将实际在 window 中生效。通过显式传递控制链条的方式，我们将状态栏的配置权限限制在页面宿主层级，在这一层让业务根据自己的实际逻辑决定内部组件的生效范围。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom-width: 1px;border-bottom-style: dashed;border-bottom-color: rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">返回事件的处理</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">与 Navigation3 库同时推出的，是 androidx.navigationevent 库，用来响应和发送页面导航事件。Nav3 库默认已经使用了这个依赖库来响应返回事件，其行为是将现有的 backStack 的最新一个元素推出。如果我们需要定制返回事件的处理，可以通过包装 backStack 实现。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">需要注意的是，androidx.navigationevent 库会将系统返回手势、系统导航栏返回键、应用顶部导航栏返回按钮或其他主动调用 backHandler.backCompleted() 处的返回事件一同给出，现有的注册层级结构关系不能区分出返回事件的来源行为和来源页面。因此，暂时无法实现“分栏页面各有一个返回按钮，各自控制其栏位的页面pop”交互。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom-width: 1px;border-bottom-style: dashed;border-bottom-color: rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">原生页面嵌入</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在需要进行宽屏适配的模块中，部分页面仍然是 Android Fragment 实现，尚未迁移到 CMP。我们选择通过 BiliNativePage 将 Fragment 嵌入 Navigation3 体系：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="kotlin"><code><span leaf=""><span class="code-snippet__meta">@Composable</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">internal</span> <span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">BiliNativePage</span></span><span class="code-snippet__function"><span class="code-snippet__params">(url: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">String</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">, modifier: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">Modifier</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">)</span></span>{</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> showBackButton = LocalBackIconVisibility.current</span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 1. 通过 Router 解析 URL，获取 Fragment Class</span></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> routeInfo = Router.newCall(url).find()</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">val</span> clazz = routeInfo?.clazz</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 2. 使用 AndroidFragment 嵌入 Compose</span></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">if</span> (clazz != <span class="code-snippet__literal">null</span>) {</span></code><br/><code><span leaf="">        <span class="code-snippet__comment">// 3. 因为 AndroidFragment 尚不支持响应state变化主动更新参数，因此选择一个key主动进行重组，通过切换fragment的方式将新的 showBackButton 传入</span></span></code><br/><code><span leaf="">        <span class="code-snippet__comment">// 也可以选择使用 ViewModel 传递 showBackButton 的更新，避免fragment的重建</span></span></code><br/><code><span leaf="">        key(showBackButton) {</span></code><br/><code><span leaf="">            AndroidFragment(</span></code><br/><code><span leaf="">                clazz = clazz <span class="code-snippet__keyword">as</span> Class&lt;<span class="code-snippet__keyword">out</span> Fragment&gt;,</span></code><br/><code><span leaf="">                modifier = modifier,</span></code><br/><code><span leaf="">                arguments = createRouteExtraForFragment(routeInfo).also {</span></code><br/><code><span leaf="">                    it.putBoolean(<span class="code-snippet__string">&#34;show_back_button&#34;</span>, showBackButton)</span></code><br/><code><span leaf="">                },</span></code><br/><code><span leaf="">            )</span></code><br/><code><span leaf="">        }</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">}</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment">// Fragment 侧：从 arguments 读取 show_back_button 控制返回按钮显隐</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">SomePageFragment</span> : <span class="code-snippet__type">Fragment</span>(R.layout.fragment_some_page) {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">private</span> <span class="code-snippet__keyword">val</span> showBackButton <span class="code-snippet__keyword">get</span>() = arguments?.getBoolean(<span class="code-snippet__string">&#34;show_back_button&#34;</span>, <span class="code-snippet__literal">true</span>) ?: <span class="code-snippet__literal">true</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">override</span> <span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">onViewCreated</span></span><span class="code-snippet__function"><span class="code-snippet__params">(view: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">View</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">, savedInstanceState: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">Bundle</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">?)</span></span> {</span></code><br/><code><span leaf="">        <span class="code-snippet__keyword">super</span>.onViewCreated(view, savedInstanceState)</span></code><br/><code><span leaf="">        binding.btnBack.isVisible = showBackButton</span></code><br/><code><span leaf="">        binding.btnBack.setOnClickListener { parentFragmentManager.popBackStack() }</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">原生页面的注册可以通过 expect/actual 机制来声明，或者使用依赖注入框架来实现页面注册。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">showBackButton 的变化会触发 Fragment 重建（通过 key(showBackButton)），确保 Fragment 能响应宽屏/窄屏切换时返回按钮的显隐变化。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom-width: 1px;border-bottom-style: dashed;border-bottom-color: rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Scene 中的小发现</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在尝试在Nav3框架内添加页面切换动画过程中，我调研了官方示例 nav3-recipes 中关于动画切换的部分，结果看到了一段让我始料未及的代码：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="kotlin"><code><span leaf=""><span class="code-snippet__keyword">override</span> <span class="code-snippet__keyword">val</span> content: <span class="code-snippet__meta">@Composable</span> (() -&gt; <span class="code-snippet__built_in">Unit</span>) = {</span></code><br/><code><span leaf="">    Row(modifier = Modifier.fillMaxSize()) {</span></code><br/><code><span leaf="">        Column(modifier = Modifier.weight(<span class="code-snippet__number">0.4f</span>)) {</span></code><br/><code><span leaf="">            listEntry.Content()</span></code><br/><code><span leaf="">        }</span></code><br/><code><span leaf="">        ...</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">        Column(modifier = Modifier.weight(<span class="code-snippet__number">0.6f</span>)) {</span></code><br/><code><span leaf="">            AnimatedContent(</span></code><br/><code><span leaf="">                ...</span></code><br/><code><span leaf="">            ) { entry -&gt;</span></code><br/><code><span leaf="">                entry.Content()</span></code><br/><code><span leaf="">            }</span></code><br/><code><span leaf="">         }</span></code><br/><code><span leaf="">     }</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">其中的 entry.Content() 让我产生了“这能正常触发重组吗？”的疑问🤔。在通常的开发惯例中，Composable 函数一般都是独立于Kotlin class的顶层函数，而不是某个实例的成员函数来被调用，这样 Compose 框架可以通过分析入参是否变化来决定是否重组；如果函数本身是一个类对象的成员函数，那类实例的改变会不会产生类似于key改变的作用、从而触发了这个Composable函数的完全重组呢？</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">带着这个疑问，我构造了一段测试代码：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="kotlin"><code><span leaf=""><span class="code-snippet__meta">@Immutable</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">data</span> <span class="code-snippet__keyword">class</span> <span class="code-snippet__title">TestClass</span>(<span class="code-snippet__keyword">val</span> <span class="code-snippet__keyword">data</span>: String){</span></code><br/><code><span leaf="">    <span class="code-snippet__meta">@Composable</span> <span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">Content</span></span><span class="code-snippet__function"><span class="code-snippet__params">(modifier: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">Modifier</span></span></span><span class="code-snippet__function"><span class="code-snippet__params"> = Modifier)</span></span>{</span></code><br/><code><span leaf="">        Text(<span class="code-snippet__keyword">data</span>)</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">然后使用 jadx 查看它编译后的产物，看到了关键信息：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="php"><code><span leaf=""><span class="code-snippet__keyword">public</span> <span class="code-snippet__keyword">final</span> <span class="code-snippet__class"><span class="code-snippet__keyword">class</span></span><span class="code-snippet__class"><span class="code-snippet__title">TestClass</span></span>{</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">public</span> <span class="code-snippet__built_in">static</span> <span class="code-snippet__keyword">final</span> <span class="code-snippet__keyword">int</span> <span class="code-snippet__variable">$stable </span>= <span class="code-snippet__number">0</span>;</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">private</span> <span class="code-snippet__keyword">final</span> String data;</span></code><br/><code><span leaf="">    <span class="code-snippet__comment">/* JADX INFO: Access modifiers changed from: private */</span></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">public</span> <span class="code-snippet__built_in">static</span> <span class="code-snippet__keyword">final</span> Unit Content$lambda$<span class="code-snippet__number">0</span>(TestClass testClass, Modifier modifier, <span class="code-snippet__keyword">int</span> i, <span class="code-snippet__keyword">int</span> i2, Composer composer, <span class="code-snippet__keyword">int</span> i3) {</span></code><br/><code><span leaf="">        testClass.<span class="code-snippet__title">Content</span>(modifier, composer, RecomposeScopeImplKt.<span class="code-snippet__title">updateChangedFlags</span>(i | <span class="code-snippet__number">1</span>), i2);</span></code><br/><code><span leaf="">        <span class="code-snippet__keyword">return</span> Unit.INSTANCE;</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">public</span><span class="code-snippet__title"> TestClass</span>(String data){</span></code><br/><code><span leaf="">        Intrinsics.<span class="code-snippet__title">checkNotNullParameter</span>(data, <span class="code-snippet__string">&#34;data&#34;</span>);</span></code><br/><code><span leaf="">        this.data = data;</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">public</span><span class="code-snippet__title"> final String getData</span>(){</span></code><br/><code><span leaf="">        returnthis.data;</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">public</span><span class="code-snippet__title"> final void Content</span>(Modifier modifier, Composer <span class="code-snippet__variable">$composer</span>, finalint <span class="code-snippet__variable">$changed</span>, finalint i){</span></code><br/><code><span leaf="">        Composer <span class="code-snippet__variable">$composer2</span>;</span></code><br/><code><span leaf="">        <span class="code-snippet__keyword">final</span> Modifier modifier2;</span></code><br/><code><span leaf="">        Composer <span class="code-snippet__variable">$composer3 </span>= <span class="code-snippet__variable">$composer</span>.<span class="code-snippet__title">startRestartGroup</span>(<span class="code-snippet__number">507862195</span>);</span></code><br/><code><span leaf="">        ComposerKt.<span class="code-snippet__title">sourceInformation</span>(<span class="code-snippet__variable">$composer3</span>, <span class="code-snippet__string">&#34;C(Content)N(modifier)160@6025L10:ListDetailScene.kt#qpkuy4&#34;</span>);</span></code><br/><code><span leaf="">        <span class="code-snippet__keyword">int</span> <span class="code-snippet__variable">$dirty </span>= <span class="code-snippet__variable">$changed</span>;</span></code><br/><code><span leaf="">        <span class="code-snippet__keyword">if</span>((<span class="code-snippet__variable">$changed </span>&amp; <span class="code-snippet__number">48</span>) == <span class="code-snippet__number">0</span>) {</span></code><br/><code><span leaf="">            <span class="code-snippet__variable">$dirty </span>|= <span class="code-snippet__variable">$composer3</span>.<span class="code-snippet__title">changed</span>(this) ? <span class="code-snippet__number">32</span> : <span class="code-snippet__number">16</span>;</span></code><br/><code><span leaf="">        }</span></code><br/><code><span leaf="">        <span class="code-snippet__keyword">if</span>(!<span class="code-snippet__variable">$composer3</span>.<span class="code-snippet__title">shouldExecute</span>((<span class="code-snippet__variable">$dirty </span>&amp; <span class="code-snippet__number">17</span>) != <span class="code-snippet__number">16</span>, <span class="code-snippet__variable">$dirty </span>&amp; <span class="code-snippet__number">1</span>)) {</span></code><br/><code><span leaf="">            <span class="code-snippet__variable">$composer2 </span>= <span class="code-snippet__variable">$composer3</span>;</span></code><br/><code><span leaf="">            <span class="code-snippet__variable">$composer2</span>.<span class="code-snippet__title">skipToGroupEnd</span>();</span></code><br/><code><span leaf="">            modifier2 = modifier;</span></code><br/><code><span leaf="">        } <span class="code-snippet__keyword">else</span> {</span></code><br/><code><span leaf="">            Modifier modifier3 = (i &amp; <span class="code-snippet__number">1</span>) != <span class="code-snippet__number">0</span> ? Modifier.INSTANCE : modifier;</span></code><br/><code><span leaf="">            <span class="code-snippet__keyword">if</span>(ComposerKt.<span class="code-snippet__title">isTraceInProgress</span>()) {</span></code><br/><code><span leaf="">                ComposerKt.<span class="code-snippet__title">traceEventStart</span>(<span class="code-snippet__number">507862195</span>, <span class="code-snippet__variable">$dirty</span>, -<span class="code-snippet__number">1</span>, <span class="code-snippet__string">&#34;com.example.nav3recipes.scenes.listdetail.TestClass.Content (ListDetailScene.kt:159)&#34;</span>);</span></code><br/><code><span leaf="">            }</span></code><br/><code><span leaf="">            <span class="code-snippet__variable">$composer2 </span>= <span class="code-snippet__variable">$composer3</span>;</span></code><br/><code><span leaf="">            TextKt.<span class="code-snippet__title">m4145TextNvy7gAk</span>(this.data, <span class="code-snippet__literal">null</span>, <span class="code-snippet__number">0</span>L, <span class="code-snippet__literal">null</span>, <span class="code-snippet__number">0</span>L, <span class="code-snippet__literal">null</span>, <span class="code-snippet__literal">null</span>, <span class="code-snippet__literal">null</span>, <span class="code-snippet__number">0</span>L, <span class="code-snippet__literal">null</span>, <span class="code-snippet__literal">null</span>, <span class="code-snippet__number">0</span>L, <span class="code-snippet__number">0</span>, <span class="code-snippet__literal">false</span>, <span class="code-snippet__number">0</span>, <span class="code-snippet__number">0</span>, <span class="code-snippet__literal">null</span>, <span class="code-snippet__literal">null</span>, <span class="code-snippet__variable">$composer2</span>, <span class="code-snippet__number">0</span>, <span class="code-snippet__number">0</span>, <span class="code-snippet__number">262142</span>);</span></code><br/><code><span leaf="">            <span class="code-snippet__keyword">if</span>(ComposerKt.<span class="code-snippet__title">isTraceInProgress</span>()) {</span></code><br/><code><span leaf="">                ComposerKt.<span class="code-snippet__title">traceEventEnd</span>();</span></code><br/><code><span leaf="">            }</span></code><br/><code><span leaf="">            modifier2 = modifier3;</span></code><br/><code><span leaf="">        }</span></code><br/><code><span leaf="">        ScopeUpdateScope scopeUpdateScopeEndRestartGroup = <span class="code-snippet__variable">$composer2</span>.<span class="code-snippet__title">endRestartGroup</span>();</span></code><br/><code><span leaf="">        <span class="code-snippet__keyword">if</span>(scopeUpdateScopeEndRestartGroup != <span class="code-snippet__literal">null</span>) {</span></code><br/><code><span leaf="">            scopeUpdateScopeEndRestartGroup.<span class="code-snippet__title">updateScope</span>(<span class="code-snippet__keyword">new</span><span class="code-snippet__title"> Function2</span>() { // <span class="code-snippet__keyword">from</span> <span class="code-snippet__attr">class</span>: com.example.nav3recipes.scenes.listdetail.TestClass<span class="code-snippet__variable">$$ExternalSyntheticLambda0</span></span></code><br/><code><span leaf="">                @Override // kotlin.jvm.functions.Function2</span></code><br/><code><span leaf="">                publicfinal Object <span class="code-snippet__title">invoke</span>(Object obj, Object obj2) {</span></code><br/><code><span leaf="">                    <span class="code-snippet__keyword">return</span> TestClass.Content$lambda$<span class="code-snippet__number">0</span>(this.f$<span class="code-snippet__number">0</span>, modifier2, <span class="code-snippet__variable">$changed</span>, i, (Composer) obj, ((Integer) obj2).<span class="code-snippet__title">intValue</span>());</span></code><br/><code><span leaf="">                }</span></code><br/><code><span leaf="">            });</span></code><br/><code><span leaf="">        }</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">会发现，这样一种成员Composable函数的产物跟顶层函数没什么区别，都是使用一个生成的数字key作为restart group的标记，在其中判断参数是否变化时，额外进行了 this 对象的判断，也就是说，可以简单将这个函数定义等价为：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="kotlin"><code><span leaf=""><span class="code-snippet__keyword">data</span> <span class="code-snippet__keyword">class</span> <span class="code-snippet__title">TestClass</span>(<span class="code-snippet__keyword">val</span> <span class="code-snippet__keyword">data</span>: String)</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__meta">@Composable</span></span></code><br/><code><span leaf=""><span class="code-snippet__function"><span class="code-snippet__keyword">fun</span></span><span class="code-snippet__function"><span class="code-snippet__title">Content</span></span><span class="code-snippet__function"><span class="code-snippet__params">($this: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">TestClass</span></span></span><span class="code-snippet__function"><span class="code-snippet__params">, modifier: </span></span><span class="code-snippet__function"><span class="code-snippet__params"><span class="code-snippet__type">Modifier</span></span></span><span class="code-snippet__function"><span class="code-snippet__params"> = Modifier)</span></span></span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">基于这一层理解，就能确认，在nav3-recipes示例工程中，scene发生实例变化的时候，也等价于一个普通的Compose重组，其中可以依靠普通的重组、跳过和remember实现动画播放了。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom-width: 1px;border-bottom-style: dashed;border-bottom-color: rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">总结</span></b></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">Navigation3 库的出现，极大地减轻了现有 app 在既存路由框架中接入使用的负担，让我们能快速地将现有的 Compose 页面接入其中，完成宽屏适配；同时也推动开发者在编写 Compose 页面的时候更加深入地思考该如何去适配它的生命周期与状态保存，提示代码的交付质量。</span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨肖志康</span></p><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/0?wx_fmt=png" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-service_type="1" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/0?wx_fmt=png" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-service_type="2" data-verify_status="2"></mp-common-profile></p></div></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=b7584639&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247504142%26idx%3D1%26sn%3D305433f230b634c8b3d3215cd4b962d1">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 03 Apr 2026 12:02:00 +0800</pubDate>
    </item>
    <item>
      <title>从特效 SDK 到 AI 动效平台：Neon Vibe Motion 的技术演进之路</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247504130&amp;idx=1&amp;sn=e16047064d35627ab2d3619c1f763890</link>
      <description>多媒体中台在B站主要负责剪辑、拍摄、直播等业务场景的动效渲染，开发维护的SDK在后文统一称为特效SDK。</description>
      <content:encoded><![CDATA[<p>原创 <span>大前端</span> <span>2026-03-31 12:05</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=29dcde9d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FtY0ozQev6SR4zkHF7PrNovILrJAqj1S0rGicibDykia3u8tWWqlU2w5icWCKnAYUQ5tomN4bUlbGydKYwhoYiaxABgOsY9dIj22LIQEdVIZzZx5M%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>多媒体中台在B站主要负责剪辑、拍摄、直播等业务场景的动效渲染，开发维护的SDK在后文统一称为特效SDK。</p>
  <div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">多媒体中台在 B 站主要负责剪辑、拍摄、直播等业务场景的动效渲染，开发维护的 SDK 在后文统一称为特效 SDK。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">传统的视频特效生产一般分三条链路：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6212962962962963" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020466" src="https://wechat2rss.xlab.app/img-proxy/?k=07f70d7b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6STa7WSTlbHpt8usO7IklYMqSQ2xOO6YicJUCQxGCbMReyeIiceqAcRzsZIpMv03zLDZ4HV7F5ceMrAz7EuCrX5ibibUE92wnLicibOHU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">三条链路存在一个困境：</span><strong style="box-sizing: border-box;"><span leaf="">效果丰富度、实时可交互、生产效率，三者不可兼得。</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">那么能不能让 AI 直接生成可实时预览并支持调参的动效？</span></strong></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">&#34;用自然语言描述需求、AI 生成可控动效&#34;的模式我们称之为 Vibe Motion。我们沿着这个方向做了 Neon Vibe Motion：一个开源的基于 LLM 动效生成与实时控制平台。用自然语言描述你想要的效果，LLM 生成可执行的渲染代码和可调参数声明，在 HTML5 Canvas 上实时预览，调到满意后导出视频或独立网页。Neon 不绑定特定模型，支持任何兼容 OpenAI Chat Completions API 的 LLM。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.84375" data-s="300,640" data-type="gif" data-w="960" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020478" src="https://wechat2rss.xlab.app/img-proxy/?k=533e19cb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FtY0ozQev6STNl6zOPesGe9ibnCEvTorzMQvkwhsMichfQeOeOcLg0EFQJeoFYoT91zwibtib467kVxKic5tPJflqpiaxf0HdmicHc2V6wNf5DLVUf8%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">相关工作</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这个方向上已有很多人同时在探索，有同样困境的不止我们一家。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">总结下来AI 驱动的动效生成目前有两条路线。</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">像素生成</span></strong><span leaf="">——文生视频，以 Sora、Veo、Seedance 等 AI 视频生成模型为代表，输入文本或图片，输出视频文件。这类模型擅长写实画面和影视级内容，但产出的是像素数据，生成完就不可编辑。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">代码生成</span></strong><span leaf="">——LLM 输出可执行的渲染代码，产出的是可编辑、可参数化的动效程序。Neon 属于后者。</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">代码生成MG路线上，值得讨论的有两个产品：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Higgsfield Vibe Motion</span></strong><span leaf=""> 是一个商业产品，与 Anthropic 合作，基于 Claude 模型，通过对话生成渲染代码来制作动效。支持实时编辑和参数调整，按 credit 付费。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Remotion </span></strong><span leaf="">是一个开源的 React 视频框架，用 React 组件定义视频的每一帧。Remotion 官方已经提供了完整的 AI 集成方案：面向 LLM 的 system prompt、模块化的 skills 系统、以及一个&#34;Prompt to Motion Graphics&#34;的 SaaS 模板。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一、范式选择：结构化生成而非视频生成</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">AI做动效，第一个要回答的问题是：AI 应该输出什么？</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">最直觉的答案是让 AI 直接输出视频文件。然而当前的文生视频模型生成的视频动效存在明显的可控缺陷，视频生成完就固化了——颜色不对、速度太快、文字想改，都得重新抽一遍，没有任何迭代的连续性。而且贵。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们选了另一条路：</span><strong style="box-sizing: border-box;"><span leaf="">让 LLM 生成动效程序，而非视频文件。</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">但&#34;动效程序&#34;本身也有不同的形态。从我们当时的视角看，素材包至少有三种存在方式：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第一种：声明式配置包。</span></strong><span leaf=""> 这是我们特效 SDK 链路二的做法。素材包是一份 JSON 配置，描述用哪些渲染节点、怎么连接、参数是多少。SDK 内部有一组预置的渲染能力（粒子发射器、模糊、色彩变换等），JSON 负责调度它们的组合。表现力的上限等于预置能力的并集——SDK 没有的能力，JSON 再怎么写都做不出来。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第二种：引擎脚本 + 自定义 Shader。 </span></strong><span leaf="">这是 Unity、Unreal、Cocos 等游戏引擎的做法。用户可以写脚本控制渲染逻辑，写 shader 控制像素级表现。理论表现力的上限等于 GPU 的上限。但代价是 API 面很复杂——脚本要遵守引擎的生命周期约定（OnUpdate、OnRender），shader 要遵守渲染管线约定（顶点格式、uniform 绑定、pass 定义）。写出正确代码的门槛很高。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第三种：可执行渲染代码。</span></strong><span leaf=""> 这是 Neon 的做法。素材包里的 code 字段是一段完整的渲染函数，直接操作 HTML Canvas 2D context。没有预置原子的边界限制，也没有引擎管线的约定束缚。一个函数，一块画布，LLM 想怎么画就怎么画。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3055555555555556" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020467" src="https://wechat2rss.xlab.app/img-proxy/?k=92099668&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SRfFWZsC0ZHnvSHXLvfL4ImjfviauUMoBFP1qic6oRfAwAjIdhQB2Q7YG7pYlBeKYI26LCn1LLNdh7nicHz1OuQnTm9VvWiaTJoltk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们选</span><strong style="box-sizing: border-box;"><span leaf="">可执行渲染代码，</span></strong><span leaf="">原因很务实：LLM 写 Canvas 2D 的成功率远高于写引擎脚本 + shader。我们最初尝试过后者，结果不理想——渲染代码能成功执行的比例很低，而且 LLM 难以建立画面与代码之间的对应关系，它能写出语法正确的 shader，但不知道渲染出来长什么样。相比之下，LLM 训练数据中有大量 Canvas 2D API 示例，对&#34;这行代码画出来是什么&#34;有先天明确的认知。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这是当下验证方向的务实选择：先把链路跑通，验证可行性，再去搭建符合业务需求并且 AI friendly 的脚本引擎 + shader 脚手架。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">同样走代码生成路线的还有 Remotion，但架构重心不同：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.375" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020465" src="https://wechat2rss.xlab.app/img-proxy/?k=b3f29612&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSII4fvLbI1vmgPoibiccic55VfhBtYJtGxSBj6bGwlwJ86GYUxIZFmT8WQVZpuQuQksBNI1mmTE4kGpwHtnvXfDO6yLMYXQJpEDo%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">两者不互斥。Remotion 擅长的时间线编排恰好是 Neon 目前的短板，未来有可能引入 Remotion 做时间线编排层，底层保留图形管线。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">顺着这个方案走下来，还有一个额外收获：素材包本身变成了自包含的。传统素材包离开 SDK 无法运行；Neon 的 MotionDefinition 自带渲染逻辑，一个 HTML 文件浏览器打开就能独立运行。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">具体来说，MotionDefinition 包含：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">code </span></strong><span leaf="">— 可执行的 Canvas 2D 渲染代码。这段代码接收当前时间和参数，在每一帧绘制画面。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">parameters</span></strong><span leaf=""> — LLM 根据效果语义声明的可调参数。比如一个赛博朋克风格的柱状图动效，LLM 会声明 primaryColor（主色）、barCount（柱子数量）、speed（动画速度）等参数，每个参数都有类型、默认值和取值范围。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">duration / durationCode</span></strong><span leaf=""> — 动效时长。可以是固定值，也可以是一段表达式（比如根据视频素材的实际长度动态计算）。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">postProcessCode</span></strong><span leaf=""> — 可选的 WebGL 后处理 shader 代码，用于叠加全屏效果（发光、模糊、色彩校正等）。</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这个选择带来了几个直接好处。</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">实时可调。</span></strong><span leaf=""> 用户拿到的是一个可运行的程序。拖动滑块改颜色，Canvas 上的画面立刻变化。</span></p></li></ul></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.24074074074074073" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020464" src="https://wechat2rss.xlab.app/img-proxy/?k=286af522&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6STymz2qsohIxfjATY6ghdE0P4fpticMPZkdFQrFankudlUfT4TJO27rzlxeb5XzON1cia0ibC7mhY3ZWnfbb0SXiasBdlzOPibtTicMY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">确定性输出。</span></strong><span leaf=""> 在同一设备和浏览器环境下，相同的参数和相同的随机种子，产出逐帧一致的渲染结果。预览看到什么，导出就是什么。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">多格式导出。 </span></strong><span leaf="">同一份 MotionDefinition，可以导出为 MP4 视频、零依赖的独立 HTML 网页、或包含完整对话和参数快照的 .neon 会话归档。一份代码，多种交付形态。</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">Neon 后续的架构——渲染引擎、参数系统、导出流水线——都围绕这个前提展开。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">二、渲染引擎的演进</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">渲染引擎后面的几次演进，本质上都在平衡两件事：LLM 现在能稳定写出什么，和我们真正想要什么效果。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">起步：Canvas 2D</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">第一版渲染引擎选了 Canvas 2D API，选型理由在上一章已经讲过。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">对于我们的目标场景——扁平动效、数据可视化、文字动画、粒子系统——Canvas 2D 完全够用。更重要的是，生成的代码，设计师或前端开发者可以直接理解逻辑、手动微调，不需要图形学背景。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">渲染循环的实现用 requestAnimationFrame 驱动，逐帧渲染，每帧调用 LLM 生成的渲染函数renderframe，传入当前时间戳、可调参数值和 Canvas Context。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">后处理层：WebGL Shader</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">然而 Canvas 2D 的实际视觉表现力存在明显的天花板。例如纯 2D 绘图很难做出发光（bloom）、运动模糊、色彩分离这类全尺寸后处理效果。我们的方案是在 Canvas 2D 之上再叠加一层 WebGL 进行后处理。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">此方案流程是：Canvas 2D 先画完一帧的内容，然后把整个 Canvas 作为纹理传给 WebGL，跑一遍全屏 shader 链（bloom、blur、色彩校正、畸变等），最终输出到用户可见的 Canvas 上。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">至于后处理 shader 怎么来，我们探索过两条路：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3990740740740741" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020470" src="https://wechat2rss.xlab.app/img-proxy/?k=2a57994f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SRP3cNCF0dSibic51ibpmFsZibAj3bfNibgm6o5MxatKEtaoibPa1pvIe4gNc0dAsVDQewMghIKgQLzcFyZbib2YOKia7Tn4CDiay6YZGeE%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">两种方案都支持用户拖动参数面板实时修改效果。随着 LLM 的 coding 能力持续增强，方案二的稳定性问题逐步缓解，最终保留了该方案。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3D 探索：Three.js</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Canvas 2D 实践之后表现力天花板越来越明显。我们尝试引入 Three.js 来支持 3D 动效。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">采用双 Canvas 方案——一个 Canvas 跑 2D 渲染，一个跑 Three.js 的 3D 渲染，最后 blend合成到一起。MotionDefinition 的格式可以保持不变，渲染函数的签名也一致，3D 场景只是多了一种渲染模式。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">从我们目前的效果来看，3D 仍处于玩具水平。Three.js 本身能力很强，但尝试下来 LLM 生成的 3D 场景代码质量并不高——灯光、材质、相机角度的配合需要很强的美术直觉、设计感，这恰恰是纯文字的 LLM 的短板。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">3D 是一个值得继续探索的方向，但目前还不是 Neon 的核心竞争力。如果要认真做 3D 动效，可能需要投入更多人力去搭建一套对 AI 更友好的 3D 脚手架、更丰富的渲染效果抽象层——降低 LLM 生成 3D 场景代码的门槛。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">三层叠加后的完整渲染管线如下：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3194444444444444" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020471" src="https://wechat2rss.xlab.app/img-proxy/?k=1caae4f0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SRqBf6uevKicyN0WD3cHhy95WaSDbertt0SaUsqz4G6UanW0hR1h1ZEKiaIcu60libmzzicxqkTIPmKMVibVJ9GRVcRrrjNYBibmL1YY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">三、让 LLM 生成&#34;能用&#34;的代码</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">实践下来，</span><strong style="box-sizing: border-box;"><span leaf="">单次 LLM 调用，一次产出代码能运行的概率在～90%，效果符合预期的概率在～20%。</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">动效代码对&#34;能用&#34;的定义很苛刻，不仅语法要对、运行不能报错、视觉效果要符合用户预期、性能不能太拉不然拖垮浏览器。任何一个环节出问题，给用户看到的就是开天窗，一个空白 Canvas 或一个无响应的页面。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">要提升成功率，关键不在写更复杂的system prompt，而是在生成链路上加了多层质量门控。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.31574074074074077" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020469" src="https://wechat2rss.xlab.app/img-proxy/?k=f3ef2f4d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6STMZ4vSTiauoJvPBC1FO3MYIu51ooRD3icsYHA2xUuGMYNLHmibuGPLbCUzw5b9QZnMkhwm0JkfQGibR7vicQQhku4Gntj9b17FAZBs%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">澄清：生成前先问清楚</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">用户说&#34;做个炫酷的动画&#34;，LLM 怎么办？猜什么样的算炫酷。猜错了用户不满意，重新生成，再猜，再重试。这样几轮下来体验是很差的。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们加了一个设计需求</span><strong style="box-sizing: border-box;"><span leaf="">澄清</span></strong><span leaf="">环节。LLM 收到用户模糊需求 prompt 后，不马上生成代码，而是先提出 1 到 5 个定向问题，每个问题附带 3 个以上的预设选项。比如：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">“主色调想要什么？” — 选项：赛博朋克蓝 / 暖金色 / 渐变彩虹 / 自定义</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">“动画节奏？” — 选项：缓入缓出 / 弹性 / 匀速</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">“元素数量？” — 选项：少量（3-5） / 中等（10-20） / 密集（50+）</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">用户点选或自定义回答之后，LLM 基于明确的需求再生成代码。预设选项降低了用户的输入成本——不需要精确描述，选一个最接近的就行。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="2.1352201257861636" data-s="300,640" data-type="png" data-w="636" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020468" src="https://wechat2rss.xlab.app/img-proxy/?k=1b835b98&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SS1RqHAlLnia9IPQbz7FLbXUVHIz7LH8oApwnvJo0kntyOAJhBjkJphmJsqC3j7vjKZMCNeibibuX6zHMGKHib0QceW1cYyew1qZvA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">自动纠错：生成后自动修</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">LLM 生成的代码经常有 bug。例如JavaScript语法错误、引用未定义的变量、Canvas API 调用参数错误等等。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">一个方案是让用户看到报错信息，然后手动修改代码或重新描述需求。但我们的用户很大是不懂代码的设计师，看到红红的报错 TypeError: Cannot read properties of undefined 并不能帮助他们解决问题。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Neon 的方案是自我感知自动修复：检测到运行时异常后，把出错的代码和错误信息一起发回给 LLM，让它自己修。最多会尝试 3 轮。多数情况下，LLM 能在 1 到 2 轮内修好问题。在给足错误的具体位置和原因，修bug比写容易多了。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3 轮之后仍然失败的，就向用户展示错误信息和&#34;重新生成&#34;按钮。不无限重试，因为如果 3 轮修不好，大概率是一开始生成的代码方案本身有问题，需要用户换一种描述。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">帧耗时检测：运行时兜底</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">还有一类问题是渲染卡顿。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">LLM 偶尔会生成计算量爆炸的代码——循环嵌套太深、每帧创建大量对象、在 requestAnimationFrame 里做同步的cpu密集计算。单帧渲染耗时几秒甚至十几秒，页面完全卡死，用户只能强制刷新。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">于是加了帧耗时检测：单帧渲染超过 100ms 就自动暂停，弹 toast 告诉用户渲染代码太卡。用户可以调参数降低复杂度，或者让 LLM 重新生成。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">不同模型的生成效果</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Neon 不绑定特定模型，支持任何兼容 OpenAI Chat Completions API 的 LLM。以下是不同模型对同一 prompt 的生成效果：</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">“Create a parallax timeline using floating glass cards. Glide smoothly through 3D space, bringing each milestone into sharp focus with a depth-of-field effect.”</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.84375" data-s="300,640" data-type="gif" data-w="800" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020479" src="https://wechat2rss.xlab.app/img-proxy/?k=6287a397&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FtY0ozQev6STfIS5om0TpSZkiaU0VYTSWjGjbOiaOroBeOP9SKwZyjl7EIxem1AmaPibfHR2nUXGgYWysHCb7icRg0AgJxeviaCIIylmO39Fz8erk%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">不同模型对 “parallax”（视差）、“depth-of-field”（景深）等空间效果的理解和实现程度不同，这也是我们前面提到增加了澄清环节的原因。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">小结</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">三层门控各司其职：澄清收窄需求、纠错修复问题、性能检测兜底。与其追求&#34;一次做对&#34;，不如接受 LLM 会出错，用工程手段快速纠正。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">但三层门控只能保证&#34;代码能跑&#34;，短板是</span><strong style="box-sizing: border-box;"><span leaf="">分阶段渲染的缺失</span></strong><span leaf="">。Neon 目前生成的动效大多&#34;所有元素同时动&#34;，而好的动效有清晰的阶段——进场、变换、退场。LLM 很难自发产生这种概念。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们计划在 MotionDefinition 中增加 phases 显式定义，让 LLM 先规划阶段结构，再填充渲染逻辑。这与剪辑软件中 Clip 的概念类似。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">四、描述规则而非画面</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">上一章解决的是&#34;代码能不能跑&#34;的问题。但还有一个更前置的问题：用户应该怎么写 prompt？</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">直觉上，动效的 prompt 和文生视频差不多——描述画面就好。但 Vibe Motion 的产出物是代码而非像素，这决定了 prompt 要传达的信息本质不同。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4537037037037037" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020473" src="https://wechat2rss.xlab.app/img-proxy/?k=3e61aaf6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSktkTRnaxoOpEiaib5ja0xQgIXmwbwsqOM9jmIk1jUetF0qy5icVfCNNIqfNg4baf6f8eiciaOXIVAzlGBKN09oRG18M4sxCAEoT8o%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">文生视频的 prompt 描述的是</span><strong style="box-sizing: border-box;"><span leaf="">画面应该长什么样</span></strong><span leaf="">——构图、色调、光影、镜头运动。模型的任务是把文字翻译成像素。一个典型的文生视频 prompt：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">“金色粒子在深色背景上爆炸，电影感，景深模糊”</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">它描述的是视觉结果。用户不关心粒子怎么运动，只关心最终画面好不好看。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Vibe Motion 的 prompt 描述的是</span><strong style="box-sizing: border-box;"><span leaf="">动效背后的运动规则</span></strong><span leaf="">——元素怎么出现、怎么移动、怎么消失，受什么力、以什么速度衰减。因为 LLM 生成的不是像素，而是一段可执行的渲染程序，prompt 需要传达的是程序的行为逻辑：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">“粒子从画面中心向外发射，初速度快然后逐渐减速，有轻微随机偏转，生命周期末尾透明度渐隐，整体受一个向下的重力影响”</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">它描述的是运动系统的物理规则：发射源、速度衰减、随机扰动、生命周期、外力。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这个差别直接决定了产出物能不能调参。文生视频的 prompt 描述外观，模型输出像素，像素没有&#34;系数&#34;可言，结果不可调。Vibe Motion 的 prompt 描述规则，LLM 把规则写成代码，代码里是数学公式——比如用户说&#34;粒子向外扩散，逐渐减速&#34;，LLM 写出的大概是：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="ini"><code><span leaf=""><span class="code-snippet__attr">velocity</span> = initialSpeed * Math.pow(damping, t)</span></code></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这行公式里的 initialSpeed 和 damping 就是天然的可调参数。不是后加的，是公式本身的一部分。LLM 把它们声明到 MotionDefinition 的 parameters 里，用户拖滑块改的就是这些系数。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">参数可调并不是后面硬加上的能力，而是这套范式顺出来的结果。既然 prompt 描述的是规则，代码里自然会落成公式；公式一旦出现，可调参数也就跟着出来了。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这也解释了第三章的澄清环节为什么会问&#34;节奏&#34;“数量”&#34;速度&#34;这类问题——它们不是在收集画面描述，而是在收集运动规则的关键变量。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">Prompt 工程的方向也因此不同。文生视频的 prompt 工程围绕&#34;描述力&#34;——怎么用语言精确描述画面（加 negative prompt、加风格词、加镜头术语）。Vibe Motion 的 prompt 工程围绕&#34;规则表达力&#34;——怎么高效地传达运动规则。从实践来看，几类表述对 LLM 的代码生成质量影响明显：用物理直觉词汇（“弹性碰撞”“阻尼振荡”）比用感性描述（“看起来有弹性”）精确；用阶段性描述（“先聚集，再爆炸，最后飘散”）比单一描述（“粒子爆炸”）能产出更有节奏的动效；用约束（“速度不超过 200px/s，粒子数量 50-100”）比用形容词（“密集的快速粒子”）更可控。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">五、参数系统与实时控制</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">上一章讲了因果链：规则 → 公式 → 系数 → 参数。这一章看具体实现。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">LLM 在生成 MotionDefinition 时，会根据效果的语义自动声明一组可调参数。我们支持 10 种参数类型：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9527777777777777" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020475" src="https://wechat2rss.xlab.app/img-proxy/?k=eeb98cb9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSiazQVDicqnplRem3K0EWyvgMRjxhNHJ1hsPWnXEdImmhzv9aW9V8iaokLwJibyngExtHfHxUxfnCzDIY5Ma5YY8fvxgGj46P6Pkc%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">参数的流转路径很直接：LLM 在 MotionDefinition 的 parameters 字段中声明参数的名称、类型、默认值和取值范围；前端根据声明自动生成对应的 UI 控件；用户在参数面板修改值后，新值立即注入渲染函数的 params 对象，Canvas 在下一帧就反映变化。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">很多动效的时长不是固定的。比如一个视频转场效果，总时长取决于用户上传的视频有多长。如果在 MotionDefinition 中写死 duration: 5000，用户上传一个 10 秒的视频就会被截断。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们的方案是 durationCode——一段在运行时求值的表达式。LLM 可以生成类似 Math.max(params.video1.videoDuration, params.video2.videoDuration) 的表达式，时长随素材变化自动调整。静态 duration 作为 fallback，durationCode 求值失败时兜底。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">六、导出体系：从预览到交付</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">设计师最终需要一个可以交付的产物——视频文件、可嵌入的网页、或者能分享给同事的项目归档。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">视频导出</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">视频导出是最直接的需求。我们在浏览器端完成编码，无需上传服务器。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">导出流程是：创建一个离屏 Canvas，按目标帧率（24 / 30 / 60 fps）逐帧调用渲染函数，每帧提取像素数据送入编码器。确定性渲染在这里发挥作用——同样的参数和种子保证导出结果和预览完全一致。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们还支持 Alpha 通道导出。输出是一个 ZIP 包，包含 RGB.mp4 和 Alpha.mp4 两个文件，设计师可以直接拖进 After Effects 或 Premiere 做合成。分辨率支持 720p、1080p 和 4K。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">HTML 资产包</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">一键导出一个零依赖的单个 .html 文件，里面内嵌了渲染代码、资源文件和一个简单的参数面板。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">用户可以选择暴露哪些参数。导出后这个 HTML 可以直接在浏览器打开、部署到 CDN、或者发给开发者做集成。不需要安装任何依赖，不需要搭建环境，双击就能跑。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">实际场景中，设计师做完效果导出 HTML，丢给前端同事，前端看到实时效果后直接把代码集成进项目。这比传统的&#34;设计师出设计稿 → 前端还原&#34;流程更顺畅。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">会话归档</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Neon 的对话过程本身也是有价值的——prompt 怎么写的、LLM 做了什么澄清、参数调了几轮。这些上下文对复现和迭代都很重要。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">.neon 会话归档文件把完整对话、当前 MotionDefinition、所有参数快照和附件打包成一个 JSON 文件。可以跨设备迁移、团队内共享，也可以做版本备份。支持批量导出多个对话到一个文件。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">七、动效复刻：从视频到可编辑程序</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">设计师经常会遇到一个场景：看到一个喜欢的动效，想做一个类似的。传统做法是肉眼分析运动规律，然后在 AE 里手工重建——费时费力，而且重建出来的只是视觉上的近似，没有参数化的调整能力。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们尝试用 VLM 自动化这个过程：用户上传一段参考视频，系统分析画面内容，生成可编辑的动效代码。这个方向经历了两个版本的探索。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第一版：全自动流水线</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">最初的思路很直觉——让 VLM 看视频帧，直接生成渲染代码，然后自动跑 5 轮迭代优化，每轮对比参考帧和渲染帧、修改代码、再对比。用户等着拿结果就行。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">问题出在第一步。VLM 的分析质量不稳定，有时候对运动方向、元素数量、时间节奏的理解是错的。但这个错误对用户不可见——系统拿着错误的理解直接生成代码，然后在错误的基础上迭代 5 轮。迭代确实在&#34;优化&#34;，但优化的方向是错的。5 轮 API 调用花出去了，结果和用户想要的效果毫无关系。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">核心问题是：</span><strong style="box-sizing: border-box;"><span leaf="">VLM 的分析质量不确定，全自动流水线放大了这个不确定性。</span></strong></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第二版：用户参与的分阶段流程</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们把&#34;分析&#34;和&#34;生成&#34;拆开，中间插入用户确认环节。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">抽帧。</span></strong><span leaf=""> 用户上传视频后，浏览器端从视频中均匀采样 16 个关键帧。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">结构化分析。 16 帧发给 VLM，从 10 个维度提取特征：视觉元素的形状和数量、运动轨迹和缓动函数、时间阶段划分、背景类型、色彩方案、模糊和发光效果等。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">核心特征精炼。</span></strong><span leaf=""> 初次分析容易泛泛而谈——“有一些粒子在移动”。我们加了一轮精炼：VLM 从初次分析中识别出 1 到 3 个定义这个效果身份的核心视觉特征，评估初次描述是否足够精确，不够的就补充具体数值。比如&#34;粒子&#34;会被精炼为&#34;约 80 个圆形粒子，半径 2-5px，从画面中心向外扩散，速度先快后慢，带高斯模糊拖尾&#34;。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">用户确认。 </span></strong><span leaf="">分析结果展示给用户。用户可以确认，也可以补充修正——比如&#34;这不是粒子扩散，是烟花爆炸，先上升再炸开&#34;。修正内容会和分析结果一起传给后续的代码生成环节。第一版没有这个环节，VLM 理解错了用户无从纠正，后续迭代全在错误方向上浪费算力。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">代码生成与迭代优化。</span></strong><span leaf=""> 确认后，系统基于分析结果和参考帧生成 Canvas 渲染代码，然后自动进入迭代优化——VLM 对比参考帧和渲染帧，找出差异最大的 2 到 3 个问题，针对性修改代码。每轮只修最突出的几个问题，不是全部，避免改一处坏三处。如果某轮迭代的分数下降，自动回退到最佳版本重新尝试；如果连续多轮分数持平，说明陷入了局部最优，系统会尝试更大幅度的改动来跳出当前方案。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">两版的核心差异</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.46944444444444444" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020474" src="https://wechat2rss.xlab.app/img-proxy/?k=c1bddd60&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSiaFludzol1IJNn7d8ft4dr6snPC4tGX6pWQ1icWibibJEzVVbcN0dzEGFl7MmRd6ElE2iaicm9mXqZXqmoUs4Vm804VRGE4fSuMhoQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">从我们的尝试来看，第二版在简单动效（粒子、渐变、几何变换）上的复刻效果还不错，时间线排布上也有明显好转——元素的进场、变换、退场节奏更接近原始效果。复杂动效仍然差距明显。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.31261595547309834" data-s="300,640" data-type="gif" data-w="1078" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020476" src="https://wechat2rss.xlab.app/img-proxy/?k=71077a7a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FtY0ozQev6SQ3ujgnfOHOC4pVmoJMGCRPL3qxziaNibqjMibbYKZp1E1pK6a7TDKm0YakAxODNkfUyuL2U1SiaGzIwO1mPOoqm3vHNBzTm23GgWw%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">另外我们也意识到：逐像素复刻在现阶段是ROI很低的目标。就目前的模型能力而言，LLM 没有像素级的视觉精度，高保真复制不是它擅长的事。批量生成多个变体再从中挑选，才应该是它的主要发力点。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">八、Neon Skill：从 GUI 到 Agent Skill</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Neon Lab 是面向设计师的交互形态——对话、预览、调参、导出，全在浏览器里完成。但我们希望动效生成能力也能脱离 GUI 使用。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们把 Neon 的动效生成能力封装成了 Claude Code 的 Skill。核心动机有下面两个。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">一个是</span><strong style="box-sizing: border-box;"><span leaf="">复用 Claude Code 的工程能力</span></strong><span leaf="">。Neon Lab 里的Agent设计比较简单， LLM 调用是孤立的，每次对话只有用户的 prompt 和系统预设。但在 Claude Code 里，LLM 能看到整个动效项目的文件结构、读取相关代码、理解当前环境上下文。比如用户说&#34;给这个 dashboard 做一个数据加载动画&#34;，Claude Code 可以先读 dashboard 的代码，理解数据结构和配色方案，再生成风格匹配的动效。这种上下文感知能力，我们在浏览器里的 Neon Lab 很难做到。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">更关键自我迭代能力。多轮对话中，LLM 能关注到用户之前的偏好：“不要紫色”“动画速度偏快”“粒子数量不要太多”。生成动效后，Claude Code 会调用渲染工具输出视频，自己看效果，不满意就改代码、再渲染、再比对，多轮迭代直到符合预期。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">第二个是</span><strong style="box-sizing: border-box;"><span leaf="">面向 Agent 的工具接口</span></strong><span leaf="">。比如你让养的🦞(OpenClaw)为某个视频添加动效时，直接调用这个 Skill 就行，不需要通过繁琐的 GUI 交互。动效生成的消费者从设计师逐渐扩展到AI Agent。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">同一个渲染引擎，两个前端</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Neon Lab 通过网页内的 LLM 调用生成渲染代码，Neon Skill 通过 Claude Code 这类Coding Agent生成渲染代码。目标和结果一致，过程不同。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">整个系统拆成三个独立产物：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">渲染 bundle </span></strong><span leaf="">— 从 Neon Lab 的渲染模块独立打包出来的一份 HTML + JS。包含 Canvas/WebGL 渲染器、H.264 编码器等所有运行时依赖。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">CLI 渲染工具</span></strong><span leaf=""> — 一个 Node.js 命令行工具，内置渲染 bundle。通过 Playwright 启动 headless Chrome，加载渲染 bundle，注入 MotionDefinition，逐帧渲染并编码输出 MP4。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Skill 指令文件</span></strong><span leaf=""> — 指导 Coding Agent 怎么生成 `.neon` 文件、调用 CLI 渲染。</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">其中 `.neon` 文件是通用草稿。GUI 里生成的效果可以导出 `.neon`，在 CLI 里渲染；CLI 产出的 .neon 也可以拖进 GUI 里预览和调参。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Skill 的组成：不只是一段 prompt</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Neon Lab 的 system prompt 是一段很长的提示词，把渲染规范、参数格式、示例代码全揉在一起。这在WebUI 对话框里勉强能用，但对 Claude Code 来说并不是好的做法。 Skill 应该是模块化的参考文档，Coding Agent按需加载。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">于是我们把 system prompt 拆解成了几份独立的参考文档：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">SKILL.md — 入口文件，定义 Skill 的触发条件和工作流程</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">CANVAS-GUIDE.md / WEBGL-GUIDE.md / POSTPROCESS-GUIDE.md — 三种渲染模式的代码编写规范</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">PARAMETERS.md — 10 种参数类型的声明格式</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">EXAMPLES.md — 完整可运行的动效示例</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">Claude Code 在生成动效时，先读取 SKILL.md 理解整体流程，再按需加载对应的渲染规范。不需要每次都把所有prompt指令塞进上下文。这在长对话中尤其重要，避免 context window 被无关的规范文档占满，影响LLM的注意力，提升模型性能。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">CLI天生适配动效复刻的需求</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">第七章讲的动效复刻，在 GUI 里依赖浏览器端抽帧和 VLM 对话。我们在 CLI 端也做了一套复刻 Skill，思路一致但交互方式不同。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">CLI 复刻的流程是：用 FFmpeg 从参考视频中抽取key帧，Claude Code 分析后为每个动画阶段提取&#34;灵魂特征&#34;。提取的特征不是像素级别描述文本，而是可量化的运动指标（例如运动方向、缓动曲线、空间变化幅度等）。在生成初版 .neon 后渲染出视频文件，把原始key帧和渲染帧拼成对比图，喂给 Claude Code进行逐阶段比对，每轮只改差异性最大的问题。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">和 GUI 复刻相比，CLI 的优势在于 Claude Code 能直接读写文件、调用脚本、管理多轮迭代的目录结构。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">写在最后</span></b></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这些技术选型其实都可以换掉：Canvas 2D、WebGL、Three.js、h264-mp4-encoder，那 Neon 的核心是什么？</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们认为平台核心是 MotionDefinition，以及围绕它的上游能力：自然语言 → 运动规则 → 可执行代码 → 可调参数。其中渲染链路和导出格式可以看作适配层，可插拔不同的技术选型。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4583333333333333" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020477" src="https://wechat2rss.xlab.app/img-proxy/?k=dadb2d0f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSH5hwCTHcWbTGAPmd4hwIFahDbEsfGVbHH9BTZ2qLxaTckCEibpuka5RJwtREFib2VpSianfPYUpiaG8qJlxOu5r18cs8mNabbJKk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">未来工作的重点：回到特效 SDK 本身，把它改造成更 AI Friendly 的脚本引擎 + shader 体系。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">MotionDefinition 不变，变的只是下游渲染链路。不只是渲染后端可以换。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">前面章节讲的澄清、纠错、分阶段复刻等环节，本质上都是在补偿当前模型能力的不足。随着基础模型持续迭代，这些 workflow 中的一部分必然会变得冗余。我们对此有预期，也乐见其成，workflow 越精简，其实用户体验越好。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Vibe Motion 作为一个品类才刚起步，天花板在哪，我们也不知道。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Neon 的基础版本已在 GitHub 开源，如果你也在探索类似的方向，欢迎一起交流～</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">项目地址：</span><span style="text-decoration: underline;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);"><em style="box-sizing: border-box;"><span leaf=""><a href="https://github.com/S1mpleSonny/neon-vibe-motion" target="_blank">https://github.com/S1mpleSonny/neon-vibe-motion</a></span></em></span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨森破</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">往期精彩指路</span></b></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><p style="text-align: justify;padding: 0px 8px;font-size: 13px;width: 100%;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 40px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247487748&amp;idx=1&amp;sn=c9cbcacf3bba25b478abf2a0f5c0e75f&amp;scene=21#wechat_redirect" textvalue="全链路压测改造之全链自动化测试实践" data-itemshowtype="0" linktype="text" data-linktype="2">全链路压测改造之全链自动化测试实践</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247493174&amp;idx=1&amp;sn=648bf0ffb5e31b1c211d22e636e2c3df&amp;scene=21#wechat_redirect" textvalue="哔哩哔哩⼤数据建设之路—实时DQC篇" data-itemshowtype="0" linktype="text" data-linktype="2">哔哩哔哩⼤数据建设之路—实时DQC篇</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247491092&amp;idx=1&amp;sn=b09492563c760775ed61f75db1bd5822&amp;scene=21#wechat_redirect" textvalue="Apache Kyuubi 在B站大数据场景下的应用实践" data-itemshowtype="0" linktype="text" data-linktype="2">Apache Kyuubi 在B站大数据场景下的应用实践</a></span></p></li></ul></p></div></div><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);"><div style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px 8px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;text-align: center;font-size: 12px;color: rgb(160, 160, 160);"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);visibility: visible;"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);visibility: visible;"><p data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;color: rgb(62, 62, 62);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3289447926347317252#wechat_redirect" textvalue="通用工程" linktype="text" data-linktype="2">通用工程</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2390333109742534656#wechat_redirect" textvalue="大前端" linktype="text" data-linktype="2">大前端</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3297757408550699008#wechat_redirect" textvalue="业务线" linktype="text" data-linktype="2">业务线</a></span></span></p><p style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;color: rgb(62, 62, 62);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2329861166598127619#wechat_redirect" textvalue="大数据" linktype="text" data-linktype="2">大数据</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2782124818895699969#wechat_redirect" textvalue="AI" linktype="text" data-linktype="2">AI</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2532608330440081409#wechat_redirect" textvalue="多媒体" linktype="text" data-linktype="2">多媒体</a></span></span></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-index="0" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/300?wx_fmt=png&amp;wxfrom=19" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-origin_num="362" data-biz_account_status="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-index="1" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/300?wx_fmt=png&amp;wxfrom=19" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-origin_num="22" data-biz_account_status="0" data-service_type="2" data-verify_status="2"></mp-common-profile></p></div></div></div></div></div></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=2317f984&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247504130%26idx%3D1%26sn%3De16047064d35627ab2d3619c1f763890">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Tue, 31 Mar 2026 12:05:00 +0800</pubDate>
    </item>
    <item>
      <title>哔哩哔哩26春招&amp;27暑期实习正式启动！</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247504111&amp;idx=1&amp;sn=89e48eb7d152cc1f384cb3343d2e05e9</link>
      <description>算法、AI相关岗位机会多多！</description>
      <content:encoded><![CDATA[<p><span>等你投简历的</span> <span>2026-03-13 15:19</span> <span style="display: inline-block;">云南</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=09445dc0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FtY0ozQev6SQCqEGmPSiaCY0F6GyvoiaYjlRib2Wou4HlM4T3CicvDrxIWeia1gYZBDkHQG8iaOBE2vL9kL3CX4qIoRSZWQsFUd5fLtlrKFtVVF5cc%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>算法、AI相关岗位机会多多！</p>
  <p style="text-align: center;"><img class="rich_pages wxw-img js_insertlocalimg" data-ratio="6.371296296296296" data-s="300,640" data-type="png" data-w="1080" style="height: auto !important;" type="block" data-imgfileid="100020459" data-aistatus="1" src="https://wechat2rss.xlab.app/img-proxy/?k=7f0fb9e2&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSUvbtbMiceicabkI7BxLoGjoeiauibooGvkibcjVOqOsofUA0P45hcke0v7KmJicW8osTAtXs2iaag7yUkzB1ncOn2fviaqCzZGMeojXo%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p class="mp_profile_iframe_wrp"><mp-common-profile class="custom_select_card mp_profile_iframe mp_common_widget" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/0?wx_fmt=png" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-service_type="2" data-verify_status="2"></mp-common-profile></p><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="https://jobs.bilibili.com/campus">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=97223a3b&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247504111%26idx%3D1%26sn%3D89e48eb7d152cc1f384cb3343d2e05e9">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 13 Mar 2026 15:19:00 +0800</pubDate>
    </item>
    <item>
      <title>从“截图大法”到真实交互：B站专栏视频卡的技术革命</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247504106&amp;idx=1&amp;sn=7aaeea54b277e360432ccdf05df2e274</link>
      <description>回望B站富文本编辑器的演进史，我们经历了一个从“无”到“有”，再从“有”到“优”的过程。</description>
      <content:encoded><![CDATA[<p>原创 <span>大前端</span> <span>2026-03-12 12:04</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=c1059cbc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FtY0ozQev6STfBuAHx1VjysAsTFu6kkJFROQQcFEvmKgOwQs97O2H8YaHKiaVJwbIwTBfCfgAfQZLNeeibXDqUMd2fQZic3kpomjMSETfZTFt5Q%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>回望B站富文本编辑器的演进史，我们经历了一个从“无”到“有”，再从“有”到“优”的过程。</p>
  <div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">背景：从“伪造”卡片到真实交互</span></strong></p></div></div></div><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">回望 B 站富文本编辑器的演进史，我们经历了一个从“无”到“有”，再从“有”到“优”的过程。在 UEditor 时代，我们解决了基本的文本编辑需求；在 Quill 时代，我们引入了 Delta 数据模型。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">然而，在 Quill 时期，面对视频卡等复杂卡片，受限于 Quill 对 BlockNode 缺乏完善的支持，被迫采用“ Canvas 绘图伪造卡片” 的障眼法。今天，拥抱 ProseMirror 生态，这套“ 截图大法” 终于画上句号，取而代之的是支持真实交互的卡片渲染系统。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这场从“伪造”到“真实”的革命，不仅是一次技术栈的迁移，更是一次对技术债的降维打击。今天就带大家深入代码底层，看看我们是如何填平这个深坑的。</span></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第一章：旧世界——那些年，</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">我们用 Canvas “画”出来的视频卡</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1.1 用户视角的“灵异”体验</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">你可能经历过这样的场景：在专栏里粘贴了一个视频链接，然后看着 Loading 转圈圈，心里默数两秒，“啪”的一下，编辑器里出现了一个视频卡片。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">看起来很美？别急着夸。当你试图点击播放时，发现它毫无反应；当你试图修改标题时，发现根本选不中文字。这哪里是视频卡片，这分明就是一张死图！</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">是的，这就是我们不得不采用的</span><strong style="box-sizing: border-box;"><span leaf="">“Canvas 截图大法”</span></strong><span leaf="">。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1.2 技术黑幕：Canvas 的“障眼法”</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">为了在 Quill 这个不支持复杂 Block Node 的编辑器里塞进一个视频卡，我们当年可是绞尽脑汁，最终设计了一套后续发现极其痛苦的 `html2canvas` 截图链路：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1. </span><strong style="box-sizing: border-box;"><span leaf="">隐式渲染：</span></strong><span leaf="">在浏览器可视区域外（看不见的地方），用 HTML 偷偷画一个临时的卡片 DOM。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2. </span><strong style="box-sizing: border-box;"><span leaf="">Canvas 截图：</span></strong><span leaf="">调用 `html2canvas` 咔嚓一下，把这个 DOM 变成 Canvas。为了保证清晰度，通常需要设置 `scale: 4`。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">3. </span><strong style="box-sizing: border-box;"><span leaf="">图片生成：</span></strong><span leaf="">将 Canvas 导出为 Base64 图片。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">4. </span><strong style="box-sizing: border-box;"><span leaf="">上传替换：</span></strong><span leaf="">把图片上传到 CDN,最后在编辑器里插一个静态的 `&lt;img&gt;` 标签。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6712962962962963" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020441" src="https://wechat2rss.xlab.app/img-proxy/?k=e388b0b4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSFU7nAWTicliaicfEUlkbapTrgQLWWPOrcqvXLSiaZXQHBNxXxCQxBDjHdTUvsUHh2GoW5OsBYE33NrkvMWk1HzD2D32yrIBOxzBY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1.3 无法回避的四大痛点</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">说实话，每次写这段代码时，我的内心都是崩溃的。这种做法虽然暂时解决了跨平台兼容问题，但代价是沉重的：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">交互性丧失（Interactive Loss）：</span></strong><span leaf="">这仅仅是一张死图。所谓“所见即所得”其实是“所见即图片”。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">性能黑洞：</span></strong><span leaf="">整个“API请求 → 绘制 → 截图 → 上传”的链路平均耗时 2秒 以上。严重打断写作心流。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">数据死锁：</span></strong><span leaf="">卡片上的播放量、弹幕数永远停留在插入的那一刻。如果视频后续爆火，卡片信息也不会更新，甚至误导读者。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">存储浪费：</span></strong><span leaf="">每一张生成的卡片图片都需要占用 CDN 空间，随着文章数量增长，这是巨大的隐形资源浪费。</span></p></li></ul></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第二章：病根诊断——</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">当 Quill 遇上视频卡</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">为什么 Quill 做不好视频卡？这得从它的底层基因说起。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2.1 Delta 像“收银小票”，</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">ProseMirror 像“乐高积木”</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">Quill 使用的是</span><strong style="box-sizing: border-box;"><span leaf=""> Delta </span></strong><span leaf="">数据模型。Delta 本质上是一个线性的操作记录，就像一张长长的收银小票🧾。</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="php"><code><span leaf=""><span class="code-snippet__comment">// Quill Delta: 扁平的线性记录</span></span></code><br/><code><span leaf="">[</span></code><br/><code><span leaf="">  { <span class="code-snippet__string">&#34;insert&#34;</span>: <span class="code-snippet__string">&#34;Hello &#34;</span> },</span></code><br/><code><span leaf="">  { <span class="code-snippet__string">&#34;insert&#34;</span>: { <span class="code-snippet__string">&#34;video&#34;</span>: { <span class="code-snippet__string">&#34;id&#34;</span>: <span class="code-snippet__string">&#34;BV1xx...&#34;</span> } } }, <span class="code-snippet__comment">// 强行插入一个对象</span></span></code><br/><code><span leaf="">  { <span class="code-snippet__string">&#34;insert&#34;</span>: <span class="code-snippet__string">&#34;</span></span></code><br/><code><span leaf="">&#34; }</span></code><br/><code><span leaf="">]</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">你想在这张薄薄的小票中间塞进一个立体、复杂的“视频播放器盒子”？太难了！Delta 天生就是扁平的，它很难描述复杂的嵌套结构。我们被迫使用的“截图大法”，其实就是在小票上画了个电视机的图案，而不是真的放了个电视机。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">而 </span><strong style="box-sizing: border-box;"><span leaf="">ProseMirror</span></strong><span leaf=""> 使用的是 </span><strong style="box-sizing: border-box;"><span leaf="">Document Model（文档树），它就像是乐高积木</span></strong><span leaf="">。</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="json"><code><span leaf=""><span class="code-snippet__comment">// ProseMirror Tree: 结构化的树形数据</span></span></code><br/><code><span leaf=""><span class="code-snippet__punctuation">{</span></span></code><br/><code><span leaf="">  <span class="code-snippet__attr">&#34;type&#34;</span><span class="code-snippet__punctuation">:</span> <span class="code-snippet__string">&#34;doc&#34;</span><span class="code-snippet__punctuation">,</span></span></code><br/><code><span leaf="">  <span class="code-snippet__attr">&#34;content&#34;</span><span class="code-snippet__punctuation">:</span> <span class="code-snippet__punctuation">[</span></span></code><br/><code><span leaf="">    <span class="code-snippet__punctuation">{</span> <span class="code-snippet__attr">&#34;type&#34;</span><span class="code-snippet__punctuation">:</span> <span class="code-snippet__string">&#34;paragraph&#34;</span><span class="code-snippet__punctuation">,</span> <span class="code-snippet__attr">&#34;content&#34;</span><span class="code-snippet__punctuation">:</span> <span class="code-snippet__punctuation">[{</span> <span class="code-snippet__attr">&#34;type&#34;</span><span class="code-snippet__punctuation">:</span> <span class="code-snippet__string">&#34;text&#34;</span><span class="code-snippet__punctuation">,</span> <span class="code-snippet__attr">&#34;text&#34;</span><span class="code-snippet__punctuation">:</span> <span class="code-snippet__string">&#34;Hello&#34;</span> <span class="code-snippet__punctuation">}]</span> <span class="code-snippet__punctuation">},</span></span></code><br/><code><span leaf="">    <span class="code-snippet__punctuation">{</span></span></code><br/><code><span leaf="">      <span class="code-snippet__attr">&#34;type&#34;</span><span class="code-snippet__punctuation">:</span> <span class="code-snippet__string">&#34;videoCard&#34;</span><span class="code-snippet__punctuation">,</span> <span class="code-snippet__comment">// 独立的块级节点</span></span></code><br/><code><span leaf="">      <span class="code-snippet__attr">&#34;attrs&#34;</span><span class="code-snippet__punctuation">:</span> <span class="code-snippet__punctuation">{</span> <span class="code-snippet__attr">&#34;bvid&#34;</span><span class="code-snippet__punctuation">:</span> <span class="code-snippet__string">&#34;BV1xx...&#34;</span> <span class="code-snippet__punctuation">},</span></span></code><br/><code><span leaf="">      <span class="code-snippet__attr">&#34;content&#34;</span><span class="code-snippet__punctuation">:</span> <span class="code-snippet__punctuation">[]</span> <span class="code-snippet__comment">// 可以继续嵌套其他节点</span></span></code><br/><code><span leaf="">    <span class="code-snippet__punctuation">}</span></span></code><br/><code><span leaf="">  <span class="code-snippet__punctuation">]</span></span></code><br/><code><span leaf=""><span class="code-snippet__punctuation">}</span></span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">你可以搭建一个名为&#34;视频卡&#34;的积木块,然后在里面随意嵌套&#34;标题积木&#34;、&#34;封面积木&#34;甚至&#34;播放器积木&#34;。这种树状结构天然就支持复杂的 </span><strong style="box-sizing: border-box;"><span leaf="">Block Node(块级节点)</span></strong><span leaf="">。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6712962962962963" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020440" src="https://wechat2rss.xlab.app/img-proxy/?k=1e4f6c66&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSe3S3lZz1Byc0QyO5gb1DU4xFMn5nNvw96o03fUNe5UGtj3OktgdVCFhBtUVfuWJ9nJGqeLZ2M12u9bFoXHIRK7CeyEZ2qgyo%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2.2 技术对比表：为什么我们要换枪?</span></strong></p></div></div></div><div style="text-align: center;box-sizing: border-box;"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.25462962962962965" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="100020456" src="https://wechat2rss.xlab.app/img-proxy/?k=293cef6c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSicMYmyO4DJHtFRqOWLxiaMK1wnibNzZlpmvfW6dtbJC3TVWV9aTozhZtic9Wg0koTXH0zDrcXDjTcTJ1QF4jIDg7RfjkWiaibfeQ18%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2.3 选型博弈: 为什么是TipTap+ProseMirror?</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在决定彻底抛弃 Quill 之前，我们对市面上的富文本技术方案进行了一次深度摸底。从底层技术演进来看，Web 富文本编辑器主要经历了三个维度的跃迁：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">Level 0（强依赖 DOM）：完全基于原生的 contenteditable，典型如 UEditor。技术门槛低，但跨端表现极其不可控。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">Level 1（视图即数据）：拥有自身抽象的数据模型，但依然依赖原生 DOM 渲染。典型如 Quill、Slate、Draft.js 及 ProseMirror。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">Level 2（自排版自渲染）：彻底抛弃 contenteditable，利用 Canvas/SVG 自研排版引擎，典型如 Google Docs。</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">从 B 站图文生态（专栏、动态）的实际业务诉求出发，L2 方案属于严重的性能与研发成本过剩，而 L0 方案早已无法满足现代组件的交互需求。因此，我们的主战场锁定在了 L1 级别的抽象数据模型方案。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在 L1 的终极对决中，面对生态优秀的 Lexical 和老牌的 Draft.js（往往强绑定 React），以及底层极其强大但 API 学习曲线陡峭的 ProseMirror，我们最终选择了 Tiptap + ProseMirror 的组合拳。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Tiptap </span></strong><span leaf="">作为基于 ProseMirror 构建的 Headless（无头）框架，完美继承了其强大的文档树（Document Tree）和 Schema 规范，同时提供了一层极其优雅的 API 封装。这套“底层稳健兜底，上层开发丝滑”的设计，斩断了特定 UI 框架的强依赖，成为我们完成这次降维打击的最优解。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第三章：ProseMirror 核心实战</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">——架构重组</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">既然痛点找准了，那就开干。我们设计了全新的</span><strong style="box-sizing: border-box;"><span leaf="">“编辑器-组件分离”</span></strong><span leaf="">架构，利用 ProseMirror 强大的</span><strong style="box-sizing: border-box;"><span leaf=""> NodeView</span></strong><span leaf=""> 机制，彻底重构了卡片系统。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6712962962962963" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020439" src="https://wechat2rss.xlab.app/img-proxy/?k=dea7d695&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQb8BIu1rGoibb5gNKfzGrnp7AOIjRhdDtBQ9JafnLyqNvxtPI1dU5iaalK33WUcE4ibibwdLtrtK30OWcPAD24wJtmHXQyToe7GUg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.1 架构革新：编辑器与组件的“分家”</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在这个架构中，编辑器不再负责具体的 UI 渲染，而是专注于文档结构的管理。NodeView 充当了“桥接”的角色。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.2 核心设计 I:Schema 定义(给积木定规矩)</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">首先，我们需要告诉编辑器，“视频卡”这个积木长什么样，有什么属性。</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="javascript"><code><span leaf=""><span class="code-snippet__comment">// schema/video-card.ts</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">const</span> <span class="code-snippet__title">VideoCard</span> = <span class="code-snippet__title">Node</span>.<span class="code-snippet__title">create</span>({</span></code><br/><code><span leaf="">  <span class="code-snippet__attr">name</span>: <span class="code-snippet__string">&#39;videoCard&#39;</span>,</span></code><br/><code><span leaf="">  <span class="code-snippet__attr">group</span>: <span class="code-snippet__string">&#39;block&#39;</span>,     <span class="code-snippet__comment">// 声明我是块级节点</span></span></code><br/><code><span leaf="">  <span class="code-snippet__attr">atom</span>: <span class="code-snippet__literal">true</span>,         <span class="code-snippet__comment">// 💡 关键点：原子化</span></span></code><br/><code><span leaf="">  <span class="code-snippet__attr">draggable</span>: <span class="code-snippet__literal">true</span>,    <span class="code-snippet__comment">// 可拖拽</span></span></code><br/><code></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 定义数据属性</span></span></code><br/><code><span leaf="">  <span class="code-snippet__title">addAttributes</span>() {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">return</span> {</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">card_style</span>: { <span class="code-snippet__attr">default</span>: <span class="code-snippet__title">CardStyle</span>.<span class="code-snippet__property">NORMAL</span> },   <span class="code-snippet__comment">// 卡片风格</span></span></code><br/><code><span leaf="">      <span class="code-snippet__attr">info</span>: { <span class="code-snippet__attr">default</span>: {} },             <span class="code-snippet__comment">// 业务数据</span></span></code><br/><code><span leaf="">      <span class="code-snippet__attr">status</span>: { <span class="code-snippet__attr">default</span>: <span class="code-snippet__string">&#39;loading&#39;</span> }          <span class="code-snippet__comment">// loading | loaded | error</span></span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">  },</span></code><br/><code></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 解析规则：怎么从 HTML 读出来</span></span></code><br/><code><span leaf="">  <span class="code-snippet__title">parseHTML</span>() {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">return</span> [{ <span class="code-snippet__attr">tag</span>: <span class="code-snippet__string">&#39;div[data-type=&#34;video-card&#34;]&#39;</span> }]</span></code><br/><code><span leaf="">  },</span></code><br/><code></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 渲染规则：怎么存成 HTML</span></span></code><br/><code><span leaf="">  <span class="code-snippet__title">renderHTML</span>(<span class="code-snippet__params">{ node }</span>) {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">return</span> [<span class="code-snippet__string">&#39;div&#39;</span>, { <span class="code-snippet__string">&#39;data-type&#39;</span>: <span class="code-snippet__string">&#39;video-card&#39;</span>, <span class="code-snippet__string">&#39;data-bvid&#39;</span>: node.<span class="code-snippet__property">attrs</span>.<span class="code-snippet__property">bvid</span> }, <span class="code-snippet__number">0</span>]</span></code><br/><code><span leaf="">  }</span></code><br/><code><span leaf="">})</span></code><br/></pre></p><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">🧐 Code Review:</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">`atom: true` 是这里的神来之笔。它告诉 ProseMirror：“这个节点是一个整体，光标不能跑进去，要么选中整个卡片，要么不选”。这完美符合卡片的交互逻辑，避免了光标在卡片内部乱窜的尴尬。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">`addAttributes` 定义了卡片的数据模型，这些数据会直接映射到 UI 组件的 Props 中。</span></p></li></ul></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.3 核心设计 II：NodeView</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">（连接两个世界的桥梁）</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">接下来是重头戏 —— </span><strong style="box-sizing: border-box;"><span leaf="">NodeView</span></strong><span leaf="">。它是连接 ProseMirror 数据层和 UI 渲染层的桥梁。我们要在这里把 UI组件挂载上去。</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="typescript"><code><span leaf=""><span class="code-snippet__comment">// NodeView：编辑器节点 ↔ UI 组件的桥接层</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">abstract</span> classBaseCardNodeView {</span></code><br/><code><span leaf="">  <span class="code-snippet__comment">// ProseMirror 调用生命周期方法</span></span></code><br/><code><span leaf="">  <span class="code-snippet__title">constructor</span>(<span class="code-snippet__params">node</span>)  <span class="code-snippet__comment">// 节点创建 → 初始化组件</span></span></code><br/><code><span leaf="">  <span class="code-snippet__title">update</span>(node)       <span class="code-snippet__comment">// 节点更新 → 同步组件数据</span></span></code><br/><code><span leaf="">  <span class="code-snippet__title">destroy</span>()          <span class="code-snippet__comment">// 节点销毁 → 清理组件资源</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 子类实现具体卡片类型</span></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">abstract</span> <span class="code-snippet__title">createCardComponent</span>()  <span class="code-snippet__comment">// 创建对应的业务组件</span></span></code><br/><code><span leaf="">}</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment">// 视频卡片实现</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">VideoCardNodeView</span> <span class="code-snippet__keyword">extends</span> <span class="code-snippet__title">BaseCardNodeView</span> {</span></code><br/><code><span leaf="">  <span class="code-snippet__title">createCardComponent</span>() {</span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 🚀 核心动作：挂载真实组件</span></span></code><br/><code><span leaf="">    returnnew <span class="code-snippet__title">VideoCard</span>({</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">data</span>: <span class="code-snippet__variable">this</span>.<span class="code-snippet__property">node</span>.<span class="code-snippet__property">attrs</span>,      <span class="code-snippet__comment">// 编辑器数据</span></span></code><br/><code><span leaf="">      <span class="code-snippet__attr">isInEditor</span>: <span class="code-snippet__literal">true</span>            <span class="code-snippet__comment">// 标识编辑器环境</span></span></code><br/><code><span leaf="">    })</span></code><br/><code><span leaf="">  }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 事件监听：组件 → 编辑器</span></span></code><br/><code><span leaf="">  <span class="code-snippet__title">setupEventListeners</span>() {</span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 监听组件内部的状态变更，同步回编辑器</span></span></code><br/><code><span leaf="">    <span class="code-snippet__variable">this</span>.<span class="code-snippet__property">cardComponent</span>.<span class="code-snippet__title">on</span>(<span class="code-snippet__string">&#39;statusChange&#39;</span>, <span class="code-snippet__function">(</span><span class="code-snippet__function"><span class="code-snippet__params">status</span></span><span class="code-snippet__function">) =&gt;</span> {</span></code><br/><code><span leaf="">      <span class="code-snippet__variable">this</span>.<span class="code-snippet__title">updateNodeAttributes</span>({ status })  </span></code><br/><code><span leaf="">    })</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__variable">this</span>.<span class="code-snippet__property">cardComponent</span>.<span class="code-snippet__title">on</span>(<span class="code-snippet__string">&#39;delete&#39;</span>, <span class="code-snippet__function">() =&gt;</span> {</span></code><br/><code><span leaf="">      <span class="code-snippet__variable">this</span>.<span class="code-snippet__title">deleteFromEditor</span>()  <span class="code-snippet__comment">// 从文档删除</span></span></code><br/><code><span leaf="">    })</span></code><br/><code><span leaf="">  }</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">🧐 Code Review:</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">这段代码实现了真正的“所编写即所得”。你在编辑器里看到的组件，就是发布后读者看到的组件，连代码都是同一份！</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">通过事件监听，组件内部的操作（如点击删除、重试加载）可以反向控制编辑器的数据状态。</span></p></li></ul></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第四章：硬核填坑——从“能用”到“好用”</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">重构之路从不平坦，为了让这个系统真正“好用”，我们解决了不少棘手的工程问题。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.1 隐秘的代价：插入极速，但运行态呢？</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 12px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">技术世界没有银弹。当我们为“极速插入”和“真实交互”欢呼时，隐秘的代价也随之而来——展示态（运行时）的性能崩盘风险。旧方案虽然插入慢，但在运行时只是一张死图，文章里塞入 50 个卡片依然能丝滑滚动。但新方案的每一个视频卡，都是一个包含了复杂 DOM 树、状态机、播放器的真实组件。如果放任不管，十几个播放器同时驻留内存，浏览器会直接崩溃 。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">为了兜住这层底线，我们在架构上设计了两大“降落伞”：</span></strong></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.2 把播放器“装”进编辑器</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">（CardPlayer 管理器）</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们引入了双视图自由切换模式与 CardPlayer 实例池 ：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">NORMAL 模式：普通小卡，仅展示封面和元信息，不播放视频 。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">ADVANCED 模式：点击后直接展开内嵌播放器，通过改变 card_style 属性无缝切换，受 `CardPlayer` 管理器控制 。</span></p></li></ul></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="javascript"><code><span leaf=""><span class="code-snippet__comment">// CardPlayer：全局播放器资源管理</span></span></code><br/><code><span leaf="">classCardPlayer {</span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">static</span> <span class="code-snippet__variable">MAX_PLAYERS</span> = <span class="code-snippet__number">3</span>  <span class="code-snippet__comment">// 🚦 最大实例数限制</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 互斥机制：播放时暂停其他</span></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">static</span> <span class="code-snippet__title">play</span>(<span class="code-snippet__params">playerId</span>) {</span></code><br/><code><span leaf="">    <span class="code-snippet__title">pauseOthers</span>(playerId)    <span class="code-snippet__comment">// 暂停其他播放器</span></span></code><br/><code><span leaf="">    <span class="code-snippet__title">startPlay</span>(playerId)       <span class="code-snippet__comment">// 启动当前播放器</span></span></code><br/><code><span leaf="">  }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 资源回收：超限时销毁最早的实例</span></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">static</span> <span class="code-snippet__title">enforceLimit</span>() {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">if</span> (count &gt; <span class="code-snippet__variable">MAX_PLAYERS</span>) {</span></code><br/><code><span leaf="">      <span class="code-snippet__title">destroyOldest</span>()         <span class="code-snippet__comment">// LRU 策略回收</span></span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">  }</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7851851851851852" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020433" src="https://wechat2rss.xlab.app/img-proxy/?k=bb56446f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SQV0jybCESWzD4vlXFaUfLlom4DAyXmWOzicK3qiaEeHqdcyCls4Cib9rjObWW14sDoywm17gJItzZm3ltj2iaKC4T91vvWT3ibzkKI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.2 极致性能优化（批量解析 + 三级缓存）</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">如果用户一次性粘贴 50 个链接怎么办？发 50 个 API 请求？服务器会报警的 ！我们重构了链接解析层，引入了</span><strong style="box-sizing: border-box;"><span leaf="">批量验证和共享缓存</span></strong><span leaf=""> 。</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="javascript"><code><span leaf=""><span class="code-snippet__comment">// 三层缓存：验证结果 + 类型 + 卡片数据</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">const</span> cache = {</span></code><br/><code><span leaf="">  <span class="code-snippet__attr">validation</span>: <span class="code-snippet__title">Map</span>&lt;url, boolean=<span class="code-snippet__string">&#34;&#34;</span>&gt;,</span></code><br/><code><span leaf="">  <span class="code-snippet__attr">type</span>: <span class="code-snippet__title">Map</span>&lt;url, parsedtype=<span class="code-snippet__string">&#34;&#34;</span>&gt;,</span></code><br/><code><span leaf="">  <span class="code-snippet__attr">card</span>: <span class="code-snippet__title">Map</span>&lt;url, carddata=<span class="code-snippet__string">&#34;&#34;</span>&gt;</span></code><br/><code><span leaf="">}</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment">// 批量验证：防抖 + 队列合并</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">async</span> <span class="code-snippet__keyword">function</span> <span class="code-snippet__title">validateLink</span>(<span class="code-snippet__params">url</span>) {</span></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 1. 缓存命中 → 立即返回</span></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">if</span> (cache.<span class="code-snippet__title">has</span>(url)) {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">return</span> cache.<span class="code-snippet__title">get</span>(url)</span></code><br/><code><span leaf="">  }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 2. 加入验证队列（防抖 100ms）</span></span></code><br/><code><span leaf="">  <span class="code-snippet__title">addToQueue</span>(url)</span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">await</span> <span class="code-snippet__title">waitBatchProcess</span>()</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 3. 批量请求完成后从缓存读取</span></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">return</span> cache.<span class="code-snippet__title">get</span>(url)</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">🧐 Code Review:</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">这里基于防抖，100ms 内的粘贴操作会被合并为一个请求（Batch API）。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">缓存是全局共享的。当用户在编辑器内反复撤销、重做或拖拽卡片时，直接命中缓存，实现 0 延迟渲染。</span></p></li></ul></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8805555555555555" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020442" src="https://wechat2rss.xlab.app/img-proxy/?k=5c4437c9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSbkXxFOXtbd8G0Yon9lAmutPM952HjNOdYzHBAia20KR9X15I4MeF5QqP65AkoV2UfBVDngP50uugAQfm6L9U6AZCTLyuuyjCg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6712962962962963" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020445" src="https://wechat2rss.xlab.app/img-proxy/?k=134d5de7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSlONbd8ktUk7poE05hjDibgQiccMDUgaBpXgKibQL5KJiaf3IKia6fCBh7UMNrKL555CyocTOg8v8bt5wy8Gr3b2HHtaQ1VcUDeWFo%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第五章：核心创新点总结</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""> 5.1 智能链接解析与双向转换</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们不仅支持从“链接”变“卡片”，还支持完美的逆向转换。通过 `resource_url` 字段保存用户原始输入信息，确保数据 100% 完整。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9611111111111111" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020443" src="https://wechat2rss.xlab.app/img-proxy/?k=48024ff6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSR0K3XMR4qJmZpJLEIiaAGTfwhGAxVw6AYFejMYmtzF6QbOxPn93Z8TCz2XyzH6zjPlDeW25z6SX3T9TAD9WmCeax3MUwYm4B0%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="typescript"><code><span leaf=""><span class="code-snippet__comment">// 核心数据结构：保存原始链接实现双向转换</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">interface</span> <span class="code-snippet__title">CardAttrs</span> {</span></code><br/><code><span leaf="">  <span class="code-snippet__attr">resource_url</span>: <span class="code-snippet__built_in">string</span>    <span class="code-snippet__comment">// 🔑 关键：保存原始链接</span></span></code><br/><code><span leaf="">  <span class="code-snippet__attr">info</span>: <span class="code-snippet__built_in">object</span>            <span class="code-snippet__comment">// 业务数据</span></span></code><br/><code><span leaf="">  <span class="code-snippet__attr">status</span>: <span class="code-snippet__title">State</span>           <span class="code-snippet__comment">// 加载状态</span></span></code><br/><code><span leaf="">}</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment">// 链接 → 卡片</span></span></code><br/><code><span leaf=""><span class="code-snippet__title">onPaste</span>(<span class="code-snippet__params">url</span>) {</span></code><br/><code><span leaf="">  <span class="code-snippet__title">insertCard</span>({ <span class="code-snippet__attr">resource_url</span>: url, <span class="code-snippet__attr">status</span>: <span class="code-snippet__string">&#39;loading&#39;</span> })</span></code><br/><code><span leaf="">}</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment">// 卡片 → 链接</span></span></code><br/><code><span leaf=""><span class="code-snippet__title">convertToLink</span>(<span class="code-snippet__params">card</span>) {</span></code><br/><code><span leaf="">  <span class="code-snippet__title">replaceWith</span>(card.<span class="code-snippet__property">resource_url</span>)  <span class="code-snippet__comment">// 恢复原始链接</span></span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">5.2 模板策略模式</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们抽象了 `BaseCard` 基类，利用策略模式处理不同类型的卡片渲染。无论是视频卡、专栏卡还是投票卡，都复用了同一套生命周期管理逻辑（mount → load → update → destroy），代码复用率提升了 </span><strong style="box-sizing: border-box;"><span leaf="">60%</span></strong><span leaf="">。</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="cs"><code><span leaf=""><span class="code-snippet__comment">// 抽象基类：定义统一的卡片生命周期</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">abstract</span> classBaseCard {</span></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 状态机：合法的状态转换路径</span></span></code><br/><code><span leaf="">  stateTransitions = {</span></code><br/><code><span leaf="">    LOADING → [LOADED, ERROR],   <span class="code-snippet__comment">// 加载中 → 成功或失败</span></span></code><br/><code><span leaf="">    ERROR → [LOADING],            <span class="code-snippet__comment">// 失败 → 可重试</span></span></code><br/><code><span leaf="">    LOADED → [LOADING]            <span class="code-snippet__comment">// 已加载 → 可刷新</span></span></code><br/><code><span leaf="">  }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 子类必须实现的抽象方法</span></span></code><br/><code><span leaf="">  <span class="code-snippet__function"><span class="code-snippet__keyword">abstract</span></span><span class="code-snippet__function"><span class="code-snippet__title">renderContent</span></span><span class="code-snippet__function">(): </span><span class="code-snippet__function"><span class="code-snippet__keyword">void</span></span><span class="code-snippet__function"><span class="code-snippet__comment">// 渲染内容</span></span></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">abstract</span> <span class="code-snippet__title">getCardClassName</span>(): <span class="code-snippet__built_in">string</span>   <span class="code-snippet__comment">// 返回样式类名</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 数据更新：触发状态转换和重新渲染</span></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">async</span> <span class="code-snippet__title">updateData</span>(<span class="code-snippet__params">newData</span>) {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">if</span> (newData.status !== <span class="code-snippet__keyword">this</span>.currentState) {</span></code><br/><code><span leaf="">      <span class="code-snippet__keyword">if</span> (!<span class="code-snippet__keyword">this</span>.isValidTransition(newData.status)) <span class="code-snippet__keyword">return</span></span></code><br/><code><span leaf="">      <span class="code-snippet__keyword">this</span>.currentState = newData.status</span></code><br/><code><span leaf="">      <span class="code-snippet__keyword">this</span>.updateUI()</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">this</span>.renderContent()</span></code><br/><code><span leaf="">  }</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">5.3 历史包袱的优雅着陆：旧专栏兼容</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">新架构固然强大，但对于一个拥有海量存量数据的平台来说，绝不能以牺牲历史数据为代价。同时，新编辑器生产的内容也必须完美融入现有的内容分发基建。为此，我们围绕 Opus 协议(B站图文统一发布协议) 设计了一套向下兼容历史、向上打通分发的全局策略：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">战略锚点：基于 Opus 图文统一发布协议的链路闭环</span></strong></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Opus 是我们内部定义的图文统一发布协议。为了无缝接入现有的动态分发渠道，确保高质量图文能够高效流转，新版编辑器在最终发布时，会将所有文档树数据全量转换为 Opus 格式。这不仅统一了底层标准，也让生产端到分发端的链路彻底打通。</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">首选路径：历史专栏优先转出 Opus 无损还原</span></strong></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">针对过去沉淀的千万级历史专栏，我们已经在服务端优先尝试将其向 Opus 格式进行转出与迁移。由于 Opus 是我们的标准协议，当这些转换成功的数据进入新版编辑器时，能够通过 Schema 的精准映射，100% 无损还原为内部的 Document Tree，让老文章直接享受最纯粹的组件化编辑体验。</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">柔性兜底：不支持迁移场景的 H5 动态解析</span></strong></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">然而，总有一些极其古老（例如夹杂着 UEditor 时代“野生标签”）且无法安全迁移为 Opus 格式的富文本黑盒。面对这些“硬骨头”，我们并没有采用高风险的“强洗数据”，而是让新版编辑器利用加载 H5 内容的方式进行动态兜底。通过触发节点中预设的 `parseHTML` 规则，在浏览器端实时将陈旧的 HTML 代码“翻译”成全新的规范化 Block Node，确保再老的专栏也能在新编辑器中顺利“复活”并进行二次编辑。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">第六章：效果实测与总结</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">通过这次架构升级，我们将“插卡”这一高频操作的体验提升到了新的维度 。但在亮眼的数据背后，我们也完成了一次经典的工程性能博弈。来看一组真实的对比数据 ：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.19444444444444445" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="100020457" src="https://wechat2rss.xlab.app/img-proxy/?k=adf62a15&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSa79F5ZZGmmlt6nqJHEGEjibxibUTkJgBZFk6Mhaq5wcBpKwwG5VHCCAW63H0bM8WdDh4c276Bwx9tGmSzica6p7pIvHBzXKDjAc%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6157407407407407" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020444" src="https://wechat2rss.xlab.app/img-proxy/?k=8983ecca&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6STkfSpfGfM00ZFHo9jKaH3V34zE9a5ma8lbFhcIEB5PdQLYUzuteUu6CQV4L2iaYIewHwibDicqcPOcHobAE7Yib2LX9UGgEFTwufE%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">结论：走向“应用级”文档</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">从 Quill 到 ProseMirror 的迁移，不仅仅是更换了一个编辑器内核，更是我们对文档理解的一次升级。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">文档不再只是静态内容的载体，而是动态应用的容器。</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">通过 Tiptap + ProseMirror 的现代化技术栈，我们成功将“低保真”的绘图式卡片，进化为具备完整生命周期、状态管理和复杂交互的“应用级”组件。这不仅解决了当下的性能痛点，更为未来引入投票、互动游戏等更复杂的业务卡片奠定了坚实的基础。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们终于可以说：</span><strong style="box-sizing: border-box;"><span leaf="">在 B 站的专栏编辑器里，你看到的，就是真实的 🎉</span></strong><span leaf="">（WYSIWYG）</span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨</span><b style="box-sizing: border-box;"><span leaf="">泯泷</span></b></p><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">往期精彩指路</span></b></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><p style="text-align: justify;padding: 0px 8px;font-size: 13px;width: 100%;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 40px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247487748&amp;idx=1&amp;sn=c9cbcacf3bba25b478abf2a0f5c0e75f&amp;scene=21#wechat_redirect" textvalue="全链路压测改造之全链自动化测试实践" data-itemshowtype="0" linktype="text" data-linktype="2">全链路压测改造之全链自动化测试实践</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247493174&amp;idx=1&amp;sn=648bf0ffb5e31b1c211d22e636e2c3df&amp;scene=21#wechat_redirect" textvalue="哔哩哔哩⼤数据建设之路—实时DQC篇" data-itemshowtype="0" linktype="text" data-linktype="2">哔哩哔哩⼤数据建设之路—实时DQC篇</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247491092&amp;idx=1&amp;sn=b09492563c760775ed61f75db1bd5822&amp;scene=21#wechat_redirect" textvalue="Apache Kyuubi 在B站大数据场景下的应用实践" data-itemshowtype="0" linktype="text" data-linktype="2">Apache Kyuubi 在B站大数据场景下的应用实践</a></span></p></li></ul></p></div></div><div style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px 8px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;text-align: center;font-size: 12px;color: rgb(160, 160, 160);"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);visibility: visible;"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);visibility: visible;"><p data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;color: rgb(62, 62, 62);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3289447926347317252#wechat_redirect" textvalue="通用工程" linktype="text" data-linktype="2">通用工程</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2390333109742534656#wechat_redirect" textvalue="大前端" linktype="text" data-linktype="2">大前端</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3297757408550699008#wechat_redirect" textvalue="业务线" linktype="text" data-linktype="2">业务线</a></span></span></p><p style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;color: rgb(62, 62, 62);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2329861166598127619#wechat_redirect" textvalue="大数据" linktype="text" data-linktype="2">大数据</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2782124818895699969#wechat_redirect" textvalue="AI" linktype="text" data-linktype="2">AI</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2532608330440081409#wechat_redirect" textvalue="多媒体" linktype="text" data-linktype="2">多媒体</a></span></span></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-index="0" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/300?wx_fmt=png&amp;wxfrom=19" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-origin_num="361" data-biz_account_status="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-index="1" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/300?wx_fmt=png&amp;wxfrom=19" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-origin_num="22" data-biz_account_status="0" data-service_type="2" data-verify_status="2"></mp-common-profile></p></div></div></div></div></div></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=960e3e9f&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247504106%26idx%3D1%26sn%3D7aaeea54b277e360432ccdf05df2e274">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 12 Mar 2026 12:04:00 +0800</pubDate>
    </item>
    <item>
      <title>游戏数据分析Agent的全栈架构演进</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247504028&amp;idx=1&amp;sn=cb78fb155cef1df7bc5447a34b74fab1</link>
      <description>本文章主要聚焦于最核心的如何落地Agent。</description>
      <content:encoded><![CDATA[<p>原创 <span>AI</span> <span>2026-03-06 12:02</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=8f043230&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FtY0ozQev6STrPPOOol3H6cRuB461hF6ab29kJMb8zgkPCZVaTBRdNzEatVDplwNHyaUicA4RZ5LeR79osetYcXLcfQBUiajHTGddHoHbUT2cM%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>本文章主要聚焦于最核心的如何落地Agent。</p>
  <div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">前言</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">写在前面，由于现在LLM生成内容千篇一律，作者尽量自行撰写核心内容，LLM仅限于润色优化，争取把整个开发迭代历程完整呈现出来供学习交流。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一、背景与挑战</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">游戏业务随着持续深化，各个岗位对数据的诉求也越来越深入，但游戏数据分析需要结合极强的领域知识和数分技能，具备较高的门槛。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">伴随着LLM的能力增强，如果能结合个人多年游戏业务的分析沉淀，将较为通用的分析方法论融入其中，从而帮助到部门同事深化对数据的理解和使用。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">实际立项以后，发现也有诸多的挑战和难点等待被攻克。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">主要技术挑战和难点</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">游戏业务日常具备海量的‘黑话’、‘术语’、‘概念’等等，如何真实理解部门业务同事的独有诉求？</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">LLM 生成的‘不确定性’与数据查询对‘确定性’的高要求之间的矛盾，如何保障查询结果的准确性？</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">探索游戏数据问题往往需要多种技能，如何让agent自行实现游戏数据分析？</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">粒度的权限管控挑战，如何在 Agent 中通过自然语言处理复杂的企业级数据安全要求？</span></p></li></ul></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">二、架构演进之路</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">整个开发过程中，前前后后实际作者上做了完全不同的3版方案，整个演进过程如下：</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="text-align: left;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">v1.0 (LangChain Chain)：线性执行的</span></strong></p><p style="text-align: left;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">局限性，无法处理追问和复杂错误恢复。</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6479166666666667" data-s="300,640" data-type="gif" data-w="480" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020349" src="https://wechat2rss.xlab.app/img-proxy/?k=f446ccd5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_gif%2FtY0ozQev6SS8Vh6nwKqRAAGn7gWFibDrHz5bDt2UicT8C2wVwLHgVc1iaLTITS5pvj5FSTGmjnbLLbAbdYexmO1YBjGo2T2dtLLX5MxwicgbcBw%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">初步实现的效果如视频所示（备注：视频演示为测试数据）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">需求目标：</span></strong><span leaf="">单一固定场景--实现SDK转化漏斗的自动异动分析</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">技术选型：</span></strong><span leaf="">基于LangChain(0.x版本)</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">开发工具：</span></strong><span leaf="">Cursor（Claude 3.7 Sonnet）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">选型理由：</span></strong></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">异动分析是一个较为固定的开发流程，考虑到实现，最终参考大模型给出的技术选型建议，采用了 LangChain 的链式编排。当时设计了6个步骤：</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">1. 最新数据读取 → 2. 直接分析(简报) → 3. 分析方案制定 → 4. 分析代码生成 → 5. 代码执行 → 6. 结合产物做深度分析(报告)</span></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">主要卡点：</span></strong></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">整个链路成功率每一步成功率都不高(产物传递和使用与预期不符)，修改困难，彻底重写了3次也未解决(如下图 第三版PRD.md），受限于当时的模型能力和框架能力，即使使用TDD开发也无济于事。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7033898305084746" data-s="300,640" data-type="png" data-w="1416" style="vertical-align:middle;max-width:100%;width:479px;box-sizing:border-box;height:337px;" data-imgfileid="100020347" src="https://wechat2rss.xlab.app/img-proxy/?k=3de3eba0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQo8wsgjibfY0R6pPsnSmribumQH1cxmK8rIrXia1oDZIZX6704PGywaVYWBBzwPH04b0S4uaPVicB9wjBTkaVuNmTFALG8UmyVdyQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">失败总结：</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  对Agent定制开发的工程化工作量严重低估且当时对Vibe Coding盲目自信，误以为Vibe Coding可以实现一切需求，自身忽略对实现代码的关注</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  缺乏对LLM相关框架库的深入了解，无法人工debug，且不知道LangChain(0.x版本)自带的框架范式已经落后</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">（备注：官方于2025.10.22发布重写后的1.0版本，只是名字沿用但已彻底重构）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><em style="box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">最新现状：</span></strong></em></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf="">此场景已经在v3架构上重写并运用于线上重点游戏转化率和指标监控</span></em></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.9942857142857142" data-s="300,640" data-type="png" data-w="175" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020346" src="https://wechat2rss.xlab.app/img-proxy/?k=49740cbe&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6ST4nTRO5LPuFn4PolXDTZck5oR524BlA2OqWkYBIef1QBMYvG8p8I4hP2bHImfoCvPSnT2g3VToYTcnjzgRYqFibBicV4SlQCX9E%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.1386138613861385" data-s="300,640" data-type="png" data-w="303" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020345" src="https://wechat2rss.xlab.app/img-proxy/?k=7aca50ce&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SQld2IfjoYVkv6nkvLl8auobby1ScVaNY2dsAFesDJPR4zEKEAsznb6IUticoOiabhqx9qR4avdcS0Et9nXy1gbg3yianBMFwia0HQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="text-align: left;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">v2.0 (Dify Workflow)：低代码的瓶颈，</span></strong></p><p style="text-align: left;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">业务逻辑定制化困难。</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="3.1231060606060606" data-s="300,640" data-type="png" data-w="1056" style="vertical-align:middle;max-width:100%;width:346px;box-sizing:border-box;height:1081px;" data-imgfileid="100020348" src="https://wechat2rss.xlab.app/img-proxy/?k=4f38b0cc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSso4MgXkXicRQpibgksCqHgcUbb7jQM1fnedJrRUCaRBiaVQBZIFHIfmtSXAY5MIUoxZVxxLtcKGJdBqozta3KxVCP3mziavtIhmU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">需求目标：</span></strong><span leaf="">实现一个基于LLM的数据部对话机器人，实现简单的知识问答和直接的搜索查询</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">技术选型&amp;开发工具：</span></strong><span leaf="">Dify（发音为&#34;滴菲&#34;）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">选型理由：</span></strong><span leaf="">自带Rag和权限管理模块，开发简单迅速，快速上线MVP，其他同事也可以共同协作（甚至包括非技术同事）</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">主要卡点：</span></strong><span leaf="">随着持续迭代，工程项目复杂度已经难以维护（均在海量硬编码，复杂逻辑支持麻烦），调试困难（缺乏详细日志，同时Dify黑盒了不少逻辑），且开发自由度高度受限（部分上下文框架自采集，难以定制修改），基本已达项目诉求的瓶颈</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.23599003735990037" data-s="300,640" data-type="png" data-w="3212" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020352" src="https://wechat2rss.xlab.app/img-proxy/?k=fced82cf&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SR6n87s0erhQ67DQhBlvSCvXiaTpElptbXk3YzSeBAYKL8y8S8Nd9YBXbQ6sZHegiaTVdT9LVjgHnXrT4ISk1dNf8OG6GDjRLvsg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4489655172413793" data-s="300,640" data-type="png" data-w="2900" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020354" src="https://wechat2rss.xlab.app/img-proxy/?k=6cc02288&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6STBWtIMW3KkJjlWDNwqM5KRZbZUibS0AUTd0JhLY8bT0u07pdU5BoQdqHddia9YDwQibhuQjNZp4VIibgQLC4OEbwrz1ic17R5k53CA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">失败总结：</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  由于Dify是低代码可视化节点编程，项目复杂度过高时，节点编程边际收益逐渐走低</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  Dify也是比较新的项目，bug和功能也不够完善，开发过程中遇到了多次问题还提了git issues</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.  仍有比较有价值的收获，掌握了Dify的插件开发能力（甚至帮友商优化了官方开源插件）</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7182539682539683" data-s="300,640" data-type="png" data-w="1008" style="vertical-align:middle;max-width:100%;width:352px;box-sizing:border-box;height:253px;" data-imgfileid="100020351" src="https://wechat2rss.xlab.app/img-proxy/?k=89d3e269&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SR6ibfGUiaiaRUU34VEzqC9e5q0sX1KV4BVNf2BBoMtxCLQjYstjByb3GHv5WYk6VJhBo8AOwDItx9USgSOT7MbeJb1l3RIjyH2Ps%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><em style="box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">最新现状：</span></strong></em></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf="">由于方便上手的特性，目前部门其他同事会针对一些简单场景使用Dify开发落地，比如落地上线一些简单的Agent归因分析产品</span></em></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3492723492723493" data-s="300,640" data-type="png" data-w="2886" style="vertical-align:middle;max-width:100%;width:482px;box-sizing:border-box;height:168px;" data-imgfileid="100020353" src="https://wechat2rss.xlab.app/img-proxy/?k=4336d93a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SRmYp5EsLaWibsgkSZf4cAEtV0Rnias9FicaDOUs8icwHElM3JAvH1uSX9sLvaZuSicQ9JDuS2lIH6u1zA61G8DUxvFaGharvL0J65Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">v3.0 (LangGraph)：直面底层设计，</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">图与状态的引入与定制。</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">技术选型：</span></strong><span leaf="">LangGraph + Dify(知识库&amp;前端包装)</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">开发工具：</span></strong><span leaf="">Cursor(IDE) + CC + CodeX 三持</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">选型理由：</span></strong></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">目前Agents框架主要分为两大类：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="0.424597364568082" data-s="300,640" data-type="png" data-w="683" type="block" data-imgfileid="100020377" src="https://wechat2rss.xlab.app/img-proxy/?k=b61c2795&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSYR2Rf6ktckg8KrsYW16mNib414V8eHJe9JGebhNENnEzbBRkHAWPx3hJFwgF7Gl2mqWSnkD7DHO5H3nRjr0Oj8knmm1IqfSwA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">选取LangGraph的主要考量：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  个人层面：通过了官方的LangGraph认证，理解其核心代码实现，对其能力上下限有一定把握</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  框架层面：由于之前的教训，对框架的“可控性”和“观测性”有较高的优先级，LangGraph自带企业级3件套（开发、调试、部署平台）</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.  应用层面：知名科技大厂使用LangGraph开发生产级应用，比如Uber、LinkedIn、Elastic、Google等</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.13642052565707133" data-s="300,640" data-type="png" data-w="1598" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020350" src="https://wechat2rss.xlab.app/img-proxy/?k=84372f2e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SRdJkicLFibmibalsuycIL7PCKCwCq7BULo2UGmk9FuLet8Eca2iamT3Gl3VRQpbeW69h4eRRy3U14a6ak295mI8OS0cI0f861Wsag%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">最终执行实现的效果：</span></p><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="1.028125" data-s="300,640" data-type="gif" data-w="320" type="block" data-imgfileid="100020374" src="https://wechat2rss.xlab.app/img-proxy/?k=6975a0dd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FtY0ozQev6STCONYYwLI4zEH3AkWHbWsPBZhZiatzZXiaA02EpicMl0ss8dNQ6zK2oFEGxbdFTZNdIAby4rxXufFl41Rrya53x8M49nLlbfzOAM%2F640%3Fwx_fmt%3Dgif%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">三、核心工程实践</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">首先明确几个LangGraph概念，这里作者就从更方便理解的角度去描述，更具体的可以查看官方文档：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">➢ Graph - 图，本质就是一个Agent/Agents的执行流图，或者说状态转移图</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">➢ State - 状态，它是一个随执行流转而不断演变的共享数据结构</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">➢ Node - 节点，实际的逻辑执行</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">➢ Edges - 边，决定了信息(State)的流向</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">➢ Threads - 会话线程，就是用户的一个对话窗，可能包含多次与AI的交互（也就是多个Runs）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">➢ Runs - 一次Graph的执行，也就是与Agent的单次交互</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">接下来将详细开展工程化细节</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1.整体Graphs设计(Agent)</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">先来看下Multi Agent的常见架构：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8642857142857143" data-s="300,640" data-type="png" data-w="1400" style="vertical-align:middle;max-width:100%;width:438px;box-sizing:border-box;height:378px;" data-imgfileid="100020357" src="https://wechat2rss.xlab.app/img-proxy/?k=acbe8d23&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SRouvj1diaJXcd7QoeqOauxwBX2NO4R8wlHzsaG4hugzaFibof7PXxibGVJRl5P8nF9RtH73pLxJyDv7DpeYFOcqXN2ic06jpaDrLI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">(图片取自LangGraph官方文档)</span></sup></p></div><div style="text-align: center;box-sizing: border-box;"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3351851851851852" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="100020378" src="https://wechat2rss.xlab.app/img-proxy/?k=3a0026ad&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SQKJOJP7ib5uvr3rXkwN2MwmP8ficqxwl2XFmR1ZNyPialvE9mUpz8f8W5xhojTuzicGCljquibPtl80LSjlwJdco6cMBWic6tM3HmLI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">其实Multi-Agent本质上就干两件事：</span><strong style="box-sizing: border-box;"><span leaf="">上下文隔离</span></strong><span leaf=""> 与 </span><strong style="box-sizing: border-box;"><span leaf="">控制权转移</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">所以本项目采用的方案更像是Custom自定义的模式。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">当前本项目的Graph架构设计是：</span></strong></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.441434262948207" data-s="300,640" data-type="png" data-w="1255" style="vertical-align:middle;max-width:100%;width:394px;box-sizing:border-box;height:568px;" data-imgfileid="100020356" src="https://wechat2rss.xlab.app/img-proxy/?k=2299321c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SQkkpYDMstWwIy4bzuTpImByHU9M38ySdqllFVV2wFepX2YA1iaVb1XQmEkAXniaSp8ZN1GbNcadia7rjQ9t0L9LM4oOBgkmAusiaU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Graph整体上分为几块：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">初始主控路由分配器，会基于任务类型来做不同粒度的Agent分发（实际上有3条线）</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">第一条线-简单回复和HITL（最右侧）：简单的追问回复、信息查询、知识库读取等小任务（不涉及实际数据查询，单次tool_call），快速响应</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">第二条线（中间）：固定式数据查询任务，整体流程上是基于单次查询即可得出的简单任务（比如B游戏上个月的DAU情况），整体分为“找所用表-&gt;查询”两步</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">第三条线（最左侧）：基于Agent Loop的数据分析Agent，用于处理探索性数据分析任务。</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">其中第三条线是本项目最关键的上下文工程落地案例，整体上这个SubGraph的结构为：TODO 规划 + ReAct 循环。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这么设计主要考虑到tokens和时间消耗的折中，同时对各个环节进行解耦，方便后续持续的重新调整组合。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2.领域知识的“动静结合”</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">由于数据分析业务场景一定包含了大量的私有领域知识，所以知识的录入对上下文来说非常重要。这里知识来源主要分为两类 </span><strong style="box-sizing: border-box;"><span leaf="">静态知识</span></strong><span leaf=""> 和 </span><strong style="box-sizing: border-box;"><span leaf="">动态知识</span></strong><span leaf=""> 。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">静态知识：</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">针对查询的基础通用知识，比如ODPS SQL写法等内容，作为长期不变的内容，目前是通过硬编码在相关LLM请求的SystemPrompt中，更新迭代随着版本再变化。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这类知识目前采用“</span><strong style="box-sizing: border-box;"><span leaf="">结构化提示词(Structured Prompt)</span></strong><span leaf="">”方式进行撰写，关于结构化提示词：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="markdown"><code><span leaf=""><span class="code-snippet__bullet">1.</span> 不同的模型针对Markdown和XML等结构会有额外的微调，比如claude官方表示他们针对XML做过微调。</span></code><br/><code><span leaf=""><span class="code-snippet__bullet">2.</span> 结构化提示词就是为利用更加具有逻辑结构的描述，来提高LLM的生成效果，实践效果经过海量的认证。</span></code><br/><code><span leaf=""><span class="code-snippet__bullet">3.</span> 结构化提示词示例（参考LangGPT）：</span></code><br/><code><span leaf="">&#39;&#39;&#39;</span></code><br/><code><span leaf=""><span class="code-snippet__section"># Role: 你是一个游戏数据分析师</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__section">## Profile</span></span></code><br/><code><span leaf=""><span class="code-snippet__bullet">-</span> Author: 小B</span></code><br/><code><span leaf=""><span class="code-snippet__bullet">-</span> Version: 1.0</span></code><br/><code><span leaf=""><span class="code-snippet__bullet">-</span> Language: 中文</span></code><br/><code><span leaf=""><span class="code-snippet__bullet">-</span> Description: 清晰的角色描述和核心能力</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__section">### Skill-1</span></span></code><br/><code><span leaf=""><span class="code-snippet__bullet">1.</span> SQL查询</span></code><br/><code><span leaf=""><span class="code-snippet__bullet">2.</span> 具备查询公司数仓表的能力</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__section">## Rules</span></span></code><br/><code><span leaf=""><span class="code-snippet__bullet">1.</span> 在任何情况下都不要编造不是查询结果的数据</span></code><br/><code><span leaf=""><span class="code-snippet__bullet">2.</span> 严格遵循Hive SQL的语法逻辑</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__section">## Workflow</span></span></code><br/><code><span leaf=""><span class="code-snippet__bullet">1.</span> 分析用户输入并识别意图</span></code><br/><code><span leaf=""><span class="code-snippet__bullet">2.</span> 系统性地应用相关技能</span></code><br/><code><span leaf=""><span class="code-snippet__bullet">3.</span> 提供结构化、可操作的输出</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__section">## Initialization</span></span></code><br/><code><span leaf="">作为 <span class="code-snippet__tag">&lt;</span><span class="code-snippet__tag"><span class="code-snippet__name">Role</span></span><span class="code-snippet__tag">&gt;</span>，你必须遵守 <span class="code-snippet__tag">&lt;</span><span class="code-snippet__tag"><span class="code-snippet__name">Rules</span></span><span class="code-snippet__tag">&gt;</span>，你必须用默认 <span class="code-snippet__tag">&lt;</span><span class="code-snippet__tag"><span class="code-snippet__name">Language</span></span><span class="code-snippet__tag">&gt;</span> 与用户沟通，你必须严格遵循 <span class="code-snippet__tag">&lt;</span><span class="code-snippet__tag"><span class="code-snippet__name">Workflow</span></span><span class="code-snippet__tag">&gt;</span> 流程来完成用户需求。请先介绍一下自己的能力范围。</span></code><br/><code><span leaf="">&#39;&#39;&#39;</span></code><br/></pre></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">动态知识：</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1.  RAG-专有知识库</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">由于已经上线了Dify平台，知识库则正好可以依托于的已经部署完成的Dify来共同管理。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">项目所用的知识库主要分为以下几类：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1. </span><strong style="box-sizing: border-box;"><span leaf="">游戏别名：</span></strong><span leaf="">由于同一游戏在业务侧有非常多的叫法，所以对齐游戏称谓是最重要的一件事</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2. </span><strong style="box-sizing: border-box;"><span leaf="">游戏基础信息：</span></strong><span leaf="">游戏相关信息的完整表，包括game_id、上线时间，渠道id等关于该游戏的一切基础信息（通过上游多张表预加工合成，定期更新）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">3. </span><strong style="box-sizing: border-box;"><span leaf="">指标规则解释：</span></strong><span leaf="">针对日常数分领域常用的指标，对应的介绍、计算方式、维度等信息</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1" start="4"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">专业术语解释：</span></strong><span leaf="">一些额外的游戏业务专业术语、黑话</span></p></li></ol><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">5. </span><strong style="box-sizing: border-box;"><span leaf="">历史查询案例：</span></strong><span leaf="">数分同学的经典任务case，包含简要描述和对应的SQL语句</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">知识预处理：</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">项目的知识库本身都是经过结构化预处理的，主要有以下几步，整体上类似特征工程：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  数据清洗(Data Cleaning)，一些异常值剔除、缺省值处理等，比如移除没有上线的游戏，或者已经下线的游戏信息</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  重聚重塑(Data Reshaping)，比如游戏A不同地区在原始表中是有多条记录，可以对内容做Pivot（如下图将渠道进行降维）</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.  数据格式化(Data Formatting)，合理切分知识内容并转换为表格，从而做到对文档分块时0冗余</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.4779874213836478" data-s="300,640" data-type="png" data-w="2862" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020358" src="https://wechat2rss.xlab.app/img-proxy/?k=c0af5724&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQStPuLffcQ5nbOiaBDW5EMkNibcBvw5kNCrguiaGWh5Z8IUibaKAnfwl3lYZWMzwDTNlIzvq8gcmzK2OTaUysHPQJf6X2Mpvibll6s%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">实测经过处理以后的知识库，响应的召回率和准确率都有显著上升，比尝试单纯优化Embedding/召回算法带来的收益高得多</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2.  注入-场景独有知识</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">基于场景进行设定的一组Prompt集合，根据不同的key来主动注入给Agent运行的上下文，从而作为追加的Prompt内容，选择性的替换，以应对不同业务下分析路径差异。比如SDK漏斗分析Agent，就是通过配置对应的场景内容，实现了自动深度分析功能。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">场景知识主要分为这3个类型：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">该场景探索的补充知识 - 对应业务独有的数据分析探索路径，比如先细拆a维度，或者先看同环比等</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">该场景SQL执行注意事项 - 针对特定业务可能存在一些独有编写注意事项，比如分区格式、时区要求等</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">该场景的常用表 - 给与Agent一些对应业务相关表信息，避免其发散式的探索。</span></p></li></ul></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.状态管理</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Agent开发的设计哲学，就是把一切“必须稳定保存且可被模型读取”的信息抽象成结构化State，并且随着Agent执行进行“有序累积”。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">State承担了Agent运行时的上下文核心关键，记录了运行过程中的所有原始信息，并能够随时修改合并，每一次请求的Prompt构成均基于State中存在的信息进行提炼，从而确保了可以每轮对话根据实际需求动态拼接应有的完整Prompt。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">LangGraph对State的设计非常巧妙，每一个节点实际上都是一个独立的State实例，节点到下一个节点时，又copy(或合并)了一遍所有参数，从而实现了Checkpointer快照，也解耦了Node之间的上下文，这会带来好几个好处，后续将展开讲解。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">本项目的State主要由以下几类构成：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">权限与身份：</span></strong><span leaf="">记录当前运行的角色权限模型实例相关</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">查询上下文：</span></strong><span leaf="">数据分析执行的各种上下文原始数据，包括查询语句及对应的查询结果dataframe等</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">业务知识注入：</span></strong><span leaf="">前述场景RAG结果和领域知识的原始文本</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">任务/TODO管理：</span></strong><span leaf="">Agent执行过程中的TODO管理</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">执行约束：</span></strong><span leaf="">执行计数情况</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">报告拼装：</span></strong><span leaf="">撰写报告用的提炼内容</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">SubAgent上下文：</span></strong><span leaf="">SubAgent启动时的上下文及结果返回</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">针对State处理有2个关键机制实现：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  </span><strong style="box-sizing: border-box;"><span leaf="">自定义合并函数</span></strong><span leaf=""> 由于LangGraph默认的State是采取覆盖的方式，所以针对一些复杂结构需要编写自定义合并函数，以处理上下文传递时的State合并事件，比如任务列表会根据&#39;task_id&#39;进行覆盖或添加操作。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.  </span><strong style="box-sizing: border-box;"><span leaf="">上下文转字符串</span></strong><span leaf=""> State字段均编写了快速转换为String的函数，以便开发时迅速拼接所需的Prompt。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.上下文工程详细展开：</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">基础知识</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">很多没有真实做过Agent开发的朋友是否想过一件事，就是大模型如何知道你的追问的？</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">其实很简单，就是在Prompt中增加关于历史对话的描述，比如发送给LLM的伪代码示例：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="python"><code><span leaf="">dialogue_prompt = <span class="code-snippet__string">&#34;&#34;&#34;</span></span></code><br/><code><span leaf="">你与用户的历史对话为：</span></code><br/><code><span leaf="">Human：你好，我叫小B。</span></code><br/><code><span leaf="">AI：小B你好，很高兴认识你。</span></code><br/><code><span leaf="">Human：我叫什么？</span></code><br/><code><span leaf="">&#34;&#34;&#34;</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment"># 这里在最新的用户对话前面追加了关于历史对话的说明</span></span></code><br/><code><span leaf="">response = llm_client.invoke(</span></code><br/><code><span leaf="">            HumanMessage(content=dialogue_prompt + human_prompt)]</span></code><br/><code><span leaf="">        )</span></code><br/><code><span leaf=""><span class="code-snippet__built_in">print</span>(response.content) <span class="code-snippet__comment"># AI由于已经知道了之前说的内容，所以能正确回复出“小B”。</span></span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这就是最基础的Context Engineering例子，仅仅加了一段“历史对话”的文本内容，从而实现了‘多轮对话’的能力！</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">Context Engineering说白了就是在 </span><strong style="box-sizing: border-box;"><span leaf="">合适的时机</span></strong><span leaf=""> 传入 </span><strong style="box-sizing: border-box;"><span leaf="">恰到好处的上下文内容</span></strong><span leaf="">，从而引导出 </span><strong style="box-sizing: border-box;"><span leaf="">正确的响应内容</span></strong><span leaf="">。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Prompt构成</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">由于分析Agent部分基于Agent Loop，实际上是在进行内部的多轮对话（HumanMessage、AIMessage、ToolMessage等），因此先来看一下本Agent的Prompt构成（每轮对话的Prompt构成）。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">User Prompt主要通过XML进行结构化分区设计（这里的User Prompt并不是真的用户，而是每轮loop时给llm的动态Prompt内容，区分于SystemPrompt），主要有以下几个分区：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">&lt;用户问题背景&gt; - 包含用户最新的对话问题、历史对话等信息</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">&lt;已有的游戏信息&gt; - 提前查询到的问题相关游戏基础信息，包含最关键的game_id等枚举值</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">&lt;指标规则参考&gt; - 对于本次问题的指标解析信息</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">&lt;TODO状态&gt; - 管理todo list，包含todo内容、todo状态和结果摘要</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">&lt;当前历史执行情况&gt; - 过去的SQL查询执行情况</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">&lt;最近反思&gt; - 对于过去一段时间的自我反思内容</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">&lt;同期运营活动调研&gt; - 游戏对应的同期运营活动信息</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">出于对tokens的最大节约且执行的任务类型偏固定，所以在整体设计上采用每轮对话重新整理Prompt，所以上述User Prompt会在每一次Agent Loop时进行生成，但一般更常见的方式为</span><strong style="box-sizing: border-box;"><span leaf="">Messages</span></strong><span leaf="">队列达到特定阈值时进行一次内容压缩。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">ReAct架构实现</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">针对每轮Agent Loop的设计，整个执行架构使用的是中间件模式去处理</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.155115511551155" data-s="300,640" data-type="png" data-w="303" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020355" src="https://wechat2rss.xlab.app/img-proxy/?k=c1e38a58&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SRy4vBI1U8icbqcfmicV2o1KBiaDB2icCFR4l5q8lHaXkxGwlxFxr87wIEmU1uXmPhicqjJXZASOtNB9lGvOMBEVlpnhHhdrghJ7A3w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="apache"><code><span leaf=""><span class="code-snippet__attribute">1</span> - 用户问了一个问题，request一次请求进来</span></code><br/><code><span leaf=""><span class="code-snippet__attribute">2</span>/<span class="code-snippet__number">3</span>/<span class="code-snippet__number">5</span>/<span class="code-snippet__number">7</span> - 分别的执行生命周期切入点，其中<span class="code-snippet__number">2</span>/<span class="code-snippet__number">7</span>只会执行一次，Middleware包装可以重写任何生命周期函数从而对State进行逻辑编写。其中当<span class="code-snippet__number">5</span>的最新一条消息不为tool_call时则会跳转到<span class="code-snippet__number">7</span>的结束环节，准备返回给用户信息。</span></code><br/><code><span leaf=""><span class="code-snippet__attribute">4</span>/<span class="code-snippet__number">6</span> - 分别是AIMessage和ToolMessage响应前的包装器，可以完全控制调用时的参数（包括修改请求时的Prompt）和返回的结果</span></code><br/><code><span leaf=""><span class="code-snippet__attribute">8</span> - 返回给用户的AIMessage信息</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">允许编写任意多个Middleware（每个Middleware可选实现一些生命周期函数），比如一个MiddlewareA和MiddlewareB都可以实现&#39;before_model&#39;和&#39;after_model&#39;函数，然后会根据传入的Middleware顺序根据洋葱模型执行：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  MiddlewareA.before_model</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  MiddlewareB.before_model</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">3.  model</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">4.  MiddlewareB.after_model</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">5.  MiddlewareA.after_model</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.8715415019762845" data-s="300,640" data-type="png" data-w="1012" style="vertical-align:middle;max-width:100%;width:313px;box-sizing:border-box;height:273px;" data-imgfileid="100020362" src="https://wechat2rss.xlab.app/img-proxy/?k=76eda2e8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SRMewTDTuVOVibT5S6S0vI60NaMNic0aJM49Z12YdVZG0PdiaXwSmskfap8Rfvp8QINZuficTkPMlT1VYzz3t3s1oAAFSF8DqKQ0sU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><em style="box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">(图片取自网络)</span></sup></em></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">从而实现不同Middleware专注于特定的逻辑任务，实现了良好的可扩展可维护性。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Tools设计</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">实际上Context Engineering很大程度上是对工具调用的结果做信息压缩和筛选。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">主要包括工具本身的调用设计和工具结果的信息提炼，基本是每个工具都有对应的一个或者多个Middleware。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">另外作者设计工具的大原则是只设计必要的工具，控制工具数量和控制参数，工具名之间避免歧义，从而减轻llm认知负荷。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">另外根据langchain官方的实验结论：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="cs"><code><span leaf="">- Llama <span class="code-snippet__number">3.18b</span> fails <span class="code-snippet__keyword">with</span> <span class="code-snippet__number">46</span> tools but performs better <span class="code-snippet__keyword">with</span> <span class="code-snippet__number">19</span> tools</span></code><br/><code><span leaf="">- Dynamic tool selection improved Llama <span class="code-snippet__number">3.18b</span> performance <span class="code-snippet__keyword">by</span> <span class="code-snippet__number">44</span>%</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">让我们先来看本项目的 </span><strong style="box-sizing: border-box;"><span leaf="">工具设计选择</span></strong><span leaf=""> 及对应 </span><strong style="box-sizing: border-box;"><span leaf="">上下文工程细节</span></strong><span leaf="">，这里选择比较重要的展开：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">search_available_tables_tool</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">说明：表搜索工具，基于表名、表描述等信息的文本匹配搜索</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">State包含：无State长期留存内容，属于临时查询</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">上下文工程：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - 自动适配三种权限场景：game_auth 本地白名单、用户自带 ak/sk、默认管理员全表模式。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - 会自动从知识库、数据地图(封装OpenAPI)分别搜索命中的表，会将表名和简述加工成Markdown列表告知模型</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">table_info</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">说明：表明细信息查询工具</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">State包含：当前thread历史查询表的详细信息</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">上下文工程：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - 提取关键信息 表结构+分区+注释+上游任务名</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - 会附上最新分区的 3 行预览作为参考（实测有预览数据情况下，SQL生成成功率会显著提高）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - Prompt 注入时统一拼成 `&lt;TablesInfo&gt;` XML</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">table_lineage_relationships</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">说明：指定表的上游血缘表和ETL SQL信息</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">State包含：无State长期留存内容，属于临时查询</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">上下文工程：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - 封装数仓OpenAPI相关血缘查询接口</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - 原始 ETL SQL 会做压缩，随后由 LLM 提炼为“上游表关系”的摘要信息。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">sql_tool</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">说明：查询能力，兼容用户aksk，多区域自动识别，还支持临时表的DDL</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">State包含：当前thread每一次查询的任务名、SQL语句、查询结果、查询总结、对应datalayer变量名</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">上下文工程：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - SQL查询后，会先对语句做语法级压缩后再保存到State，然后结果交由 LLM 生成“详细总结 + 一句话总结”。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - 结构化写入&lt;SQLTask&gt;：`description/sql_code/sql_result/summary/summary_one_line/datalayer_variable`。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - Prompt 侧采用分层回放：最近 3 条包含完整结果；4-10 条仅 summary；更早仅 one_line，避免上下文爆炸。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - 支持 `get_sql_task_detail_tool` 按需拉取历史完整结果。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - SQL查询结果的DataFrame，会自动注册到datalayer，仅传变量名而不是整表内容。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">think_tool</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">说明：No-op函数，工具描述会引导AI强制自我反思一次</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">State包含：最近一次反思的内容</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">上下文工程：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - 强制“思考-反思”节点，逼迫模型在继续执行前进行决策复盘，参考开源的OpenDeepResearch的实现。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - 上下文工程：写入 `recent_reflection`，仅保留最近一次反思并在下一轮 Prompt 注入，随后自动清空。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">notebook_tool</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">说明：跨Runs关键点记忆（数据库记录），用于Agent记录阶段性结论或重要线索</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">State包含：当前thread的notebook记载的所有内容</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">上下文工程：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - 根据配置（支持 memory/db/file 后端），保存当前的存储记忆信息</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - 支持对notebook进行增删改查</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">code_utils</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">说明：代码执行器模块，用于执行python代码级数据分析动作</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">State包含：当前thread每一次执行的任务名、代码文件名、执行结果</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">上下文工程：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - 内置Python沙盒环境，并支持常用数据分析库</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - 有datalayer数据层设计，用于沙盒环境与外部的数据交换</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf=""> - 前述SQL查询结果会自动注册查询结果到Datalayer，并告知变量名</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">research_subagent</span></strong></span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本身其实是一个极简易的ReAct Agent包装为Tool，整体设计如下图：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.0367816091954023" data-s="300,640" data-type="png" data-w="435" style="vertical-align:middle;max-width:100%;width:298px;box-sizing:border-box;height:309px;" data-imgfileid="100020359" src="https://wechat2rss.xlab.app/img-proxy/?k=e7c0c269&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQiadhEBwZuSUgOcPNnhN4cjxmibowGkNIGWQruLz0Du5snO2jNbOh5zTsQpicEReKGz6BKsw9lRGichvT5EOJSRPjVjXLUibBiabxJ4%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">主要有2个特殊设计：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  实现了基于 `(场景, 主题, 问题)` 的内存级 TTL 缓存，对于相同的游戏查询实现毫秒级响应。这在多次重复测试时很有帮助。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  针对不同场景挂载不同工具集。针对游戏官方动态、游戏官网的新闻获取，都做了定制化的信息获取工具，以服务于公司发行的各个游戏，同时也是高频分析对象。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Middlewares执行顺序</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  </span><strong style="box-sizing: border-box;"><span leaf="">BaseAnalysisMiddleware：</span></strong><span leaf="">构建 Prompt / 执行次数控制 / 处理 AI 响应</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  </span><strong style="box-sizing: border-box;"><span leaf="">工具中间件（N个）：</span></strong><span leaf="">对每类 Tool 的行为做结构化状态更新</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.  </span><strong style="box-sizing: border-box;"><span leaf="">MessageCleanupMiddleware：</span></strong><span leaf="">清理工具调用的中间消息，避免 context 污染</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Tokens优化</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">实际上对于tokens使用的优化也是需要持续迭代的一件事，项目初步使用了以下技术进行优化：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">全链路 Token 可观测性：</span></strong><span leaf="">集成日志级的 Token 消耗计数与追踪，以便评估每一次请求的tokens开销。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">语法级 Token 压缩：</span></strong><span leaf="">细扣节省，例如将MD表格语法从&#34;| :--- | ---: |&#34;优化为最简形式&#34;|-|-|&#34;，由于有大量的表格内容，这项就能实际获得约20%的节省。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">上下文剪枝：</span></strong><span leaf="">Messages 流精简，在每轮Loop后都会自动清理历史中间状态消息（如 ToolMsg），确保消息流的干净。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">混合压缩策略：</span></strong><span leaf="">基于时间衰减与内容语义的上下文压缩，会根据执行轮数对内容做不通程度的压缩。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">动态上下文重构：</span></strong><span leaf="">每轮对话根据当前状态重新拼接 Context，也就是前文Prompt构成中提到的每次请求均重新构建完整Prompt。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">前缀缓存优化：</span></strong><span leaf="">保持 Prompt 头部尽可能静态，最大化利用 LLM API厂商的响应缓存。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">自适应计算预算：</span></strong><span leaf="">硬性限制执行轮数，并根据 TODO List 复杂度动态计算最大步数。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">非对称 I/O 优化：</span></strong><span leaf="">利用 Input Token更快的特性， 在部门场景上减少Output Token，以提升响应速度，比如问题分类。</span></p></li></ul></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">回复内容优化</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这块其实没有太多建设内容，主要就是采用拼接形式（固定查询&amp;结果）+ LLM分析总结部分，从而确保查询结果的精准性与LLM不确定思考共存。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">5.开发效能</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">俗话说得好，</span><strong style="box-sizing: border-box;"><span leaf="">磨刀不误砍柴工</span></strong><span leaf="">。由于LLM输出具备高度的随机性，而且很多bug只会在超长流程后面呈现，所以开发调试能力也是Agent长期迭代的重要保障，接下来讲述围绕本项目相关的内容。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Graphs可视化</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">良好的可视化对于 Graph 类编程来说不可或缺。虽然 LangGraph 自带绘图功能，但在处理复杂嵌套子图时视觉效果一般，且依赖外部在线服务。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">因此，作者基于`pygraphviz`定制了离线可视化引擎`BeautifulGraphDrawer`，核心是通过递归解析节点ID（如`group:subgroup:node`）自动构建`cluster`嵌套结构，并精心调优`ranksep`/`nodesep`等布局参数以实现高密度信息展示，彻底解决了多级Agent从属关系无法直观呈现的痛点。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><em style="box-sizing: border-box;"><span leaf="">备注：对应的效果见前文Graph架构设计的渲染图</span></em></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">追踪装饰器</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">执行自动追踪 - 专门编写了@track_node @track_tool等装饰器，快速实现链路追踪（自动关键日志记录），解耦 逻辑编写 与debug代码</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: auto;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.20498614958448755" data-s="300,640" data-type="png" data-w="361" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020361" src="https://wechat2rss.xlab.app/img-proxy/?k=db6bf3ba&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6STsQY0TBHibwJtcdqnEDMJUIEdX8jdMhpAYs8tJUIg0aYQ86hldt3V1OmEwVqtcAEJZCl3nCa1LkvN7icuSgMyLCUemlRXwmxttk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.20985010706638116" data-s="300,640" data-type="png" data-w="467" style="vertical-align:middle;max-width:100%;width:413px;box-sizing:border-box;height:87px;" data-imgfileid="100020360" src="https://wechat2rss.xlab.app/img-proxy/?k=dd1a16ff&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SQmVCs3icgicsRdIgcgfKd6hEGOicQdTxIXCfveSLRQ0aYWR0rRLZqeU3qQXqqcDHTk02fyYB7jootv9iccPxQMsNfhiafqrMMqc3cE%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">主要会自动打印以下内容：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">track_node：</span></strong><span leaf="">执行的Node名、checkpoint_ns、checkpoint_id、当前的config、执行剩余步数</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">track_tool：</span></strong><span leaf="">工具名、工具调用参数、调用耗时、调用结果</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">CompositePromptTemplate</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">自写CompositePromptTemplate模板类（实现2套API），支持Prompt模版自由组合</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">额外有个小技巧：因为python代码缩进的关系，建议prompt与逻辑文件分离，从而能更方便的组合Prompt、管理代码逻辑，以及节省少量制表符的tokens</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="python"><code><span leaf="">Traditional usage:</span></code><br/><code><span leaf="">    &gt;&gt;&gt; templates = {<span class="code-snippet__string">&#34;greeting&#34;</span>: <span class="code-snippet__string">&#34;Hello, {name}!&#34;</span>, <span class="code-snippet__string">&#34;question&#34;</span>: <span class="code-snippet__string">&#34;How can I help you with {topic}?&#34;</span>}</span></code><br/><code><span leaf="">    &gt;&gt;&gt; prompt = CompositePromptTemplate(templates, <span class="code-snippet__string">&#34;{greeting}\\n{question}&#34;</span>)</span></code><br/><code><span leaf="">    &gt;&gt;&gt; result = prompt.<span class="code-snippet__built_in">format</span>(name=<span class="code-snippet__string">&#34;Alice&#34;</span>, topic=<span class="code-snippet__string">&#34;Python&#34;</span>)</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">Fluent API usage:</span></code><br/><code><span leaf="">    &gt;&gt;&gt; greeting = CompositePromptTemplate(<span class="code-snippet__string">&#34;Hello, {name}!&#34;</span>).with_name(<span class="code-snippet__string">&#34;greeting&#34;</span>)</span></code><br/><code><span leaf="">    &gt;&gt;&gt; question = CompositePromptTemplate(<span class="code-snippet__string">&#34;How can I help you with {topic}?&#34;</span>).with_name(<span class="code-snippet__string">&#34;question&#34;</span>)</span></code><br/><code><span leaf="">    &gt;&gt;&gt; prompt = greeting.add(question).compose(<span class="code-snippet__string">&#34;{greeting}\\n{question}&#34;</span>)</span></code><br/><code><span leaf="">    &gt;&gt;&gt; result = prompt.<span class="code-snippet__built_in">format</span>(name=<span class="code-snippet__string">&#34;Alice&#34;</span>, topic=<span class="code-snippet__string">&#34;Python&#34;</span>)</span></code><br/></pre></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">专用日志查看器</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">由于前述动作诞生了海量日志，为此专门研发了用日志分析工具LogViewer（兼容python的logging日志格式）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">主要特性：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">支持数亿行超大日志解析</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">支持实时日志的自动刷新及强制重构</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">日志标记以及多种过滤模块（模块、级别、时间、正则）</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">支持不同级别日志及关键词着色</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">支持多种日志结构预览:PlainText/PythonObject/SQL/Markdown（且支持互相嵌套打开）</span></p></li></ul></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.716" data-s="300,640" data-type="png" data-w="3000" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020363" src="https://wechat2rss.xlab.app/img-proxy/?k=119748aa&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQFTxcECkf63ct2S3awqfwico2zAdlw9sZgFyL0n3AhRRCnh3zYBPtJ06LK64LOqiccFBOhibSfWTCDtTCgibB9pboV4gOXGFFfuRs%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Time Travel</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">前面讲到每一次Node执行实际上都有对应的一个State实例（checkpointer）会保存到数据库，如果能针对性的修改对应的实例并基于修改的实例或者新代码从中途继续执行，能极大加快开发效率，这里就涉及到2项重要的调试技巧：</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Replaying</span></strong><span leaf="">：使用新代码重试，使用方式如下：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="python"><code><span leaf=""><span class="code-snippet__comment"># 直接以当时的断点处重新开始执行</span></span></code><br/><code><span leaf="">result = graph.invoke(</span></code><br/><code><span leaf="">    <span class="code-snippet__built_in">input</span>=<span class="code-snippet__literal">None</span>,    <span class="code-snippet__comment"># 无需新的输入，不然会开启新的一轮Run</span></span></code><br/><code><span leaf="">    config={</span></code><br/><code><span leaf="">        <span class="code-snippet__string">&#39;configurable&#39;</span>: {</span></code><br/><code><span leaf="">            <span class="code-snippet__string">&#39;thread_id&#39;</span>: <span class="code-snippet__string">&#39;1&#39;</span>,    <span class="code-snippet__comment"># 需保持原先的线程</span></span></code><br/><code><span leaf="">            <span class="code-snippet__comment"># 目标状态的checkpoint_ns和checkpoint_id，已经由 @track_node 装饰器自动输出日志，只需找到填入即可</span></span></code><br/><code><span leaf="">            <span class="code-snippet__string">&#39;checkpoint_ns&#39;</span>: <span class="code-snippet__string">&#39;info_collection:e21930aa-f8ca-1b78-442a-9a755527f50c&#39;</span>,</span></code><br/><code><span leaf="">            <span class="code-snippet__string">&#39;checkpoint_id&#39;</span>: <span class="code-snippet__string">&#39;1f071b4d-146b-65e2-8002-fb2b835b828c&#39;</span>}</span></code><br/><code><span leaf="">    })</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Fork</span></strong><span leaf="">：修改State实例，使用方式如下：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="bash"><code><span leaf=""><span class="code-snippet__comment"># 换一种方式获取前一个状态</span></span></code><br/><code><span leaf="">all_states = [s <span class="code-snippet__keyword">for</span> s <span class="code-snippet__keyword">in</span> graph.get_state_history(config)]</span></code><br/><code><span leaf="">to_replay = all_states[-2]</span></code><br/><code><span leaf=""><span class="code-snippet__comment"># 这里通过config更新State以后就自动创建了fork</span></span></code><br/><code><span leaf="">fork_config = graph.update_state(</span></code><br/><code><span leaf="">    to_fork.config,</span></code><br/><code><span leaf="">    <span class="code-snippet__comment"># 这里传入替换的State字段</span></span></code><br/><code><span leaf="">    {</span></code><br/><code><span leaf="">        <span class="code-snippet__comment"># 比如这里使用id来实现覆盖对应的历史消息</span></span></code><br/><code><span leaf="">        <span class="code-snippet__string">&#39;messages&#39;</span>: [HumanMessage(content=<span class="code-snippet__string">&#39;查询游戏B的LTV数据&#39;</span>, <span class="code-snippet__built_in">id</span>=to_fork.values[<span class="code-snippet__string">&#39;messages&#39;</span>][0].<span class="code-snippet__built_in">id</span>)]     </span></code><br/><code><span leaf="">    },  </span></code><br/><code><span leaf="">)</span></code><br/></pre></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Model动态配置框架</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">既然可以快速重放，实际上很多时候简单的修改为更强的模型就能提高执行的成功率，所以作者也简单写了一套快速修改模型的配置框架，实现对使用的模型的一键替换。先设计了多级语义化模型，然后通过配置文件设置实际的使用模型，路由层会根据配置映射不同的Provider实例，从而方便随时进行切换和重新组合Agent各处使用的model。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">多级模拟测试环境</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">都知道本地执行和线上总会有细微差异，所以在推进公司上线流程前，作者会在不同的环境进行测试，分别是：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Jupyter模式：</span></strong><span leaf="">用于验证Agent所有的代码执行逻辑，相关数据均存在本地sqlite，便于修改调试</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">langgraph dev模式：</span></strong><span leaf="">用于验证Agents的API、异步调用、流式响应输出等能力</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">本地docker模式：</span></strong><span leaf="">用于验证docker环境下的执行情况，尤其是和环境还有数据库相关的内容</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">结合以上内容基本可以实现较为快速的开发迭代工作</span></strong></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">额外备注</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">官方提供了企业级的调试平台LangSmith（支持调试本地图，但仍需联网加载框架本身），但具有一定的学习成本且较多功能和云平台绑定，本人开发过程中仅辅助使用。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">6.Agent安全：Prompt 层的权限控制</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">由于是数据分析Agent，关于如何限制AI查询或吐出的数据超过使用者的权限，作者针对这一块的设计做了较多设计</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">首先支持两种自由度：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  基于 </span><strong style="box-sizing: border-box;"><span leaf="">认证用户</span></strong><span leaf="">：基于</span><strong style="box-sizing: border-box;"><span leaf=""> RBAC权限模型</span></strong><span leaf="">，自动判断当前登录会话用户的对应权限列表（和现有的OLAP平台共享，包括可用表和可用游戏限制）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  基于</span><strong style="box-sizing: border-box;"><span leaf=""> aksk</span></strong><span leaf="">：由于业务分析师申请过权限更高的个人aksk，所以允许传入私人 的aksk，查询时优先使用该aksk创建的client进行查询</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">关于认证用户的实现也分为两个部分：</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1.Agent对用户的身份识别</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">实际上每一个用户识别是通过上游可信服务进行请求时注入（通过调用graph时设置config参数），Agent自身默认完全信任该身份认证，从而解耦的认证与Agent执行能力。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本项目是第一个python调用游戏权限管理系统的服务，为此专门编写了python版sdk实现，以便后续的开发工作。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6428571428571429" data-s="300,640" data-type="png" data-w="546" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020365" src="https://wechat2rss.xlab.app/img-proxy/?k=84aa0fdc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SScwOUfiawdwdXQURVIslY54JqkFvYyFbIYL6znaXhU7tQ4oibVnB4Nbicw0KSQJKLTvWwCJIichpsRCKibN10of9xlPhmOFIic47neo%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="python"><code><span leaf=""><span class="code-snippet__comment"># 获取权限管理器单例</span></span></code><br/><code><span leaf="">auth_mgr = get_auth_manager()</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment"># 查询用户权限</span></span></code><br/><code><span leaf="">perms = auth_mgr.fetch_user_permissions(<span class="code-snippet__string">&#34;username&#34;</span>)</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment"># 权限检查</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">if</span> perms.has_table(<span class="code-snippet__string">&#34;biligame_dc.ads_table&#34;</span>):</span></code><br/><code><span leaf="">    <span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">&#34;✓ 有表访问权限&#34;</span>)</span></code><br/><code><span leaf=""><span class="code-snippet__keyword">if</span> perms.has_game_base(<span class="code-snippet__string">&#34;23&#34;</span>):</span></code><br/><code><span leaf="">    <span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">&#34;✓ 有游戏基础ID权限&#34;</span>)</span></code><br/><code><span leaf=""><span class="code-snippet__keyword">if</span> perms.has_game(<span class="code-snippet__string">&#34;4368&#34;</span>):</span></code><br/><code><span leaf="">    <span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">&#34;✓ 有游戏ID权限&#34;</span>)</span></code><br/><code><span leaf=""><span class="code-snippet__keyword">if</span> perms.has_role(<span class="code-snippet__string">&#34;dataDev&#34;</span>):</span></code><br/><code><span leaf="">    <span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">&#34;✓ 有dataDev角色&#34;</span>)</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment"># 访问权限列表</span></span></code><br/><code><span leaf=""><span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">f&#34;表权限: </span><span class="code-snippet__string"><span class="code-snippet__subst">{perms.tables}</span></span><span class="code-snippet__string">&#34;</span>)</span></code><br/><code><span leaf=""><span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">f&#34;游戏基础ID: </span><span class="code-snippet__string"><span class="code-snippet__subst">{perms.game_base_ids}</span></span><span class="code-snippet__string">&#34;</span>)</span></code><br/><code><span leaf=""><span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">f&#34;游戏ID: </span><span class="code-snippet__string"><span class="code-snippet__subst">{perms.game_ids}</span></span><span class="code-snippet__string">&#34;</span>)</span></code><br/><code><span leaf=""><span class="code-snippet__built_in">print</span>(<span class="code-snippet__string">f&#34;角色: </span><span class="code-snippet__string"><span class="code-snippet__subst">{perms.role_tags}</span></span><span class="code-snippet__string">&#34;</span>)</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment"># 基于现有权限直接校验 SQL</span></span></code><br/><code><span leaf="">sql_result = perms.evaluate_sql(<span class="code-snippet__string">&#34;SELECT * FROM biligame_dc.ads_table;&#34;</span>)</span></code><br/><code><span leaf=""><span class="code-snippet__built_in">print</span>(sql_result.is_allowed)</span></code><br/></pre></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2.查询时的动态控制</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">可以通过前述实例代码中看到，实际上有个基于权限的动态校验SQL能力（见上文最后2行调用）。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这里作者设计取了个巧，对Agent来说实际上并不知道自己的权限，而是采用了一种启发式的探索策略。也就是会有一个权限校验AOP，任何SQL执行前均会进行判断，如果发现权限不足，会模拟查询工具的response，告知查询失败的原因，及用户所拥有的权限。从而让llm根据情况动态调整查询语句，或探索可用表，以及引导用户申请权限。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">另外在执行层为最大程度发挥Agent的探索能力，对于查询表信息、元数据等内部执行流程环节，则会统一使用数仓管理员级别账号，仅在实际查询表明细数据时进行动态权限判断。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">SQL权限判断实现</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这里作者摒弃了传统的正则匹配方案，采用 AST（抽象语法树）语法分析 技术，构建了深度防御体系：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1. 语义级的精准解析</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">引入 sqlglot 库并将方言严格配置为 ODPS/MaxCompute 模式，消除“解析器差异”带来的安全隐患。这使得我们不再是在“字符串”层面“猜”意图，而是在“语义”层面“读”逻辑。无论是 CTE、嵌套子查询还是复杂的 Union 结构，都能被精准递归遍历。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2. 深度逻辑校验</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">解析后的 AST 会经过一系列严格的检测器：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">- 表级权限围栏：</span></strong><span leaf="">标准化提取所有涉及表名（自动处理 odps. 前缀、Alias 别名映射），与用户的 RBAC 权限列表进行比对。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">- 数据行级隔离：</span></strong><span leaf="">强制检查是否包含必需的 game_id 过滤条件。针对多表 Join 等复杂场景，采用“最小特权原则”，若无法确定过滤条件是否能通过传递性约束所有敏感表，则直接拒绝执行。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">- 逻辑漏洞防御：</span></strong><span leaf="">专门检测能够绕过权限的 SQL 模式，如 OR 1=1（永真式）、OR game_id = &#39;unauthorized&#39;（逻辑或绕过）、以及对权限字段使用 LIKE/BETWEEN 等模糊匹配操作，一经发现立即拦截。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3. 安全的自动改写</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">对于权限不足但结构合法的简单查询（如 SELECT * FROM table），Guard 组件支持 </span><strong style="box-sizing: border-box;"><span leaf="">Enforce 模式</span></strong><span leaf="">。它直接操作 AST 节点，在 WHERE 子句中构建强类型的表达式对象（Expression Object）注入 game_id IN (...) 条件。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">防注入设计：由于全程不涉及字符串拼接，从根源上杜绝了改写过程中的二次注入风险。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4. 基于白名单的防御策略</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">不同于传统的黑名单拦截（容易被生僻语法绕过），对 Agent 生成的 SQL 还采用“AST 模式白名单”策略。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 只允许有限的、可被完全语义理解的 SQL 结构通过。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 任何包含不确定性的语法结构（如复杂的非等值 Join、未知的 UDF 调用、特殊的 Hint 注入）都会触发“解析不确定”警报并回退，迫使 Agent 重新生成更标准的查询语句，或干脆换一种写法。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">5.  完善的单元测试覆盖</span></strong></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">同时为了验证这套防御体系的健壮性，编写了数十个覆盖各种边界情况的单元测试。这种基于编译器前端技术的安全方案，将原本脆弱的“文本匹配”升级为了坚固的“语义验证”，在保障 Agent 灵活性的同时，也能最大化的避免安全风险。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""> 四、落地与可观测性</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">内网部署思考</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">实际上很多网上的方案只有“如何做出Agent”，而没有“如何内网落地”的完整方案，而本项目在Agent开发完后，落地存在2个限制需要考虑：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  需要支持公司内网的鉴权登录</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  存在主动提供ak/sk等定制的场景</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">结合当前实际的部署情况以及业务使用场景进行了分析：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5921052631578947" data-s="300,640" data-type="png" data-w="1824" style="vertical-align:middle;max-width:100%;width:450px;box-sizing:border-box;height:266px;" data-imgfileid="100020367" src="https://wechat2rss.xlab.app/img-proxy/?k=1393b91d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQqspibjLzM5aneqUFyBicfQPp18EEYiclZiaVvqZDuDGYMzMtsmsIeZxw6JIEhYRZ6IPdER4yGzBtPFmtMzL2rdicEF24Wal6J6IM8%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.5638297872340425" data-s="300,640" data-type="png" data-w="940" style="vertical-align:middle;max-width:100%;width:468px;box-sizing:border-box;height:264px;" data-imgfileid="100020364" src="https://wechat2rss.xlab.app/img-proxy/?k=f873c1ed&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSzpYruXGGIicbYPa4sicMUm9OwjEHbsBpK4trHrQGGZo7nZS34We9S7ooFShnog6Q7hbeo8qY6wv0RmDUZtWXaRP3zcOSz7sLJE%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">最后决定基于现有的Dify开源WebUI做二次开发来满足后续的迭代需要，有几个好处：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  Dify作为长期迭代的开源项目，在整个前后端链路上的协议建设会比作者临时自己搭建思考更全面和完善</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  屏蔽了LangGraph这类底层服务的直接对外API的不确定性风险（实际上正好避开了后来爆出的比如CVE-2025-64439远程执行漏洞等）</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.  客户端可以复用于部门其他同事创作的DifyAgents</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">整体架构设计</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7322834645669292" data-s="300,640" data-type="png" data-w="1524" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020366" src="https://wechat2rss.xlab.app/img-proxy/?k=b84ddc3c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQypoBgKMa6HIpJagM7p5vFAEMhhekPSdxJrMqaFGrOapllwRsrSYaxtLretknu5zYJmrouuW2lziaspIEJtibSzKAcPbCPtEvAk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">图中对应关系：</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  Agents实例服务</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  Dify - 提供知识库服务、简易Agent搭建、Agent服务的APP化包装</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">3.  BFF层 - 接入公司权限系统等鉴权服务，从而绕过了外部框架难以集成公司鉴权的问题</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">4.  自研运维管理服务台 - LangGraph的Agent线程实例监控管理台</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">5.  自研Cron调度服务 - 一个简易的专用调度服务，以处理定时触发类服务，比如日志、数据巡检</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">6.  Langfuse - 开源LLM运维仪表盘</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">7.  Nginx - Docker内的统一网关，管理不同path对应的服务，以及仅允许前端类服务外部暴露</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">8.  公司OA系统 - 提供内网认证服务</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">9.  游戏权限管理系统 - 提供&#39;用户&#39;与&#39;游戏/表&#39;权限的管理</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">10.  公司LLM网关 - 提供大模型接口调用服务</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">11.  ChatUI - 与Agent交流的对话界面，能够通过iFrame嵌入到其他服务内，从而实现在不同的地方提供用户服务</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">12.  企业微信智能Bot - 提供用户在企业微信中直接沟通的方式</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">网络设计</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">考虑到场景调用量，整个网络拓扑架构未对分布式做过多设计，主要服务于单机配置，安全方面遵守了以下几个限制：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">所有服务仅服务于公司内网环境</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">Agents服务不暴露端口到宿主机，和Dify在同一docker内，从而实现通信的内外隔离</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">由BFF层负责所有API的用户鉴权管理</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">docker内建专用Nginx网关，从而确保不同服务的共存</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">关于nginx的配置，有一些注意点：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="nginx"><code><span leaf=""><span class="code-snippet__comment"># 客户端上传文件大小限制(根据需要调整)</span></span></code><br/><code><span leaf=""><span class="code-snippet__attribute">client_max_body_size</span> <span class="code-snippet__number">100M</span>;</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment"># SSE/流式传输关键配置 - 禁用所有缓冲</span></span></code><br/><code><span leaf=""><span class="code-snippet__attribute">proxy_buffering</span> <span class="code-snippet__literal">off</span>;              <span class="code-snippet__comment"># 禁用响应缓冲</span></span></code><br/><code><span leaf=""><span class="code-snippet__attribute">proxy_cache</span> <span class="code-snippet__literal">off</span>;                  <span class="code-snippet__comment"># 禁用缓存</span></span></code><br/><code><span leaf=""><span class="code-snippet__attribute">proxy_request_buffering</span> <span class="code-snippet__literal">off</span>;      <span class="code-snippet__comment"># 禁用请求缓冲</span></span></code><br/><code><span leaf=""><span class="code-snippet__attribute">chunked_transfer_encoding</span> <span class="code-snippet__literal">on</span>;     <span class="code-snippet__comment"># 启用分块传输编码</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__comment"># 超时设置(AI 响应可能需要较长时间)</span></span></code><br/><code><span leaf=""><span class="code-snippet__attribute">proxy_connect_timeout</span> <span class="code-snippet__number">60s</span>;</span></code><br/><code><span leaf=""><span class="code-snippet__attribute">proxy_send_timeout</span> <span class="code-snippet__number">3600s</span>;</span></code><br/><code><span leaf=""><span class="code-snippet__attribute">proxy_read_timeout</span> <span class="code-snippet__number">3600s</span>;</span></code><br/></pre></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">补齐开源短板</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Dify通信插件</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Dify和LangGraph Agents的链接是通过自研的通信插件实现的</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">实现的关注点：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">协议转换：将 LangGraph 的复杂 Event Stream 实时转换为 Dify 标准 SSE 流。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">线程转换：通过 thread_mapping 工具，动态处理LangGraph的thread_id与Dify的conversation_id的转换关系，从而实现两边历史会话记录绑定。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">隔离安全：隔离了原生 api 可能吐出过多metadata的问题，因为Dify最后只会返回消息部分了。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.1409313725490196" data-s="300,640" data-type="png" data-w="1632" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020368" src="https://wechat2rss.xlab.app/img-proxy/?k=ae28e5bd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SQ3NR2CfpVa2IMv7AicKNy5C12G66krlVasPQBHyW08mjJEdnZ9k0TDejdHicqrlLvAJnxmnNFC2Vjr3pTHiaGDjhxq1xhwicqjiaeY%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">全功能运维台</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">痛点：</span></strong><span leaf="">由于官方开源版本未提供任何运维管理功能，加上Agent的线上运行极有可能需要干预，因此需要自行建设管理台</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">解决方案：</span></strong><span leaf="">封装 @langchain/langgraph-sdk 全量接口的嵌入式管理台。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">核心能力：</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">- State热修复：</span></strong><span leaf="">支持 patchState，在 Agent 卡死时手动修正变量并恢复运行。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">- 记忆可视化：</span></strong><span leaf="">直接查看和清理 KV Store，治理被污染的长期记忆。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">- 无状态安全：</span></strong><span leaf="">管理台采用无状态设计，兼容性极佳</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.7813852813852814" data-s="300,640" data-type="png" data-w="1848" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020373" src="https://wechat2rss.xlab.app/img-proxy/?k=f7e0542a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SRgMBJGpZNshwsL6wKZALN7f5TvJkqKhStuKMApn37xrYtVpLgWpL1DjHUpo9uibvYicGOBTRhC9oHfeiaH6CL5jHXgsicYd8esn6Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">自研分布式调度系统</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">痛点：</span></strong><span leaf="">开源版缺乏Cron支持（企业版是通过官方云LangSmith实现，开源版API是空实现），定时类任务（如日报巡检等）难以落地。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">架构设计：</span></strong><span leaf="">基于 Node.js Worker + Postgres 的轻量级调度器。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">关键特性：</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""> - 状态保持任务：</span></strong><span leaf="">支持复用 Thread 上下文的连续任务（如“基于昨日分析继续生成今日日报”）。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">- 逻辑线程映射：</span></strong><span leaf="">设计 (logical_id, api_url) -&gt; actual_thread_id 映射机制，解决多实例部署下的状态保持问题。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""> - 可靠性：</span></strong><span leaf="">支持优先级设定、多种并发策略及企微告警闭环。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.9688249400479616" data-s="300,640" data-type="png" data-w="2502" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020372" src="https://wechat2rss.xlab.app/img-proxy/?k=03c838cb&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SQuVLvbvYw3QV13wJ2bfE2f3Ae3oBHStB553LAN6ffPWxt22aniaiccbL9zSZcx4KKjo2hBJN5qXtEic1AZggtibXsmACxia63kS4qk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">WebUI设计</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">由于产品最终还是需要面向用户，所有针对WebUI做了一些专门产品化的设计</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.6258741258741258" data-s="300,640" data-type="png" data-w="2860" style="vertical-align:middle;max-width:100%;width:467px;box-sizing:border-box;height:292px;" data-imgfileid="100020371" src="https://wechat2rss.xlab.app/img-proxy/?k=3f97f124&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SQPU64ptAsRjiawe8qBLicN1iaUJbrWkEjC16JHFYAkWQBR4aU9iaq83cHIiaRC3WN6wHBokF6WicamNic6PZY5SKlcqPAwtMfW0DxBDI%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.1827586206896552" data-s="300,640" data-type="png" data-w="1160" style="vertical-align:middle;max-width:100%;width:277px;box-sizing:border-box;height:328px;" data-imgfileid="100020370" src="https://wechat2rss.xlab.app/img-proxy/?k=32291386&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SQlT4Zd6ibahCHKSC669DpFJO29YLiadvYBb66JC44aJTFN8B9kKRjw8kGIowI0aFdzvazALicG8tlulfyZdntDdDKHDEN6mCvIxU%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.44380639868744876" data-s="300,640" data-type="png" data-w="2438" style="vertical-align:middle;max-width:100%;width:453px;box-sizing:border-box;height:201px;" data-imgfileid="100020369" src="https://wechat2rss.xlab.app/img-proxy/?k=b6a2f572&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SSAHjMay3SA62wibH2jZNmh4QlTALcjqzlo7ibgjrAXIoOrXflU2mibx5n483Cib63YibvTRC5N8QibyiawxEW81wss68C7253M7tgnDM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.</span><strong style="box-sizing: border-box;"><span leaf="">思维链可视化：</span></strong><span leaf="">前端深度解析 SSE 流，可以选择折叠/展开 &lt;think&gt; 过程。联动了代码中写的一个便捷函数&#34;emit_thinking&#34;，从而产生实时反馈，缓解用户等待焦虑。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.</span><strong style="box-sizing: border-box;"><span leaf="">可选深度分析：</span></strong><span leaf="">给用户一个选择，可以强制激活深度分析链路。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">3.</span><strong style="box-sizing: border-box;"><span leaf="">快速用户反馈：</span></strong><span leaf="">作者认为获得真实的bad case对于迭代属于重中之重，所以专门设计了一个快速用户反馈功能，方便用户数秒内完成反馈。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">4.</span><strong style="box-sizing: border-box;"><span leaf="">更新日志提醒：</span></strong><span leaf="">考虑到很多版本的变动对用户感知不强，用户难以知道产品是否有在持续迭代，所以专门做了版本更新提醒模块。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">5.</span><strong style="box-sizing: border-box;"><span leaf="">自定义启动：</span></strong><span leaf="">由于允许用户填入自有aksk（会话级记忆），制作了专门的启动填入UI。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">6.</span><strong style="box-sizing: border-box;"><span leaf="">结构化渲染：</span></strong><span leaf="">会自动拦截 Agent 生成的 CSV 数据，动态渲染为 ECharts 可交互图表。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">7.</span><strong style="box-sizing: border-box;"><span leaf="">全屏水印：</span></strong><span leaf="">出于安全考虑，WebUI集成了全屏水印，以防数据泄露等情况。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">最后的FAQ</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">关于打包</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">对于LangGraph编写的Agents，主要有3种打包方式：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.23425925925925925" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="100020379" src="https://wechat2rss.xlab.app/img-proxy/?k=9b8e0f4e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SRp0iaYtcvnxqtbEA0mJ4h5wOLVvBZOBUiaicSyeCACTBZsM2T3zOl11t4LSOMeOaX2x5euvtDCYWiaP7rD698OVKyusDIaiaVDbA5o%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">如果使用langgraph build担心数据未经许可的上报，可以在环境变量内加入：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="ini"><code><span leaf=""><span class="code-snippet__attr">LANGSMITH_PROJECT</span>=xxx</span></code><br/><code><span leaf=""><span class="code-snippet__attr">LANGSMITH_API_KEY</span>=xxx               <span class="code-snippet__comment"># 填入自己申请的Key，官方仅用来做build记录，不会上报其他数据</span></span></code><br/><code><span leaf=""><span class="code-snippet__comment"># 加入以下配置</span></span></code><br/><code><span leaf=""><span class="code-snippet__attr">LANGCHAIN_TRACING_V2</span>=<span class="code-snippet__literal">false</span>          <span class="code-snippet__comment"># 关闭 LangSmith tracing，避免对话数据上报</span></span></code><br/><code><span leaf=""><span class="code-snippet__attr">LANGSMITH_TRACING</span>=<span class="code-snippet__literal">false</span></span></code><br/><code><span leaf=""><span class="code-snippet__attr">LANGSMITH_DISABLE_SAAS_RUNS</span>=<span class="code-snippet__literal">true</span>    <span class="code-snippet__comment"># 强制 CLI 运行在本地/离线模式</span></span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">经过作者抓包实测和源码解析，如上配置后不会上报到官方SaaS运维平台LangSmith。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">打包注意事项：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  使用langgraph build构建报错 `requires LANGSMITH_API_KEY`是因为强依赖该Key，必须填入。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">2.  如果构建时修改了一些关联开源库，可以引入wheel包，同时注意“构建时 `relative path` 错误：`uv` 和 `pip` 处理相对路径行为不同”。可以在 `pyproject.toml` 中引用本地 wheel 包时，务必在 Docker 环境中使用绝对路径（如 `file:///deps/DataChat/wheels/...`）</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">其他注意事项</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  记得优化模型的RPM、TPM限制，不然可能会出现意料之外的报错</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  公司内网的SLB可能有单独的超时限制，需要调大，不然Dify的SSE会存在难以排查的timeout</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">3.  如果有使用到matplotlib库，在Docker无头环境中，务必设置 `matplotlib.use(&#39;Agg&#39;)`，否则会因为找不到GUI后端而crash</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">五、总结与展望</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">过去的2个月整个Agent行业也发生了翻天覆地的变化，但这个项目其中很多经验具备长期价值，所以依旧撰写了此文。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本文章主要聚焦于最核心的如何落地Agent，受限于篇幅，一些较大篇幅的内容并未详细开展描述，比如“Vibe/Spec Coding”、“记忆体系”、“评估器”、“HITL(Human-in-the-loop)设计”等内容，感兴趣的读者可以自行进一步了解。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">对本项目未来的规划：</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  使用最新的架构和方法论重写一遍</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  进一步降低使用门槛，允许Agent查询敏感权限数据但是最终报告脱敏，只给调研结论（现在被权限卡住的人太多）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">3.  丰富Skills，沉淀更多业务分析技能</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">4.  完善共享记忆，能够实现跨项目知识能力提升</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">5.  优化HITL流程</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">等等</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">相关资料：</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">LangGraph官方文档：</span><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);"><em style="box-sizing: border-box;"><span leaf=""><a href="https://docs.langchain.com/" target="_blank">https://docs.langchain.com/</a></span></em></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">LangGPT结构化提示词：</span><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);"><em style="box-sizing: border-box;"><span leaf=""><a href="https://LangGPT.ai" target="_blank">https://LangGPT.ai</a></span></em></span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">推荐一个UP主：沧海九粟 </span><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);"><em style="box-sizing: border-box;"><span leaf=""><a href="https://space.bilibili.com/28357052" target="_blank">https://space.bilibili.com/28357052</a></span></em></span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨小B</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">往期精彩指路</span></b></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><p style="text-align: justify;padding: 0px 8px;font-size: 13px;width: 100%;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 40px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247487748&amp;idx=1&amp;sn=c9cbcacf3bba25b478abf2a0f5c0e75f&amp;scene=21#wechat_redirect" textvalue="全链路压测改造之全链自动化测试实践" data-itemshowtype="0" linktype="text" data-linktype="2">全链路压测改造之全链自动化测试实践</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247493174&amp;idx=1&amp;sn=648bf0ffb5e31b1c211d22e636e2c3df&amp;scene=21#wechat_redirect" textvalue="哔哩哔哩⼤数据建设之路—实时DQC篇" data-itemshowtype="0" linktype="text" data-linktype="2">哔哩哔哩⼤数据建设之路—实时DQC篇</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247491092&amp;idx=1&amp;sn=b09492563c760775ed61f75db1bd5822&amp;scene=21#wechat_redirect" textvalue="Apache Kyuubi 在B站大数据场景下的应用实践" data-itemshowtype="0" linktype="text" data-linktype="2">Apache Kyuubi 在B站大数据场景下的应用实践</a></span></p></li></ul></p></div></div><div style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px 8px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;text-align: center;font-size: 12px;color: rgb(160, 160, 160);"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);visibility: visible;"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);visibility: visible;"><p data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;color: rgb(62, 62, 62);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3289447926347317252#wechat_redirect" textvalue="通用工程" linktype="text" data-linktype="2">通用工程</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2390333109742534656#wechat_redirect" textvalue="大前端" linktype="text" data-linktype="2">大前端</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3297757408550699008#wechat_redirect" textvalue="业务线" linktype="text" data-linktype="2">业务线</a></span></span></p><p style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;color: rgb(62, 62, 62);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2329861166598127619#wechat_redirect" textvalue="大数据" linktype="text" data-linktype="2">大数据</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2782124818895699969#wechat_redirect" textvalue="AI" linktype="text" data-linktype="2">AI</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2532608330440081409#wechat_redirect" textvalue="多媒体" linktype="text" data-linktype="2">多媒体</a></span></span></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-index="0" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/300?wx_fmt=png&amp;wxfrom=19" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-origin_num="360" data-biz_account_status="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-index="1" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/300?wx_fmt=png&amp;wxfrom=19" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-origin_num="22" data-biz_account_status="0" data-service_type="2" data-verify_status="2"></mp-common-profile></p></div></div></div></div></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>



<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=91f21108&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247504028%26idx%3D1%26sn%3Dcb78fb155cef1df7bc5447a34b74fab1">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 06 Mar 2026 12:02:00 +0800</pubDate>
    </item>
    <item>
      <title>视频生成推理加速实践：基于全局时间索引的序列并行 3D 位置编码优化</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503933&amp;idx=1&amp;sn=f9b7c2ebf85e78af4473ea0134835723</link>
      <description>本文分享B站在视频生成模型推理优化中的一系列实践，重点围绕分块自回归视频模型在序列并行场景下的计算与通信优化展开。</description>
      <content:encoded><![CDATA[<p>原创 <span>AI</span> <span>2026-02-13 12:01</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=7358915b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2FtY0ozQev6STPb7299rFf1defLpNpseJJf6WMHqPhicqyZFF6XGmposyt3UhxV8wtyNzJUmUFDZAz9C2tyov7keK5okYibpV1BPWdhhla5WCfc%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>本文分享B站在视频生成模型推理优化中的一系列实践，重点围绕分块自回归视频模型在序列并行场景下的计算与通信优化展开。</p>
  <div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一、Self-Forcing：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">从 Wan2.1 到因果视频推理</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Wan2.1：全帧并行的视频扩散模型</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">Wan2.1 是阿里巴巴团队开源的大规模视频生成基础模型，基于主流的扩散 Transformer（DiT）架构，并采用 Flow Matching 作为训练框架，在多个视频生成评测基准上展现了领先的生成质量。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.3037037037037037" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020279" src="https://wechat2rss.xlab.app/img-proxy/?k=a3c8a617&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SRKB3xLPgajGje9rcB2L7xyqaAicakqk3PAkP54NiaxLXEtYUjKrKWJUcFQoDXd2glPqNRCLVhpes21BI3iah2xKXASc2HUj6I4ls%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在模型设计上，Wan2.1 采用典型的</span><strong style="box-sizing: border-box;"><span leaf="">全时空并行建模思路</span></strong><span leaf="">。模型使用 Full Spatio-temporal Attention，使得所有视频帧在时间和空间维度上完全互相可见，从而实现双向的信息流动与全局一致性建模。视频首先通过 3D Causal VAE 被压缩到 4×8×8 的时空比例，latent 维度为 16，文本侧则使用 umT5 编码器，将中英文输入映射为 512 tokens、4096 维的语义表示，并通过 Cross-Attention 注入到生成过程中。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">从规模上看，Wan2.1 同时提供了面向效率和质量的不同版本：1.3B 模型采用 1536 维隐藏层、30 层 Transformer 和 12 个注意力头，更适合资源受限场景，14B 模型则扩展到 5120 维隐藏层、40 层 Transformer 和 40 个注意力头，以追求更高的生成上限。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在推理阶段，Wan2.1 会一次性处理所有视频帧，通过 40–50 步去噪迭代生成完整视频。这种全帧并行的生成方式在中短视频场景中能够有效保证时序一致性，但其设计假设也直接决定了模型在更长视频和实时推理场景下会遇到不可回避的瓶颈。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">全局扩散模型在长视频推理中的瓶颈</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">随着视频长度的增加，基于双向全注意力的扩散模型逐渐暴露出结构性问题。首先是显存和计算复杂度的快速膨胀。自注意力的复杂度为 O(N²)，其中 N 为 token 序列长度。以 Wan2.1 生成 5 秒、16 FPS、832×480 分辨率视频为例，经过 VAE 压缩后仍然会形成约 3 万级别的 token 序列，当视频长度翻倍时，注意力相关的显存需求将增长至原来的四倍，这使得单卡生成更长视频变得困难。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">其次，全局并行注意力隐含了</span><strong style="box-sizing: border-box;"><span leaf="">固定长度假设</span></strong><span leaf="">。由于所有帧必须同时参与计算，模型在训练阶段通常就需要设定最大帧数，当推理阶段希望生成更长的视频时，只能通过滑动窗口或分段拼接来变通处理，而这往往会带来明显的时间接缝和长程一致性退化，模型本身并不具备自然向更长时间轴扩展的能力。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">更重要的是，这种双向依赖的建模方式使得模型无法进行流式推理。由于当前帧的生成会受到未来帧的反向影响，系统必须等待整个视频生成完成后才能输出结果，首帧延迟往往达到数十秒甚至更长。这种“离线式”的推理模式显然无法满足实时交互、在线生成或视频续写等应用需求。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这些问题并非简单的工程优化可以解决，而是源自全局扩散模型在时间建模上的基本假设。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Self-Forcing：用因果生成重构视频扩散推理</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Self-Forcing 提出了一种因果自回归的视频扩散训练与推理方式，其核心思想是将 Wan2.1 这类全帧并行模型，改造为</span><strong style="box-sizing: border-box;"><span leaf="">只依赖历史信息的逐步生成模型</span></strong><span leaf="">，同时避免传统自回归模型中常见的误差累积问题。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在模型结构上，Self-Forcing 引入因果注意力约束，使当前帧只能关注历史帧而无法“看到”未来信息。这一约束通过 Block Mask 施加在注意力计算中，并配合 Flex Attention 实现高效计算。由于满足因果性，模型在推理时可以安全地复用历史帧的 Key / Value，从而引入 KV 缓存机制，避免在每一步生成中重复计算已经确定的上下文。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.29907407407407405" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020277" src="https://wechat2rss.xlab.app/img-proxy/?k=6e32ccaa&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SSJmekw5XzjnuVxvs57RqA6guP5h1k4IHjOicgL8mcAib0HiaTdvUKk5tnv9Y1j8rlh9extia74YfiaFXIVysMz6bH9BicGk1icfIq8NM%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在此基础上，Self-Forcing 采用逐块生成策略，将视频按帧或按小段 latent 分块生成。每一块完成去噪后，其结果会被写入 KV 缓存，作为后续生成的上下文；当缓存达到上限时，通过 Rolling KV Cache 自动淘汰最早的 tokens，从而在有限显存下支持任意长度的视频生成。这种设计将注意力的峰值复杂度从 O(N²) 降低到 O(B×N)，其中 B 为单次生成的块大小。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">从工程实现上看，Self-Forcing 使用 CausalWanModel 替代原始 WanModel，并在注意力层中系统性地引入因果掩码、KV 缓存以及编译级优化。在保持训练与推理一致性的前提下，模型在生成质量上与 Wan2.1 基本持平，VBench 指标甚至略有提升，同时将首帧延迟降低到亚秒级，并在单卡 H100 上实现了接近实时的视频生成速度。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">总体而言，Self-Forcing 并不是对 Wan2.1 的局部加速，而是一次从</span><strong style="box-sizing: border-box;"><span leaf="">全局扩散范式向因果推理范式</span></strong><span leaf="">的结构性转变，为长视频生成、流式推理和实时交互提供了可行的技术路径。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""> 二、推理优化工作详解</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">序列并行实现</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">官方的 Self-Forcing 实现并未支持序列并行（Sequence Parallelism, SP），这在单卡显存受限、尤其是长视频推理场景下，成为扩展模型能力的主要瓶颈。为了解决这一问题，我们的算法团队在 Self-Forcing 因果注意力的基础上，参考 Megatron 以及 Ulysses 的设计，引入了对 SP 的完整支持。</span></p><div data-tool="mdnice编辑器" data-website="https://www.mdnice.com" data-pm-slice="0 0 []"><p data-tool="mdnice编辑器" style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在 SP 模式下，序列维度被均匀切分到多个并行 rank 上，每个 rank 仅持有长度为 </span><span leaf=""> 的局部序列。整体的计算流程如下所示：</span></p></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.0600801068090788" data-s="300,640" data-type="png" data-w="749" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020278" src="https://wechat2rss.xlab.app/img-proxy/?k=db6dc2bf&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6STyxL9F7zRBNvOP3lpAgviaOy4ib1dRqSg4yr81B0OSjDNqpTibOiaZpb58GmY3j8rWhhdhnogy7fQib66320gbaIqich1TOKTY6NKQk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在实际的性能分析中，我们注意到两个关键问题：一方面，RoPE 在整个自注意力模块的计算中占据了显著的时间比例；另一方面，现有 Causal RoPE 的实现需要完整序列信息，其计算依赖于前面的三次 all-gather 通信，导致 RoPE 无法与通信阶段重叠执行，从而进一步放大了通信带来的性能损耗。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="0.33774834437086093" data-s="300,640" data-type="png" data-w="755" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020276" src="https://wechat2rss.xlab.app/img-proxy/?k=d1016382&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6SS38e95ypWGuYxNibjzy4B42worvZDqvicORCblpdHDY99JjUQazu7NMrsGel1ZY2Zia0gUu8L6D5o0ePmE93nNVv43Jl8mHUicAaE%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在 Self-Forcing 的分块自回归生成中，时间位置需要通过全局偏移来编码，这使得 RoPE 的计算逻辑相比传统实现有所不同。为了保证 KV Cache 与因果注意力的一致性，我们需要在序列分片内部正确应用全局时间索引，实现 Causal-RoPE 的局部化计算。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">分块自回归下的旋转位置编码</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Wan2.1 使用的 3D Rotary Positional Encoding 与 Qwen2.5-VL 中的多模态 RoPE（M-RoPE）在设计上是一致的：将旋转频率在维度上拆分为时间（temporal）、高度（height）和宽度（width）三部分，从而对视频 token 的三维空间位置进行编码。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在具体实现上，Qwen2.5-VL 采用传统的 cos/sin 形式，并通过 </span><strong style="box-sizing: border-box;"><span leaf="">rotate_half</span></strong><span leaf=""> 实现旋转：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="ini"><code><span leaf=""><span class="code-snippet__attr">q_embed</span> = (q * cos) + (rotate_half(q) * sin)</span></code></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">而 Wan2.1 则直接使用复数形式来表达旋转操作，将 RoPE 显式建模为复平面上的乘法：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="makefile"><code><span leaf=""><span class="code-snippet__comment"># freqs 在 rope_params 中已通过 torch.polar 转换为复数</span></span></code><br/><code><span leaf="">freqs = freqs.split([c - 2 * (c // 3), c // 3, c // 3], dim=1)</span></code><br/><code><span leaf="">x_i = torch.view_as_complex(x[i, :seq_len].to(torch.float64).reshape(</span></code><br/><code><span leaf="">    seq_len, n, -1, 2))</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">freqs_i = torch.cat([</span></code><br/><code><span leaf="">    freqs[0][:f].view(f, 1, 1, -1).expand(f, h, w, -1),</span></code><br/><code><span leaf="">    freqs[1][:h].view(1, h, 1, -1).expand(f, h, w, -1),</span></code><br/><code><span leaf="">    freqs[2][:w].view(1, 1, w, -1).expand(f, h, w, -1)</span></code><br/><code><span leaf="">], dim=-1)</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">x_i = torch.view_as_real(x_i * freqs_i).flatten(2)</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这种实现方式更贴近 RoPE 的数学本质，其核心等价关系可以写为：</span></p></div><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在 Self-Forcing 框架下，为了支持分块因果推理与 KV Cache，引入了额外的 </span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">start_frame</span></strong><span leaf=""> 参数，用于显式指定当前生成块在全局时间轴上的起始位置：</span></p><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="ruby"><code><span leaf=""><span class="code-snippet__keyword">def</span> <span class="code-snippet__title">causal_rope_apply</span>(<span class="code-snippet__params">x, grid_sizes, freqs, start_frame=</span><span class="code-snippet__params"><span class="code-snippet__number">0</span></span>):</span></code><br/><code><span leaf="">    freqs_i = torch.cat([</span></code><br/><code><span leaf="">        freqs[<span class="code-snippet__number">0</span>][<span class="code-snippet__symbol">start_frame:</span>start_frame + f].view(f, <span class="code-snippet__number">1</span>, <span class="code-snippet__number">1</span>, -<span class="code-snippet__number">1</span>).expand(f, h, w, -<span class="code-snippet__number">1</span>),</span></code><br/><code><span leaf="">        freqs[<span class="code-snippet__number">1</span>][<span class="code-snippet__symbol">:h</span>].view(<span class="code-snippet__number">1</span>, h, <span class="code-snippet__number">1</span>, -<span class="code-snippet__number">1</span>).expand(f, h, w, -<span class="code-snippet__number">1</span>),</span></code><br/><code><span leaf="">        freqs[<span class="code-snippet__number">2</span>][<span class="code-snippet__symbol">:w</span>].view(<span class="code-snippet__number">1</span>, <span class="code-snippet__number">1</span>, w, -<span class="code-snippet__number">1</span>).expand(f, h, w, -<span class="code-snippet__number">1</span>)</span></code><br/><code><span leaf="">    ], dim=-<span class="code-snippet__number">1</span>)</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p><span leaf="">通过这一改动，3D RoPE 被自然地扩展为适用于分块自回归生成的因果形式。对于时间–空间位置为 </span></p><p data-tool="mdnice编辑器" style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""> 的 token，其位置编码可以形式化表示为：</span></p><p data-tool="mdnice编辑器" style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">其中，全局时间索引定义为：</span></p><p data-tool="mdnice编辑器" style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这里 </span><span leaf=""> 为块索引，</span><span leaf=""> 为块大小。以 chunk-wise（每块 3 个 latent 帧）为例，不同生成块对应的 start_frame 分别为 0、3、6 …，依此类推。</span></p><p data-tool="mdnice编辑器" style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">如果仅使用局部时间索引，不同块中处于相同相对位置的 token 将获得完全相同的位置编码，从而导致全局时间顺序混淆，并使 KV Cache 中的位置信息失真。通过显式引入全局时间偏移，Causal-RoPE 保证了位置编码与自回归生成顺序之间的一一对应关系。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">局部计算的可行性</span></strong></p></div></div></div><div data-tool="mdnice编辑器" data-website="https://www.mdnice.com" data-pm-slice="0 0 []"><p data-tool="mdnice编辑器" style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在序列并行设置下，序列维度被划分到 </span><span leaf=""> 个并行 rank 上。对于 rank  </span><span leaf=""> ，其负责的序列区间为 </span><span leaf=""> ，其中 </span><span leaf=""> 。 由于 token 在序列中按照&#34;帧优先&#34;的顺序排列，序列切分在效果上等价于对时间维度的近似划分。对于 rank </span><span leaf=""> 中局部索引为 </span><span leaf=""> 的 token，其对应的全局序列位置和全局时间索引分别为：</span></p><p data-tool="mdnice编辑器" style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">其中 </span><span leaf=""> 为当前块的 start_frame。 可以看到，对每个 token，Causal-RoPE 的计算仅依赖其自身特征、全局时间位置以及共享的频率参数 </span><span leaf="">。在分块自回归 + SP 的组合下，我们通过在每个 rank 内应用正确的全局时间索引，实现了 RoPE 的完全局部计算，无需额外跨 rank 通信，同时保持了因果一致性。</span></p></div><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这一结论为后续的优化提供了理论基础。</span></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">实现方案与性能对比</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">基于上述分析，我们将 RoPE 的计算下沉到序列分片内部，先在本地完成 Causal-RoPE 的计算，再通过一次融合的 all-to-all 通信，同时完成序列维度与注意力头维度的重排，从而替代原始实现中的三次 all-gather 和一次 split 操作：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img" data-ratio="1.0975609756097562" data-s="300,640" data-type="png" data-w="697" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-imgfileid="100020280" src="https://wechat2rss.xlab.app/img-proxy/?k=762cbc3f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FtY0ozQev6SQfuOBiac1zNUA7AMTHEgkLcuGhx6RV7SC6U5tN4MPzkfqWXicH8Z0VPSycAAmfyehmjP0CAiafz9pmJiahooDicfMrQDR2SiaKVBib3A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在第一阶段优化中，我们进一步缓存 RoPE 所需的 sin/cos，并基于 TileLang 实现算子融合，相比社区常见的 Triton 实现获得了约 10% 的性能提升，整体优化方案的 profile 结果如下所示：</span></p></div><div style="text-align: center;box-sizing: border-box;"><p style="text-align: center;" nodeleaf=""><img data-aistatus="1" class="rich_pages wxw-img js_insertlocalimg" data-ratio="0.3435185185185185" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="100020284" src="https://wechat2rss.xlab.app/img-proxy/?k=179e6463&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FtY0ozQev6STmP9pOmqLic5OVfoWTBGAVCUs5iaKXSWmyibD0oMFfcWDgcFdDwobib88mgTb1ribDQMwboEhfVCYicicwZnCRPSBoIpqSNAR19b7nMk%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在一次典型的 5s 480P 视频推理中，会触发 920 次的自注意力计算，整体耗时降低约：</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">相比优化前 8.86s 的端到端耗时，整体推理性能实现 约 1.48× 无损加速（≈47.5% speedup），与实际的实验结果高度一致。后续我们在做计算图优化的时候，注意到 RoPE 的缓存逻辑对整图优化不友好，进一步将动态的缓存逻辑改成了预计算逻辑，并将结果存储在连续张量中，绕过 Host Op，在推理过程中直接在 GPU 上进行寻址，使用预计算的 cos / sin 对输入张量进行旋转编码计算，优化了 CUDA 的计算流，实现了计算性能的进一步提升。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">三、总结与展望</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本文分享了我们在视频生成模型推理优化中的一系列实践，重点围绕分块自回归视频模型在序列并行场景下的计算与通信优化展开。除上述工作外，我们还在低比特量化、计算图优化等方向持续探索，为后续更大规模、更低延迟的视频生成系统打下基础。</span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨storyicon、在喝可乐的派派</span></p><div style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 5px 0px 10px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;" data-pm-slice="0 0 []"><div style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 5px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;height: auto;"><div style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;text-align: justify;color: rgb(12, 182, 242);"><p style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;clear: both;min-height: 1em;white-space: normal;"><b style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span leaf="" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">往期精彩指路</span></b></p></div></div></div><div style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 5px 0px 10px;padding: 25px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;width: 677px;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);height: auto;"><div style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;transform: translate3d(-5px, 0px, 0px);width: 627px;"><p style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px 8px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;text-align: justify;font-size: 13px;width: 627px;"><ul style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px 0px 0px 40px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;list-style-type: disc;list-style-position: outside;" class="list-paddingleft-1"><li style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><p style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px 0px 15px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;clear: both;min-height: 1em;"><span leaf="" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: var(--weui-LINK);text-decoration: none;-webkit-user-drag: none;cursor: default;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502937&amp;idx=1&amp;sn=c5d6846baf254ae2a9961c61bb619dea&amp;scene=21#wechat_redirect" textvalue="Index-AniSora技术升级开源：动漫视频生成强化学习" data-itemshowtype="0" linktype="text" data-linktype="2">Index-AniSora技术升级开源：动漫视频生成强化学习</a></span></p></li><li style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><p style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px 0px 15px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;clear: both;min-height: 1em;"><span leaf="" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: var(--weui-LINK);text-decoration: none;-webkit-user-drag: none;cursor: default;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502001&amp;idx=1&amp;sn=9ee9dbe3b289e181b228325a53fb8cfe&amp;scene=21#wechat_redirect" textvalue="B站自研动画视频生成模型全链路技术报告" data-itemshowtype="0" linktype="text" data-linktype="2">B站自研动画视频生成模型全链路技术报告</a></span></p></li><li style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><p style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;clear: both;min-height: 1em;"><span leaf="" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: var(--weui-LINK);text-decoration: none;-webkit-user-drag: none;cursor: default;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503478&amp;idx=1&amp;sn=88443ff2c297891906e845fd463f15b1&amp;scene=21#wechat_redirect" textvalue="KMP on iOS 深度工程化：模块化、并发编译与 98% 增量构建加速" data-itemshowtype="0" linktype="text" data-linktype="2">KMP on iOS 深度工程化：模块化、并发编译与 98% 增量构建加速</a></span></p></li></ul></p></div></div><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);visibility: visible;"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);visibility: visible;"><p data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;color: rgb(62, 62, 62);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3289447926347317252#wechat_redirect" textvalue="通用工程" linktype="text" data-linktype="2">通用工程</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2390333109742534656#wechat_redirect" textvalue="大前端" linktype="text" data-linktype="2">大前端</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3297757408550699008#wechat_redirect" textvalue="业务线" linktype="text" data-linktype="2">业务线</a></span></span></p><p style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;color: rgb(62, 62, 62);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;white-space: normal;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2329861166598127619#wechat_redirect" textvalue="大数据" linktype="text" data-linktype="2">大数据</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2782124818895699969#wechat_redirect" textvalue="AI" linktype="text" data-linktype="2">AI</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2532608330440081409#wechat_redirect" textvalue="多媒体" linktype="text" data-linktype="2">多媒体</a></span></span></p><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/0?wx_fmt=png" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/0?wx_fmt=png" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-service_type="2" data-verify_status="2"></mp-common-profile></p></div></div></div></div></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="%27%27">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=914b1596&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247503933%26idx%3D1%26sn%3Df9b7c2ebf85e78af4473ea0134835723">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 13 Feb 2026 12:01:00 +0800</pubDate>
    </item>
    <item>
      <title>视频生成推理加速实践：基于 torch.compile 的整图编译优化</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503911&amp;idx=1&amp;sn=73d66c55e26bfe6da2c540e57ffb5ab3</link>
      <description>视频生成模型的推理优化是一个多层次、系统性的工程挑战。</description>
      <content:encoded><![CDATA[<p>原创 <span>AI</span> <span>2026-01-28 12:03</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=eb18ff80&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1BMf5Ir754TOndhiciclb24ib0CIibCoMBovRLy3ftsDMbZnSnBOOkGicHJZwBLMqPDtKm3vsqicTAXEtuysFXXbvMiaw%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>视频生成模型的推理优化是一个多层次、系统性的工程挑战。</p>
  <div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一、引言：从算子级优化到计算图级优化</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">视频生成模型的推理优化是一个多层次、系统性的工程挑战。在模型推理的早期阶段，优化重点通常集中在算子层面，例如通过优化卷积、注意力等核心算子的计算效率来直接提升浮点运算性能。然而，随着单算子性能逐渐逼近硬件极限，计算图层面的优化便成为释放更大潜力的关键。计算图优化关注的是算子之间的调度、内存复用以及控制流开销，其核心在于提升整体执行图效率。一个高效的执行图能够最大限度地减少框架与硬件的交互开销，避免不必要的内存搬运，并使得更激进的算子融合与内存规划成为可能。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本文将聚焦于推理执行流程本身，探讨如何借助 torch.compile 对 Self-Forcing 的推理流程进行整图编译（full graph compilation），以系统性地降低 Python 解释与调度开销，并为后续更深层次的图级优化奠定基础。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">二、Self-Forcing 推理特性</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">与整图编译的挑战</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Self-Forcing 是一种将 Wan2.1 等全帧并行扩散模型改造为因果注意力架构的训练与推理范式。与传统双向扩散模型在推理阶段需要同时处理全部视频帧不同，Self-Forcing 采用逐块（block-wise）的自回归生成策略：每次生成一小段 latent（通常为 3 帧），并通过 KV Cache 复用历史上下文。</span></p><div data-tool="mdnice编辑器" data-website="https://www.mdnice.com" data-pm-slice="0 0 []"><p data-tool="mdnice编辑器" style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在这种设计下，注意力计算的复杂度由传统扩散模型的</span><span leaf="">下降为</span><span leaf="">，其中 B 表示单次生成的 block 大小。这一特性使得 Self-Forcing 在低延迟、流式视频生成等应用场景中具备显著优势。</span></p></div><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">从编译优化的角度看，Self-Forcing 的实现同时具备“适合编译”和“难以编译”的双重特性。一方面，其推理过程高度结构化，计算模式在每个 step 内基本固定；另一方面，原始实现中广泛存在以下问题：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1）依赖张量值的 Python 控制流；</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2）通过</span><strong style="box-sizing: border-box;"><span leaf=""> .item()、tolist() </span></strong><span leaf="">等方式将张量退回 Host 端；</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">3）KV Cache 的动态索引与切片操作；</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">4）Python 层缓存与调试逻辑的混入。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">上述因素都可能会在 torch.compile 过程中触发 Graph Break，使编译器只能生成多个碎片化的子图，从而难以获得实质性的性能收益。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">三、整图编译策略与实现选择</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在具体实现上，我们采用了一种渐进式的优化策略：首先对关键模块使用 torch.compile 进行局部封装，以评估其潜在收益；随后，在此基础上系统性地识别并消除 Graph Break，逐步推进至整图编译（Full Graph Compilation）。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们最终选择在注意力模块（CausalWanAttentionBlock）的 </span><strong style="box-sizing: border-box;"><span leaf="">forward</span></strong><span leaf=""> 方法上使用如下配置：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="python"><code><span leaf=""><span class="code-snippet__meta">@torch.compile(</span><span class="code-snippet__meta"><span class="code-snippet__params">dynamic=</span></span><span class="code-snippet__meta"><span class="code-snippet__params"><span class="code-snippet__literal">True</span></span></span><span class="code-snippet__meta"><span class="code-snippet__params">, fullgraph=</span></span><span class="code-snippet__meta"><span class="code-snippet__params"><span class="code-snippet__literal">True</span></span></span><span class="code-snippet__meta">)</span></span></code></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">其中，</span><strong style="box-sizing: border-box;"><span leaf="">dynamic=True </span></strong><span leaf="">允许编译器以符号形状（symbolic shapes）的形式表示部分运行期才能确定的维度，从而在不触发额外 graph break 或重新编译的前提下，支持一定范围内的输入形状变化。这一特性在进行前期优化的时候比较重要：尽管单次推理的视频分辨率和总帧数通常是固定的，但序列在多卡之间的切分方式、以及 KV Cache 在不同 step 中的有效长度与写入区间，都可能会引入运行期的形状差异，通过符号化这些维度，可以避免因形状变化而频繁触发重新编译，从而提升整体推理稳定性与性能。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">fullgraph=True</span></strong><span leaf=""> 则是实现整图优化的关键。该选项要求整个函数必须被编译为单一 FX 计算图，一旦遇到无法追踪的操作便直接报错并中止编译。虽然这一“严格模式”显著提高了工程改造的难度，但它能够在编译阶段完整暴露所有潜在的 Graph Break 点，避免隐式的子图切换开销，并为后续的算子融合和 CUDA Graph 捕获提供必要前提。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在实践中，fullgraph 模式的价值不仅体现在最终性能上，更体现在其对代码结构与数据流设计的“约束”作用。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">四、Graph Break 的成因分析与消除方法</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在本章节中，我们的代码示例基于 Self Forcing 的 </span><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;"><em style="box-sizing: border-box;"><span leaf="">官方实现</span></em></span><span leaf="">（</span><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);"><em style="box-sizing: border-box;"><span leaf=""><a href="https://github.com/guandeh17/Self-Forcing" target="_blank">https://github.com/guandeh17/Self-Forcing</a></span></em></span><span leaf="">），部分提及的序列并行代码基于内部工程实现。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">控制流与标量提取</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在 </span><strong style="box-sizing: border-box;"><span leaf="">torch.compile </span></strong><span leaf="">中导致图断开的最常见原因之一是 Python 端语义依赖于运行时张量值。在 Self-Forcing 的原始实现中，大量逻辑通过</span><strong style="box-sizing: border-box;"><span leaf=""> .item() </span></strong><span leaf="">将张量转换为 Python 标量，用于计算序列长度、帧索引以及 KV Cache 的读写位置，例如：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="ini"><code><span leaf=""><span class="code-snippet__attr">frame_seqlen</span> = math.prod(grid_sizes[<span class="code-snippet__number">0</span>][<span class="code-snippet__number">1</span>:]).item()</span></code><br/><code><span leaf=""><span class="code-snippet__attr">local_end_index</span> = kv_cache[<span class="code-snippet__string">&#34;local_end_index&#34;</span>].item() + current_end</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在 </span><strong style="box-sizing: border-box;"><span leaf="">fullgraph=True</span></strong><span leaf=""> 模式下，这类代码会直接触发如下错误：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="sql"><code><span leaf="">Unsupported Tensor.item() <span class="code-snippet__keyword">call</span> <span class="code-snippet__keyword">with</span> capture_scalar_outputs<span class="code-snippet__operator">=</span><span class="code-snippet__literal">False</span></span></code></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">尽管 PyTorch 提供了 capture_scalar_outputs=True 来支持此类用法，但该方案会引入额外的 Host-Device 同步和标量封装开销，并削弱编译器对数据流的静态分析能力。因此基于性能考虑，我们选择彻底消除 .item() 调用，而不是依赖该选项。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">核心思路是：只要某个量可以在 GPU 上以张量形式计算，就应避免将其退回 CPU。例如，上述代码可以改写为：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="ini"><code><span leaf=""><span class="code-snippet__attr">frame_seqlen</span> = torch.prod(grid_sizes[<span class="code-snippet__number">0</span>][<span class="code-snippet__number">1</span>:])</span></code><br/><code><span leaf=""><span class="code-snippet__attr">current_start_frame</span> = current_start // frame_seqlen</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">更加概括的说，我们在推理热路径上系统性地移除了所有张量到 Python 的转换操作，包括但不限于：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">.item()</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">int(tensor)</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">.tolist()</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">其他类似的标量化操作</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">原因在于，从 torch.compile 的视角来看，Tensor 并不等价于具体数值，而是一种可被分析和优化的计算关系表示。一旦中间结果被转换为 Python 对象，相关数据依赖将很有可能脱离编译器的控制范围，导致计算图无法被完整捕获和优化。相反，保持计算逻辑完全以张量形式表达，有助于最大化编译器的优化空间，并确保推理过程中 CUDA 执行的高效性与并行性。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">数据依赖与动态形状</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">另一类更为隐蔽的 Graph Break 源于</span><strong style="box-sizing: border-box;"><span leaf="">数据依赖导致的动态形状推导失败</span></strong><span leaf="">。在 RoPE 的计算逻辑中，原始实现通过 tolist() 将 grid_sizes 张量转换为 Python 列表，并在循环中动态计算序列长度：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="powershell"><code><span leaf=""><span class="code-snippet__keyword">for</span> f, <span class="code-snippet__built_in">h</span>, w <span class="code-snippet__keyword">in</span> grid_sizes.tolist():</span></code><br/><code><span leaf="">    seq_len = f * <span class="code-snippet__built_in">h</span> * w</span></code><br/><code><span leaf="">    x_i = x[<span class="code-snippet__type">i</span>, :<span class="code-snippet__type">seq_len</span>]</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这一实现同时引入了两个问题：一方面，tolist() 本身会触发 Graph Break，使相关计算逻辑脱离计算图；另一方面，由图外标量 f、h、w 参与计算得到的 seq_len 被用于张量切片，导致编译器无法为输出张量的形状建立有效的符号约束。最终，这种数据依赖关系会在编译阶段表现为守卫失败（data-dependent guard failure），报错如下：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="apache"><code><span leaf=""><span class="code-snippet__attribute">Could</span> not guard <span class="code-snippet__literal">on</span> data-dependent expression u0*u1*u2 &lt; <span class="code-snippet__number">0</span> (unhinted: u0*u1*u2 &lt; <span class="code-snippet__number">0</span>).  (Size-like symbols: none)</span></code></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">但事实上，从推理优化的角度来看，这种实现方式本身是不必要的。对于 Self-Forcing 推理流程而言，grid_sizes 实际由视频帧数、latent 分辨率以及 patch 大小共同决定，而这些参数在推理服务启动时就已经确定，或仅存在有限几组离散取值。因此，在推理优化场景中，我们将 grid_sizes 视为配置期常量，并针对固定配置对计算图进行特化（specialization）。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">尽管这种做法在形式上降低了实现的通用性，但在推理系统中，为固定分辨率和序列长度构建多组计算图是一种常见且行之有效的工程实践。其设计思想也与 CUDA Graph 实践中的分桶（bucketing）与填充（padding）机制高度一致。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">KV Cache 的动态索引问题</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">KV Cache 的读写是推理代码中导致 Graph Break 的另一个高频来源。原始实现中，KV Cache 的访问依赖于运行时计算得到的索引：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="makefile"><code><span leaf=""><span class="code-snippet__comment"># local_start_index 和 local_end_index 是 Tensor 类型</span></span></code><br/><code><span leaf=""><span class="code-snippet__comment"># 读取 KV Cache</span></span></code><br/><code><span leaf="">x = kv_cache[<span class="code-snippet__string">&#34;k&#34;</span>][:, local_start_index:local_end_index]</span></code><br/><code><span leaf=""><span class="code-snippet__comment"># 写入 KV Cache</span></span></code><br/><code><span leaf=""><span class="code-snippet__section">kv_cache[&#34;k&#34;][:, local_start_index:local_end_index] = roped_key</span></span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">由于当前主流版本的 torch.compile 实现尚不支持将张量作为切片边界，上述代码在 fullgraph 模式下会导致编译失败。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">通过对因果注意力具体计算过程的分析可以发现，在未启用滑动窗口注意力的前提下，KV Cache 的访问范围实际上具有明确的闭式解：历史 KV 的读取起点始终为 0，而写入位置则可以由全局序列起始位置 current_start 与当前 block 的 token 数直接确定。在序列并行（SP）场景中，由于 attention 计算开始前已经完成了当前 block 所有序列的 all-gather，这一结论同样成立。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">基于上述观察，我们将 KV Cache 中依赖运行期索引的动态切片逻辑重构为等价的静态索引访问，并在工程实现中通过自定义的 tilelang kernel 实现高效写入。该改造不仅彻底消除了由 KV Cache 读写引发的 Graph Break，也在实际推理中带来了较为明显的性能收益。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Host 调用与 Python 层缓存</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">除了张量相关的问题，Python 层的缓存与调试逻辑同样可能会破坏整图编译。例如，社区中常见的 RoPE 优化方案通常使用 LRU 缓存 cos/sin 值，但该缓存机制依赖 Python 字典的状态更新，推理过程中仍会引入 Host 端参与。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在实际工程中，我们将这类依赖运行期状态的动态缓存改写为预计算逻辑：在模型初始化阶段提前生成所需的 cos / sin 张量，并以连续 Tensor 的形式常驻于 GPU 显存中；在推理阶段仅通过张量索引完成访问，从而彻底消除 Python 侧的参与。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">类似地，诸如 time.time() 等调试代码也会直接触发 Graph Break，应该在优化阶段彻底移除。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">五、实验结果与总结</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在完成 Graph Break 的系统性消除并启用整图编译后，我们在生成 5 秒、480P 视频 的推理任务上进行了性能评测，模型规模为 14B 参数。消融实验结果表明，仅通过 torch.compile 的整图优化，便可在端到端层面获得约 47.6% 的加速效果，将推理耗时从 8.86 秒 降低至 6.00 秒，且未观察到明显的精度退化。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">综上所述，本文展示了在自回归视频生成推理场景下，基于 torch.compile 实现整图编译的一套工程实践经验。我们的经验表明，整图编译的核心价值并不仅在于“自动加速”，更在于其对数据依赖、控制流以及工程实现方式所施加的强约束。这种约束能够显式暴露系统中的隐性复杂度，为进一步的底层算子融合与系统级优化奠定基础。</span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨storyicon、在喝可乐的派派</span></p></div></div></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">往期精彩指路</span></b></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><p style="text-align: justify;padding: 0px 8px;font-size: 13px;width: 100%;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 40px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502937&amp;idx=1&amp;sn=c5d6846baf254ae2a9961c61bb619dea&amp;scene=21#wechat_redirect" textvalue="Index-AniSora技术升级开源：动漫视频生成强化学习" data-itemshowtype="0" linktype="text" data-linktype="2">Index-AniSora技术升级开源：动漫视频生成强化学习</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502001&amp;idx=1&amp;sn=9ee9dbe3b289e181b228325a53fb8cfe&amp;scene=21#wechat_redirect" textvalue="B站自研动画视频生成模型全链路技术报告" data-itemshowtype="0" linktype="text" data-linktype="2">B站自研动画视频生成模型全链路技术报告</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503478&amp;idx=1&amp;sn=88443ff2c297891906e845fd463f15b1&amp;scene=21#wechat_redirect" textvalue="KMP on iOS 深度工程化：模块化、并发编译与 98% 增量构建加速" data-itemshowtype="0" linktype="text" data-linktype="2">KMP on iOS 深度工程化：模块化、并发编译与 98% 增量构建加速</a></span></p></li></ul></p></div></div><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);visibility: visible;"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);visibility: visible;"><p data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(62, 62, 62);font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3289447926347317252#wechat_redirect" textvalue="通用工程" linktype="text" data-linktype="2">通用工程</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2390333109742534656#wechat_redirect" textvalue="大前端" linktype="text" data-linktype="2">大前端</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3297757408550699008#wechat_redirect" textvalue="业务线" linktype="text" data-linktype="2">业务线</a></span></span></p><p style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(62, 62, 62);font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2329861166598127619#wechat_redirect" textvalue="大数据" linktype="text" data-linktype="2">大数据</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2782124818895699969#wechat_redirect" textvalue="AI" linktype="text" data-linktype="2">AI</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2532608330440081409#wechat_redirect" textvalue="多媒体" linktype="text" data-linktype="2">多媒体</a></span></span></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px 0px 24px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;letter-spacing: 0.578px;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-index="0" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/300?wx_fmt=png&amp;wxfrom=19" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-origin_num="358" data-biz_account_status="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;letter-spacing: 0.578px;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-index="1" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/300?wx_fmt=png&amp;wxfrom=19" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-origin_num="22" data-biz_account_status="0" data-service_type="2" data-verify_status="2"></mp-common-profile></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="%27%27">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=e69a2a3f&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247503911%26idx%3D1%26sn%3D73d66c55e26bfe6da2c540e57ffb5ab3">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Wed, 28 Jan 2026 12:03:00 +0800</pubDate>
    </item>
    <item>
      <title>文末有礼丨2025年哔哩哔哩技术精选技术干货</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503876&amp;idx=1&amp;sn=cd7b82abbd2a676ca55cc08c8f2d9194</link>
      <description>一键收藏2025年哔哩哔哩技术最受欢迎的20篇文章！</description>
      <content:encoded><![CDATA[<p><span>陪你跨年的</span> <span>2026-01-01 12:04</span> <span style="display: inline-block;">上海</span></p>






  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=703b7176&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1BMf5Ir754Rn5ZIanr3qyL4ErgPBQVicedh07IGLEXYFMFwKVrZx8KZc2qicCYRwQPDnY2gicn9DqYFE5KxXYP8icw%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>一键收藏2025年哔哩哔哩技术最受欢迎的20篇文章！</p>
  <div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><p style="display: inline-block;box-sizing: border-box;"><span style="display: block;padding: 0.3em 0.5em;border-radius: 0.8em 0.8em 0px 0px;background-color: rgb(12, 182, 242);font-size: 14px;color: rgb(255, 255, 255);box-sizing: border-box;" title=""><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">哔哩哔哩技术</span></p></span></p><div style="border: 1px solid rgb(12, 182, 242);border-radius: 0px 0px 0.8em 0.8em;padding: 10px;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">时光匆匆，【哔哩哔哩技术】公众号又与大家携手走过了充实的一年。2025年我们共精心打造了56篇原创技术文章，全方位、多角度地剖析了各类前沿技术与实用业务应用。今天，我们特别挑选出 2025 年度广受好评的 20 篇文章，汇集成这份年度精选干货，邀您一同回顾那些闪耀着智慧光芒的技术瞬间，汲取宝贵的知识养分，激发新的灵感火花！</span></p></div></div></div><div style="text-align: center;font-size: 12px;color: rgb(159, 159, 159);padding: 0px 8px;box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">哔哩哔哩技术精彩回顾（点击标题查看）</span></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">👇 👇 👇</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span style="color: rgb(12, 182, 242);box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">01</span> </span></span><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503755&amp;idx=1&amp;sn=bd23c345d87a50bbfc833e442081843c&amp;scene=21#wechat_redirect" textvalue="B站消息新架构升级" data-itemshowtype="0" linktype="text" data-linktype="2">B站消息新架构升级</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">IM系统是一个老生常谈的话题，也是融合众多有趣技术难点的地方。当技术上数据量越大，降级概率越大，但消息业务场景上数据量大的是影响力更大的UP，业务不接受技术降级，如何破？如果消息流量增加10倍，怎么保障服务不挂？本文基于以上命题，阐述了优化一个数据密集型 &gt;&gt; 计算密集型，读多写少（首页未读数）、读少写多（会话）场景兼具的系统，同时拥有热门C端产品的稳定性、扩展性和好的业务域解耦。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span style="color: rgb(12, 182, 242);box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">02</span> </span></span><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502600&amp;idx=1&amp;sn=578792a76a85d5179cedce71702c97ae&amp;scene=21#wechat_redirect" textvalue="大会员交易系统建设" data-itemshowtype="0" linktype="text" data-linktype="2">大会员交易系统建设</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">B站大会员交易系统，基于传统电商交易系统架构上适配虚拟物品业务，采用模块化架构，涵盖交易、订单、签约、商品、营销、清结算、规则配置等核心模块，搭载支付 SDK、风控等能力，通过事务控制、分布式锁、对账、分级业务限流等保障数据与资金安全，支撑多业务高效运转，适配个性化接入需求。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span style="color: rgb(12, 182, 242);box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">03 </span></span></span><font color="#ff6695" style="box-sizing: border-box;"></font></strong><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502953&amp;idx=1&amp;sn=fe426c3e291e714f3670901c8552e4ff&amp;scene=21#wechat_redirect" textvalue="服务器故障管理实践" data-itemshowtype="0" linktype="text" data-linktype="2">服务器故障管理实践</a></span></strong></span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">服务器故障管理实践总结了B站在服务器规模快速扩展下，故障检测与维修自动化的探索。文章介绍了故障分类、传统人工管理的不足，以及自动化故障检测与维修方案，包括带内/带外信息采集、统一故障规则库、自动化任务流转和资产更新。通过自动化系统，提升了故障发现、定位和处理效率，实现了高覆盖率和准确率。未来将继续推进智能化监测和更高效的故障管理。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span style="color: rgb(12, 182, 242);box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">04</span> </span></span><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502109&amp;idx=1&amp;sn=01f3cb0332659283beec301837f962aa&amp;scene=21#wechat_redirect" textvalue="Apache Celeborn 在B站的生产实践" data-itemshowtype="0" linktype="text" data-linktype="2">Apache Celeborn 在B站的生产实践</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">B站完成 Apache Celeborn 大规模落地，替代 ESS 与 Push-based Shuffle，实现 Spark/Flink/MR 统一 Remote Shuffle 服务。构建元仓、HBO 智能路由、诊断治理、混沌测试、故障自愈等闭环运维体系，滚动升级与灰度发布零中断。Celeborn 承载 70% Shuffle 流量，单作业最大 200 T，日均 27 PB，显著降低 Fetch Fail 与重算，作业稳定性大幅提升；混部低优集群释放空闲资源，集群降本增效明显。后续将推进潮汐弹性、优先级 IO 调度、Remote Spill、Native 引擎集成及更多 Fallback 策略，持续与社区共建云原生中间数据服务新标准。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span style="color: rgb(12, 182, 242);box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">05</span> </span></span><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503622&amp;idx=1&amp;sn=0ac090fb8c352983d3c14d02e27ea3fc&amp;scene=21#wechat_redirect" textvalue="B站游戏大模型翻译实践 —— 我们如何用LLM撑起全年百万字本地化翻译任务" data-itemshowtype="0" linktype="text" data-linktype="2">B站游戏大模型翻译实践 —— 我们如何用LLM撑起全年百万字本地化翻译任务</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">B站游戏自研翻译大模型体系，专为游戏本地化场景打造，覆盖 UI、技能、剧情等多类高复杂度文本。通过 RAG 检索增强、自动术语挖掘与 LLM 质检闭环，在保障角色语气与术语一致性的同时，实现翻译效率提升 7 倍、成本降低 70%+，稳定支撑 10 语种、全年百万字级本地化交付，为游戏出海提供强有力的技术支撑。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span style="color: rgb(12, 182, 242);box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">06 </span></span></span><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502999&amp;idx=1&amp;sn=9213bf3505748c329053a5b583450a18&amp;scene=21#wechat_redirect" textvalue="B站在KMP跨平台的业务实践之路" data-itemshowtype="0" linktype="text" data-linktype="2">B站在KMP跨平台的业务实践之路</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们以一个实际业务视角，总结我们在使用 KMP 的 Share Logic 和 Share UI 两种模式在三端落地的经验与 infra 工程建设的互补，并总结了一套方便日常开发快速接入使用的框架和开发范式。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span style="color: rgb(12, 182, 242);box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">07</span> </span></span><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502139&amp;idx=1&amp;sn=9f5ebff5c16b76e9d06f7a2d5bd7f5c1&amp;scene=21#wechat_redirect" textvalue="B站搜推大规模召回系统工程实践" data-itemshowtype="0" linktype="text" data-linktype="2">B站搜推大规模召回系统工程实践</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">召回作为搜索和推荐系统的首要环节，其性能直接决定了系统效果的上限。随着B站业务快速发展，搜推召回系统面临着数据规模爆炸式增长、算法策略日益复杂、时效性要求不断提高等严峻挑战。本文从工程实践角度，详细阐述了B站如何构建一套云原生、可扩展、配置化、搜推统一的大规模召回系统。希望对读者有所启发。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span style="color: rgb(12, 182, 242);box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">08</span> </span></span><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503308&amp;idx=1&amp;sn=cd2dd7100bdd013c32657500d44a73c4&amp;scene=21#wechat_redirect" textvalue="B站是如何实现原声视频翻译的" data-itemshowtype="0" linktype="text" data-linktype="2">B站是如何实现原声视频翻译的</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">本文聚焦B站原声视频翻译的技术革新，其核心能力在于实现中文视频向多语种的“原声风格”沉浸式转化，突破传统配音的标准化局限与字幕的认知负担，完整保留原说话人音色、情绪与节奏，且达成口型与语音的自然适配。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">技术层面，以BILIBILI IndexTTS2模型为核心，通过感知一致性建模破解跨语言音色偏移、情绪迁移等痛点；依托RIVAL对抗式强化学习框架与Deep Search技术，保障翻译精准度、风格适配性及专有名词翻译质量；再经字幕消除与Diffusion模型驱动的唇形同步技术，实现音画协同。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">该技术降低了内容全球化成本，推动跨语言传播从“互通”向“共鸣”升级。未来B站将拓展语言覆盖、适配多元场景，并计划开源核心模型，助力全球内容生态构建。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span style="color: rgb(12, 182, 242);box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">09</span> </span></span><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502635&amp;idx=1&amp;sn=4970d9c282a1ef597782bfa2bbed3a83&amp;scene=21#wechat_redirect" textvalue="B站票务抢购下单流程演进" data-itemshowtype="0" linktype="text" data-linktype="2">B站票务抢购下单流程演进</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">由于近年来漫展、电影等文化产业的消费力复苏，系统频繁承载高并发抢购场景（如漫展门票）。然而，热门项目库存远低于市场需求，传统架构在高并发场景下面临性能瓶颈。如何保障系统稳定性与用户体验，成为核心挑战。本文介绍了B站票务抢购下单的演进迭代过程，从实战经验中为大家整理了一些高并发场景的应对策略。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><font color="#0cb6f2" style="box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">10 </span></span></font><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503792&amp;idx=1&amp;sn=1254ec52914112d15140a850cf692837&amp;scene=21#wechat_redirect" textvalue="B站社群AI智能分析系统的实践" data-itemshowtype="0" linktype="text" data-linktype="2">B站社群AI智能分析系统的实践</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">社群 AI 智能分析系统是一套完全由 AI 驱动和自动实时运行的用户反馈分析与决策系统。通过对社群反馈内容进行话题聚合与意图识别，引入群体共振、话题热度和情绪变化等指标，系统能够从大量碎片化发言中快速识别具有代表性和风险性的关键问题，并自动生成预警或工单，推动问题流转与处理闭环，提升社群治理、产品优化与运营决策效率。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span style="color: rgb(12, 182, 242);box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">11 </span></span></span><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502416&amp;idx=1&amp;sn=0fe22277419dd8a5f6c879470d907420&amp;scene=21#wechat_redirect" textvalue="B站自研的第二代视频连麦系统（上）" data-itemshowtype="0" linktype="text" data-linktype="2">B站自研的第二代视频连麦系统（上）</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">B站基于 WebRTC 重构了视频连麦系统，本文从客户端角度介绍第二代视频连麦系统如何使用标准 WebRTC API 以符合其设计的方式接入视频连麦业务，并为后续服务器端（选择性转发服务器，SFU）篇做铺垫。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><font color="#0cb6f2" style="box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">12</span> </span></font><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502323&amp;idx=1&amp;sn=0f0f8948f0c1d62172f3eff362c5408b&amp;scene=21#wechat_redirect" textvalue="CIKM&#39;24 : 更快的批量KV查询系统" data-itemshowtype="0" linktype="text" data-linktype="2">CIKM&#39;24 : 更快的批量KV查询系统</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">针对 B 站推荐场景中亿级用户与海量多模态特征带来的 Memory Wall 挑战，本文介绍了入选 CIKM &#39;24 的高性能分布式批量 KV 查询架构。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">本文介绍了核心自研HashTable算法 NeighborHash ，利用 Lodger Relocation（寄宿重定位）与 双向 Cacheline 感知探测，将平均内存访问次数压缩至物理极限的 1.12。结合 AMAC 异步指令流水与 SIMD 向量化加速，实现了查询吞吐的大幅提升。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">系统架构层面，采用 NVMe + io_uring 的冷热分级存储策略与强一致性版本控制协议，以极低的成本开销支撑了海量特征吞吐。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><font color="#0cb6f2" style="box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">13</span> </span></font><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503507&amp;idx=1&amp;sn=4e64c3e2481d267d1a0f8b487a22b477&amp;scene=21#wechat_redirect" textvalue="RAG在B站大会员中心数据智能平台的应用实践" data-itemshowtype="0" linktype="text" data-linktype="2">RAG在B站大会员中心数据智能平台的应用实践</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本文介绍 RAG 技术在 B 站大会员中心数据智能平台的应用，解决 LLM 生成 SQL 的幻觉问题，搭建完整技术架构，实现自然语言转精准 SQL，大幅提升数据查询效率，同时阐述现存挑战与后续优化方向。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><font color="#0cb6f2" style="box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">14</span> </span></font><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502440&amp;idx=1&amp;sn=3322ad1f4f096ed809245082fa8bf4a0&amp;scene=21#wechat_redirect" textvalue="构建可扩展的智能体系统：工程化方法与实践(一）" data-itemshowtype="0" linktype="text" data-linktype="2">构建可扩展的智能体系统：工程化方法与实践(一）</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2024年下半年写这篇文章时，我们还在小心翼翼地探索：怎么让AI不胡说八道？怎么让它记住上下文？用LangChain还是自己写？每个选择都像在黑暗中摸索。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">一年过去，这些&#34;小众研究&#34;已经变成了入门教程。Agent开发从少数人的实验，变成了大规模的工程实践。技术迭代快得让人眩晕，但回头看，当时那些看似笨拙的尝试——比如用多重验证对抗幻觉、用模块化应对不确定性——反而成了今天仍然适用的底层逻辑。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">AI的进化速度可以很快，但工程的本质问题不会变。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><font color="#0cb6f2" style="box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">15</span> </span></font><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503578&amp;idx=1&amp;sn=817c3ba757f9f91dbbe70977f567983d&amp;scene=21#wechat_redirect" textvalue="VibeCut - 智能剪辑探索与实现" data-itemshowtype="0" linktype="text" data-linktype="2">VibeCut - 智能剪辑探索与实现</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">视频剪辑长期面临专业软件门槛高与模板工具创意受限的“两难”困境，如何填补全手动与全自动之间的鸿沟成为行业难题。本文基于WebCut平台，深入探索并实现了一款智能剪辑体——VibeCut。该系统采用创新的计划者-执行者(Orchestrator-Executor)双智能体架构，通过引入结构化的共享上下文(Shared Context)作为唯一事实源，有效解决了传统多智能体协作中的上下文丢失与错误累积问题，实现了任务规划与工具执行的解耦。在原型实践中，VibeCut利用LLM与MCP协议，成功通过了字幕调整、语义裁切及图文成片等场景考验，为下一代人机协同的智能内容创作工具提供了兼具效率与稳定性的范式。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><font color="#0cb6f2" style="box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">16</span> </span></font><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502230&amp;idx=1&amp;sn=76feb6f4717cedf7c7fc1aaaf16d619d&amp;scene=21#wechat_redirect" textvalue="新活动平台建设历程与架构演进" data-itemshowtype="0" linktype="text" data-linktype="2">新活动平台建设历程与架构演进</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">B站用户技术中心的活动平台是连接运营效率、用户体验和活动业务的重要基础设施。活动团队历时两年对活动平台进行了一次系统级重构，打造出了一套更现代、更高效、更智能的活动工业化生产体系。改版后，活动搭建耗时和配置问题显著减少，复杂玩法可以更低成本落地，页面性能和用户体验同步提升。本文详细阐述了整个重构过程中的设计理念、建设规划和架构思考，以及活动团队是如何解决不同阶段面临的挑战，希望能对你有点帮助～</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span style="color: rgb(12, 182, 242);box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">17 </span></span></span><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503399&amp;idx=1&amp;sn=486abeda98f6d2faf2150b006ff6b94b&amp;scene=21#wechat_redirect" textvalue="为什么我的 TLS 1.3 多了一个 RTT" data-itemshowtype="0" linktype="text" data-linktype="2">为什么我的 TLS 1.3 多了一个 RTT</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本文从一次非预期的 TSL 1.3 握手时延问题入手，通过细致的抓包分析，探究 TCP 协议细节，发现了 Nagle 算法在现代网络环境下对时延敏感应用的影响，并成功优化了握手时间。不仅提升了用户体验，也让我们对不同层级网络协议的真实交互逻辑有了更深入的理解。希望能对大家有所助益。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span style="color: rgb(12, 182, 242);box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">18</span> </span></span><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503093&amp;idx=1&amp;sn=aa6d0bb23c2525f9f345e6d02ec21739&amp;scene=21#wechat_redirect" textvalue="前端物料库的设计" data-itemshowtype="0" linktype="text" data-linktype="2">前端物料库的设计</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">随着公司前端业务快速发展，原有 cnpm 系统在物料管理、搜索和文档支持方面日显不足。本文介绍了如何基于 Nexus3 构建全新的前端物料平台，实现 npm 包、UMD 组件和 SVG 图标的统一管理。通过建立四维分类体系（终端、框架、领域、功能）提升物料可发现性，并引入外部文档嵌入、产物在线预览及 Cosmos2 示例沙盒等创新功能，有效解决了&#34;找组件难、查文档难&#34;的痛点，为前端物料标准化治理奠定了基础。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span style="color: rgb(12, 182, 242);box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">19</span> </span></span><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503693&amp;idx=1&amp;sn=3d65c30c986bc3c51f2f924b1ea5f158&amp;scene=21#wechat_redirect" textvalue="B站基础安全在AI溯源方向的探索实践" data-itemshowtype="0" linktype="text" data-linktype="2">B站基础安全在AI溯源方向的探索实践</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本文分享了B站基础安全团队在AI辅助告警溯源方面的探索实践。随着安全告警运营从人工查证演进到SOAR阶段,团队借助AI技术和MCP协议,将HIDS、蜜罐、EDR等安全产品的API转化为AI可调用的工具集,构建了&#34;告警产生-研判降噪-机器人推送-AI溯源&#34;的完整链路。通过蜜罐、HIDS、EDR三类真实告警案例,展示了AI自动关联堡垒机日志、资产信息、用户部门等多源数据,完成从事件追踪到责任主体定位的全链路溯源能力。显著提升了安全运营效率,实现了&#34;人机协同+自动化溯源&#34;的落地。</span></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span style="color: rgb(12, 182, 242);box-sizing: border-box;"><span leaf=""><span textstyle="" style="color: rgb(255, 102, 149);">20</span> </span></span><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503025&amp;idx=1&amp;sn=f4517a23d23b938279b57a640f5fe864&amp;scene=21#wechat_redirect" textvalue="从拥塞控制算法热交换到内核错误修复" data-itemshowtype="0" linktype="text" data-linktype="2">从拥塞控制算法热交换到内核错误修复</a></span></span></strong></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">最近在哔哩哔哩，我们开发了一种改进的 BBR 拥塞控制算法，需要在真实环境中进行测试。该算法本身以内核模块的形式存在，因此将其安装到服务器上不是问题。然而，在快节奏的迭代过程中，我们遇到了一系列问题，最终发现了一个内核错误。本文将带您了解我们解决问题的整个过程，从拥塞控制算法热交换到内核错误修复。</span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">福利时刻</span></b></p></div></div></div><div style="text-align: center;padding: 0px 8px;font-size: 12px;box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">以上就是2025年【哔哩哔哩技术】年度精选干货！</span></p><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">有没有哪篇在技术道路上给了你新启发？</span></strong></span></p><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">或者有任何建议&amp;意见、未来想看到的内容，都欢迎留言告诉我们。</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">转发本文至朋友圈并留言，即可参与</span><strong style="box-sizing: border-box;"><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;"><span leaf="">下方抽奖</span></span></strong><strong style="box-sizing: border-box;"><span leaf="">⬇️</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">小编将抽取</span><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4位</span></strong></span><span leaf="">幸运的小伙伴获取</span><span style="text-decoration: underline;"><strong style="box-sizing: border-box;"><span leaf="">蛇来运转系列小电视毛绒挂件</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">抽奖截止时间：1月5日12:00</span></strong></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(180, 176, 176);box-sizing: border-box;"><span leaf="">如果喜欢本期内容的话，欢迎点个“在看”吧！</span></span></p></div><p nodeleaf=""><mp-common-miniprogram class="js_uneditable custom_select_card mp_miniprogram_iframe" data-pluginname="insertminiprogram" data-miniprogram-path="pages/lucky/lottery/detail?id=8Px9QYB35TU" data-miniprogram-nickname="抽奖助手" data-miniprogram-avatar="http://mmbiz.qpic.cn/mmbiz_png/Vdys2e8jP1l1clbflznHYO7IRflCZWjPfD4NMn1Xqgr5gZbBy1qVc12cGVG1whLTXiafBT7kiaWRl38HCbqLnRzw/640?wx_fmt=png&amp;wxfrom=200" data-miniprogram-title="蛇来运转系列小电视毛绒挂件*4" data-miniprogram-imageurl="http://mmbiz.qpic.cn/mmbiz_jpg/1BMf5Ir754Rn5ZIanr3qyL4ErgPBQVicekFdiaHPLcmtYlvoXiaurmV78PU4fH1MVaaHGPU6gt3YOa7BpHpqkYasw/0?wx_fmt=jpeg" data-miniprogram-type="card" data-miniprogram-servicetype="0" data-miniprogram-appid="wx01bb1ef166cd3f4e" data-miniprogram-applink="#小程序://抽奖/tKMg3B5gckNLwPB" data-miniprogram-imageurlback="http%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754Rn5ZIanr3qyL4ErgPBQVice0upmLFYDuJudzg67icc5EVySEEv6fB1N6DvYwgPiaKz6IpvdSbu9Yhlg%2F0%3Fwx_fmt%3Dpng" data-miniprogram-cropperinfo="%7B%22c%22%3A%7B%22x%22%3A0%2C%22y%22%3A25%2C%22x2%22%3A245%2C%22y2%22%3A221%2C%22w%22%3A245%2C%22h%22%3A196%7D%7D"></mp-common-miniprogram></p><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/0?wx_fmt=png" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="%27%27">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=77106e0f&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247503876%26idx%3D1%26sn%3Dcd7b82abbd2a676ca55cc08c8f2d9194">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 01 Jan 2026 12:04:00 +0800</pubDate>
    </item>
    <item>
      <title>SABER: 模式切换的混合思考模型训练范式</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503851&amp;idx=1&amp;sn=0a88fac52a526d6367a1487dd6a78292</link>
      <description>bilibili Index-llm Team提出 SABER，一种让大模型具备可切换、可控、并受 token 预算约束的推理能力的强化学习框架。</description>
      <content:encoded><![CDATA[<p>原创 <span>AI</span> <span>2025-12-19 12:01</span> <span style="display: inline-block;">上海</span></p>




  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=4ae1f942&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1BMf5Ir754TvqSibic7Sk351aHiakMM6jFplStm8q9ftNXQQo9HfHpiaZaWNRdEJloniczrYQyUOoKQ1bydHB9xcSTA%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>bilibili Index-llm Team提出 SABER，一种让大模型具备可切换、可控、并受 token 预算约束的推理能力的强化学习框架。</p>
  <div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一、概述</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">通过链式思考增强的大语言模型在复杂任务上已取得显著的性能提升，但在将这种推理方式无差别地应用于所有问题时，常常面临推理开销过大、响应延迟偏高等现实瓶颈。为解决这一矛盾，bilibili Index-llm Team提出 SABER（Switchable and Balanced Training for Efficient LLM Reasoning），一种让大模型具备可切换、可控、并受 token 预算约束的推理能力的强化学习框架。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">SABER 首先对基座模型在每个训练样本中的推理长度进行统计，将样本划分到不同的预算层级。在随后的微调过程中，模型在系统提示词和混合奖励的引导下，学习如何在给定预算内完成推理。同时，我们额外加入一部分无思考训练数据，确保模型在关闭显式推理时依然能够稳定作答。SABER 支持四种离散推理模式：NoThink、FastThink、CoreThink、DeepThink，能够在推理深度与推理延迟之间灵活调节。我们在数学推理、代码生成和逻辑推理等复杂任务上进行了系统实验。结果显示：SABER 在限制 token 预算下依然保持高精度推理结果，具备平滑退化特性，并在跨模型规模与跨任务场景中展现出良好的泛化能力。特别是在 MATH 任务上，SABER-FastThink 将推理长度减少了 65.4%，并相较基座模型提升了 3.6% 的精度，展现出显著的效率与性能优势。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">该论文已被AAAI 2026收录，链接：</span><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);"><em style="box-sizing: border-box;"><span leaf=""><a href="https://arxiv.org/abs/2508.10026" target="_blank">https://arxiv.org/abs/2508.10026</a></span></em></span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">二、背景</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">近年来，大语言模型在复杂推理任务上的表现取得了显著进步，这主要得益于它们在显式、逐步的思考能力上的增强。诸如思维链提示（Chain-of-Thought）和推理时扩展（Test-Time Compute Scaling）等方法，使模型能够在给出最终答案前，将问题拆解为一系列中间步骤，从而提升推理的可靠性和准确性。这类策略已在多类任务中展现出了卓越的效果。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">然而，这种方法也带来了一些新的挑战。首先，推理轨迹往往过长，导致推理成本和响应延迟显著增加。更重要的是，模型通常会在所有输入上机械地采用相同的深度推理流程，而不考虑任务本身的复杂度或用户的偏好。这种推理深度与任务需求的不匹配，引出了一个越来越受到关注的问题：过度思考（overthinking）。在这一现象中，大语言模型即便面对极其简单的问题，也会生成冗长、复杂且不必要的推理内容。例如，对于“1 + 1 等于几？”这样的简单问题，一些模型可能仍会给出多步推理、列举无关的推导过程，其 token 消耗远超直接回答。这不仅拖慢响应速度，也显著提高推理的计算成本，从而限制了模型在真实场景中的部署效率。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">尽管已有工作尝试通过指令微调、长度约束、奖励重塑等方式来压缩输出，但这些方法多依赖静态规则或任务无关的启发式机制，既无法根据问题难度动态调节推理长度，也无法真正让用户掌控模型的推理深度。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">三、方法</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.1 思考长度统计与预算划分</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">思考预算（thinking budget）的设计是 SABER 的核心。若所有样本采用统一预算，简单任务不会受到长度约束，难题则会持续受罚并导致性能崩塌。为此，SABER 对每个样本单独校准预算：先运行基础模型，统计&lt;think&gt;和&lt;/think&gt;之间的推理 token 数量，再依据分布将样本划分为三个难度档：128（简单）、4096（中等）和 16384（困难）。难度越高，所允许的推理长度越宽松；超过 16384 的样本不设上限。同时在系统提示词中显式告知该样本的推理上限，从而让模型在训练中学习不同推理模式之间的切换。图1展示了不同思考模式的系统提示词。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020192" class="rich_pages wxw-img" data-ratio="0.7926357" data-s="300,640" data-type="png" data-w="1032" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=95a11bed&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TvqSibic7Sk351aHiakMM6jFpP9XfDEibTVznDddgicoEG4y7epgKw4OhiagclBfvjcL1ZwnIUwvg2ZDmw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图1 不同思考模式的系统提示词</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这种分级缩放策略既保证了大量样本能产生有效的长度惩罚，加速模式切换的学习，又能尊重任务本身的推理需求，使训练过程更稳定。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.2 样本分组与稳定性控制</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">直接对所有样本一开始就施加强长度惩罚会导致训练不稳定，因此 SABER 采用两项稳定化机制：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">（1）基于准确率的样本分组</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们测量基础模型对训练集的回答情况，对其无法正确回答的约 40% 样本，其中一半保持原预算、另一半不设预算上限，使其推理过程不受惩罚。只有基础模型能答对的 60% 样本才会被降级预算。该策略减少了模型早期因频繁切换推理模式而带来的不稳定性。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">（2）推理长度比例约束</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">为了避免模型为了减少惩罚而故意生成过短的推理轨迹，我们要求生成的思考 token 数必须在基础模型长度的区间内：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 80%;height: auto;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020194" class="rich_pages wxw-img" data-ratio="0.1611111" data-s="300,640" data-type="png" data-w="1080" style="vertical-align:middle;max-width:100%;width:307px;box-sizing:border-box;height:49px;" src="https://wechat2rss.xlab.app/img-proxy/?k=07462cc1&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TvqSibic7Sk351aHiakMM6jFpzmfquiauwPcJIC9b55wSIFFdCy0U2cViaSEVnRG6JCvzV1yh6h8KbXrA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">防止出现因过度压缩推理导致的reward hacking现象。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.3 无思考模式构造</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在应用场景中，用户可能希望直接获得答案而无需推理过程。然而长推理模型若直接关闭思考通常会导致显著性能下降。因此 SABER 显式在训练集中加入部分 no-think 样本，通过构造极短的占位思维块来告诉模型跳过推理直接作答。即使少量数据，也能显著增强模型在无推理模式下的稳定性与表现。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.4 无需SFT预热的直接RL优化</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">与许多需要先进行 SFT 的方法不同，SABER 的构造天然与模型行为一致，因此可直接用强化学习进行训练，无需额外的 SFT 热身阶段，使训练更简单高效。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">模型采用 GRPO 进行优化，其奖励由四部分组成：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">格式奖励：推理与答案必须使用 &lt;think&gt;...&lt;/think&gt; 标记的结构化格式；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">答案奖励：数学任务检查 boxed{} 内容，代码任务通过运行测试；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">长度惩罚：超过预算则扣分；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">比例惩罚：推理长度若偏离基础模型过多则扣分，防止reward hacking。</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">综合优化后，模型能够实现对推理深度的精确控制，在长推理、短推理及无推理场景中均保持稳定的高质量回答。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020193" class="rich_pages wxw-img" data-ratio="0.4157407" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=bd56b37d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TvqSibic7Sk351aHiakMM6jFpITkbQRqwr3icHC7MWAWTRXZ5I6NBeEFUbem3KSlLl3z92iayV5T3a6JA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图2 SABER框架</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">图2总结了SABER的整体框架。上半部分展示了数据预处理流程，我们通过基座模型的推理结果估计每个样本所需的思考预算，并据此将训练数据划分为简单、中等和困难三类。下半部分展示了强化学习阶段的训练机制，模型在不同推理模式对应的提示词引导下生成回答，随后依据格式规范性、答案准确性以及推理长度与预算的匹配程度等多维奖励信号进行综合评估与更新，从而实现更高效、更可控的推理行为。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">四、实验</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们在实验阶段系统评估了 SABER 框架的有效性，围绕四个核心研究问题展开：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">（1）SABER 在数学推理与代码生成任务上相较现有方法是否具备优势？</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">（2）SABER 是否能推广到更大规模的模型，以及泛化到未见过的推理领域？</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">（3）SABER 的关键设计组件各自的重要性如何？</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">（4）SABER 的可切换推理模式之间呈现出怎样的行为差异？</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">为回答上述问题，我们首先介绍实验设置，包括使用的数据集、对比基线与训练数据构成。随后展示 SABER 在 1.5B 模型规模上的核心结果，覆盖数学推理（MATH / GSM8K）与代码生成（MBPP）任务；接着进一步在 7B 模型上复现相同训练流程，评估其跨规模、跨领域的泛化能力，并在 LiveBench-Reasoning 逻辑推理任务上验证模式切换机制的迁移能力。我们也通过逐项删减关键组件的消融实验，分析 SABER 各模块的贡献。最后，我们选取具体案例，比较 FastThink、CoreThink 和 DeepThink 三种推理模式的行为差异，展示不同思考深度下的推理风格与答案准确性表现。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.1 与基线的比较（RQ1）</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020195" class="rich_pages wxw-img" data-ratio="0.3574074" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=8f2e737a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TvqSibic7Sk351aHiakMM6jFpibySZtNjVuhOGMibaI9EOxbicIHRiahGiaoah9sAyhRHhWRJAqggUUiaPmlw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在 1.5B 模型规模下，SABER 的各模式均优于基座模型。</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">FastThink 在保证准确率提升的同时，使推理长度下降 70%+，实现极高的效率；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">CoreThink 在精简推理的基础上进一步提升了整体准确率；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">DeepThink 在维持较高推理完整性的同时仍显著压缩生成长度，并取得最高准确率。</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">对比 L1 和 SelfBudgeter，SABER 在更小训练量（2K vs. 30K）下获得更好的准确率—效率折中，并展现更稳定的推理行为学习能力。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.2 跨规模与跨领域泛化（RQ2）</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020196" class="rich_pages wxw-img" data-ratio="0.2944444" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=70efd75e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TvqSibic7Sk351aHiakMM6jFpckr3yv6xrvPPuaHSycMibJzc9ZFJFa6ZMxz9w3owGqiaKDcpzzb609Kg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在应用于 7B 模型时，SABER 仍保持良好的推理压缩能力与准确率增益：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">FastThink 在保持较高精度的前提下减少超过 80% 的推理长度；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">DeepThink 同时实现较大幅度的压缩与轻微的准确率提升。</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">更重要的是，尽管训练数据仅包含数学和代码样本，但 SABER 的推理模式切换机制成功迁移到了逻辑推理任务（LiveBench-R），显示出跨领域的泛化能力。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.3 消融实验（RQ3）</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020197" class="rich_pages wxw-img" data-ratio="0.6194444" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=ca962604&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TvqSibic7Sk351aHiakMM6jFpD9KpJejic96E08FRzYgjiaEGVjOibYlTSicqXfTWBR2ThaGOZIz7kkSCyw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们对 SABER 的核心设计逐项去除并测试其影响，包括预算降级策略、NoThink 示例比例、样本准确率过滤等。实验表明：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">移除预算降级会显著削弱短推理模式的学习能力，使模型难以适应不同推理深度；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">减少或删除 NoThink 数据会导致无推理模式性能明显下降，且不会带来其他模式的收益；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">移除准确率过滤会引入监督噪声，使训练不稳定。</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这些结果说明，SABER 的各子模块均是稳定学习推理模式的必要组成部分。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.4 推理模式行为分析（RQ4）</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020198" class="rich_pages wxw-img" data-ratio="0.5537037" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=aefe4cf6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TvqSibic7Sk351aHiakMM6jFpPl1L4sibticKNLCNsUKUZ9lv0ibLqf60alDWbaw61LR8RWgRics7vYFWvA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">通过 MATH500 的示例可见，各模式都会遵循核心解题步骤，但推理深度有所区分：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">FastThink 仅包含关键步骤，最为简洁直接；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">CoreThink 会加入额外的反思与局部解释，推理更完整；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">DeepThink 则在得出答案后进一步展开自校验与总结，展现更深入、更具反思性的推理风格。</span></p></li></ul></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">五、总结</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在本研究中，我们提出了一种模式切换的混合思考模型训练范式SABER，使大语言模型能够在多种推理模式下实现高效、可控的思考过程。SABER 通过结构化奖励、离散化推理模式设计，以及类似课程学习的预算分配策略，在无需额外监督微调的前提下，依然能够保持稳定的训练过程与灵活的推理行为。实验结果表明，SABER 在数学推理、代码生成与逻辑推理等多类任务中都展现了良好的泛化能力，并能在不同的计算预算下保持稳健性能。同时，我们验证了 SABER 能够在同一模型中自然地支持开关思考两种模式，且关思考模式的性能退化很少。总体来看，这些结果说明 SABER 为构建可控、高效率且高性价比的大模型推理机制提供了一个具有前景的方向。</span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨Index LLM Team</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">开发者问答</span></b></p></div></div></div><div style="text-align: center;padding: 0px 8px;font-size: 12px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">SABER将于2026年1月24日在新加坡Expo进行Poster展示，现场还会发放SABER精美无料，欢迎大家来一起交流！</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">转发本文至朋友圈并留言，即可参与</span><strong style="box-sizing: border-box;"><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;"><span leaf="">下方抽奖</span></span></strong><span style=""><strong style="box-sizing: border-box;"><span leaf="">⬇️</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">小编将抽取1位幸运的小伙伴获取</span><span style="text-decoration: underline;"><strong style="box-sizing: border-box;"><span leaf="">龙年小电视鼠标垫键盘垫</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">抽奖截止时间：12月26日12:00</span></strong></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(180, 176, 176);box-sizing: border-box;"><span leaf="">如果喜欢本期内容的话，欢迎点个“在看”吧！</span></span></p><p nodeleaf=""><mp-common-miniprogram class="js_uneditable custom_select_card mp_miniprogram_iframe" data-pluginname="insertminiprogram" data-miniprogram-path="pages/lucky/lottery/detail?id=8PbDrmissCN" data-miniprogram-nickname="抽奖助手" data-miniprogram-avatar="http://mmbiz.qpic.cn/mmbiz_png/Vdys2e8jP1l1clbflznHYO7IRflCZWjPfD4NMn1Xqgr5gZbBy1qVc12cGVG1whLTXiafBT7kiaWRl38HCbqLnRzw/640?wx_fmt=png&amp;wxfrom=200" data-miniprogram-title="星星向龙系列卡套包" data-miniprogram-imageurl="http://mmbiz.qpic.cn/mmbiz_jpg/1BMf5Ir754TvqSibic7Sk351aHiakMM6jFpCSwBSFuj4rKCQdlaEhPG0xDjI2JSc2okriahrbGKg6AJezHGNMJI2rQ/0?wx_fmt=jpeg" data-miniprogram-type="card" data-miniprogram-servicetype="0" data-miniprogram-appid="wx01bb1ef166cd3f4e" data-miniprogram-applink="#小程序://抽奖/91PsdzwWHJrF9Mq" data-miniprogram-imageurlback="http%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TvqSibic7Sk351aHiakMM6jFpMDESjQ5damuNBBkRvW1yg9n2BFTfJme6Jc094vktI9MGjUoCejicK9g%2F0%3Fwx_fmt%3Dpng" data-miniprogram-cropperinfo="%7B%22c%22%3A%7B%22x%22%3A0%2C%22y%22%3A30%2C%22x2%22%3A245%2C%22y2%22%3A226%2C%22w%22%3A245%2C%22h%22%3A196%7D%7D"></mp-common-miniprogram></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">往期精彩指路</span></b></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><p style="text-align: justify;padding: 0px 8px;font-size: 13px;width: 100%;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 40px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247487748&amp;idx=1&amp;sn=c9cbcacf3bba25b478abf2a0f5c0e75f&amp;scene=21#wechat_redirect" textvalue="全链路压测改造之全链自动化测试实践" data-itemshowtype="0" linktype="text" data-linktype="2">全链路压测改造之全链自动化测试实践</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247493174&amp;idx=1&amp;sn=648bf0ffb5e31b1c211d22e636e2c3df&amp;scene=21#wechat_redirect" textvalue="哔哩哔哩⼤数据建设之路—实时DQC篇" data-itemshowtype="0" linktype="text" data-linktype="2">哔哩哔哩⼤数据建设之路—实时DQC篇</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247491092&amp;idx=1&amp;sn=b09492563c760775ed61f75db1bd5822&amp;scene=21#wechat_redirect" textvalue="Apache Kyuubi 在B站大数据场景下的应用实践" data-itemshowtype="0" linktype="text" data-linktype="2">Apache Kyuubi 在B站大数据场景下的应用实践</a></span></p></li></ul></p></div></div><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);visibility: visible;"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);visibility: visible;"><p data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(62, 62, 62);font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3289447926347317252#wechat_redirect" textvalue="通用工程" linktype="text" data-linktype="2">通用工程</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2390333109742534656#wechat_redirect" textvalue="大前端" linktype="text" data-linktype="2">大前端</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3297757408550699008#wechat_redirect" textvalue="业务线" linktype="text" data-linktype="2">业务线</a></span></span></p><p style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(62, 62, 62);font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2329861166598127619#wechat_redirect" textvalue="大数据" linktype="text" data-linktype="2">大数据</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2782124818895699969#wechat_redirect" textvalue="AI" linktype="text" data-linktype="2">AI</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2532608330440081409#wechat_redirect" textvalue="多媒体" linktype="text" data-linktype="2">多媒体</a></span></span></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px 0px 24px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;letter-spacing: 0.578px;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-index="0" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/300?wx_fmt=png&amp;wxfrom=19" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-origin_num="357" data-biz_account_status="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;letter-spacing: 0.578px;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-index="1" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/300?wx_fmt=png&amp;wxfrom=19" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-origin_num="22" data-biz_account_status="0" data-service_type="2" data-verify_status="2"></mp-common-profile></p></div></div></div></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="2247503851">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=d22546c8&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247503851%26idx%3D1%26sn%3D0a88fac52a526d6367a1487dd6a78292">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 19 Dec 2025 12:01:00 +0800</pubDate>
    </item>
    <item>
      <title>从JS云函数到MCP：打造跨平台AI Agent工具的工程实践</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503836&amp;idx=1&amp;sn=d84b2e1c6ce9330751cd4d58b3ec32ef</link>
      <description>构建 AI 工具生态这件事上，过去一年B站做了不少尝试。</description>
      <content:encoded><![CDATA[<p>原创 <span>AI</span> <span>2025-12-12 12:01</span> <span style="display: inline-block;">上海</span></p>




  
  <p><img src="https://wechat2rss.xlab.app/img-proxy/?k=c4da79f7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1BMf5Ir754QPhZ0Q0TUDiafK0upmgic9Kiaa5vURw5RKTzqcduLzKLsO5pI2bxySmH01q32X8tTxZxZJj9Jo1meOA%2F0%3Fwx_fmt%3Djpeg"/></p>
  <p>构建 AI 工具生态这件事上，过去一年B站做了不少尝试。</p>
  <div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">构建 AI 工具生态这件事上，过去一年我们做了不少尝试。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">回头看，会觉得这条路径像是在搭建一条越来越清晰的“能力生产线”：</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">从写 JS → Agent Tool 工具 → 成为 MCP 工具 → 成为跨平台 Agent 能力。</span></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这篇文章我们就按这条演进路线，把底层逻辑、踩坑经验和最终的工程方案完整讲清楚。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一、先做简单介绍</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们做了一个“在线 JS 云函数平台”，它的本质是：把写一个 JS 函数，变成给 AI 赋予一个 Tool 新能力。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这套系统经历了三个阶段：</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1.  第一版：</span></strong><span leaf="">只是 Flowise 里的一个 LangChain StructuredTool 扩展，能在工作流里被 Agent 调用。</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Flowise</span></strong><span leaf="">（</span><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);"><em style="box-sizing: border-box;"><span leaf=""><a href="https://flowiseai.com/" target="_blank">https://flowiseai.com/</a></span></em></span><span leaf="">） 是一款开源、可视化的 AI 工作流工具，通过拖拽节点即可构建 LLM 应用或 Agent。它底层基于 LangChain 的 TypeScript 版本，因此天然具备模型调用、工具调用、链式处理、记忆与向量检索等能力。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">当时我们在技术选型时使用 Flowise 做AI工作流平台有两个原因：</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">一是它基于 LangChain 的 TypeScript 版本——在早期 AI 框架还不成熟时，这是少数原生支持 TS 的方案；二是它提供了可拖拽的可视化工作流，能让我们快速搭建和验证 AI 原型。</span></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2.  第二版：</span></strong><span leaf="">演进为一个浏览器里的 云函数 IDE：在线写代码、调试、沙箱运行时、连内网 gRPC/HTTP/MySQL。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.  现在：</span></strong><span leaf="">接上 MCP 协议，变成一个可以被「任何支持 MCP 的 Agent / Studio」跨平台调用的独立工具平台，并支持 SSE + Streamable HTTP 两种流式协议。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">二、为什么我们需要“AI 工具能力层”？</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在我们内部构建 AI 应用（客服、直播运营助手等）时，遇到几个非常典型的痛点。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1. 工具很多，但每接一次 AI，</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">都要重写一遍工具</span></strong></p></div></div></div><p style="padding: 0px 8px;box-sizing: border-box;"><ul style="list-style-type: disc;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">想让 AI 查开播状态、查卡顿、查稿件、给用户发通知……</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">后端能力其实都有，但每接一个新智能体，就要：</span></p></li></ul><ul style="list-style-type: circle;margin-left: 16px;margin-right: 16px;" class="list-paddingleft-1"><li><p style="word-break: break-all;margin-top: 0px;margin-bottom: 15px;padding: 0px;box-sizing: border-box;"><span leaf="">在某个项目里再写一遍调用代码</span></p></li><li><p style="word-break: break-all;margin-top: 0px;margin-bottom: 15px;padding: 0px;box-sizing: border-box;"><span leaf="">手动写结构化参数 / 返回值</span></p></li><li><p style="word-break: break-all;margin-top: 0px;margin-bottom: 15px;padding: 0px;box-sizing: border-box;"><span leaf="">校验、鉴权</span></p></li></ul><ul style="list-style-type: disc;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">每个团队都重新写一遍</span></p></li></ul></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2. AI 需要的是“能力”，而不是“接口”</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">业务接口往往是这样的：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="nginx"><code><span leaf=""><span class="code-snippet__attribute">GET</span> /room/<span class="code-snippet__literal">info</span>?roomid=<span class="code-snippet__number">123</span></span></code></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">但是用户却会说：“查一下imzerooo开播状态”</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这中间的自然语言 → 参数的语义映射，很难靠简单规则完成。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">如果让开发者直接暴露接口，AI 是很难用好的。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3. JSON 不是 AI 友好的输入格式</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">内网接口通常返回一大坨 JSON。LLM 解析 JSON 没问题，但：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">字段多、嵌套深 → 容易丢字段</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">字段名杂乱 → 模型记不住</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">文本内容多 → 容易产生幻觉</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">AI 友好的格式是：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">Markdown 表格</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">简洁的自然语言</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">提炼过的信息</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">而不是整包 JSON。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4. 工具没有做成“资产层”</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">以前的工具要么：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">绑死在某个 AI 工作流上</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">埋在某个项目里</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">放在某个业务脚本中</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">无法像资产一样复用。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">所以一切问题的核心其实是：</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">缺少一个可以写工具、管理工具、发布工具、复用工具的统一能力层。</span></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">而我们做的，就是让这件事：</span><strong style="box-sizing: border-box;"><span leaf="">只需写一段 JS 函数</span></strong><span leaf="">。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">三、第一版：StructuredTool </span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">—— </span></strong><strong style="box-sizing: border-box;"><span leaf="">工具能力的萌芽</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">最初我们是在 Flowise 里写 StructuredTool 组件。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020174" class="rich_pages wxw-img" data-ratio="0.625" data-s="300,640" data-type="png" data-w="880" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=f4d45a91&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754QPhZ0Q0TUDiafK0upmgic9KiayEiaApdkbLfHvpMeUaevnbDIKloSN6PiaxpQsqMeOU68j9IcahlP4IRg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">Flowise 底层基于 LangChain，所以我们写了很多 StructuredTool：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="javascript"><code><span leaf="">exportclassQueryLiveRoomToolextendsStructuredTool {</span></code><br/><code><span leaf="">  name = <span class="code-snippet__string">&#39;QueryLiveRoomTool&#39;</span></span></code><br/><code><span leaf="">  description = <span class="code-snippet__string">&#39;根据 uid 查询主播信息&#39;</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  schema = z.<span class="code-snippet__title">object</span>({</span></code><br/><code><span leaf="">    <span class="code-snippet__attr">roomid</span>: z.<span class="code-snippet__title">string</span>().<span class="code-snippet__title">describe</span>(<span class="code-snippet__string">&#39;直播间id&#39;</span>)</span></code><br/><code><span leaf="">  })</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">async</span> <span class="code-snippet__title">_call</span>(<span class="code-snippet__params">{ roomid }</span>) {</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">const</span> res = <span class="code-snippet__keyword">await</span> axios.<span class="code-snippet__title">post</span>({...})</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">return</span> <span class="code-snippet__title">formatForAI</span>(res)</span></code><br/><code><span leaf="">  }</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这一版有几个优点：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">工具能被 Agent 调用</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">参数有 schema</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">有一定的模块化</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">但有几个局限：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">工具生命周期跟 Flowise 项目绑死</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">要写 TS、写 Node 项目，对效率很不友好</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">无法跨平台使用</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">JSON 处理还是要自己写</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">无法注入通用能力（如内网 SDK）</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">于是我们开始考虑平台化。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">四、第二版：在线 JS 云函数平台（NodeVM 运行时）</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们打造了一套全新的平台：在线 JS 云函数平台。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">开发者不需要知道 Flowise、LangChain，也不用开</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">Node 项目。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020173" class="rich_pages wxw-img" data-ratio="1.2584071" data-s="300,640" data-type="png" data-w="565" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=37a14cce&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754QPhZ0Q0TUDiafK0upmgic9KiazlLdD5uM3ia38ib1nZFJhqza9ZsYIe2LHSDL4holgGjZ5uKp9Ic4ibUEg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.1 NodeVM：一个安全可控的 JS 执行沙箱</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们基于 vm2（NodeVM）做了一个“可控的 JS 执行环境”。</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">运行时基于 StructureTool</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">NodeVM 作为安全隔离的执行环境</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">自动注入企业内部能力（统一上下文能力层）</span></p></li></ul></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="javascript"><code><span leaf=""><span class="code-snippet__comment">/**</span></span></code><br/><code><span leaf=""> * 核心思路抽象版</span></code><br/><code><span leaf=""> */</span></code><br/><code><span leaf=""><span class="code-snippet__keyword">import</span> { <span class="code-snippet__title">NodeVM</span> } <span class="code-snippet__keyword">from</span> <span class="code-snippet__string">&#39;vm2&#39;</span></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">import</span> { <span class="code-snippet__title">StructuredTool</span> } <span class="code-snippet__keyword">from</span> <span class="code-snippet__string">&#39;@langchain/core/tools&#39;</span></span></code><br/><code><span leaf=""><span class="code-snippet__comment">//...</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">classDynamicToolextendsStructuredTool {</span></code><br/><code><span leaf="">  <span class="code-snippet__title">constructor</span>(<span class="code-snippet__params">{ name, description, schema, code }</span>) {</span></code><br/><code><span leaf="">    <span class="code-snippet__variable">super</span>({ name, description, schema })</span></code><br/><code><span leaf="">    <span class="code-snippet__variable">this</span>.<span class="code-snippet__property">code</span> = code <span class="code-snippet__comment">// 用户在在线编辑器里写的 JS 代码</span></span></code><br/><code><span leaf="">  }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">async</span> <span class="code-snippet__title">_call</span>(<span class="code-snippet__params">args, runManager, flowContext</span>) {</span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 1. 构建沙箱（所有注入能力都放在这里）</span></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">const</span> sandbox = {</span></code><br/><code><span leaf="">      <span class="code-snippet__comment">// 用户传入的参数转成 $xxx</span></span></code><br/><code><span leaf="">      ...<span class="code-snippet__title">Object</span>.<span class="code-snippet__title">fromEntries</span>(<span class="code-snippet__title">Object</span>.<span class="code-snippet__title">entries</span>(args).<span class="code-snippet__title">map</span>(<span class="code-snippet__function">(</span><span class="code-snippet__function"><span class="code-snippet__params">[k, v]</span></span><span class="code-snippet__function">) =&gt;</span> [<span class="code-snippet__string">`$</span><span class="code-snippet__string"><span class="code-snippet__subst">${k}</span></span><span class="code-snippet__string">`</span>, v])),</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">      <span class="code-snippet__comment">// 内部上下文（cookie/env/session）</span></span></code><br/><code><span leaf="">      <span class="code-snippet__attr">$flow</span>: flowContext,</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">$cookie</span>: flowContext.<span class="code-snippet__property">cookie</span>,</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">      <span class="code-snippet__comment">// 内网能力封装（gRPC/HTTP）</span></span></code><br/><code><span leaf="">      <span class="code-snippet__attr">$yuumi</span>: yuumi,</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">      <span class="code-snippet__comment">// 结果转换工具（用于把 JSON 转成更 AI 友好的 Markdown 表格）</span></span></code><br/><code><span leaf="">      <span class="code-snippet__attr">$json2MarkdownTable</span>: json2MarkdownTable,</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">      <span class="code-snippet__comment">// 内部 AI 模型</span></span></code><br/><code><span leaf="">      <span class="code-snippet__attr">$biliLLM</span>: biliLLMClient</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 2. 构建 NodeVM 沙箱</span></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">const</span> vm = <span class="code-snippet__keyword">new</span> <span class="code-snippet__title">NodeVM</span>({</span></code><br/><code><span leaf="">      sandbox,</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">console</span>: <span class="code-snippet__string">&#34;inherit&#34;</span>,</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">require</span>: {</span></code><br/><code><span leaf="">        <span class="code-snippet__attr">builtin</span>: allowedBuiltinDeps,</span></code><br/><code><span leaf="">        <span class="code-snippet__attr">external</span>: allowedExternalDeps</span></code><br/><code><span leaf="">      }</span></code><br/><code><span leaf="">    })</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 3. 执行开发者写的云函数代码</span></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">return</span> <span class="code-snippet__keyword">await</span> vm.<span class="code-snippet__title">run</span>(</span></code><br/><code><span leaf="">      <span class="code-snippet__string">`module.exports = async () =&gt; { </span><span class="code-snippet__string"><span class="code-snippet__subst">${</span></span><span class="code-snippet__string"><span class="code-snippet__subst"><span class="code-snippet__variable">this</span></span></span><span class="code-snippet__string"><span class="code-snippet__subst">.code}</span></span><span class="code-snippet__string"> }()`</span>,</span></code><br/><code><span leaf="">      __dirname</span></code><br/><code><span leaf="">    )</span></code><br/><code><span leaf="">  }</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">它既能隔离风险，又能注入能力：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">禁止访问文件系统</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">禁止随意 require</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">只开放白名单依赖</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">内置 $yuumi（内网 gRPC/HTTP 调用）</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">内置 $json2MarkdownTable</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">内置 $cookie</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">内置 $flow（上下文）</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">内置 内部 AI 能力</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">于是开发者传入的业务代码类似这样：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="php"><code><span leaf=""><span class="code-snippet__keyword">const</span> <span class="code-snippet__variable">res </span>= await <span class="code-snippet__variable">$yuumi</span>.<span class="code-snippet__title">grpc</span>({</span></code><br/><code><span leaf=""><span class="code-snippet__attr">  appId</span>: <span class="code-snippet__string">&#39;live.service&#39;</span>,</span></code><br/><code><span leaf=""><span class="code-snippet__attr">  path</span>: <span class="code-snippet__string">&#39;/room/info&#39;</span>,</span></code><br/><code><span leaf=""><span class="code-snippet__attr">  params</span>: {<span class="code-snippet__attr"> roomid</span>: <span class="code-snippet__variable">$roomid </span>},</span></code><br/><code><span leaf=""><span class="code-snippet__attr">  cookie</span>: <span class="code-snippet__variable">$cookie</span>,</span></code><br/><code><span leaf="">})</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf=""><span class="code-snippet__keyword">return</span> <span class="code-snippet__variable">$json2MarkdownTable</span>(res.data.<span class="code-snippet__keyword">list</span>)</span></code><br/></pre></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.2 在线调试：monaco-editor </span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">+ Mock </span></strong><strong style="box-sizing: border-box;"><span leaf="">+ 沙箱日志</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">编辑器底层用的是 microsoft/monaco-editor，好处是：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">TypeScript / JS 语法高亮</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">可以做一些简单的智能提示</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">UI 很像 VSCode，大家上手成本低</span></p></li></ul></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020180" class="rich_pages wxw-img" data-ratio="0.4657407" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=03f4f738&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754QPhZ0Q0TUDiafK0upmgic9Kia4alKy5Rg2t3Jkm8UCFv6zUvNCbHvAdKTjxj8wodhd8M8zwHwKyxzSg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">调试方面：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">提供了一个 参数 Mock 面板：可以填入调用时的 JSON</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">点击「运行」，平台会在沙箱里跑一遍你的函数，把：日志打印（console.log）、返回字符串、可能的异常，全都展示出来</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">每次保存，我们都会生成一个版本：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">当前编辑的是“草稿”</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">发布的时候会把某个版本标记为发布</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">出现问题可以一键回滚到上一版</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">最后，开发者只需要在编辑器里写一个 “普通 JS 函数”，但：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">安全隔离由 NodeVM 负责</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">内网调用靠 $yuumi</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">会话靠 $cookie</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">AI 友好的结果格式靠 $json2MarkdownTable</span></p></li></ul></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.3 Tool Arguments：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">为 AI 帮开发者“定义接口”</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">传统开发写接口参数：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="cs"><code><span leaf="">roomid: <span class="code-snippet__built_in">string</span></span></code></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">为此，我们提供了转为 Tool Arguments 的可视化配置：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020179" class="rich_pages wxw-img" data-ratio="0.2361111" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=a15be827&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754QPhZ0Q0TUDiafK0upmgic9KiayaXGKWnLicu6ty45rgiaWQiajHMEy3wUeibUf0YPzicUPCt2PImlZyUBz8A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">它会统一生成：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">MCP Tool 的 JSON Schema</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">StructuredTool 的 Zod Schema</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">NodeVM 内 $roomid 变量</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">一次配置，全平台复用。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">4.4 工具市场：企业内部的 Agent 工具仓库</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020175" class="rich_pages wxw-img" data-ratio="0.3601852" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=e3ed7de6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754QPhZ0Q0TUDiafK0upmgic9KiaQM9JxjyhBzlfgtyaOIIMQG3xwIH1oZibyETTQnR4hFQuW5kfXBRhRkQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们提供了工具市场：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">各部门把工具上架</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">其他部门直接复用</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">工具行为一致，调用方式一致</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">避免重复开发</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">工具从“项目资产”变成“企业能力”。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">五、第三版：接入 MCP </span></strong><strong style="box-sizing: border-box;"><span leaf="">—— </span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">让工具跨平台、跨模型、跨框架</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">做到第二版时，工具已经变得很好用了。但还缺一块：</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">同一份工具定义，既能在 Flowise 里当 LangChain StructuredTool 用，又能在 MCP 里变成跨平台 ToolCall。</span></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">5.1 MCP 是什么？以及一个常见误区</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">MCP 全称 Model Context Protocol，可以简单理解为：</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">给“大模型 + 工具调用”定义了一个“统一插线板”</span></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">它解决的是：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">大模型想调用一个外部工具</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">这个工具可能跑在本机、另一台服务器、甚至另一个团队的系统里</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们希望“调用方式”是统一、可描述、可流式的。</span></p></li></ul></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">5.2 一个常见误区：把旧接口一包就行了？</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">很多人第一反应是：</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">那我把现在的业务 HTTP 接口包成一个 MCP 工具，不就行了吗？</span></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">理论上可以，实践里有两个坑：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">1.  自然语言 ≠ 接口参数</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">用户会说：“查一下未完成的任务”。但你的接口长这样：/tasks?status=1&amp;owner_id=xxx。中间这层 “自然语言 → status=1” 的映射，需要：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">prompt / few-shot</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">枚举表 / 映射关系</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">甚至分类模型。</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">所以我们在 Tool Arguments 设置时一定要尽量贴近自然语言，比如 status 描述写成“任务的进度状态（未开始/进行中/已完成）”，而不是“1/2/3”。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">2.  JSON 返回 ≠ AI 可读</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">很多内部接口返回一大坨嵌套 JSON，LLM 虽然能解析，但：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">容易“漏看”字段；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">回答会很啰嗦或不稳定。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">所以我们在云函数层统一规定：</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">返回给 AI 的一定是“人类可读”的文本/Markdown，</span></strong><span leaf="">JSON 只是中间态。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这就是前面 $json2MarkdownTable 那段代码存在的原因。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">5.3 StructuredTool → MCP：</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">我们是怎么做“代理层”的？</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">前面说了两件事：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">工具在平台内部用 LangChain StructuredTool + NodeVM 来执行</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">我们希望同一份工具定义，既能在 Flowise 里用，也能被任意支持 MCP 的 Agent / Studio 调用</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">createMCPServer：Express 里的一层 MCP 网关</span></strong></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在服务端，我们做了一层很薄的 MCP 网关，挂在 Express 应用上：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="javascript"><code><span leaf=""><span class="code-snippet__keyword">export</span> <span class="code-snippet__keyword">function</span> <span class="code-snippet__title">createMCPServer</span>(<span class="code-snippet__params">{ app, AppDataSource }: App</span>){</span></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 单个云函数 → MCP-StreamableHTTP</span></span></code><br/><code><span leaf="">  app.<span class="code-snippet__title">post</span>(<span class="code-snippet__string">&#39;/api/mcp/function-tool/:toolId&#39;</span>, singleToolCreateStreamableHTTPServer)</span></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 多个云函数组合 → MCP-StreamableHTTP</span></span></code><br/><code><span leaf="">  app.<span class="code-snippet__title">post</span>(<span class="code-snippet__string">&#39;/api/mcp/:mcpId&#39;</span>, multipleToolCreateStreamableHTTPServer)</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__comment">// 会话后续请求复用</span></span></code><br/><code><span leaf="">  app.<span class="code-snippet__title">get</span>(<span class="code-snippet__string">&#39;/api/mcp/function-tool/:id&#39;</span>, handleSessionRequest)</span></code><br/><code><span leaf="">  app.<span class="code-snippet__title">delete</span>(<span class="code-snippet__string">&#39;/api/mcp/function-tool/:id&#39;</span>, handleSessionRequest)</span></code><br/><code><span leaf="">  app.<span class="code-snippet__title">get</span>(<span class="code-snippet__string">&#39;/api/mcp/:mcpId&#39;</span>, handleSessionRequest)</span></code><br/><code><span leaf="">  app.<span class="code-snippet__title">delete</span>(<span class="code-snippet__string">&#39;/api/mcp/:mcpId&#39;</span>, handleSessionRequest)</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">const</span> transports = {</span></code><br/><code><span leaf="">    <span class="code-snippet__attr">streamable</span>: {} <span class="code-snippet__keyword">as</span> <span class="code-snippet__title">Record</span>&lt;string, <span class="code-snippet__title">StreamableHTTPServerTransport</span>&gt;</span></code><br/><code><span leaf="">  }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__comment">// ... 省略 SSE 相关 ...</span></span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">对外就是几条 HTTP 路由；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">对内维护一个 streamable 的 transport 池，用 sessionId 作为 key。</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这样，不同 AI Studio / Agent 只要知道某个 URL，就可以把它当 MCP 端点来用。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">Streamable HTTP：用 session 管住一条“长连接”</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">StreamableHTTPServerTransport 是 MCP 官方 SDK 提供的一个传输实现，用来做 Streamable HTTP 模式。我们做的事情有两种情况：</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">客户端第一次初始化（没有 sessionId）；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">之后所有请求都带上 mcp-session-id 头，复用之前的 session。</span></p></li></ol><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">核心代码大概是这样：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="javascript"><code><span leaf=""><span class="code-snippet__keyword">async</span> <span class="code-snippet__keyword">function</span> <span class="code-snippet__title">createStreamableHTTP</span>(<span class="code-snippet__params">config: CreateMcpServerConfig</span>){</span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">const</span> { req, res, username } = config</span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">const</span> sessionId = req.<span class="code-snippet__property">headers</span>[<span class="code-snippet__string">&#39;mcp-session-id&#39;</span>] <span class="code-snippet__keyword">as</span> string | <span class="code-snippet__literal">undefined</span></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">let</span> <span class="code-snippet__attr">transport</span>: <span class="code-snippet__title">StreamableHTTPServerTransport</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">if</span> (sessionId &amp;&amp; transports.<span class="code-snippet__property">streamable</span>[sessionId]) {</span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// ① 有 sessionId，复用之前的 transport</span></span></code><br/><code><span leaf="">    transport = transports.<span class="code-snippet__property">streamable</span>[sessionId]</span></code><br/><code><span leaf="">  } <span class="code-snippet__title">elseif</span> (!sessionId &amp;&amp; <span class="code-snippet__title">isInitializeRequest</span>(req.<span class="code-snippet__property">body</span>)) {</span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// ② 首次初始化，请求体符合 MCP 初始化格式</span></span></code><br/><code><span leaf="">    transport = <span class="code-snippet__keyword">new</span> <span class="code-snippet__title">StreamableHTTPServerTransport</span>({</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">sessionIdGenerator</span>: <span class="code-snippet__function">() =&gt;</span> <span class="code-snippet__title">randomUUID</span>(),</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">onsessioninitialized</span>: <span class="code-snippet__function">(</span><span class="code-snippet__function"><span class="code-snippet__params">sessionId</span></span><span class="code-snippet__function">) =&gt;</span> {</span></code><br/><code><span leaf="">        transports.<span class="code-snippet__property">streamable</span>[sessionId] = transport</span></code><br/><code><span leaf="">      }</span></code><br/><code><span leaf="">    })</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 连接关闭时清理掉这个 session</span></span></code><br/><code><span leaf="">    transport.<span class="code-snippet__property">onclose</span> = <span class="code-snippet__function">() =&gt;</span> {</span></code><br/><code><span leaf="">      <span class="code-snippet__keyword">if</span> (transport.<span class="code-snippet__property">sessionId</span>) {</span></code><br/><code><span leaf="">        <span class="code-snippet__keyword">delete</span> transports.<span class="code-snippet__property">streamable</span>[transport.<span class="code-snippet__property">sessionId</span>]</span></code><br/><code><span leaf="">        opsLogger.<span class="code-snippet__title">info</span>(<span class="code-snippet__string">`[Streamable] 删除sessionId: username=</span><span class="code-snippet__string"><span class="code-snippet__subst">${username}</span></span><span class="code-snippet__string"> sessionId=</span><span class="code-snippet__string"><span class="code-snippet__subst">${transport.sessionId}</span></span><span class="code-snippet__string">`</span>)</span></code><br/><code><span leaf="">      }</span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">const</span> server = <span class="code-snippet__title">buildMcpServer</span>({</span></code><br/><code><span leaf="">      ...config,</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">transport</span>: <span class="code-snippet__string">&#39;streamable-http&#39;</span></span></code><br/><code><span leaf="">    })</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">await</span> server.<span class="code-snippet__title">connect</span>(transport)</span></code><br/><code><span leaf="">  } <span class="code-snippet__keyword">else</span> {</span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 既不是初始化，又没有合法 sessionId：直接返回错误</span></span></code><br/><code><span leaf="">    res.<span class="code-snippet__title">status</span>(<span class="code-snippet__number">400</span>).<span class="code-snippet__title">json</span>({</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">jsonrpc</span>: <span class="code-snippet__string">&#39;2.0&#39;</span>,</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">error</span>: {</span></code><br/><code><span leaf="">        <span class="code-snippet__attr">code</span>: -<span class="code-snippet__number">32000</span>,</span></code><br/><code><span leaf="">        <span class="code-snippet__attr">message</span>: <span class="code-snippet__string">&#39;Bad Request: No valid session ID provided&#39;</span></span></code><br/><code><span leaf="">      },</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">id</span>: <span class="code-snippet__literal">null</span></span></code><br/><code><span leaf="">    })</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">return</span></span></code><br/><code><span leaf="">  }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">await</span> transport.<span class="code-snippet__title">handleRequest</span>(req, res, req.<span class="code-snippet__property">body</span>)</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">配合一个统一的会话请求入口：</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="javascript"><code><span leaf=""><span class="code-snippet__keyword">async</span> <span class="code-snippet__keyword">function</span> <span class="code-snippet__title">handleSessionRequest</span>(<span class="code-snippet__params">req: Request, res: Response</span>){</span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">const</span> sessionId = req.<span class="code-snippet__property">headers</span>[<span class="code-snippet__string">&#39;mcp-session-id&#39;</span>] <span class="code-snippet__keyword">as</span> string | <span class="code-snippet__literal">undefined</span></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">if</span> (!sessionId || !transports.<span class="code-snippet__property">streamable</span>[sessionId]) {</span></code><br/><code><span leaf="">    res.<span class="code-snippet__title">status</span>(<span class="code-snippet__number">400</span>).<span class="code-snippet__title">send</span>(<span class="code-snippet__string">&#39;Invalid or missing session ID&#39;</span>)</span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">return</span></span></code><br/><code><span leaf="">  }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">const</span> transport = transports.<span class="code-snippet__property">streamable</span>[sessionId]</span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">await</span> transport.<span class="code-snippet__title">handleRequest</span>(req, res)</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这样实现的好处是：客户端只需要记住一个 mcp-session-id，之后所有请求都可以复用同一条 Streamable HTTP 会话。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">buildMcpServer：真正把“工具注册到 MCP 协议”</span></strong></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">首先，用户可以将云函数平台创建的智能体工具代理到MCP协议上，一个MCP可以关联多个工具</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020181" class="rich_pages wxw-img" data-ratio="1.4003623" data-s="300,640" data-type="png" data-w="552" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=6828c56e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754QPhZ0Q0TUDiafK0upmgic9KiaNvGicwO7iatZc54WSiaDxH2Al5UIrMvbZH3oOCcEtPDsvia72WK7VvnQTQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">接下来是最关键的一步：用官方 McpServer 把 Tool Registry 里的工具挂成 MCP Tool。</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="typescript"><code><span leaf=""><span class="code-snippet__keyword">function</span> <span class="code-snippet__title">buildMcpServer</span>(<span class="code-snippet__params"><span class="code-snippet__attr">config</span></span><span class="code-snippet__params">: </span><span class="code-snippet__params"><span class="code-snippet__title">BuildMcpServerConfig</span></span>): <span class="code-snippet__title">McpServer</span> {</span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">const</span> { name, tools, cookie, env, id, <span class="code-snippet__keyword">type</span>, username, transport } = config</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">const</span> server = <span class="code-snippet__keyword">new</span> <span class="code-snippet__title">McpServer</span>({</span></code><br/><code><span leaf="">    name,</span></code><br/><code><span leaf="">    <span class="code-snippet__attr">version</span>: <span class="code-snippet__string">&#39;1.0.0&#39;</span></span></code><br/><code><span leaf="">  })</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">for</span> (<span class="code-snippet__keyword">const</span> tool <span class="code-snippet__keyword">of</span> tools) {</span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 1）把数据库里的元信息，转成 DynamicStructuredTool 入参</span></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">const</span> obj = {</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">name</span>: tool.<span class="code-snippet__property">name</span>,</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">description</span>: tool.<span class="code-snippet__property">description</span>,</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">schema</span>: z.<span class="code-snippet__title">object</span>(<span class="code-snippet__title">convertSchemaToZod</span>(tool.<span class="code-snippet__property">schema</span> <span class="code-snippet__keyword">as</span> <span class="code-snippet__built_in">string</span> | <span class="code-snippet__built_in">object</span>)),</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">code</span>: tool.<span class="code-snippet__property">func</span> <span class="code-snippet__keyword">as</span> <span class="code-snippet__built_in">string</span></span></code><br/><code><span leaf="">    }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// DynamicStructuredTool 内部就是一个“动态 StructuredTool” + NodeVM 沙箱</span></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">const</span> dynamicStructuredTool = <span class="code-snippet__keyword">new</span> <span class="code-snippet__title">DynamicStructuredTool</span>(obj)</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// Flow 信息：cookie + env（来自 MCP URL 上的 sign / 其它 query）</span></span></code><br/><code><span leaf="">    dynamicStructuredTool.<span class="code-snippet__title">setFlowObject</span>({</span></code><br/><code><span leaf="">      cookie,</span></code><br/><code><span leaf="">      <span class="code-snippet__attr">env</span>: <span class="code-snippet__keyword">typeof</span> env === <span class="code-snippet__string">&#39;object&#39;</span> &amp;&amp; <span class="code-snippet__title">Object</span>.<span class="code-snippet__title">keys</span>(env).<span class="code-snippet__property">length</span> ? env : {}</span></code><br/><code><span leaf="">    })</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 2）把我们在 UI 里配置的 Tool Arguments schema，转成 MCP 需要的 zod 参数定义</span></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">const</span> schemaParser = (tool.<span class="code-snippet__property">schema</span> ? <span class="code-snippet__title">JSON</span>.<span class="code-snippet__title">parse</span>(tool.<span class="code-snippet__property">schema</span>) : []) <span class="code-snippet__keyword">as</span> <span class="code-snippet__title">Schema</span>[]</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__keyword">const</span> paramsSchema = schemaParser.<span class="code-snippet__title">reduce</span>(<span class="code-snippet__function">(</span><span class="code-snippet__function"><span class="code-snippet__params">res, cur</span></span><span class="code-snippet__function">) =&gt;</span> {</span></code><br/><code><span leaf="">      <span class="code-snippet__keyword">if</span> (cur.<span class="code-snippet__property">required</span>) {</span></code><br/><code><span leaf="">        res[cur.<span class="code-snippet__property">property</span>] = z[cur.<span class="code-snippet__property">type</span>]({ <span class="code-snippet__attr">required_error</span>: <span class="code-snippet__string">`</span><span class="code-snippet__string"><span class="code-snippet__subst">${cur.property}</span></span><span class="code-snippet__string"> required`</span> })</span></code><br/><code><span leaf="">          .<span class="code-snippet__title">describe</span>(cur.<span class="code-snippet__property">description</span>) <span class="code-snippet__keyword">as</span> z.<span class="code-snippet__property">ZodTypeAny</span></span></code><br/><code><span leaf="">      } <span class="code-snippet__keyword">else</span> {</span></code><br/><code><span leaf="">        res[cur.<span class="code-snippet__property">property</span>] = z[cur.<span class="code-snippet__property">type</span>]()</span></code><br/><code><span leaf="">          .<span class="code-snippet__title">describe</span>(cur.<span class="code-snippet__property">description</span>)</span></code><br/><code><span leaf="">          .<span class="code-snippet__title">optional</span>() <span class="code-snippet__keyword">as</span> z.<span class="code-snippet__property">ZodTypeAny</span></span></code><br/><code><span leaf="">      }</span></code><br/><code><span leaf="">      <span class="code-snippet__keyword">return</span> res</span></code><br/><code><span leaf="">    }, {} <span class="code-snippet__keyword">as</span> <span class="code-snippet__built_in">any</span>)</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">    <span class="code-snippet__comment">// 3）用官方 server.tool() 方法注册 MCP Tool</span></span></code><br/><code><span leaf="">    server.<span class="code-snippet__title">tool</span>(tool.<span class="code-snippet__property">name</span>, tool.<span class="code-snippet__property">description</span>, paramsSchema, <span class="code-snippet__title">async</span> (args, _extra) =&gt; {</span></code><br/><code><span leaf="">      <span class="code-snippet__comment">// 注意：这里的 call() 对应的就是 LangChain StructuredTool._call()</span></span></code><br/><code><span leaf="">      <span class="code-snippet__keyword">const</span> runnerResult = <span class="code-snippet__keyword">await</span> dynamicStructuredTool.<span class="code-snippet__title">call</span>({</span></code><br/><code><span leaf="">        ...args</span></code><br/><code><span leaf="">      })</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">      <span class="code-snippet__comment">// 线上环境做一层使用上报（方便统计谁在用哪个 MCP）</span></span></code><br/><code><span leaf="">      <span class="code-snippet__keyword">if</span> (process.<span class="code-snippet__property">env</span>.<span class="code-snippet__property">DEPLOY_ENV</span> === <span class="code-snippet__string">&#39;prod&#39;</span>) {</span></code><br/><code><span leaf="">        <span class="code-snippet__title">reportMcpUse</span>({</span></code><br/><code><span leaf="">          id,</span></code><br/><code><span leaf="">          <span class="code-snippet__keyword">type</span>,</span></code><br/><code><span leaf="">          name,</span></code><br/><code><span leaf="">          username,</span></code><br/><code><span leaf="">          transport</span></code><br/><code><span leaf="">        })</span></code><br/><code><span leaf="">      }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">      <span class="code-snippet__comment">// MCP 协议统一的返回格式：content[] 数组</span></span></code><br/><code><span leaf="">      <span class="code-snippet__keyword">return</span> {</span></code><br/><code><span leaf="">        <span class="code-snippet__attr">content</span>: [{ <span class="code-snippet__attr">type</span>: <span class="code-snippet__string">&#39;text&#39;</span>, <span class="code-snippet__attr">text</span>: runnerResult }]</span></code><br/><code><span leaf="">      }</span></code><br/><code><span leaf="">    })</span></code><br/><code><span leaf="">  }</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">  <span class="code-snippet__keyword">return</span> server</span></code><br/><code><span leaf="">}</span></code><br/></pre></p><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">把Tool Registry 里的：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">name</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">description</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">schema（以数组 JSON 形式存）</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">func（在线编辑器里的 JS 代码）</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">按 MCP 需要的格式做了一层映射：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">输入 → paramsSchema（zod 校验）</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">执行 → dynamicStructuredTool.call()</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">输出 → MCP 标准的 content[{ type: &#39;text&#39;, text: ... }]</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">StructuredTool 内部：从 MCP 入参到 NodeVM 执行的最后一步</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">DynamicStructuredTool.call() 里面最终会走到 _call()，这一步就是前面介绍的 NodeVM 沙箱执行：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">把 MCP 传进来的参数变成 $xxx 变量</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">把 cookie / env、以及会话信息塞进 $flow</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">注入 $yuumi、$json2MarkdownTable、$biliIndex、$deepseek、$chatgpt 等能力</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">在受限依赖白名单下创建 NodeVM</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">以 module.exports = async function() { ${this.code} }() 的形式执行开发者写的 JS</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">对于上层 MCP 调用方来说：</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">调用了一个名字叫 QueryLiveRoomInfo 的 MCP 工具，传了一些参数，收到了一个文本/Markdown 结果</span></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">而对于我们平台来说，这中间其实已经执行了一整套：</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">MCP → McpServer.tool → DynamicStructuredTool → NodeVM → 内网服务的完整链路。</span></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">可复用可共享的MCP市场</span></strong></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020183" class="rich_pages wxw-img" data-ratio="0.3805556" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=ee2b0c51&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754QPhZ0Q0TUDiafK0upmgic9KiaUZMHzsmshiaStDmM7FfarKjVKupg8BZSA3bASmllPib1dGU25V32FdyQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">对于 MCP 新手，我们在平台上还提供了“MCP 市场” 的入口，里面还提供了一键调试：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">不需要真的连上一个大模型</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">直接在浏览器里模拟一次 MCP ToolCall</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">看看云函数有没有跑对、返回是不是 AI 友好的格式</span></p></li></ul></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020182" class="rich_pages wxw-img" data-ratio="0.5416667" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=bcb0f44b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754QPhZ0Q0TUDiafK0upmgic9KiaYrxb2NyKX1OpcsXBnSbjb3f3GLzIED8voITGkftlGJopmrrQiaSZ4YA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">六、身份鉴权：MCP 是独立服务，</span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">安全必须先想清楚</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">MCP 本质上是一个“跨平台的服务访问入口”，如果不做鉴权，很容易变成无法管理。我们的做法大致是这样：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  注册阶段就要带 sign：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">每个 MCP 工具的注册地址必须带一个 sign 参数</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">sign 是基于内网规范签出的签名</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">没有合法签名，工具不会被注册成功</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  调用阶段统一 Proxy：</span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">外部 Agent 调用 MCP Server</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">MCP Server 把调用转发给云函数平台的 Proxy 层</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">Proxy 层会：</span></p></li></ul><ul style="list-style-type: circle;margin-left: 16px;margin-right: 16px;" class="list-paddingleft-1"><li><p style="word-break: break-all;margin-top: 0px;margin-bottom: 15px;padding: 0px;box-sizing: border-box;"><span leaf="">校验 sign</span></p></li><li><p style="word-break: break-all;margin-top: 0px;margin-bottom: 15px;padding: 0px;box-sizing: border-box;"><span leaf="">注入对应的 $cookie / 会话</span></p></li><li><p style="word-break: break-all;margin-top: 0px;margin-bottom: 15px;padding: 0px;box-sizing: border-box;"><span leaf="">再去调真正的内网业务接口</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">3.  业务侧拿到的是“处理后的内网协议”：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">Proxy 会把 sign 解密、校验后，以内部统一格式透传给业务</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">避免在业务里掺杂各种外部协议细节</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这样，MCP 既可以对外暴露统一的工具接口，又仍然受控在内网的安全体系内</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020184" class="rich_pages wxw-img" data-ratio="2.1245136" data-s="300,640" data-type="png" data-w="771" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=33468f9b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754QPhZ0Q0TUDiafK0upmgic9KiaSqqXic8lYBmtuQCSlIgD7z2tPzTtKF35tujAV2kEWiadoFIHu6T2uAug%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">七、结语：把“接 AI”变成“写一个云函数”</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">从 AI工作流 → StructuredTool → 云函数平台 → MCP 的这条路径，我们最终得到了：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">一个统一的工具定义方式：元信息</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">一个统一的执行方式：NodeVM</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">一个统一的调用协议：MCP</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">一个统一的共享方式：工具市场</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">一个统一的安全体系：sign + cookie</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">也让我们真正做到了：</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">让业务同学不再关心“怎么接 AI”，而是只需要关心“我能给 AI 提供什么能力”。</span></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">把写一个 JS 函数，变成给 AI 加一个新能力。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">未来我们还会继续提升运行时性能、正确性评估观测、深度研究等方向，把工具能力建设得更现代、更企业级。</span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨Zerooo、Gengar</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">开发者问答</span></b></p></div></div></div><div style="text-align: center;padding: 0px 8px;font-size: 12px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">在你们团队做 AI 应用时，最困扰你的一件事是什么？</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">欢迎在留言区分享你的经历~</span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">转发本文至朋友圈并留言，即可参与</span><strong style="box-sizing: border-box;"><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;"><span leaf="">下方抽奖</span></span></strong><span style=""><strong style="box-sizing: border-box;"><span leaf="">⬇️</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">小编将抽取1位幸运的小伙伴获取</span><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;"><strong style="box-sizing: border-box;"><span leaf="">星星向龙系列卡套包</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">抽奖截止时间：12月19日12:00</span></strong></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(180, 176, 176);box-sizing: border-box;"><span leaf="">如果喜欢本期内容的话，欢迎点个“在看”吧！</span></span></p><p nodeleaf=""><mp-common-miniprogram class="js_uneditable custom_select_card mp_miniprogram_iframe" data-pluginname="insertminiprogram" data-miniprogram-path="pages/lucky/lottery/detail?id=8P06YXIXohO" data-miniprogram-nickname="抽奖助手" data-miniprogram-avatar="http://mmbiz.qpic.cn/mmbiz_png/Vdys2e8jP1l1clbflznHYO7IRflCZWjPfD4NMn1Xqgr5gZbBy1qVc12cGVG1whLTXiafBT7kiaWRl38HCbqLnRzw/640?wx_fmt=png&amp;wxfrom=200" data-miniprogram-title="星星向龙系列卡套包" data-miniprogram-imageurl="http://mmbiz.qpic.cn/mmbiz_jpg/1BMf5Ir754QPhZ0Q0TUDiafK0upmgic9KiaQjGu1NdiaB2h1WdeicZGFkPV2LtiaJr2nGeqXgvicROWyX3J2b3zrDM3Vg/0?wx_fmt=jpeg" data-miniprogram-type="card" data-miniprogram-servicetype="0" data-miniprogram-appid="wx01bb1ef166cd3f4e" data-miniprogram-applink="#小程序://抽奖/UpF0O2YYuy7HBhK" data-miniprogram-imageurlback="http%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754QPhZ0Q0TUDiafK0upmgic9Kian8DOA5ldLTex0LQia1WRPfCaGS3LZe7Qzzh0kJWZV0opunEI64QLicPQ%2F0%3Fwx_fmt%3Dpng" data-miniprogram-cropperinfo="%7B%22c%22%3A%7B%22x%22%3A0%2C%22y%22%3A25%2C%22x2%22%3A245%2C%22y2%22%3A221%2C%22w%22%3A245%2C%22h%22%3A196%7D%7D"></mp-common-miniprogram></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">往期精彩指路</span></b></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><p style="text-align: justify;padding: 0px 8px;font-size: 13px;width: 100%;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 40px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503792&amp;idx=1&amp;sn=1254ec52914112d15140a850cf692837&amp;scene=21#wechat_redirect" textvalue="B站社群AI智能分析系统的实践" data-itemshowtype="0" linktype="text" data-linktype="2">B站社群AI智能分析系统的实践</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247499358&amp;idx=1&amp;sn=468d7be1a6ccd13a7905beec48664e36&amp;scene=21#wechat_redirect" textvalue="面向AI应用开发实战分享 - 基础篇" data-itemshowtype="0" linktype="text" data-linktype="2">面向AI应用开发实战分享 - 基础篇</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502050&amp;idx=1&amp;sn=401c110c768f8adc52e873245fd46fd4&amp;scene=21#wechat_redirect" textvalue="B站AI计算网络建设实践" data-itemshowtype="0" linktype="text" data-linktype="2">B站AI计算网络建设实践</a></span></p></li></ul></p></div></div><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);"><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);visibility: visible;"><p data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(62, 62, 62);font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3289447926347317252#wechat_redirect" textvalue="通用工程" linktype="text" data-linktype="2">通用工程</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2390333109742534656#wechat_redirect" textvalue="大前端" linktype="text" data-linktype="2">大前端</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3297757408550699008#wechat_redirect" textvalue="业务线" linktype="text" data-linktype="2">业务线</a></span></span></p><p style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(62, 62, 62);font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2329861166598127619#wechat_redirect" textvalue="大数据" linktype="text" data-linktype="2">大数据</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2782124818895699969#wechat_redirect" textvalue="AI" linktype="text" data-linktype="2">AI</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2532608330440081409#wechat_redirect" textvalue="多媒体" linktype="text" data-linktype="2">多媒体</a></span></span></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px 0px 24px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;letter-spacing: 0.578px;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-index="0" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/300?wx_fmt=png&amp;wxfrom=19" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-origin_num="356" data-biz_account_status="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;letter-spacing: 0.578px;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-index="1" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/300?wx_fmt=png&amp;wxfrom=19" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-origin_num="22" data-biz_account_status="0" data-service_type="2" data-verify_status="2"></mp-common-profile></p></div></div></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="2247503836">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=c0cd161d&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247503836%26idx%3D1%26sn%3Dd84b2e1c6ce9330751cd4d58b3ec32ef">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 12 Dec 2025 12:01:00 +0800</pubDate>
    </item>
    <item>
      <title>B站社群AI智能分析系统的实践</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503792&amp;idx=1&amp;sn=1254ec52914112d15140a850cf692837</link>
      <description>AI 让我们从“人工盯岗”进入“主动洞察”时代。</description>
      <content:encoded><![CDATA[<p>
原创 <span>AI</span> <span>2025-11-28 12:01</span> <span style="display: inline-block;">上海</span>
</p>




<p><img src="https://wechat2rss.xlab.app/img-proxy/?k=5f74422b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1BMf5Ir754TVtb1gJIpwkrp4q6pffBddz1AMKMiblGr7XDzG74qNHicAKw48glTQQKg44apnUYNrK1uDwe5OA8iag%2F0%3Fwx_fmt%3Djpeg"/></p>

<p>AI 让我们从“人工盯岗”进入“主动洞察”时代。</p>

<div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一、为什么我们需要一套能“读懂群聊”的 AI？</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在 B 站，我们运营团队需要管理着数量庞大的UP主交流群，如：品类扶持、成长训练营、专项交流、答疑沟通群等。覆盖许许多多的创作者，每天会产生大量的消息。如果完全依赖人工逐条统计，不仅效率低下，而且容易遗漏关键问题。早期运营尝试过简单的关键字分析和人工汇总的方式，但这种传统方案存在明显局限：只能捕捉预先设定的词汇，无法理解上下文和隐含含义，对新出现的话题无法及时捕获。同时人工整理出的反馈多为自由文本，缺乏结构化信息，难以及时深入分析。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">于是我们做了一件事：</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">让 AI 自动阅读社群会话内容</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">理解创作者的真实声音</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">并生成结构化洞察、预警、日报、周报。</span></p></li></ul></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">二、整体架构：一套由 LLM 驱动的社群 “AI 中台”</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">整个系统的生命周期可以分为 四层：</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">数据采集层 → AI 结构化层 → 群体分析层 → 运营洞察层</span></strong></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020134" class="rich_pages wxw-img" data-ratio="0.187963" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=39d50b66&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TVtb1gJIpwkrp4q6pffBddA6eYV30w6gs6lCeC69aCEJ1nSLtoamwJZvW9icmBzX5niazOjDhRj3tQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在大量真实业务场景中落地群聊智能分析，我们不仅构建了由多个大模型驱动的 Agent Pipeline，更形成了一套 可治理、可复用、可演化的 Prompt Engineering 与语义分析架构。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">系统的关键点如下：</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""><span textstyle="" style="font-size: 17px;">1.分层 Prompt Engineering 体系：</span></span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""><span textstyle="" style="font-size: 17px;">高召回 × 高精度的协同设计</span></span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们将整条 LLM 链路拆分为四层 Prompt：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  信息挖掘层</span></p><ul style="list-style-type: disc;margin-left: 16px;margin-right: 16px;" class="list-paddingleft-1"><li><p style="word-break: break-all;margin-top: 0px;margin-bottom: 15px;padding: 0px;box-sizing: border-box;"><span leaf="">用于高召回地提取所有可能的用户反馈</span></p></li><li><p style="word-break: break-all;margin-top: 0px;margin-bottom: 15px;padding: 0px;box-sizing: border-box;"><span leaf="">固定 Schema 输出，保障结构化稳定性</span></p></li><li><p style="word-break: break-all;margin-top: 0px;margin-bottom: 15px;padding: 0px;box-sizing: border-box;"><span leaf="">内置业务语义空间（反馈类型、标签体系、情绪体系）</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  内容治理层</span></p><ul style="list-style-type: disc;margin-left: 16px;margin-right: 16px;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin-top: 0px;margin-bottom: 15px;padding: 0px;box-sizing: border-box;"><span leaf="">用于高精度校验、去幻觉、去噪</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin-top: 0px;margin-bottom: 15px;padding: 0px;box-sizing: border-box;"><span leaf="">引入“模糊语句过滤 + 情绪 × 意图双因子校验”</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin-top: 0px;margin-bottom: 15px;padding: 0px;box-sizing: border-box;"><span leaf="">合并同用户重复反馈、剔除弱反馈、剔除运营/测试信息</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">3.  语义聚类层</span></p><ul style="list-style-type: disc;margin-left: 16px;margin-right: 16px;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin-top: 0px;margin-bottom: 15px;padding: 0px;box-sizing: border-box;"><span leaf="">基于大模型语义理解自动构建话题簇</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin-top: 0px;margin-bottom: 15px;padding: 0px;box-sizing: border-box;"><span leaf="">统一标签命名，避免相似标签分裂</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin-top: 0px;margin-bottom: 15px;padding: 0px;box-sizing: border-box;"><span leaf="">当出现语义相近但不属于既有标签的反馈时，模型能够基于语义自动归并或生成新标签</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">4.  洞察生成层</span></p><p style="word-break: break-all;margin: 0px 16px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">a.  自动生成 100 字社区热点摘要</span></p><p style="word-break: break-all;margin: 0px 16px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">b.  基于结构化数据生成日报/周报，包含环比变化与风险事件</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">通过分层 Prompt，我们实现了 </span><strong style="box-sizing: border-box;"><span leaf="">可控、高可用、全链路可解释</span></strong><span leaf=""> 的模型输出体系。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""><span textstyle="" style="font-size: 17px;">2.双模型协作：精准性与成本之间的动态平衡</span></span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">社群消息本质是 </span><strong style="box-sizing: border-box;"><span leaf="">非结构化、口语化、强上下文依赖</span></strong><span leaf=""> 的文本，针对每日大量群聊，我们采用“轻模型做召回 → 强模型做校验”的方法：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">LLM A：擅长高召回、信息挖掘</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">LLM B：擅长严谨判断、减少幻觉</span></p></li></ul></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">出于业务安全，本次分享中我们对实际使用的大语言模型进行了匿名化处理，仅以其能力特征进行描述。</span></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这种 多模型协同校验 的设计，让我们在成本、召回率、准确率之间达成最佳平衡。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">真实样例：模型幻觉导致的严重误判</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在项目初期，我们仅使用单模型直接解析群聊内容。当遇到某些“非结构化、短句、无明确反馈意图”的消息时，模型会为了满足结构化输出要求，</span><strong style="box-sizing: border-box;"><span leaf="">主动补充一些并不存在的反馈信息</span></strong><span leaf="">。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">下面是一次典型的错误样本：</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">真实情况：该群当天没有 UP 主提出任何有效反馈内容。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">模型输出：却“凭空生成”了数十条反馈结构，包括需求、负向反馈、标签分类等。</span></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">截图如下：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020135" class="rich_pages wxw-img" data-ratio="0.5714286" data-s="300,640" data-type="png" data-w="672" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=132b377a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TVtb1gJIpwkrp4q6pffBdd2OG2ickVF31uyrkiazCWSyZ2gfwibfDBGHLVKz8ckuqOeU6EM6lNt3rgg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">然而经过人工复查可以确认：</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">以上所有反馈均为模型“自动脑补”，群聊原文中完全不存在。</span></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这不是简单的技术 Bug，而是足以影响业务判断的 </span><strong style="box-sizing: border-box;"><span leaf="">严重幻觉风险</span></strong><span leaf="">。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">因此，我们必须引入第二阶段严格复核节点</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">为了避免这类“凭空生成反馈”的问题，我们设计了 LLM A（高召回） → LLM B（高精度） 的双模型协作机制。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020132" class="rich_pages wxw-img" data-ratio="0.3" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=4d608640&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TVtb1gJIpwkrp4q6pffBddx0cu5ndSfia0icc9VeGKAU9nJzj4QTLKFtBTCyL3rKPic33HSAlFxLEXQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在复核节点中我们做了几类专门的</span><strong style="box-sizing: border-box;"><span leaf="">“反幻觉策略”</span></strong><span leaf="">：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">严格禁止模型补充不存在的用户原话</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">无原话时 → 必须输出「无反馈」</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">结构化数据必须与原文一一对应</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">模糊语气（似乎、可能） → 自动判定为高风险 → 进入复核</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">字段缺失、标签不符 → Must Fix</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">经过增强后：</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">幻觉率从 早期的 8–12% → 降为 &lt;1%</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">假反馈基本完全消失</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">所有反馈均带可追溯原话，形成“证据链”</span></p></li></ul></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""><span textstyle="" style="font-size: 17px;">3.基于 Few-shot 的结构化输出稳定机制</span></span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在实际使用大模型时，结构化输出（尤其是表格字段）容易随着上下文或模型版本发生“格式漂移”。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">为此，我们采用了一种 轻量级 Few-shot Prompting 方法，让模型在正式解析业务数据前，通过少量示例快速“记住”目标格式，从而保持输出稳定。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020133" class="rich_pages wxw-img" data-ratio="0.2816568" data-s="300,640" data-type="png" data-w="845" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=b20e37e8&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TVtb1gJIpwkrp4q6pffBdd7HetdzhAb6Kz8kbaruAhsGAfuXLiaUZsXiaHWKlkDRp1wFibmTKFSPXibQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">方案原理：</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">通过给模型连续提供 2～3 个标准表格示例（Few-shot），并让模型在后续回答中沿用同样的格式，来显著降低结构漂移概率。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">无须额外的校验器，无须复杂自愈机制，成本极低，但对稳定性提升非常明显。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">技术流程：</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1.  在 Prompt 中加入 1–2 个“标准表格示例”（Few-shot Examples）</span></p><p style="word-break: break-all;margin: 0px 16px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">a.  示例内容来自真实数据或我们构造的理想格式。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2.  要求模型：下一轮回答必须完全沿用示例格式</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">3.  如果模型偶尔偏移，少量的“格式纠正提示”即可修正</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在某些场景下，这种 few-shot 技巧甚至比复杂的结构化约束更实用。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""><span textstyle="" style="font-size: 17px;">4.LLM 语义聚类：适应社区语言变化的</span></span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""><span textstyle="" style="font-size: 17px;">轻量级 Topic 分组</span></span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">用户在群聊中的用词高度自由，包含大量细微表达差异：</span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">多种说法表达同一个问题（如“审核慢”“卡审核”）</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">多种术语、别名并存（“流量波动”“推流不稳”）</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">不断出现新的词汇或表述</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">为避免关键词维护负担，我们采用：</span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">LLM 自主判断语义相似度（不是关键词匹配）</span></p></li><li><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">让模型生成统一标签（避免同类话题被拆分）</span></p></li><li><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">当模型识别到“完全不属于现有主题”的内容时，自动生成新主题</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这是一种轻量但非常实用的 Topic 聚类方式，可以让系统在不依赖复杂算法的前提下，自动跟上业务与社区语境的变化，</span><strong style="box-sizing: border-box;"><span leaf="">效果足以支撑每日热点、话题趋势分析</span></strong><span leaf="">。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">以下Prompt隐去了一些我们业务标签注入的内容，但仍可供大家参考</span></p></div><p class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"></ul><pre class="code-snippet__js" data-lang="diff"><code><span leaf="">你是社区运营团队的一员。你即将阅读到一批用户反馈内容，每条反馈都有唯一的“反馈ID”。</span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">你的工作如下：</span></code><br/><code><span leaf="">主题聚类</span></code><br/><code><span leaf=""><span class="code-snippet__deletion">- 对所有反馈进行语义聚类，将语义相近的反馈归为同一主题（如“系统卡顿”和“服务器崩溃”应归为同类）。</span></span></code><br/><code><span leaf=""><span class="code-snippet__deletion">- 相同主题只保留一个统一标签，不要生成相似但不同的标签名称。</span></span></code><br/><code><span leaf="">标签命名</span></code><br/><code><span leaf=""><span class="code-snippet__deletion">- 参考微博热搜命名方式，生成简洁有冲击力的标签（2~8字），避免冗长描述。</span></span></code><br/><code><span leaf=""><span class="code-snippet__deletion">- 标签需覆盖多种类型（满意度、咨询、问题等），不可只聚焦问题反馈。</span></span></code><br/><code><span leaf="">事件提炼</span></code><br/><code><span leaf=""><span class="code-snippet__deletion">- 为每个标签用一句话概括用户关注的焦点，事件化描述，不要罗列类别。</span></span></code><br/><code><span leaf="">热度统计</span></code><br/><code><span leaf=""><span class="code-snippet__deletion">- 统计该标签下的反馈数量，作为热度值。</span></span></code><br/><code><span leaf="">反馈ID标注</span></code><br/><code><span leaf=""><span class="code-snippet__deletion">- 列出与该标签相关的最多5个反馈ID，用英文逗号分隔。</span></span></code><br/><code><span leaf="">排序输出</span></code><br/><code><span leaf=""><span class="code-snippet__deletion">- 按热度从高到低，输出前10个标签的信息。</span></span></code><br/><code><span leaf=""><br/></span></code><br/><code><span leaf="">输出表格格式如下，请勿返回多余的注解：</span></code><br/><code><span leaf="">| 标签 | 热议事件 | 热度 | 反馈ID |</span></code><br/></pre></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""><span textstyle="" style="font-size: 17px;">5.语义驱动的风控预警体系：</span></span></strong></p><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf=""><span textstyle="" style="font-size: 17px;">从趋势中提前发现风险</span></span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们结合语义聚类结果与反馈指标，形成了轻量级的预警判断逻辑：</span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">量级分析</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">增速分析</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">负向占比</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">情绪突发检测</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">跨群体一致性判断</span></p></li></ul></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020131" class="rich_pages wxw-img" data-ratio="1.1082474" data-s="300,640" data-type="png" data-w="388" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=211656e5&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TVtb1gJIpwkrp4q6pffBddZ5OYzibGH14mibBuHM3Zatg0MiaKsOG2zEXqmcudvYK1We37kwrBbQpLg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">当某个话题出现：</span></p><ul style="list-style-type: disc;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">负向情绪短时间急增</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">环比快速上涨</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">多个群同时出现类似反馈</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">系统会自动判定为 </span><strong style="box-sizing: border-box;"><span leaf="">突发事件</span></strong><span leaf="">，并标注风险等级。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">相比传统人工轮询，这种能力可以：</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">全链路流程图</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020140" class="rich_pages wxw-img" data-ratio="0.712963" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=48494989&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TVtb1gJIpwkrp4q6pffBddExItiaTxxKud7kBkgqJcc5Nu8iaKo5DwmZqsX65gYv4tjfNM4DFt63AA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">三、实际效果与业务收益</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">引入 AI 智能分析系统后，我们在反馈洞察的效率、覆盖、准确性上都取得了显著提升。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">过去依赖人工筛查时，在有限人力下日均只能回收约 50 条有效反馈；如今系统能够每天自动回收近 600 条，覆盖范围扩大十倍以上，大量被忽略的“弱信号”得以被及时捕捉和记录。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020137" class="rich_pages wxw-img" data-ratio="0.2675926" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=be326ff0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TVtb1gJIpwkrp4q6pffBddzlhCv8qV8A0kicL9Yhqdvwicknk8MoBtxG40qDSwGQZpH8eDvC7Cg15w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">AI 带来的价值不仅体现在规模化处理，更重要的是对关键事件的提前洞察能力。系统能够识别短时间内出现的异常聚集信号，如创作流程、审核体验、版权申诉等领域的情绪波动。当某一话题的负面表达突然增多时，系统会自动聚合并提升为重点关注事件，让团队能在问题形成大范围扩散前就提前介入，在早期苗头阶段就进行响应与处理。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020136" class="rich_pages wxw-img" data-ratio="0.2740741" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=969d3203&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TVtb1gJIpwkrp4q6pffBddBDAo3a0o7YiaPsC6UibFrc4MicBvJIBd8ibNks0ouGO7VVxEAEicjBRVBlg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">此外，结构化处理后的海量群聊信息，也成为了团队的重要知识资产。这些数据会进一步被用于：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">生成每日/每周的事件简报，为运营与产品提供准确的用户温度计</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">输出典型案例与话题热度，辅助判断优先级</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">自动生成 TAPD 需求，推动问题闭环处理</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">为产品团队提供真实用户的“原声证据”，减少沟通成本</span></p></li></ul></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020138" class="rich_pages wxw-img" data-ratio="0.4185185" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=7072d7bc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TVtb1gJIpwkrp4q6pffBdddxILKYeEfOddC7PZB9nLuUF8AETicDiaaHRjhtpMDmyxgQ1FayaHpLBg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在 BI 看板上，这些沉淀的数据以更直观的方式呈现：情绪趋势、话题聚类、反馈规模、风险事件等核心指标一目了然，让业务团队可以随时掌握用户的关注点和变化趋势，做到“数据驱动运营决策”。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020139" class="rich_pages wxw-img" data-ratio="0.4314815" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=778e1c49&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TVtb1gJIpwkrp4q6pffBddRLGxmW3hfWq9fYdc7tj2RyN6FOYz3Oc2wg7Ez5Jteoa4kfkG7BSUWQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">整体而言，这套社群信息 AI 分析体系让我们从被动响应走向了主动洞察——</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">不再是等用户大量投诉后再处理，而是能够利用 AI 的语义理解能力，及时捕捉到群聊中不断浮现的细微变化，并将分散的用户声音转化为推动产品迭代的动力。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">四、AI应用优势总结</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这套社群信息 AI 分析体系的落地，让我们在反馈获取、问题识别和运营决策三个层面都获得了实质性的提升：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">效率跃升：大量重复、零散的群聊分析工作被自动化取代，团队能把更多精力投入到关键问题的判断与沟通上。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">全面覆盖：大模型的语义理解能力让“隐晦表达、弱信号、新话题”都能被及时捕捉，显著降低反馈遗漏率。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">情绪量化：用户情绪从主观判断变成可观测指标，趋势变化也能通过数据直接呈现，为运营提供更及时的风险提示。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">话题聚合能力：语义聚类让重复表达的意见被合并、长尾问题被显性化，帮助我们更准确地把握 UP 主的关注点。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">推动闭环：结构化数据沉淀后，反馈能自然进入日报、周报和需求流转体系，问题从被发现到被解决的路径更加顺畅。</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">AI 让我们从“人工盯岗”进入“主动洞察”时代。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们真正实现了将创作者的声音得到规模化记录、分析与反馈，这在过去几乎是不可能完成的任务。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">未来，我们也会继续加强模型在风险识别、创作支持与社区生态等方向的能力建设，为平台持续提供更智能的基础设施。</span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨Zerooo、蓝莓派</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">开发者问答</span></b></p></div></div></div><div style="text-align: center;padding: 0px 8px;font-size: 12px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">你们团队在 AI 效率提升上做过哪些有趣的探索？</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">欢迎在留言区分享你的见解~</span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">转发本文至朋友圈并留言，即可参与</span><strong style="box-sizing: border-box;"><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;"><span leaf="">下方抽奖</span></span></strong><span style=""><strong style="box-sizing: border-box;"><span leaf="">⬇️</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">小编将抽取1位幸运的小伙伴获取</span><span style="text-decoration: underline;"><strong style="box-sizing: border-box;"><span leaf="">星星向龙系列卡套包</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">抽奖截止时间：12月05日12:00</span></strong></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(180, 176, 176);box-sizing: border-box;"><span leaf="">如果喜欢本期内容的话，欢迎点个“在看”吧！</span></span></p></div><p nodeleaf=""><mp-common-miniprogram class="js_uneditable custom_select_card mp_miniprogram_iframe" data-pluginname="insertminiprogram" data-miniprogram-path="pages/lucky/lottery/detail?id=8OCPDOQcvHK" data-miniprogram-nickname="抽奖助手" data-miniprogram-avatar="http://mmbiz.qpic.cn/mmbiz_png/Vdys2e8jP1l1clbflznHYO7IRflCZWjPfD4NMn1Xqgr5gZbBy1qVc12cGVG1whLTXiafBT7kiaWRl38HCbqLnRzw/640?wx_fmt=png&amp;wxfrom=200" data-miniprogram-title="星星向龙系列卡套包" data-miniprogram-imageurl="http://mmbiz.qpic.cn/mmbiz_jpg/1BMf5Ir754TVtb1gJIpwkrp4q6pffBddUyMwx1DYtibpOoUSAryt5j26x5dy0qRMicviaQbcOuU4xaY1n6mRGmDEA/0?wx_fmt=jpeg" data-miniprogram-type="card" data-miniprogram-servicetype="0" data-miniprogram-appid="wx01bb1ef166cd3f4e" data-miniprogram-applink="#小程序://抽奖/ui3Wt1RYgbENawo" data-miniprogram-imageurlback="http%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TVtb1gJIpwkrp4q6pffBddyxL5iahaYaTaQUAxIEp5Ff6ze92e9SvjwZuV7XfeW0UWPS96JQOpLYQ%2F0%3Fwx_fmt%3Dpng" data-miniprogram-cropperinfo="%7B%22c%22%3A%7B%22x%22%3A0%2C%22y%22%3A25%2C%22x2%22%3A245%2C%22y2%22%3A221%2C%22w%22%3A245%2C%22h%22%3A196%7D%7D"></mp-common-miniprogram></p><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">往期精彩指路</span></b></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><p style="text-align: justify;padding: 0px 8px;font-size: 13px;width: 100%;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 40px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247499358&amp;idx=1&amp;sn=468d7be1a6ccd13a7905beec48664e36&amp;scene=21#wechat_redirect" textvalue="面向AI应用开发实战分享 - 基础篇" data-itemshowtype="0" linktype="text" data-linktype="2">面向AI应用开发实战分享 - 基础篇</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502050&amp;idx=1&amp;sn=401c110c768f8adc52e873245fd46fd4&amp;scene=21#wechat_redirect" textvalue="B站AI计算网络建设实践" data-itemshowtype="0" linktype="text" data-linktype="2">B站AI计算网络建设实践</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502853&amp;idx=1&amp;sn=cd742d5d59f45a684decf0c3af381c25&amp;scene=21#wechat_redirect" textvalue="大模型时代：AI 网关的智能连接与场景对接" data-itemshowtype="0" linktype="text" data-linktype="2">大模型时代：AI 网关的智能连接与场景对接</a></span></p></li></ul></p></div></div><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);visibility: visible;"><p data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(62, 62, 62);font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3289447926347317252#wechat_redirect" textvalue="通用工程" linktype="text" data-linktype="2">通用工程</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2390333109742534656#wechat_redirect" textvalue="大前端" linktype="text" data-linktype="2">大前端</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3297757408550699008#wechat_redirect" textvalue="业务线" linktype="text" data-linktype="2">业务线</a></span></span></p><p style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(62, 62, 62);font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2329861166598127619#wechat_redirect" textvalue="大数据" linktype="text" data-linktype="2">大数据</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2782124818895699969#wechat_redirect" textvalue="AI" linktype="text" data-linktype="2">AI</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2532608330440081409#wechat_redirect" textvalue="多媒体" linktype="text" data-linktype="2">多媒体</a></span></span></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px 0px 24px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;letter-spacing: 0.578px;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-index="0" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/300?wx_fmt=png&amp;wxfrom=19" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-origin_num="355" data-biz_account_status="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;letter-spacing: 0.578px;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-index="1" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/300?wx_fmt=png&amp;wxfrom=19" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-origin_num="22" data-biz_account_status="0" data-service_type="2" data-verify_status="2"></mp-common-profile></p></div></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="2247503792">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=72de6e8b&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247503792%26idx%3D1%26sn%3D1254ec52914112d15140a850cf692837">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 28 Nov 2025 12:01:00 +0800</pubDate>
    </item>
    <item>
      <title>智能体开发新范式：Blades 架构下的高效 Agent &amp; Workflow 实践</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503757&amp;idx=1&amp;sn=77027417e47156e9236c34963bcddda2</link>
      <description></description>
      <content:encoded><![CDATA[<p>
<span>Blades</span> <span>2025-11-27 12:02</span> <span style="display: inline-block;">上海</span>
</p>




<p><img src="https://wechat2rss.xlab.app/img-proxy/?k=3e05350f&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FDicvG64GianWg3MQA9sfsdmRFPpU9m2y9fnCYpp25MD6OgcVe8ONjJGOqRKPof8y7SAeVQe8qVCUAAxULiap2IoPQ%2F0%3Fwx_fmt%3Djpeg"/></p>


<div data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="" data-pm-slice="0 0 []"><blockquote style="margin-top: 20px;margin-bottom: 20px;margin-left: 0px;margin-right: 0px;padding-top: 10px;padding-bottom: 10px;padding-left: 20px;padding-right: 10px;border-top-style: none;border-bottom-style: none;border-left-style: solid;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgb(216, 156, 246);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;background-attachment: scroll;background-clip: border-box;background-color: rgb(244, 238, 255);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;display: block;overflow-x: auto;overflow-y: auto;"><p style="text-indent: 0em;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;margin-top: 0px;margin-right: 0px;margin-bottom: 0px;margin-left: 0px;"><span leaf="">🎉Blades 已发布 v0.3.0 版本，欢迎大家使用</span><span leaf=""><br/></span><span leaf=""><a href="https://github.com/go-kratos/blades/releases/tag/v0.3.0" target="_blank">https://github.com/go-kratos/blades/releases/tag/v0.3.0</a></span></p></blockquote><h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 1px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(0, 0, 0);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;box-shadow: none;display: block;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow-x: unset;overflow-y: unset;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;text-align: left;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="font-size: 18px;color: rgb(34, 34, 34);line-height: 1.8em;letter-spacing: 0em;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: solid;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 5px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(145, 109, 213);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;box-shadow: none;display: block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;overflow-x: unset;overflow-y: unset;text-align: left;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span leaf="">什么是 Agent（智能体）？</span></span></h2><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">业界对 </span><strong style="color: rgb(145, 109, 213);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;"><span leaf="">Agent</span></strong><span leaf=""> 并没有一个统一、严格的定义。不同厂商、开源社区甚至论文体系中，对 Agent 的描述都略有差异。但整体来看，Agent 通常指 </span><strong style="color: rgb(145, 109, 213);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;"><span leaf="">能够长期自主运行、具备一定决策能力、并能根据任务需要调用多种外部工具的智能系统</span></strong><span leaf="">。</span></p><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">它可以表现为一个“懂目标、会判断、能执行”的程序，也可以是传统意义上</span><strong style="color: rgb(145, 109, 213);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;"><span leaf="">基于规则的固定流程机器人</span></strong><span leaf="">。</span></p><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">在 Blades 中，我们把这些不同形态统称为 </span><strong style="color: rgb(145, 109, 213);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;"><span leaf="">智能体系统（Agentic Systems）</span></strong><span leaf="">。尽管它们都属于 Agent 范畴，但在实际架构设计时，需要特别区分两个核心概念：</span><strong style="color: rgb(145, 109, 213);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;"><span leaf="">工作流（Workflow）</span></strong><span leaf=""> 与 </span><strong style="color: rgb(145, 109, 213);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;"><span leaf="">智能体（Agent）</span></strong><span leaf="">。</span></p><h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: block;"><span style="font-size: 18px;color: rgb(0, 0, 0);line-height: 1.5em;letter-spacing: 0em;text-align: left;font-weight: bold;display: block;"><span leaf="">工作流（Workflow）</span></span></h4><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">工作流更偏向传统软件的思想：它依赖 </span><strong style="color: rgb(145, 109, 213);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;"><span leaf="">预先定义好的执行步骤</span></strong><span leaf=""> 来组织 LLM 与工具的调用关系，一切的逻辑顺序都由开发者提前规划、写死在流程图或代码中。</span></p><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">特点：</span></p><ul style="list-style-type: circle;margin-top: 8px;margin-bottom: 8px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 25px;padding-right: 0px;color: rgb(0, 0, 0);" class="list-paddingleft-1"><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">执行路径是</span><strong style="color: rgb(145, 109, 213);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;"><span leaf="">固定的</span></strong><span leaf="">、可预期的</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">每一步的输入、输出、条件分支都由开发人员提前设定</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">更适用于业务流程标准化、稳定、可拆分的任务</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">易于控制边界、测试与审计</span></p></li></ul><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">一句话：</span><strong style="color: rgb(145, 109, 213);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;"><span leaf="">它是模型按照流程走，而不是流程根据模型变。</span></strong></p><h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: block;"><span style="font-size: 18px;color: rgb(0, 0, 0);line-height: 1.5em;letter-spacing: 0em;text-align: left;font-weight: bold;display: block;"><span leaf="">智能体（Agent）</span></span></h4><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">Agent 的核心价值在于“自主性”和“适应性”。它不是按照流程图运行，而是让 LLM 作为“大脑”，根据任务目标与当前状态，</span><strong style="color: rgb(145, 109, 213);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;"><span leaf="">动态决定下一步做什么</span></strong><span leaf="">。</span></p><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">Agent 的典型能力包括：</span></p><ul style="list-style-type: circle;margin-top: 8px;margin-bottom: 8px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 25px;padding-right: 0px;color: rgb(0, 0, 0);" class="list-paddingleft-1"><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">由 LLM </span><strong style="color: rgb(145, 109, 213);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;"><span leaf="">自主决定</span></strong><span leaf=""> 执行步骤，而不是依赖预设流程</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">能够自主选择、组合或多轮调用外部工具</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">在执行过程中具有对任务全局状态的“记忆”和“理解”</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">根据实时反馈动态改变策略，而不是固定走分支</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">某些情况下可以持续运行，类似“服务型 Agent”</span></p></li></ul><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">因此相比 Workflow，Agent 更接近一个</span><strong style="color: rgb(145, 109, 213);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;"><span leaf="">主动的执行者</span></strong><span leaf="">，而不是被动的流程节点。</span></p><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">一句话：</span><strong style="color: rgb(145, 109, 213);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;"><span leaf="">工作流是“流程在控制模型”，而 Agent 是“模型在控制流程”。</span></strong></p><h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 1px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(0, 0, 0);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;box-shadow: none;display: block;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow-x: unset;overflow-y: unset;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;text-align: left;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="font-size: 18px;color: rgb(34, 34, 34);line-height: 1.8em;letter-spacing: 0em;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: solid;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 5px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(145, 109, 213);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;box-shadow: none;display: block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;overflow-x: unset;overflow-y: unset;text-align: left;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span leaf="">使用 Blades 构建：智能体（Agent）</span></span></h2><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">Blades 基于 Go 语言的简洁语法和高并发特性，提供了灵活、可扩展的 Agent 架构。其设计理念是通过统一的接口和可插拔式组件，让开发者能够在保持高性能的同时，轻松扩展 Agent 的能力。 整体架构如下：</span></p><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: flex;flex-direction: column;justify-content: center;align-items: center;"><span leaf=""><img alt="architecture" class="rich_pages wxw-img" data-imgfileid="100005386" data-ratio="0.5527777777777778" style="display: block;margin-top: 0px;margin-right: auto;margin-bottom: 0px;margin-left: auto;max-width: 100%;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 8px;border-top-right-radius: 8px;border-bottom-right-radius: 8px;border-bottom-left-radius: 8px;object-fit: fill;box-shadow: rgba(153, 153, 153, 0.3) 2px 4px 8px 0px;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=0b8a20f7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FDicvG64GianWhARauPalfeaiaPRia1kqAdw3TYqQev6UErOUdQQxw259499tlDEibFHias89ka53UfHfHtmKsEl7AEvQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span><figcaption style="color: rgb(136, 136, 136);font-size: 13px;line-height: 1.5em;letter-spacing: 0em;text-align: center;font-weight: normal;margin-top: 10px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;"><span leaf="">architecture</span></figcaption></figure><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">在 </span><strong style="color: rgb(145, 109, 213);font-weight: bold;background-attachment: scroll;background-clip: border-box;background-color: rgba(0, 0, 0, 0);background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;"><span leaf="">Blades</span></strong><span leaf=""> 中，可以通过 </span><code style=""><span leaf="">blades.NewAgent</span></code><span leaf=""> 创建一个智能体（Agent）。Agent 是整个框架的核心组件，主要负责：</span></p><ul style="list-style-type: circle;margin-top: 8px;margin-bottom: 8px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 25px;padding-right: 0px;color: rgb(0, 0, 0);" class="list-paddingleft-1"><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">调用 LLM 模型</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">管理工具（Tools）</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">执行提示词（Prompts）</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">控制整个任务的运行流程</span></p></li></ul><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">同时，Blades 提供了简单优雅的方式来自定义工具，可以使用 </span><code style=""><span leaf="">tools.NewTool</span></code><span leaf=""> 或者 </span><code style=""><span leaf="">tools.NewFunc</span></code><span leaf=""> 进行构建工具，让 Agent 能够访问外部 API、业务逻辑或计算能力。</span></p><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">下面是一个自定义天气查询工具的示例：</span></p><pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;"><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;"><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">// 定义天气处理逻辑</span></span><span leaf=""><br/></span><span style="line-height: 26px;"><span style="color: #c678dd;line-height: 26px;"><span leaf="">func</span></span><span style="color: #61aeee;line-height: 26px;"><span leaf="">weatherHandle</span></span><span style="line-height: 26px;"><span leaf="">(ctx context.Context, req WeatherReq)</span></span><span style="line-height: 26px;"><span leaf="">(WeatherRes, error)</span></span></span><span leaf=""> {</span><span leaf=""><br/></span><span style="color: #c678dd;line-height: 26px;"><span leaf="">return</span></span><span leaf=""> WeatherRes{Forecast: </span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;Sunny, 25°C&#34;</span></span><span leaf="">}, </span><span style="color: #56b6c2;line-height: 26px;"><span leaf="">nil</span></span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">// 创建一个天气工具</span></span><span leaf=""><br/></span><span style="line-height: 26px;"><span style="color: #c678dd;line-height: 26px;"><span leaf="">func</span></span><span style="color: #61aeee;line-height: 26px;"><span leaf="">createWeatherTool</span></span><span style="line-height: 26px;"><span leaf="">()</span></span><span style="line-height: 26px;"><span leaf="">(tools.Tool, error)</span></span></span><span leaf=""> {</span><span leaf=""><br/></span><span style="color: #c678dd;line-height: 26px;"><span leaf="">return</span></span><span leaf=""> tools.NewFunc(</span><span leaf=""><br/></span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;get_weather&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;Get the current weather for a given city&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">        weatherHandle,</span><span leaf=""><br/></span><span leaf="">    )</span><span leaf=""><br/></span><span leaf="">}</span></code></pre><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">再构建一个可调用天气工具的智能助手（Weather Agent）：</span></p><pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;"><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;"><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">// 配置所调用的模型和地址</span></span><span leaf=""><br/></span><span leaf="">model := openai.NewModel(</span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;deepseek-chat&#34;</span></span><span leaf="">, openai.Config{</span><span leaf=""><br/></span><span leaf="">    BaseURL: </span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;<a href="https://api.deepseek.com" target="_blank">https://api.deepseek.com</a>&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    APIKey: os.Getenv(</span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;YOUR_API_KEY&#34;</span></span><span leaf="">),</span><span leaf=""><br/></span><span leaf="">})</span><span leaf=""><br/></span><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">// 创建一个天气智能助手</span></span><span leaf=""><br/></span><span leaf="">agent, err := blades.NewAgent(</span><span leaf=""><br/></span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;Weather Agent&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    blades.WithModel(model),</span><span leaf=""><br/></span><span leaf="">    blades.WithInstruction(</span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;You are a helpful assistant that provides weather information.&#34;</span></span><span leaf="">),</span><span leaf=""><br/></span><span leaf="">    blades.WithTools(createWeatherTool()),</span><span leaf=""><br/></span><span leaf="">)</span><span leaf=""><br/></span><span style="color: #c678dd;line-height: 26px;"><span leaf="">if</span></span><span leaf=""> err != </span><span style="color: #56b6c2;line-height: 26px;"><span leaf="">nil</span></span><span leaf=""> {</span><span leaf=""><br/></span><span leaf="">    log.Fatal(err)</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">// 实现查询上海的天气信息</span></span><span leaf=""><br/></span><span leaf="">input := blades.UserMessage(</span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;What is the weather in Shanghai City?&#34;</span></span><span leaf="">)</span><span leaf=""><br/></span><span leaf="">runner := blades.NewRunner(agent)</span><span leaf=""><br/></span><span leaf="">output, err := runner.Run(ctx := context.Background(), input)</span><span leaf=""><br/></span><span style="color: #c678dd;line-height: 26px;"><span leaf="">if</span></span><span leaf=""> err != </span><span style="color: #56b6c2;line-height: 26px;"><span leaf="">nil</span></span><span leaf=""> {</span><span leaf=""><br/></span><span leaf=""> log.Fatal(err)</span><span leaf=""><br/></span><span leaf="">}</span><span leaf=""><br/></span><span leaf="">log.Println(output.Text())</span></code></pre><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">使用 Blades 的框架设计，你只需少量代码就能快速构建一个既能调用工具又能自主决策的智能体。</span></p><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">接下来，我们将基于 Blades 框架介绍几种典型的工作流模式，每种设计模式适用于不同的业务场景，从最简单的线性流程，到高度自治的智能体，可以根据实际业务需求选择合适的设计方式。</span></p><h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 1px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(0, 0, 0);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;box-shadow: none;display: block;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow-x: unset;overflow-y: unset;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;text-align: left;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="font-size: 18px;color: rgb(34, 34, 34);line-height: 1.8em;letter-spacing: 0em;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: solid;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 5px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(145, 109, 213);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;box-shadow: none;display: block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;overflow-x: unset;overflow-y: unset;text-align: left;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span leaf="">模式 1：Chain Workflow（串联工作流）</span></span></h2><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">该模式体现了“将复杂任务拆分为简单步骤”的原则。 适用场景：</span></p><ul style="list-style-type: circle;margin-top: 8px;margin-bottom: 8px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 25px;padding-right: 0px;color: rgb(0, 0, 0);" class="list-paddingleft-1"><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">任务本身具有明确的、顺序分明的步骤。</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">想以牺牲少许延迟换取更高准确度。</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">每个步骤都依赖前一个步骤的输出。</span></p></li></ul><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: flex;flex-direction: column;justify-content: center;align-items: center;"><span leaf=""><img data-imgfileid="100005382" class="rich_pages wxw-img" data-ratio="0.35" data-type="png" data-w="1080" style="display: block;margin-top: 0px;margin-right: auto;margin-bottom: 0px;margin-left: auto;max-width: 100%;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 8px;border-top-right-radius: 8px;border-bottom-right-radius: 8px;border-bottom-left-radius: 8px;object-fit: fill;box-shadow: rgba(153, 153, 153, 0.3) 2px 4px 8px 0px;" src="https://wechat2rss.xlab.app/img-proxy/?k=09735c81&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FDicvG64GianWhARauPalfeaiaPRia1kqAdw3UcibLr79DAV6huMvrekciaVvs0ic0lKicBkV4qu4mKjWyUZkIibB1IcFnxg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></figure><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">示例代码（examples/workflow-sequential）：</span></p><pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;"><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;"><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">// 串行工作流，进行按编排顺序执行智能体</span></span><span leaf=""><br/></span><span leaf="">sequentialAgent := flow.NewSequentialAgent(flow.SequentialConfig{</span><span leaf=""><br/></span><span leaf="">    Name: </span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;WritingReviewFlow&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    SubAgents: []blades.Agent{</span><span leaf=""><br/></span><span leaf="">        writerAgent,</span><span leaf=""><br/></span><span leaf="">        reviewerAgent,</span><span leaf=""><br/></span><span leaf="">    },</span><span leaf=""><br/></span><span leaf="">})</span></code></pre><h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 1px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(0, 0, 0);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;box-shadow: none;display: block;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow-x: unset;overflow-y: unset;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;text-align: left;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="font-size: 18px;color: rgb(34, 34, 34);line-height: 1.8em;letter-spacing: 0em;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: solid;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 5px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(145, 109, 213);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;box-shadow: none;display: block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;overflow-x: unset;overflow-y: unset;text-align: left;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span leaf="">模式 2：Parallelization Workflow（并行工作流）</span></span></h2><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">该模式用于让 LLM 同时处理多个子任务，然后将结果汇总。</span></p><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">适用场景：</span></p><ul style="list-style-type: circle;margin-top: 8px;margin-bottom: 8px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 25px;padding-right: 0px;color: rgb(0, 0, 0);" class="list-paddingleft-1"><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">需要处理大量“相似但独立”的项。</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">任务需要多个不同视角。</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">时间敏感、任务可并行化。</span></p></li></ul><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: flex;flex-direction: column;justify-content: center;align-items: center;"><span leaf=""><img data-imgfileid="100005384" class="rich_pages wxw-img" data-ratio="0.5842592592592593" data-type="png" data-w="1080" style="display: block;margin-top: 0px;margin-right: auto;margin-bottom: 0px;margin-left: auto;max-width: 100%;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 8px;border-top-right-radius: 8px;border-bottom-right-radius: 8px;border-bottom-left-radius: 8px;object-fit: fill;box-shadow: rgba(153, 153, 153, 0.3) 2px 4px 8px 0px;" src="https://wechat2rss.xlab.app/img-proxy/?k=038d42b3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FDicvG64GianWhARauPalfeaiaPRia1kqAdw3823sM2jBicEwYSPzHIvkxpKl9EKuQlgUwicOSLJreZf2eU9S1nAgG63w%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></figure><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">示例代码（examples/workflow-parallel）：</span></p><pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;"><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;"><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">// 并行工作流，通过把生成的结果存到 session state 中，后续流程进行引用</span></span><span leaf=""><br/></span><span leaf="">parallelAgent := flow.NewParallelAgent(flow.ParallelConfig{</span><span leaf=""><br/></span><span leaf="">    Name:        </span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;EditorParallelAgent&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    Description: </span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;Edits the drafted paragraph in parallel for grammar and style.&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    SubAgents: []blades.Agent{</span><span leaf=""><br/></span><span leaf="">        editorAgent1,</span><span leaf=""><br/></span><span leaf="">        editorAgent2,</span><span leaf=""><br/></span><span leaf=""> },</span><span leaf=""><br/></span><span leaf="">})</span><span leaf=""><br/></span><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">// 定义串行工作流，实现同时与并行定义</span></span><span leaf=""><br/></span><span leaf="">sequentialAgent := flow.NewSequentialAgent(flow.SequentialConfig{</span><span leaf=""><br/></span><span leaf="">    Name:        </span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;WritingSequenceAgent&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    Description: </span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;Drafts, edits, and reviews a paragraph about climate change.&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    SubAgents: []blades.Agent{</span><span leaf=""><br/></span><span leaf="">        writerAgent,</span><span leaf=""><br/></span><span leaf="">        parallelAgent,</span><span leaf=""><br/></span><span leaf="">        reviewerAgent,</span><span leaf=""><br/></span><span leaf="">    },</span><span leaf=""><br/></span><span leaf="">})</span></code></pre><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">这种模式能显著提升吞吐量，但也要注意并行带来的资源消耗与复杂性。</span></p><h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 1px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(0, 0, 0);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;box-shadow: none;display: block;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow-x: unset;overflow-y: unset;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;text-align: left;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="font-size: 18px;color: rgb(34, 34, 34);line-height: 1.8em;letter-spacing: 0em;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: solid;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 5px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(145, 109, 213);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;box-shadow: none;display: block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;overflow-x: unset;overflow-y: unset;text-align: left;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span leaf="">模式 3：Routing Workflow（路由工作流）</span></span></h2><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">这个模式通过 LLM 智能判断输入类型，再将其分派给不同处理流程。 适用场景：</span></p><ul style="list-style-type: circle;margin-top: 8px;margin-bottom: 8px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 25px;padding-right: 0px;color: rgb(0, 0, 0);" class="list-paddingleft-1"><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">输入类别多、结构差异大。</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">各类输入需不同专用处理流程。</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">分类准确率较高。</span></p></li></ul><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: flex;flex-direction: column;justify-content: center;align-items: center;"><span leaf=""><img data-imgfileid="100005385" class="rich_pages wxw-img" data-ratio="0.5805555555555556" data-type="png" data-w="1080" style="display: block;margin-top: 0px;margin-right: auto;margin-bottom: 0px;margin-left: auto;max-width: 100%;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 8px;border-top-right-radius: 8px;border-bottom-right-radius: 8px;border-bottom-left-radius: 8px;object-fit: fill;box-shadow: rgba(153, 153, 153, 0.3) 2px 4px 8px 0px;" src="https://wechat2rss.xlab.app/img-proxy/?k=afeebb99&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FDicvG64GianWhARauPalfeaiaPRia1kqAdw3Pc4TLIPZTW6Zeu05hMKyEDYzLDm7mxd64kcw7XUJAd2ew9zNW2ibo6Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></figure><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">示例代码（examples/workflow-routing）：</span></p><pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;"><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;"><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">// 通过 Agent 中的 description 进行自动选择合适的专家智能体</span></span><span leaf=""><br/></span><span leaf="">agent, err := flow.NewRoutingAgent(flow.RoutingConfig{</span><span leaf=""><br/></span><span leaf="">    Name:        </span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;TriageAgent&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    Description: </span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;You determine which agent to use based on the user&#39;s homework question&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    Model:       model,</span><span leaf=""><br/></span><span leaf="">    SubAgents: []blades.Agent{</span><span leaf=""><br/></span><span leaf="">        mathTutorAgent,</span><span leaf=""><br/></span><span leaf="">        historyTutorAgent,</span><span leaf=""><br/></span><span leaf=""> },</span><span leaf=""><br/></span><span leaf="">})</span></code></pre><h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 1px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(0, 0, 0);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;box-shadow: none;display: block;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow-x: unset;overflow-y: unset;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;text-align: left;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="font-size: 18px;color: rgb(34, 34, 34);line-height: 1.8em;letter-spacing: 0em;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: solid;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 5px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(145, 109, 213);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;box-shadow: none;display: block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;overflow-x: unset;overflow-y: unset;text-align: left;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span leaf="">模式 4：Orchestrator-Workers（编排-工作者模式）</span></span></h2><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">这个模式结合了 “Agent” 倾向：一个中央 LLM 作任务分解（orchestrator），再由不同 “Worker” 执行子任务。</span></p><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">适用场景：</span></p><ul style="list-style-type: circle;margin-top: 8px;margin-bottom: 8px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 25px;padding-right: 0px;color: rgb(0, 0, 0);" class="list-paddingleft-1"><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">无法事先完全预测子任务。</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">任务需要多种视角或处理方法。</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">需要系统的适应性与复杂决策流程。</span></p></li></ul><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: flex;flex-direction: column;justify-content: center;align-items: center;"><span leaf=""><img data-imgfileid="100005383" class="rich_pages wxw-img" data-ratio="0.42685185185185187" data-type="png" data-w="1080" style="display: block;margin-top: 0px;margin-right: auto;margin-bottom: 0px;margin-left: auto;max-width: 100%;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 8px;border-top-right-radius: 8px;border-bottom-right-radius: 8px;border-bottom-left-radius: 8px;object-fit: fill;box-shadow: rgba(153, 153, 153, 0.3) 2px 4px 8px 0px;" src="https://wechat2rss.xlab.app/img-proxy/?k=d1da1306&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FDicvG64GianWhARauPalfeaiaPRia1kqAdw3w1BjcY8op6yDsic10b37iaDrkSyAU4t0u0IGSgXibpwOfK1QnGLRojhbQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></figure><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">示例代码（examples/workflow-orchestrator）：</span></p><pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;"><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;"><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">// 通过工具定义翻译器（Agent as a Tool）</span></span><span leaf=""><br/></span><span leaf="">translatorWorkers := createTranslatorWorkers(model)</span><span leaf=""><br/></span><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">// 协调器进行选择需要的工具进行执行</span></span><span leaf=""><br/></span><span leaf="">orchestratorAgent, err := blades.NewAgent(</span><span leaf=""><br/></span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;orchestrator_agent&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    blades.WithInstruction(</span><span style="color: #98c379;line-height: 26px;"><span leaf="">`You are a translation agent. You use the tools given to you to translate.</span><span leaf=""><br/></span><span leaf="">    If asked for multiple translations, you call the relevant tools in order.</span><span leaf=""><br/></span><span leaf="">    You never translate on your own, you always use the provided tools.`</span></span><span leaf="">),</span><span leaf=""><br/></span><span leaf="">    blades.WithModel(model),</span><span leaf=""><br/></span><span leaf="">    blades.WithTools(translatorWorkers...), </span><span leaf=""><br/></span><span leaf="">)</span><span leaf=""><br/></span><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">// 进行合成生成的多个结果</span></span><span leaf=""><br/></span><span leaf="">synthesizerAgent, err := blades.NewAgent(</span><span leaf=""><br/></span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;synthesizer_agent&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    blades.WithInstruction(</span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;You inspect translations, correct them if needed, and produce a final concatenated response.&#34;</span></span><span leaf="">),</span><span leaf=""><br/></span><span leaf="">    blades.WithModel(model),</span><span leaf=""><br/></span><span leaf="">)</span></code></pre><h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 1px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(0, 0, 0);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;box-shadow: none;display: block;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow-x: unset;overflow-y: unset;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;text-align: left;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="font-size: 18px;color: rgb(34, 34, 34);line-height: 1.8em;letter-spacing: 0em;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: solid;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 5px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(145, 109, 213);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;box-shadow: none;display: block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;overflow-x: unset;overflow-y: unset;text-align: left;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span leaf="">模式 5：Evaluator-Optimizer（评估-优化模式）</span></span></h2><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">该模式中，一个模型生成输出，另一个模型评估该输出并提供反馈，如同人类“先写后改”流程。 适用场景：</span></p><ul style="list-style-type: circle;margin-top: 8px;margin-bottom: 8px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 25px;padding-right: 0px;color: rgb(0, 0, 0);" class="list-paddingleft-1"><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">有明确可量化的评估标准。</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">通过多轮“生成→评估→改进”能显著提升质量。</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">任务适合反复迭代。</span></p></li></ul><figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;display: flex;flex-direction: column;justify-content: center;align-items: center;"><span leaf=""><img data-imgfileid="100005390" class="rich_pages wxw-img" data-ratio="0.2574074074074074" data-type="png" data-w="1080" style="display: block;margin-top: 0px;margin-right: auto;margin-bottom: 0px;margin-left: auto;max-width: 100%;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 8px;border-top-right-radius: 8px;border-bottom-right-radius: 8px;border-bottom-left-radius: 8px;object-fit: fill;box-shadow: rgba(153, 153, 153, 0.3) 2px 4px 8px 0px;" src="https://wechat2rss.xlab.app/img-proxy/?k=9ee2f47b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_png%2FDicvG64GianWhARauPalfeaiaPRia1kqAdw3O1HO4Tg2TaibicndgB07wbiaWvvRx4bsF1PLqoUgBqNWkPnePjmhGWu9A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></span></figure><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">示例代码（examples/workflow-loop）：</span></p><pre data-tool="mdnice编辑器" style="border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;text-align: left;margin-top: 10px;margin-bottom: 10px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;"><code style="overflow-x: auto;padding: 16px;color: #abb2bf;padding-top: 15px;background: #282c34;border-radius: 5px;display: -webkit-box;font-family: Consolas, Monaco, Menlo, monospace;font-size: 12px;"><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">// 通过生成内容，再进行评估效果，反复实现多次迭代</span></span><span leaf=""><br/></span><span leaf="">loopAgent := flow.NewLoopAgent(flow.LoopConfig{</span><span leaf=""><br/></span><span leaf="">    Name:          </span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;WritingReviewFlow&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    Description:   </span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;An agent that loops between writing and reviewing until the draft is good.&#34;</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    MaxIterations: </span><span style="color: #d19a66;line-height: 26px;"><span leaf="">3</span></span><span leaf="">,</span><span leaf=""><br/></span><span leaf="">    Condition: </span><span style="line-height: 26px;"><span style="color: #c678dd;line-height: 26px;"><span leaf="">func</span></span><span style="line-height: 26px;"><span leaf="">(ctx context.Context, output *blades.Message)</span></span><span style="line-height: 26px;"><span leaf="">(</span><span style="color: #c678dd;line-height: 26px;"><span leaf="">bool</span></span><span leaf="">, error)</span></span></span><span leaf=""> {</span><span leaf=""><br/></span><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">// 评估内容效果判断是否结束迭代</span></span><span leaf=""><br/></span><span style="color: #c678dd;line-height: 26px;"><span leaf="">return</span></span><span leaf=""> !strings.Contains(output.Text(), </span><span style="color: #98c379;line-height: 26px;"><span leaf="">&#34;The draft is good&#34;</span></span><span leaf="">), </span><span style="color: #56b6c2;line-height: 26px;"><span leaf="">nil</span></span><span leaf=""><br/></span><span leaf="">    },</span><span leaf=""><br/></span><span leaf="">    SubAgents: []blades.Agent{</span><span leaf=""><br/></span><span leaf="">        writerAgent,</span><span leaf=""><br/></span><span leaf="">        reviewerAgent,</span><span leaf=""><br/></span><span leaf="">    },</span><span leaf=""><br/></span><span leaf="">})</span></code></pre><h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 1px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(0, 0, 0);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;box-shadow: none;display: block;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow-x: unset;overflow-y: unset;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;text-align: left;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="font-size: 18px;color: rgb(34, 34, 34);line-height: 1.8em;letter-spacing: 0em;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: solid;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 5px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(145, 109, 213);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;box-shadow: none;display: block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;overflow-x: unset;overflow-y: unset;text-align: left;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span leaf="">最佳实践与建议</span></span></h2><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">在业务实践中，不管是单一智能体还是多智能体架构，工程设计往往比模型能力更决定最终效果。</span></p><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">以下实践建议总结了实际项目中最关键的原则，可作为设计与实现智能体时作为参考。</span></p><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">从简单做起</span></p><ul style="list-style-type: circle;margin-top: 8px;margin-bottom: 8px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 25px;padding-right: 0px;color: rgb(0, 0, 0);" class="list-paddingleft-1"><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">先构建基础工作流，再考虑更复杂的智能体。</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">用最简单能满足需求的模式。</span></p></li></ul><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">设计可靠性</span></p><ul style="list-style-type: circle;margin-top: 8px;margin-bottom: 8px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 25px;padding-right: 0px;color: rgb(0, 0, 0);" class="list-paddingleft-1"><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">明确错误处理机制。</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">尽量使用类型安全响应。</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">每一步加上验证。</span></p></li></ul><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf="">权衡取舍</span></p><ul style="list-style-type: circle;margin-top: 8px;margin-bottom: 8px;margin-left: 0px;margin-right: 0px;padding-top: 0px;padding-bottom: 0px;padding-left: 25px;padding-right: 0px;color: rgb(0, 0, 0);" class="list-paddingleft-1"><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">在延迟与准确率之间做平衡。</span></p></li><li><p style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);font-size: 14px;line-height: 1.8em;letter-spacing: 0em;text-align: left;font-weight: normal;"><span leaf="">是否并行要评估场景。</span></p></li></ul><h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;margin-left: 0px;margin-right: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 1px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(0, 0, 0);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;box-shadow: none;display: block;flex-direction: unset;float: unset;height: auto;justify-content: unset;line-height: 1.5em;overflow-x: unset;overflow-y: unset;padding-top: 0px;padding-bottom: 0px;padding-left: 0px;padding-right: 0px;text-align: left;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span style="font-size: 18px;color: rgb(34, 34, 34);line-height: 1.8em;letter-spacing: 0em;padding-top: 0px;padding-bottom: 0px;padding-left: 10px;padding-right: 0px;border-top-style: none;border-bottom-style: none;border-left-style: solid;border-right-style: none;border-top-width: 1px;border-bottom-width: 1px;border-left-width: 5px;border-right-width: 1px;border-top-color: rgb(0, 0, 0);border-bottom-color: rgb(0, 0, 0);border-left-color: rgb(145, 109, 213);border-right-color: rgb(0, 0, 0);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;align-items: unset;background-attachment: scroll;background-clip: border-box;background-color: unset;background-image: none;background-origin: padding-box;background-position-x: 0%;background-position-y: 0%;background-repeat: no-repeat;background-size: auto;box-shadow: none;display: block;font-weight: bold;flex-direction: unset;float: unset;height: auto;justify-content: unset;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;overflow-x: unset;overflow-y: unset;text-align: left;text-indent: 0em;text-shadow: none;transform: none;width: auto;-webkit-box-reflect: unset;"><span leaf="">参考</span></span></h2><p data-tool="mdnice编辑器" style="color: rgb(0, 0, 0);font-size: 14px;line-height: 1.8em;letter-spacing: 0.02em;text-align: left;text-indent: 0em;margin-top: 0px;margin-bottom: 0px;margin-left: 0px;margin-right: 0px;padding-top: 8px;padding-bottom: 8px;padding-left: 0px;padding-right: 0px;"><span leaf=""><a href="https://github.com/go-kratos/blades/blob/main/examples" target="_blank">https://github.com/go-kratos/blades/blob/main/examples</a></span></p></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="2247503757">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=31905cdb&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247503757%26idx%3D1%26sn%3D77027417e47156e9236c34963bcddda2">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Thu, 27 Nov 2025 12:02:00 +0800</pubDate>
    </item>
    <item>
      <title>B站消息新架构升级</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503755&amp;idx=1&amp;sn=bd23c345d87a50bbfc833e442081843c</link>
      <description>技术升级不是一蹴而就的，一个逐步优化的过程。</description>
      <content:encoded><![CDATA[<p>
原创 <span>业务线</span> <span>2025-11-21 12:03</span> <span style="display: inline-block;">上海</span>
</p>




<p><img src="https://wechat2rss.xlab.app/img-proxy/?k=d3f4055c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJenyrac149qOC7LFrwDc4W3UtU4MrR6DHbHW3nYYrH4fRE00ia4ROQOg%2F0%3Fwx_fmt%3Djpeg"/></p>

<p>技术升级不是一蹴而就的，一个逐步优化的过程。</p>

<div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">先思考两个问题：</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">技术上数据量越大，降级概率越大，但消息业务场景上数据量大的是影响力更大的UP，业务不接受技术降级，如何破？</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">如果消息流量增加10倍，怎么保障服务不挂？</span></p></li></ul></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">1.现状</span></b></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">业务解读</span></strong></p></div></div></div><div style="margin: 10px 0%;text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;box-sizing: border-box;"><div style="display: inline-block;vertical-align: middle;width: 50%;padding: 0px 5px 0px 0px;align-self: center;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020087" class="rich_pages wxw-img" data-ratio="2.2182741" data-s="300,640" data-type="png" data-w="394" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=2f23a708&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJJAA5HMdFJFtRrUM2piadM5WY9HVqDvvaicyrVj7CQCGEwjHl1qBcInjg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div><div style="display: inline-block;vertical-align: middle;width: 50%;padding: 0px 0px 0px 5px;align-self: center;flex: 0 0 auto;box-sizing: border-box;"><div style="text-align: center;margin: 0px 0%;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020088" class="rich_pages wxw-img" data-ratio="2.2435897" data-s="300,640" data-type="png" data-w="390" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=ba565d52&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJsWOwHiafibrdUWSxVNcwXmzmf9jw016FmaZApePIv2iaic7aqBialkRS1JA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">按业务全域现状，在服务端角度分成客服系统、系统通知、互动通知和私信4个业务线，每个业务线内按现状标识了服务分层。私信内分为用户单聊、bToC的批量私信、群聊和应援团小助手四类，这四类细分私信没有技术解耦，单聊和批量私信比较接近系统天花板。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020104" class="rich_pages wxw-img" data-ratio="0.4953125" data-s="300,640" data-type="png" data-w="1280" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-croporisrc="https://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJhK5RCqjsCc7UBMwcj6pQINKyEUl4RibRa2biak3Dgr6INO0oBdT4cSbA/0?wx_fmt=png&amp;from=appmsg" data-cropselx2="578" data-cropsely2="286" src="https://wechat2rss.xlab.app/img-proxy/?k=f9a59c26&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJhK5RCqjsCc7UBMwcj6pQINKyEUl4RibRa2biak3Dgr6INO0oBdT4cSbA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">私信单聊发送到触达的pv转化和uv转化不足10%，有明显通过业务优化提升触达率的潜力。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">技术解读</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">私信域内的几个概念解释：</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">会话列表：按聊天人排序的列表。即B站首页右上角信封一跳后看到的历史聊天人列表，以及点击未关注人等折叠会话看到的同属一类的聊天人列表。传达对方账号、最新私信和未读数的信息。点击一个会话后看到的是对聊历史，也称会话历史。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">会话详情：描述和一个聊天人会话状态的原子概念，包括接收人uid、发送人uid、未读数、会话状态、会话排序位置等。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">会话历史：按时间线对发送内容排序的列表。一份单聊会话历史既属于自己，也属于另一个和自己的聊天的人。群聊的会话历史属于该群，不属于某个成员。会话历史是收件箱和消息内容合并后的结果。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">收件箱：将一次发送的时序位置映射到发送内容唯一id的kv存储，可以让服务端按时间序读取一批发送内容唯一id。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">私信内容：一个包括发送内容唯一id、原始输入内容、消息状态的原子概念。批量私信把同一个发送内容唯一id写入每个收信人的收件箱里。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">timeline模型：时间轴的抽象模型，模型包括消息体、已读位点、最大位点、生产者、消费者等基本模块，可以用于基于时间轴的数据同步、存储和索引。私信涉及timeline模型的包括会话列表和会话历史。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">读扩散：pull模式。群聊每条私信只往群收件箱写一次，让成百上千的群成员在自己的设备都看到，是典型的读扩散。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">写扩散：push模式。单聊每条私信既更新接收人会话也更新发送人会话，是轻微的写扩散，无系统压力。群聊有另一个不一样的特点，就是当群成员发送消息后，需要通过长链接通知其他群成员的在线设备，以及发送人其他的在线设备，这是一个写扩散的技术模型，但是这个写扩散是通知后即时销毁的，并且具有过期时间，所以仅临时占用资源，并不对存储造成压力，且能有较好的并发量。</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">私信核心概念关系表达：</span></strong></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020085" class="rich_pages wxw-img" data-ratio="0.312963" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=3614623a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJqS90U4TB0SJ4mVeYRTnhnJqQ4NjgdqWYkqcVic3vkgQR7nYTIGSw3tA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">2.问题</span></b></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">会话慢查询</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">当会话缓存过期时，Mysql是唯一回源，Mysql能承载的瞬时QPS受当时应用总连接数和sql平均响应速度的影响，连接数打满时会给前端返回空会话列表。虽然可以增加POD数量、增大akso proxy连接数、优化sql和索引来作为短线方案，来提升瞬时请求Mysql容量，但是这种短线方案无法加快单次响应速度，mysql响应越来越慢的的问题依然在。另外增加POD数量也会降低发版速度。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020105" class="rich_pages wxw-img" data-ratio="0.24631675874769798" data-s="300,640" data-type="png" data-w="2172" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-croporisrc="https://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJNrB8TKW5emUbRQiaGE3yY6CwuJlCHlrXY8jbeIVXK68wRqJsM2icoafg/0?wx_fmt=png&amp;from=appmsg" data-cropselx2="578" data-cropsely2="142" src="https://wechat2rss.xlab.app/img-proxy/?k=81dd1f2a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJNrB8TKW5emUbRQiaGE3yY6CwuJlCHlrXY8jbeIVXK68wRqJsM2icoafg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">会话Mysql使用用户uid%1000/100分库，用户uid%100分表，table总量是1000。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">单表会话量在1kw-3.2kw。单个大up的会话积累了10W条以上，会话量最大的用户有0.2亿条会话。单个Up的会话会落到一张表中，每张表都有比较严重的数据倾斜。如果考虑增加分库分表的方案，sql查找条件依然需要用户uid，所以相当于倾斜数据要转移到新的单表，问题没有解决。另外，重新分库分表过程中新旧table增量同步和迁移业务读写流量的复杂度也很大，有比较大的业务风险。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Mysql的规格是48C 128G和32C 64G。由于会话数据量大，Mysql buffer_pool有限，数据比较容易从内存淘汰，然后mysql需要进行磁盘扫描并将需要的数据加载到内存进行运算，加之比较多的磁盘扫描数据，这时的响应一般在秒级别，接口会给前端返回超时错误，会话列表页空白。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">为了适配业务发展，Mysql 会话表 已经添加了9个非聚集索引，如果通过增加索引使用业务需要，需要更大的Mysql资源，且解决不了冷数据慢查询的问题。增加更多索引也会让Mysql写入更慢。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">私信内容单表空间和写性能接近天花板</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">每条私信内容都绑定私信自己的发号器生成的msgkey，即私信内容唯一id，该msgkey包含私信发送时的时间戳。读写私信内容Mysql之前先从msgkey解析出时间，用这个时间路由分库分表。私信内容库按季度分库，分库内按月度分表，单表数据量数亿，数据量最大的用户日增私信351.9W条。按照曲率预测，25年全年数据量有近百亿，如果继续按照月度分表，分表规则不适应增长。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">当前该Mysql最大写qps 790，特别活动时写qps峰值预计是20k，但是为了保障Mysql服务整体的可靠，单库写流量我们需要控制在3000qps以下，无法满足写入量峰值时的需要。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020090" class="rich_pages wxw-img" data-ratio="0.6" data-s="300,640" data-type="png" data-w="720" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=5c928960&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJ555jz9dymLywicf3QuVgOGVEI85ibtEC1hcOU4O05wMK0Kr0IAIpneqQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">此外，消息内容表结构包含了群聊、单聊和应援团小助手全部的属性，增加业务使用难度。绝大部分私信内容是单聊的。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">服务端代码耦合</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">四类私信（单聊、群聊、B端批量私信、应援团小助手）都需要实现发送和触达两条核心链路，四种私信核心链路的代码逻辑和存储耦合在一起，代码复杂度随着业务功能上线而不断增加，熵增需要得到控制。从微服务这方面来说，实例和存储耦合会带来资源随机竞争，当一方流量上涨，可能给对方的业务性能带来不必要的影响，也会带来不必要的变更传导。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">3.升级路径</span></b></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">基于对私信现状的论述，可以确定我们要优化的是一个数据密集型 &gt;&gt; 计算密集型，读多写少（首页未读数）、读少写多（会话）场景兼具的系统，同时需要拥有热门C端产品的稳定性、扩展性和好的业务域解耦。针对读多写少和读少写多制定了针对的技术方案。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">消息域整体架构设计</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">结合B站业务现状，我觉得比较合理的架构：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020094" class="rich_pages wxw-img" data-ratio="0.525" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=86551563&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJqanOicW0noZttarRTM9EXdo9rHLD81km5DAtbK9iaH6xYNAheAmb0Znw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一个兼顾复杂列表查询架构和IM架构的消息域框架，整体分四层</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">接入层：即toC的BFF和服务端网关</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">业务层：按复杂查询设计系统，用于各种业务形态的支撑</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">平台层：按IM架构设计系统，目标是实时、有序的触达用户，平台层可扩展</span></strong></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">触达层：对接长链和push</span></strong></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">端上本地缓存降级</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">端上应该支持部分数据缓存，以确保极端情况下用户端可展示，可以是仅核心场景，比如支付小助手、官号通知，用户在任何情况下打开消息页都不应该白屏。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">BFF架构升级</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">BFF网关吸收上浮的业务逻辑，控制需求向核心领域传导。服务端基于业务领域的能力边界，抽象出单聊、群聊、系统通知、互动通知和消息设置共五个新服务，提升微服务健康度。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020092" class="rich_pages wxw-img" data-ratio="0.7047619" data-s="300,640" data-type="png" data-w="630" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=34d8f30b&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJovOZ0s13tiaCCWELVg2QjuBgMP5icdIGS7ibGWu5hSALkb4Knt0Plib51g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">新服务剥离了历史包袱，也解决一些在老服务难解的功能case，优化了用户体验，比如消息页不同类型消息的功能一致性；重新设计会话缓存结构和更新机制，优化Mysql索引，优化Mysql查询语句，减少了一个量级的慢查询。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020091" class="rich_pages wxw-img" data-ratio="0.6642012" data-s="300,640" data-type="png" data-w="676" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=02cf022e&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJPJolpOKNxG4Izt9ueB6J9uAlWm6bukCYKB5XsIPTm9wOwWhhib5bX8A%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">服务端可用性升级</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">服务端按四层拆分后，集中精力优化业务层和平台层：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">业务层：按复杂查询设计系统，用于各种业务形态的支撑</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">冷热分离：多级缓存 redis(核心数据有过期)+taishan(有限明细数据)+mysql(全部数据)</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">读写分离：95%以上复杂查询可以迁移到从库读</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">平台层：按IM架构设计系统，目标是实时、有序的触达用户，平台层可扩展</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">Timeline模型：依赖雪花发号器，成熟方案</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">读写扩散：单聊-写扩散，群聊-读扩散</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">单聊会话</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">缓存主动预热</span></strong></span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">用户在首页获取未读数是一个业务域内可以捕捉的事件，通过异步消费这个事件通知服务端创建会话缓存，提高用户查看会话的缓存命中率。鉴于大部分人打开B站并不会进私信，此处可以仅大UP预热。大UP的uid集合可以在数平离线分析会话数据后写入泰山表，这个泰山表更新时效是T+1。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">监控UP会话数量实时热点，触发突增阈值时，通过异步链路自动为热点用户主动预热会话列表缓存。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">对预热成功率添加监控，并在数平离线任务失败或者预热失败时做出业务告警，及时排查原因，避免功能失效。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">泰山和Mysql双持久化</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">增加泰山存储用户有限会话明细，作为redis未命中后的第一回源选择，Mysql作为泰山之后的次选。基于用户翻页长度分析后确定泰山存储的有限会话的量级。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020093" class="rich_pages wxw-img" data-ratio="0.48" data-s="300,640" data-type="png" data-w="400" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=09f2af9c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJG6Qh5aWJjBm6MwHicAbQbypdOibeL8xoCN2ZIfscwib1PCibK6eYsRYgMw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">redis 存储24小时数据，taishan 存储 600条/用户（20页），预设到的极端情况才会回源mysql从库。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">对于ZSET和KV两种数据结构，评估了各自读写性能的可靠性，符合业务预期。业务如果新增会话类型，可以跟本次新增泰山有限明细一样，基于会话类型的具体规则新增泰山Key。</span></p></div><div style="text-align: center;box-sizing: border-box;"><p style="text-align: center;" nodeleaf=""><img data-imgfileid="100020103" class="rich_pages wxw-img" data-ratio="0.19444444444444445" data-s="300,640" data-type="png" data-w="1080" type="block" src="https://wechat2rss.xlab.app/img-proxy/?k=58e824b9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJZQibVNCYG7NnjRrrd64tj0uic99YQicMa1IV7w4NDR9zy0YOI473GlAwA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">泰山长尾优化</span></strong></span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">查询redis未命中时会优先回源泰山，考虑到泰山99分位线在50ms以下，而且Mysql多从实例都能承受来自C端的读请求，所以采用比泰山报错后降级Mysql稍微激进的对冲回源策略。在泰山出现“长尾”请求时，取得比较好的耗时优化效果。可以使用大仓提供的error group结合quit channel实现该回源策略，同时能避免协程泄漏。整个处理过程在业务响应和资源开销中维持中间的平衡，等待泰山的时间可以灵活调整。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: auto;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020097" class="rich_pages wxw-img" data-ratio="1.1694915" data-s="300,640" data-type="png" data-w="295" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=056e2fa9&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJ7m7kIBpRgHwqAianzaJgWf2v6xAl5Hfg3sD4E6fX55uib8ELiar0a23ng%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">泰山最初没有数据，可以在泰山未命中时进行被动加载，保证用户回访时能命中。</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一致性保证</span></strong></span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">虽然我们重构了新服务，但是老服务也需要保留，用来处理未接入BFF的移动端老版本和web端请求，这些前端在更新会话时（比如ACK）请求到了老服务，新服务需要通过订阅会话Mysql binlog异步更新本服务的redis和泰山。为了避免分区倾斜，订阅binlog的dts任务使用id分区，这样方便的是一条会话在topic的分区是固定的。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">为了避免两次请求分别命中泰山和Mysql时给用户返回的数据不一样，需要解决三大问题：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">当出现分区rebalance需要避免重复消费；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">当Mysql一条会话记录在短时间内（秒级）多次更新，要保证binlog处理器不会逆时间序消费同一个会话的binlog，即跳过较早版本的binlog；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">保证泰山写入正确并且从Mysql低延迟同步。</span></p></li></ul><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">这三个问题都要保证最终一致性，具体解决方案是用redis lua脚本实现compare and swap，lua脚本具有原生的原子性优势。dts每同步一条binlog都会携带毫秒级mtime，当binlog被采用时，mtime被记入redis10分钟，如果下一条binlog的mtime大于redis记录的mtime，这条binlog被采用，否则被丢弃。这个过程可以考虑使用gtid代替mtime，但这个存在的问题是每个从实例单独维护自己的gtid，当特殊情况发生mysql主从切换，或者dts订阅的从节点发生变更，gtid在CAS计算中变得不再可靠，所以我们选择了使用mtime作为Mysql会话记录的版本。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">通过消费路线高性能设计保证泰山异步更新的延迟在1秒以内，并在特殊情况延迟突破1s时有效告警。高性能消费路线中，每个库的binlog分片到50个partition，业务提供不低于50个消费pod，单pod配置100并发数，按照写泰山999分位线20ms计算，每秒可以消费50*100*(1000/20)=250000条，大约线上峰值8.3倍，考虑dts本身的max延迟在600~700毫秒，同步泰山和redis的延迟会在700毫秒至1秒以内，符合业务预期。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020096" class="rich_pages wxw-img" data-ratio="0.687251" data-s="300,640" data-type="png" data-w="502" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=892ff2cc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJP05Kibibl068eQ4GZfjZnLzJKfVVdJmNlGicw2SvFEHHUS7WXlyq3iaGHg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">收件箱</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">BFF已经从业务层和平台层将单聊读收件箱独立出来，本次升级主要是从存储做增量解耦 ，存量单聊收件箱的读流量可以访问旧表。 单聊新收件箱存储采用redis+泰山的模式，redis提供热数据，泰山提供全部数据并采用RANDOM读模式，让主副本都能分担读流量。</span></p></div><div style="text-align: center;box-sizing: border-box;"><p style="text-align: center;" nodeleaf=""><img data-imgfileid="100020102" class="rich_pages wxw-img" data-ratio="0.08981481481481482" data-s="300,640" data-type="png" data-w="1080" type="block" src="https://wechat2rss.xlab.app/img-proxy/?k=2a68d61c&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJLTibFUInhACJpvxjrmgj6751tcbVPmGFXckLTIGo4ujjoe06Jkcu45g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">私信内容</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">本次升级主要如下</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">单聊增量数据独立存储，按照单聊业务设计表结构，和群聊、应援团小助手彻底解耦。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">写Mysql升级为异步化操作，提高写性能天花板，这种异步写Mysql改造不会影响读消息内容的可用性和设计。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">单聊分库规则升级为月度分库，单库内分表为100张。 群聊、应援团小助手和历史单聊依然使用旧的分库分表规则读写Mysql。</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">业务需要对增量单聊私信路由分库分表时，先从msgkey先解析出时间戳，找到用时间戳对应的月份分库，然后用msgkey对100取余找到分表。这种方案能达到按时间纬度的冷热数据的分离，同时由于msgkey取余的结果具有随机性，平衡了每张表的读写流量。这样预计2025年单表数据量能从9亿下降到900万。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020106" class="rich_pages wxw-img" data-ratio="0.23796548592188918" data-s="300,640" data-type="png" data-w="2202" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-croporisrc="https://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJpH4E0rOoziaAg1jQSwoHlkkbMuINYsumttOyia5gtXQSxJQLShIxaluQ/0?wx_fmt=png&amp;from=appmsg" data-cropselx2="578" data-cropsely2="138" src="https://wechat2rss.xlab.app/img-proxy/?k=90e97ed6&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJpH4E0rOoziaAg1jQSwoHlkkbMuINYsumttOyia5gtXQSxJQLShIxaluQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020095" class="rich_pages wxw-img" data-ratio="0.5732484" data-s="300,640" data-type="png" data-w="628" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=0a9c6db4&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJJnfQvxq1WOA4ic3JgewhaibfpAyocDoBMias1Kfrib0luB5QWyGc3F1Jog%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">批量私信</span></strong></p></div></div></div><p style="padding: 0px 8px;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">日常通道：日常批量私信任务共用通道，共用配额。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">高优通道：主要通过将链路上topic partition扩容、消费POD扩容、POD内消费通道数扩容、缓存扩容、akso proxy连接数扩容，把平均发送速度从3500 人/秒提高到30000人/秒。这个通道可以特殊时期开给特殊业务使用。</span></p></li></ul></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">4.结语</span></b></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们逐步发现技术升级不是一蹴而就的，一个逐步优化的过程；设计技术方案前设立合适和有一些挑战的目标，但这个目标要控制成本，做好可行性；设计技术方案的时候，需要清楚现有架构与理想架构的差距和具体差异点，做多个方案选型，并确定一个，这个更多从技术团队考虑；其次要保证功能在新老架构平稳过渡，保证业务的稳定性。后面持续关注新老架构的技术数据，持续优化，老架构要持续关注它的收敛替换。IM系统是一个老生常谈的话题，也是融合众多有趣技术难点的地方，欢迎感兴趣的同行交流研讨。</span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨比奇堡、Xd、三木森</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">开发者问答</span></b></p></div></div></div><div style="text-align: center;padding: 0px 8px;font-size: 12px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">在消息系统架构升级中，你最关心的是哪项能力？</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">欢迎在留言区分享你的见解~</span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">转发本文至朋友圈并留言，即可参与</span><strong style="box-sizing: border-box;"><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;"><span leaf="">下方抽奖</span></span></strong><span style=""><strong style="box-sizing: border-box;"><span leaf="">⬇️</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">小编将抽取1位幸运的小伙伴获取</span><span style="text-decoration: underline;"><strong style="box-sizing: border-box;"><span leaf="">星星向龙系列卡套包</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">抽奖截止时间：11月28日12:00</span></strong></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(180, 176, 176);box-sizing: border-box;"><span leaf="">如果喜欢本期内容的话，欢迎点个“在看”吧！</span></span></p><p nodeleaf=""><mp-common-miniprogram class="js_uneditable custom_select_card mp_miniprogram_iframe" data-pluginname="insertminiprogram" data-miniprogram-path="pages/lucky/lottery/detail?id=8Ordb0wCOfB" data-miniprogram-nickname="抽奖助手" data-miniprogram-avatar="http://mmbiz.qpic.cn/mmbiz_png/Vdys2e8jP1l1clbflznHYO7IRflCZWjPfD4NMn1Xqgr5gZbBy1qVc12cGVG1whLTXiafBT7kiaWRl38HCbqLnRzw/640?wx_fmt=png&amp;wxfrom=200" data-miniprogram-title="星星向龙系列卡套包" data-miniprogram-imageurl="http://mmbiz.qpic.cn/mmbiz_jpg/1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJK4BZt1NvoK25GwMLFzkHRWtlWy11s2ctuzic6oXWrn48ooSJFxuftHg/0?wx_fmt=jpeg" data-miniprogram-type="card" data-miniprogram-servicetype="0" data-miniprogram-appid="wx01bb1ef166cd3f4e" data-miniprogram-applink="#小程序://抽奖/jQ3tffeJslOO4TD" data-miniprogram-imageurlback="http%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RxcicfiaugGSUUuc6VK9VxcJ0aw0wibbLrm9hTGbHuhsZSkMOias8iccibvYB9xq88HL1rvNUufpDVvZRg%2F0%3Fwx_fmt%3Dpng" data-miniprogram-cropperinfo="%7B%22c%22%3A%7B%22x%22%3A0%2C%22y%22%3A25%2C%22x2%22%3A245%2C%22y2%22%3A221%2C%22w%22%3A245%2C%22h%22%3A196%7D%7D"></mp-common-miniprogram></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">往期精彩指路</span></b></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><p style="text-align: justify;padding: 0px 8px;font-size: 13px;width: 100%;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 40px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247501708&amp;idx=1&amp;sn=3eacbd4445fe9a5c31e1f186fdb606bb&amp;scene=21#wechat_redirect" textvalue="B站评论系统的多级存储架构" data-itemshowtype="0" linktype="text" data-linktype="2">B站评论系统的多级存储架构</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503295&amp;idx=1&amp;sn=55146b91931719da636dc6a720ec354d&amp;scene=21#wechat_redirect" textvalue="哔哩哔哩Android视频编辑页的架构升级" data-itemshowtype="0" linktype="text" data-linktype="2">哔哩哔哩Android视频编辑页的架构升级</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502230&amp;idx=1&amp;sn=76feb6f4717cedf7c7fc1aaaf16d619d&amp;scene=21#wechat_redirect" textvalue="新活动平台建设历程与架构演进" data-itemshowtype="0" linktype="text" data-linktype="2">新活动平台建设历程与架构演进</a></span></p></li></ul></p></div></div><p style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(62, 62, 62);font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);" data-pm-slice="0 0 []"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf=""><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;color: rgb(12, 182, 242);box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3289447926347317252#wechat_redirect" textvalue="通用工程" linktype="text" data-linktype="2">通用工程</a></span></span><span leaf="">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf=""><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;color: rgb(12, 182, 242);box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2390333109742534656#wechat_redirect" textvalue="大前端" linktype="text" data-linktype="2">大前端</a></span></span><span leaf="">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf=""><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;color: rgb(12, 182, 242);box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3297757408550699008#wechat_redirect" textvalue="业务线" linktype="text" data-linktype="2">业务线</a></span></span></p><p style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;color: rgb(62, 62, 62);font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf=""><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;color: rgb(12, 182, 242);box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2329861166598127619#wechat_redirect" textvalue="大数据" linktype="text" data-linktype="2">大数据</a></span></span><span leaf="">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf=""><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;color: rgb(12, 182, 242);box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2782124818895699969#wechat_redirect" textvalue="AI" linktype="text" data-linktype="2">AI</a></span></span><span leaf="">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf=""><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;color: rgb(12, 182, 242);box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2532608330440081409#wechat_redirect" textvalue="多媒体" linktype="text" data-linktype="2">多媒体</a></span></span></p><p class="mp_profile_iframe_wrp" style="-webkit-tap-highlight-color: transparent;margin: 0px 0px 24px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;letter-spacing: 0.578px;" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-index="0" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/300?wx_fmt=png&amp;wxfrom=19" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-origin_num="354" data-biz_account_status="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;letter-spacing: 0.578px;" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-index="1" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/300?wx_fmt=png&amp;wxfrom=19" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-origin_num="22" data-biz_account_status="0" data-service_type="2" data-verify_status="2"></mp-common-profile></p></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="2247503755">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=be30a397&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247503755%26idx%3D1%26sn%3Dbd23c345d87a50bbfc833e442081843c">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 21 Nov 2025 12:03:00 +0800</pubDate>
    </item>
    <item>
      <title>VisionWeaver：从“现象识别”到“病因诊断”，开启AI视觉幻觉研究新篇章</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503701&amp;idx=1&amp;sn=6ca4ff76ca955db7350d14556e814b2c</link>
      <description>bilibili用户技术中心提出VisionWeaver及其核心诊断工具 VHBench-10，带来了创新性的视角。</description>
      <content:encoded><![CDATA[<p>
原创 <span>AI</span> <span>2025-11-14 12:01</span> <span style="display: inline-block;">上海</span>
</p>




<p><img src="https://wechat2rss.xlab.app/img-proxy/?k=45d01cbd&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1BMf5Ir754RJEHz8LhcpF96iaWNvHBzDcd1FgvJkfaKRDofO7cZlia4IK7mBhySG8RQCfcdS6j6IRiaybYz5woFdw%2F0%3Fwx_fmt%3Djpeg"/></p>

<p>bilibili用户技术中心提出VisionWeaver及其核心诊断工具 VHBench-10，带来了创新性的视角。</p>

<div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">前言</span></b></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">长久以来，我们只知道大型视觉语言模型（LVLM）会犯错，但始终缺乏一把“手术刀”，无法剖析其视觉感知的根源性缺陷。我们只知其然，不知其所以然。我们希望当 AI 模型观察图像时，不再凭空想象，不再“指鹿为马”。</span></p><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">现在，这一瓶颈被打破了。bilibili 用户技术中心提出 </span><strong style="box-sizing: border-box;"><span leaf="">VisionWeaver</span></strong><span leaf=""> 及其核心诊断工具 </span><strong style="box-sizing: border-box;"><span leaf="">VHBench-10</span></strong><span leaf="">，带来了创新性的视角。VisionWeaver 不再依赖单一编码器，而是开创性地提出“上下文感知路由网络”，动态协同多个“视觉专家” 。而这一切得以实现的基础，正是其专门打造的诊断基准 VHBench-10——它让幻觉研究从</span><strong style="box-sizing: border-box;"><span leaf="">“识别现象”迈向了“诊断病因”</span></strong><span leaf="">的新阶段。此工作已被 EMNLP 2025 Findings 录用。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">相关链接</span></b></p></div></div></div><p style="padding: 0px 8px;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">文章: </span><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);"><em style="box-sizing: border-box;"><span leaf=""><a href="https://arxiv.org/abs/2509.13836v1" target="_blank">https://arxiv.org/abs/2509.13836v1</a></span></em></span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">代码：</span><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);"><em style="box-sizing: border-box;"><span leaf=""><a href="https://github.com/whwangovo/VisionWeaver" target="_blank">https://github.com/whwangovo/VisionWeaver</a></span></em></span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">数据集：</span><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);"><em style="box-sizing: border-box;"><span leaf=""><a href="https://huggingface.co/datasets/whwangovo/VHBench_10" target="_blank">https://huggingface.co/datasets/whwangovo/VHBench_10</a></span></em></span></p></li></ul></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">论文介绍</span></b></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">大型视觉语言模型（LVLM）的“幻觉”问题是阻碍其应用的核心障碍。以往的评测方法（如POPE）虽然有价值，但普遍停留在</span><strong style="box-sizing: border-box;"><span leaf="">粗粒度</span></strong><span leaf="">层面，大多只关注“图片中是否存在某个物体”这类简单判断。这就像医生只知道病人发烧，却无法定位具体的病灶。这种“只知其然”的评测方式，无法揭示幻觉产生的根本原因，更无法为模型的改进提供针对性指导。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">为了解决这一核心痛点，本研究首先提出了全新的诊断工具——VHBench-10基准。</span></strong><span leaf="">它开创性地将幻觉问题溯源至检测、分割、定位、分类这四项基本视觉能力，并进一步细分为10个具体的子任务（如颜色、计数、文本识别等）。通过这个“精准CT扫描”，我们首次能够系统性地诊断出不同视觉编码器各自的“能力盲区”。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">基于这一深刻洞察，VisionWeaver架构应运而生。它不再是盲目地使用单一编码器，而是构建了一个动态专家协作系统，根据图像内容智能地调度最合适的视觉专家参与决策，从根源上抑制幻觉的产生。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020047" class="rich_pages wxw-img" data-ratio="0.5231481" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=abb93cb0&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RJEHz8LhcpF96iaWNvHBzDc9a9r8fjQd8aBwbicNuzBricmATibVX3R7ZW9r9RRKFkZx8TdFb8bECPCQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图1 VisionWeaver整体架构</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">我们的主要贡献点如下：</span></strong></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">提出了VHBench-10——一个革命性的精细化诊断基准，推动幻觉研究从“识别现象”迈向“诊断病因”。</span></strong><span leaf="">它首次将幻觉与底层视觉任务失败直接挂钩，为精确评估和定位LVLM的视觉能力短板提供了强有力的工具。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">系统性地揭示了不同视觉编码器的幻觉倾向。</span></strong><span leaf="">通过在VHBench-10上的全面评估，论文首次量化并证实了特定编码器在特定视觉任务上的优势与短板，为解决幻觉问题提供了明确的靶点。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">提出了VisionWeaver——一个强大的LVLM新架构。</span></strong><span leaf="">它引入上下文感知专家路由机制，能根据图像内容智能地聚合多个专家的视觉知识，效果远超简单的特征融合方法。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">在多个权威基准上取得了SOTA性能。</span></strong><span leaf="">大量实验表明，VisionWeaver不仅显著降低了幻觉率，还全面提升了模型的综合表现。</span></p></li></ol><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">方法概述</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">VisionWeaver 的核心是解决单一视觉编码器能力有限且存在固有偏见的问题 。简单地将多个编码器的特征相加或拼接，实验证明效果并不理想 。为此，VisionWeaver 设计了一套智能、动态的专家协作流程，主要包含两大模块：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">上下文感知路由 (Context-Aware Routing)： </span></strong><span leaf="">该机制旨在利用图像的全局语义特征来计算自适应的软路由权重，从而选择最合适的视觉专家 。具体而言，系统将基础 CLIP 编码器输出的[CLS] Token 特征作为路由模块的主要输入 。该 [CLS] Token 被证实能够有效捕获图像的关键全局视觉信息 。路由模块基于此特征生成一组路由信号，即针对每个下游专家编码器（如ConvNext, DINOv2, SAM, Vary等）的动态权重，以此决定不同专家在当前情境下的重要性得分 。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">知识增强与特征融合 (Knowledge Enhancement and Fusion)：</span></strong><span leaf=""> 获得各专家的重要性权重后，系统对所有专家的输出特征进行加权融合（Weighted Fusion），生成一个聚合的专家表征 。为了在引入专家知识的同时不损失原始的细粒度视觉信息，该聚合表征将与基础 CLIP 编码器输出的 Patch Tokens 进行对齐 。实现方式上，通过一个残差式连接（residual-style connection），将聚合的专家特征与原始的 Patch Tokens 进行加法操作 。最终，这份增强后的视觉表征被传递至投影器（Projector），以映射到大型语言模型（LLM）的嵌入空间中，供后续的文本生成使用 。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020046" class="rich_pages wxw-img" data-ratio="0.9639175" data-s="300,640" data-type="png" data-w="776" style="vertical-align:middle;max-width:100%;width:331px;box-sizing:border-box;height:319px;" src="https://wechat2rss.xlab.app/img-proxy/?k=529fd981&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RJEHz8LhcpF96iaWNvHBzDciaORJU9aiaycArCVFE9EWdbyvRaXTvfRgX2QNUvnpibyUmrfyFm0ZxRiaA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图2 VHBench-10将幻觉分为4大类10小类</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">关键特征</span></strong></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">精细化幻觉诊断： </span></strong><span leaf="">依托VHBench-10，从视觉任务根源诊断并解决幻觉问题。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">上下文感知路由： </span></strong><span leaf="">告别单一编码器，智能调度最适合当前任务的视觉专家。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">多专家协同融合：</span></strong><span leaf=""> 汇集不同编码器的独特优势，实现对图像的全方位、深层次理解。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">卓越的幻觉抑制能力：</span></strong><span leaf=""> 在多个基准上显著降低幻觉率，提升模型可靠性。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">高效推理设计： </span></strong><span leaf="">通过轻量级专家和KV缓存等机制，在不显著增加延迟的情况下提升性能。</span></p></li></ul></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">实验</span></b></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">全新的精细化幻觉评估</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">VHBench-10基准的核心并非简单地判断对错，而是通过对10个细分视觉任务的评估，精准定位模型在感知能力上的具体短板。团队利用GPT-4为近万张图片生成了包含特定类型错误的描述（例如，颜色错误、数量错误等），与正确的描述形成对比，从而精确量化模型在各个维度上的幻觉倾向。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">与已有方法的比较</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在VHBench-10以及POPE、AutoHallusion等多个幻觉基准测试中，VisionWeaver的表现全面超越了使用单一编码器或简单多编码器融合的方法。如下图所示，无论是在物体存在性、颜色、形状还是文本识别等所有10个细分任务上，VisionWeaver的错误率均为最低，证明了其架构的普适性和有效性。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020048" class="rich_pages wxw-img" data-ratio="1.0074074" data-s="300,640" data-type="png" data-w="1080" style="vertical-align:middle;max-width:100%;width:384px;box-sizing:border-box;height:387px;" src="https://wechat2rss.xlab.app/img-proxy/?k=31a2e457&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RJEHz8LhcpF96iaWNvHBzDcbicp3C9ll8Q5yruWpAGia0XNmyDfoA4n5EtIBxiaLz7Tprpnk3DXQlY9g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">图3 VisionWeaver在10类细分幻觉任务上均取得最低错误率</span></sup></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">总结</span></b></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">VisionWeaver及其核心评测工具VHBench-10，共同将幻觉研究的范式从模糊的现象描述，提升到了</span><strong style="box-sizing: border-box;"><span leaf="">病因诊断</span></strong><span leaf="">层面。它不再满足于“知道模型错了”，而是要探究“模型为什么会错”。通过VHBench-10提供的深刻洞察，VisionWeaver得以构建一个智能、动态的多专家协作系统，从视觉感知的根源上大幅缓解了幻觉问题。这一“诊断+治疗”的新范式，为构建更可靠、更精确的下一代多模态AI提供了坚实的基础和清晰的实现路径。</span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨Jerry酱、Kiren_</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">开发者问答</span></b></p></div></div></div><div style="text-align: center;padding: 0px 8px;font-size: 12px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">大家在用大模型的时候，有产生什么样的幻觉问题呢？</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">欢迎在留言区分享你的见解~</span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">转发本文至朋友圈并留言，即可参与</span><strong style="box-sizing: border-box;"><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;"><span leaf="">下方抽奖</span></span></strong><span style=""><strong style="box-sizing: border-box;"><span leaf="">⬇️</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">小编将抽取1位幸运的小伙伴获取</span><span style="text-decoration: underline;"><strong style="box-sizing: border-box;"><span leaf="">星星向龙系列卡套包</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">抽奖截止时间：11月21日12:00</span></strong></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(180, 176, 176);box-sizing: border-box;"><span leaf="">如果喜欢本期内容的话，欢迎点个“在看”吧！</span></span></p><p nodeleaf=""><mp-common-miniprogram class="js_uneditable custom_select_card mp_miniprogram_iframe" data-pluginname="insertminiprogram" data-miniprogram-path="pages/lucky/lottery/detail?id=8OfBwQ4G0z4" data-miniprogram-nickname="抽奖助手" data-miniprogram-avatar="http://mmbiz.qpic.cn/mmbiz_png/Vdys2e8jP1l1clbflznHYO7IRflCZWjPfD4NMn1Xqgr5gZbBy1qVc12cGVG1whLTXiafBT7kiaWRl38HCbqLnRzw/640?wx_fmt=png&amp;wxfrom=200" data-miniprogram-title="星星向龙系列卡包套" data-miniprogram-imageurl="http://mmbiz.qpic.cn/mmbiz_jpg/1BMf5Ir754RJEHz8LhcpF96iaWNvHBzDcbtibI9D3a0Fcn46nxGUqkoz1dibrhaRxEcSPXMjJ5IyO9TqABqGF0zZg/0?wx_fmt=jpeg" data-miniprogram-type="card" data-miniprogram-servicetype="0" data-miniprogram-appid="wx01bb1ef166cd3f4e" data-miniprogram-applink="#小程序://抽奖/WwLBECNT6kZ4hAg" data-miniprogram-imageurlback="http%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754RJEHz8LhcpF96iaWNvHBzDceehiaesgPeHM6hTicE0b4rMh8Wqx6uO1KBH4aEKL75ORYN9aibiaEV85qQ%2F0%3Fwx_fmt%3Dpng" data-miniprogram-cropperinfo="%7B%22c%22%3A%7B%22x%22%3A0%2C%22y%22%3A25%2C%22x2%22%3A245%2C%22y2%22%3A221%2C%22w%22%3A245%2C%22h%22%3A196%7D%7D"></mp-common-miniprogram></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">往期精彩指路</span></b></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><p style="text-align: justify;padding: 0px 8px;font-size: 13px;width: 100%;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 40px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503491&amp;idx=1&amp;sn=94972b8b0d82197532d6bdcfedd2ed42&amp;scene=21#wechat_redirect" textvalue="TextFlux重磅发布：告别复杂控制信号！多语种高保真场景文本编辑新时代" data-itemshowtype="0" linktype="text" data-linktype="2">TextFlux重磅发布：告别复杂控制信号！多语种高保真场景文本编辑新时代</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247500314&amp;idx=1&amp;sn=533ba2df818c33283992bba1b562ae17&amp;scene=21#wechat_redirect" textvalue="用多模态技术在多媒体系统中实现场景分类" data-itemshowtype="0" linktype="text" data-linktype="2">用多模态技术在多媒体系统中实现场景分类</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503446&amp;idx=1&amp;sn=05fba9a60da1133bf0e82aeeb1a06d1d&amp;scene=21#wechat_redirect" textvalue="AniSoraV3 正式开源，长视频创作智能体框架AniME技术揭秘" data-itemshowtype="0" linktype="text" data-linktype="2">AniSoraV3 正式开源，长视频创作智能体框架AniME技术揭秘</a></span></p></li></ul></p></div></div><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);"><p data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;color: rgb(62, 62, 62);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3289447926347317252#wechat_redirect" textvalue="通用工程" linktype="text" data-linktype="2">通用工程</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2390333109742534656#wechat_redirect" textvalue="大前端" linktype="text" data-linktype="2">大前端</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3297757408550699008#wechat_redirect" textvalue="业务线" linktype="text" data-linktype="2">业务线</a></span></span></p><p style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;color: rgb(62, 62, 62);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2329861166598127619#wechat_redirect" textvalue="大数据" linktype="text" data-linktype="2">大数据</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2782124818895699969#wechat_redirect" textvalue="AI" linktype="text" data-linktype="2">AI</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2532608330440081409#wechat_redirect" textvalue="多媒体" linktype="text" data-linktype="2">多媒体</a></span></span></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-index="0" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/300?wx_fmt=png&amp;wxfrom=19" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-origin_num="353" data-biz_account_status="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-index="1" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/300?wx_fmt=png&amp;wxfrom=19" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-origin_num="22" data-biz_account_status="0" data-service_type="2" data-verify_status="2"></mp-common-profile></p></div></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="2247503701">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=5774bd2a&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247503701%26idx%3D1%26sn%3D6ca4ff76ca955db7350d14556e814b2c">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 14 Nov 2025 12:01:00 +0800</pubDate>
    </item>
    <item>
      <title>B站基础安全在AI溯源方向的探索实践</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503693&amp;idx=1&amp;sn=3d65c30c986bc3c51f2f924b1ea5f158</link>
      <description>借助 AI 的能力来提升安全事件告警的处理效率，已经成为各大企业探索与实践的重要方向。</description>
      <content:encoded><![CDATA[<p>
原创 <span>AI</span> <span>2025-11-07 12:02</span> <span style="display: inline-block;">上海</span>
</p>




<p><img src="https://wechat2rss.xlab.app/img-proxy/?k=bfd3ee0d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1BMf5Ir754Q5HQkDs2nAH4kR9iaJ3PfbFcvJ7t7It58ibibQBzJfiby7v65bE3IXiaQsj2ReHGtZ82YBiaKHPYB3gofw%2F0%3Fwx_fmt%3Djpeg"/></p>

<p>借助 AI 的能力来提升安全事件告警的处理效率，已经成为各大企业探索与实践的重要方向。</p>

<div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">背景</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">安全事件告警自动化运营的演变</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在企业安全建设中，SIEM/SOC 的告警运营始终是不可或缺的核心环节。随着安全需求的不断提升，告警自动化运营经历了多个迭代阶段：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">人工查证阶段：运营人员需要在各类平台之间频繁切换，手动收集与比对信息；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">脚本驱动阶段：通过编写简单脚本实现部分告警处理的自动化，但灵活性有限；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">SOAR 阶段：引入编排化的剧本设计，能够串联多种安全工具与流程，实现更高程度的自动化。</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">虽然自动化能力在不断增强，但实际运营中仍需安全人员持续参与，对剧本进行调试和优化，以确保其适应复杂多变的威胁场景。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">AI的发展</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">随着 AI 技术的不断成熟，其在 自动编排、报告生成与智能分析 等方面展现出天然优势。借助 AI 的能力来提升安全事件告警的处理效率，已经成为各大企业探索与实践的重要方向。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">演变过程大致经历了以下几个阶段：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">大模型安全知识库搭建：沉淀安全规则与经验，为 AI 的智能化分析提供底层支撑；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">大模型告警解读分析：自动化理解告警内容，完成分类、归因与初步分析；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">大模型告警研判：在多源数据与上下文的支撑下，AI 逐步具备辅助安全人员进行告警定性与风险判断的能力。</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">近年来，随着 Claude 的 MCP（Model Context Protocol） 协议逐渐成为主流的 AI 与工具交互标准，基于 MCP 的 AI Agent 已经演变为连接 AI 与真实数据的关键桥梁。这种方式不仅提升了告警分析、研判的智能化程度，也让自动化溯源与安全运营更加契合企业内部的实际需求。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">人与平台交互的演变</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">最初，用户通过账号密码登录平台，在界面上逐步完成各类操作；随着平台开放程度的提高，API 的出现让机器能够直接调用数据和服务，OpenAPI极大地提升了交互的效率与自动化程度。随后，低代码平台的兴起又进一步降低了门槛，使非专业开发者也能以可视化、拖拽式的方式快速构建业务流程。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">而在当下，AI 正在重塑人与平台的交互方式。借助 MCP，大模型不仅仅是对话聊天，答疑助手，而是一个具备领域全面，专业性极强的智能体，通过增加记忆能力，管理上下文能力，自动解析意图、调用合适的工具集，便可完成复杂的业务闭环。这意味着交互正从 “人教机器做事” 向 “人与智能体协作” 转变，平台的可用性和智能化程度也因此迈入新的阶段。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">技术方案</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">发展</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">对于基础安全团队而言，我们同样经历了引入 AI 的逐步过程：从告警解读到告警研判，再到告警降噪。随着 MCP 协议逐渐被业界认可并采纳，基于 MCP 的 AI Agent 可以在告警降噪之后，在解读告警的同时关联内部多源数据，进一步完成对事件的溯源分析。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">工具准备与处理</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在溯源场景中，关键在于让 AI 能够接触并查询到企业内部平台的数据。安全团队通常会部署多种安全产品，例如 HIDS、WAF、EDR、IPS、蜜罐等。若希望实现 AI 自动化溯源，就需要借助 MCP 将 AI Agent 与这些安全设备能力对接，使其能够：</span></p><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-2"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">查询并关联 HIDS、WAF 等安全告警数据；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">访问内部资产信息；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">将结果映射和关联到人、IP、部门等维度。</span></p></li></ul><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">通过这种方式，AI 不仅能完成告警分析，还能自动串联攻击线索，最终实现更高程度的自动化溯源。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">方案设计</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">基于上述思路，我们的整体设计方案是将内部安全产品的 API 接口、内部资产接口和日志相关的查询接口转化为 AI 可调用的 MCP 工具集，供AI-Agent调用。目前，我们已完成对以下产品的转化与实现：</span></p></div><p style="text-align: center;box-sizing: border-box;"><table style="border-collapse:collapse;margin:0px;overflow-x:auto;min-width:299px;"><tbody><tr><td data-colwidth="274" style="border:1px solid rgb(193, 199, 208);padding:7px 10px;vertical-align:top;text-align:left;min-width:8px;background-color:#fffed5;"><p style="margin: 0px;padding: 0px;"><span leaf=""><span textstyle="" style="font-weight: bold;">安全产品</span></span></p></td><td style="border:1px solid rgb(193, 199, 208);padding:7px 10px;vertical-align:top;text-align:left;min-width:8px;background-color:#fffed5;"><p style="margin: 0px;padding: 0px;"><span leaf=""><span textstyle="" style="font-weight: bold;">MCP能力</span></span></p></td></tr><tr><td data-colwidth="274" style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">HIDS</span></p></td><td style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">资产信息：</span><span leaf="">IP</span><span leaf="">、H</span><span leaf="">ostname</span><span leaf="">、端口、进程、账户信息</span></p><p style="margin: 10px 0px 0px;padding: 0px;"><span leaf="">告警信息：异常登录、命令执行、暴力破解、后门检测、反弹</span><span leaf="">shell</span><span leaf="">等</span></p></td></tr><tr><td data-colwidth="274" style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">蜜罐</span></p></td><td style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">告警信息：告警时间、源目</span><span leaf="">IP</span><span leaf="">、源目端口、连接信息、登录使用的帐密信息</span></p></td></tr><tr><td data-colwidth="274" style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">CMDB</span></p></td><td style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">主机资产信息</span></p></td></tr><tr><td data-colwidth="274" style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">EDR</span></p></td><td style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">告警信息，用户资产信息</span></p></td></tr><tr><td data-colwidth="274" style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">日志平台</span></p></td><td style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">堡垒机登录、操作信息，SLB访问数据信息、DNS查询信息</span></p></td></tr><tr><td data-colwidth="274" style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">SIEM平台</span></p></td><td style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">告警汇总信息，告警详情信息</span></p></td></tr><tr><td data-colwidth="274" style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">SRC平台</span></p></td><td style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">漏洞工单信息，漏洞数量信息</span></p></td></tr><tr><td data-colwidth="274" style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">......</span></p></td><td style="border: 1px solid rgb(193, 199, 208);padding: 7px 10px;vertical-align: top;text-align: left;min-width: 8px;"><p style="margin: 0px;padding: 0px;"><span leaf="">......</span></p></td></tr></tbody></table></p><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">流程架构</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在实际工作中，告警信息通常会通过机器人推送到告警处置群。联合大模型智能体、企业微信机器人以及企业微信三方应用号，我们设计并实现了如下处理链路，以提升告警研判与溯源的效率：</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">安全产品产生告警</span></strong><span leaf=""> —— HIDS、蜜罐、EDR 等安全设备输出原始告警事件；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">流式处理</span></strong><span leaf=""> —— 通过实时流处理框架对告警进行过滤和汇总至安全SIEM平台；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">AI 研判降噪</span></strong><span leaf=""> —— AI Agent对告警进行解读与风险评估，实现告警降噪；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">机器人推送告警</span></strong><span leaf=""> —— 企业微信机器人将大模型研判为高危的告警推送至告警处置群；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">运营人员响应</span></strong><span leaf=""> —— 安全运营人员根据高危告警信息进行分析与处置；</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">AI 辅助溯源与自动处置（可选）</span></strong><span leaf=""> —— 运营人员借助大模型可进一步触发溯源流程，甚至自动完成处置动作。</span></p></li></ol><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这一架构使得告警处理流程既保留了人工判断的灵活性，又逐步引入 AI 的智能化能力，实现了“人机协同 + 自动化溯源”的目标。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">实践案例</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">prompt</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">对于集成了众多工具集的AI-Agent,prompt在大幅简化的情况下，仍能有很不错的溯源效果，比如下边例子中，我们给的prompt均为：</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">prompt</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">以下是我收到的安全告警详情，请帮我使用合适的工具进行溯源和分析：</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">{{ $input }}</span></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">溯源流程图</span></strong></p></div></div></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100020039" data-ratio="0.3871983" data-s="300,640" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-type="png" data-w="953" src="https://wechat2rss.xlab.app/img-proxy/?k=f5e1b809&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754Q5HQkDs2nAH4kR9iaJ3PfbF9Ughq57iaoTpBdksCPOCRGHxwr0Ax4AHGpxZnGc0taDeMpu2Yy30xhw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">蜜罐告警溯源分析</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">一次溯源分析流程，运营人员只需要点击告警卡片的AI溯源，即可触发大模型的溯源分析：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img class="rich_pages wxw-img" data-imgfileid="100020040" data-ratio="0.4305556" data-s="300,640" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" data-type="png" data-w="1080" src="https://wechat2rss.xlab.app/img-proxy/?k=4b42c949&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754Q5HQkDs2nAH4kR9iaJ3PfbFp2tZmTMMzkFgnr8CA59icuv9E7vicTqn4G4WHia4QWeIJrCF0Oobribicbg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">完整溯源结果如下，可见AI-Agent可自行搜索主机信息，关联堡垒机信息，找到命令执行人和执行的命令，并定位到触发告警的员工部门</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">告警溯源信息</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">溯源分析结果</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">攻击者信息</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 攻击者IP: 10.xxx.xxxx.35</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 主机名: js02-xxxs-xxx-01</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 操作系统: Debian GNU/Linux 11.2</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">堡垒机操作日志分析</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在告警发生时间（2025-08-28 07:56:06 UTC）前后1小时时间段内，发现攻击者IP 10.xxx.xxxx.35上有堡垒机操作记录：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 操作人: zhangxxx</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 操作时间: 2025-08-28 15:25:56 至 15:55:11（北京时间）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 操作命令: 包含多次  telnet 172.xx.xx.39 22  连接尝试，以及网络配置命令  mtu 1500  、  ifconfig  等</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 客户端IP: 10.xx.xx.79</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 用户部门: xx工程部-xxx部</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">HIDS检测结果</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">对攻击者主机10.xx.xx.35进行HIDS检测：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1. 进程信息: 主机运行了nginx、postgres、docker相关进程，未发现异常进程</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2. 端口信息: 开放了22(SSH)、80(HTTP)、5432(PostgreSQL)等常规服务端口</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">3. 异常登录: 未发现异常登录记录</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">4. 后门检测: 未发现后门程序</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">5. 反弹Shell: 未发现反弹Shell行为</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">攻击行为分析</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">根据蜜罐告警和堡垒机日志，攻击者通过TCP连接尝试访问蜜罐的22端口（SSH服务），并在同一时间段内通过堡垒机执行了多次telnet连接尝试，确认攻击行为来自用户zhangxxxxx的操作。</span></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">HIDS告警溯源分析</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">HIDS基于主机的告警类型比较多，此处我们用真实的例子，说明在命令执行场景中，借助MCP能力，大模型能够自行分析恶意进程，并关联HIDS的其他告警信息，最终给出行为分析和结论：</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">告警溯源信息</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">根据告警详情，这是一个HIDS告警，属于&#34;web命令执行&#34;类别。我将从HIDS检测的角度进行分析：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">HIDS告警分析报告</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">告警基本信息</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 告警类型: HIDS - web命令执行</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 告警等级: 中危</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 触发规则: [web命令执行]Java服务异常写文件</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 告警时间: 2025-09-07 11:51:36 UTC</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 主机名: nvm-xxxxx-14</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 操作系统: Linux (Debian GNU/Linux 11.6)</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">主机信息溯源</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 主机名: nvm-xxxxx-14</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- IP地址: 10.xxx.xx.41 (主要IP)</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 连接IP: 10.xxx.xx.13</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 操作系统: Debian GNU/Linux 11.6</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 所属业务组: xx技术中心</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 云平台: OpenStack Nova虚拟机</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">用户信息溯源</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 操作用户: root (UID: 0)</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 最后登录用户: zhuxxxjie (朱xx)</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 用户部门: xx技术中心-xx研发组</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 最后登录时间: 2025-09-07 00:52:53</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 登录来源: 10.xxx.xx.18 (通过SSH)</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">进程信息分析</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">主机运行的主要进程包括：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- sshd: SSH服务进程，开放22端口</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- java: Jenkins agent进程，连接至 <a href="http://xxx.bilibili.co/xxx/" target="_blank">http://xxx.bilibili.co/xxx/</a></span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- node_exporter: Prometheus监控进程，开放9100端口</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- titanagent/titan_monitor: 安全监控agent</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- chronyd: 时间同步服务</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 常规系统进程: systemd, cron, rsyslogd等</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">命令执行分析</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">触发告警的命令:</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">node /usr/local/bin/claude -p /data/soft/ClaudeCodeReviewPrompt/java.txt</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">执行的bash脚本内容:</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 创建shell快照文件   /root/.claude/shell-snapshots/snap17067224-n3plkv.sh  </span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 使用base64编码/解码函数定义</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 使用eval执行动态代码</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 设置PATH环境变量包含多个Java和Node.js路径</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">安全检测结果</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">1. 进程检测: 未发现异常进程，均为系统正常服务进程</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">2. 端口检测: 仅开放22(SSH)和9100(node_exporter)端口，无异常端口</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">3. 账户检测: 系统账户状态正常，root账户有堡垒机SSH密钥授权</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">4. 异常登录: 未发现异常登录记录</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">5. 后门检测: 未发现后门程序</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">6. 反弹Shell: 未发现反弹Shell行为</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">攻击行为分析</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">根据HIDS检测和命令分析，该告警由Claude代码审查工具触发：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 执行上下文: Node.js执行的Claude代码审查工具</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 行为特征: 创建shell环境快照文件，涉及动态代码加载和文件操作</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 风险等级: 中危 - root权限下执行包含eval和base64操作的脚本</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 关联信息: 该操作为代码审查工具的正常功能，但触发了HIDS的web命令执行检测规则</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">该告警属于误报情况，是开发工具的正常操作触发了安全检测规则。</span></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">EDR告警溯源分析</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">对于EDR的告警，我们更加聚焦于员工的行为分析，以某位员工终端设备疑似被病毒感染的告警为例：</span></p></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><div style="text-align: justify;padding: 0px 8px;width: 100%;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">告警溯源信息</span></strong></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">根据EDR告警信息，我为您进行溯源分析：</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">用户信息溯源</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 用户名：xxx（徐xx）</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 所属部门：xxx发行部-xxxx项目组</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">设备信息溯源</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 主机名：WIN-xxxxxx</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- IP地址：10.xxx.xxx.151（主要IP），10.xx.xxx.69</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 操作系统：Windows 10</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 办公区域：国正</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">恶意文件信息</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 文件名：hitokoto_api.exe</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 文件路径：C:/Program/Data/Autodesk/Application/Pluginsng/skintools2Contents/scripts/ngSkinTools2api/hitokoto_api.exe</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- MD5：7f1a37388876e4b6eac5609cab534a56</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 病毒类型：Win32.Trojan.Agent.ckjl (aiScore=h)</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">- 发现时间：2025-09-05 15:33:23</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">关联信息</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">该恶意文件位于Autodesk 3D建模软件插件目录下，具体路径为ngSkinTools2（Maya皮肤工具插件）的API文件夹中。hitokoto_api.exe文件名暗示可能与&#34;一言&#34;API相关，但实际为特洛伊木马程序，疑似通过Autodesk相关软件或插件进行伪装植入。该IP地址历史使用记录显示，当前用户xxxxx从2025年8月11日开始使用此IP地址。</span></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">可见大模型可根据提供的MCP工具，自行查询并给出用户信息，包含用户名，部门、操作系统，办公区域等，并在关联分析中，给出员工从8月11日开始使用该IP，且因为使用了带病毒的Autodesk 3D建模插件，触发了EDR告警。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">AI提效</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">通过半年的探索实践，以HIDS告警比较多的命令执行为例，以往人工研判的告警每天大概30条左右，接入大模型后，需人工研判的数量下降到了1-3条，降噪率平均约93.33%，对于降噪后的告警，结合AI的自动化溯源分析，大大提升了运营人员的安全问题排查效率。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">未来畅想</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">基于上述实践，我们认为未来的安全产品与安全设备在交付时，将不仅仅局限于提供传统的OpenAPI 接口，还会同时向客户开放基于 MCP 的工具集。借助大模型能力的延伸，用户可以直接将安全产品与自身的大模型平台对接，实现更自然的交互与更高效的使用体验。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">这种模式将显著提升客户在告警关联分析与自动化安全运营方面的效率，使安全产品从“单点能力输出”转变为“智能化协同伙伴”，帮助企业更好地应对复杂多变的安全威胁。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">总结</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">通过本次在 B 站基础安全体系中的探索实践可以看到，AI 已经不再只是辅助告警分析的“锦上添花”，而是逐步演变为推动告警运营自动化与溯源智能化的核心引擎。从告警解读、研判到降噪，再到与内部安全数据的深度关联，AI-Agent 借助 MCP 协议真正成为了连接安全产品能力与智能分析的桥梁。</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在实践案例中，无论是蜜罐、HIDS，还是 EDR 的告警，AI 都能够在具备足够上下文和工具集的前提下，完成从事件追踪、行为分析到责任主体定位的完整溯源链路。这不仅显著提升了运营人员的效率，也推动了“人机协同 + 自动化溯源”的落地。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">展望未来，随着 MCP 工具集逐渐成为安全产品的标配，AI 在安全运营中的价值将进一步释放。安全部门能够在更短的时间、更低的成本、更高的准确性下完成告警处置与溯源，为企业抵御日益复杂的安全威胁提供坚实保障。</span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨zhiye</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">开发者问答</span></b></p></div></div></div><div style="text-align: center;padding: 0px 8px;font-size: 12px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">对于网络安全&amp;大模型的探索，大家还有哪些落地实践？</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">欢迎在留言区分享你的见解~</span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">转发本文至朋友圈并留言，即可参与</span><strong style="box-sizing: border-box;"><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;"><span leaf="">下方抽奖</span></span></strong><span style=""><strong style="box-sizing: border-box;"><span leaf="">⬇️</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">小编将抽取1位幸运的小伙伴获取</span><span style="text-decoration: underline;"><strong style="box-sizing: border-box;"><span leaf="">宝可梦徽章（随机款）</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">抽奖截止时间：11月14日12:00</span></strong></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(180, 176, 176);box-sizing: border-box;"><span leaf="">如果喜欢本期内容的话，欢迎点个“在看”吧！</span></span></p><p nodeleaf=""><mp-common-miniprogram class="js_uneditable custom_select_card mp_miniprogram_iframe" data-pluginname="insertminiprogram" data-miniprogram-path="pages/lucky/lottery/detail?id=8O3WN2SxBH6" data-miniprogram-nickname="抽奖助手" data-miniprogram-avatar="http://mmbiz.qpic.cn/mmbiz_png/Vdys2e8jP1l1clbflznHYO7IRflCZWjPfD4NMn1Xqgr5gZbBy1qVc12cGVG1whLTXiafBT7kiaWRl38HCbqLnRzw/640?wx_fmt=png&amp;wxfrom=200" data-miniprogram-title="宝可梦徽章（随机款）" data-miniprogram-imageurl="http://mmbiz.qpic.cn/mmbiz_jpg/1BMf5Ir754Q5HQkDs2nAH4kR9iaJ3PfbFYrHviaKMlvsAVxPKYRjMBLNng14r34zp6mBV0rXG2iaQPJMpTc20635Q/0?wx_fmt=jpeg" data-miniprogram-type="card" data-miniprogram-servicetype="0" data-miniprogram-appid="wx01bb1ef166cd3f4e" data-miniprogram-applink="#小程序://抽奖/uUzw1po9SMxc01w" data-miniprogram-imageurlback="http%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754Q5HQkDs2nAH4kR9iaJ3PfbFZbNvZlRmMX3pSqxEicahAU6Q5iaQzibt7Yd002ibOrbhE4TIZAorqch9Hw%2F0%3Fwx_fmt%3Dpng" data-miniprogram-cropperinfo="%7B%22c%22%3A%7B%22x%22%3A0%2C%22y%22%3A25%2C%22x2%22%3A245%2C%22y2%22%3A221%2C%22w%22%3A245%2C%22h%22%3A196%7D%7D"></mp-common-miniprogram></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">往期精彩指路</span></b></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><p style="text-align: justify;padding: 0px 8px;font-size: 13px;width: 100%;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 40px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247500098&amp;idx=1&amp;sn=dc84c7516862c827a9f488e3450575c3&amp;scene=21#wechat_redirect" textvalue="B站安全开发流程落地实践" data-itemshowtype="0" linktype="text" data-linktype="2">B站安全开发流程落地实践</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247502853&amp;idx=1&amp;sn=cd742d5d59f45a684decf0c3af381c25&amp;scene=21#wechat_redirect" textvalue="大模型时代：AI 网关的智能连接与场景对接" data-itemshowtype="0" linktype="text" data-linktype="2">大模型时代：AI 网关的智能连接与场景对接</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503364&amp;idx=1&amp;sn=f9f058066a52979ae03540b90b0780af&amp;scene=21#wechat_redirect" textvalue="B站模型训练存储加速实践" data-itemshowtype="0" linktype="text" data-linktype="2">B站模型训练存储加速实践</a></span></p></li></ul></p></div></div><p style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;color: rgb(62, 62, 62);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;outline: 0px;font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);" data-pm-slice="0 0 []"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;outline: 0px;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3289447926347317252#wechat_redirect" textvalue="通用工程" linktype="text" data-linktype="2">通用工程</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;outline: 0px;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2390333109742534656#wechat_redirect" textvalue="大前端" linktype="text" data-linktype="2">大前端</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;outline: 0px;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3297757408550699008#wechat_redirect" textvalue="业务线" linktype="text" data-linktype="2">业务线</a></span></span></p><p style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;color: rgb(62, 62, 62);font-family: &#34;PingFang SC&#34;, system-ui, -apple-system, BlinkMacSystemFont, &#34;Helvetica Neue&#34;, &#34;Hiragino Sans GB&#34;, &#34;Microsoft YaHei UI&#34;, &#34;Microsoft YaHei&#34;, Arial, sans-serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;outline: 0px;font-size: 13px;letter-spacing: 4px;text-align: center;background-color: rgb(255, 255, 255);"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;outline: 0px;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2329861166598127619#wechat_redirect" textvalue="大数据" linktype="text" data-linktype="2">大数据</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;outline: 0px;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2782124818895699969#wechat_redirect" textvalue="AI" linktype="text" data-linktype="2">AI</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;outline: 0px;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;outline: 0px;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2532608330440081409#wechat_redirect" textvalue="多媒体" linktype="text" data-linktype="2">多媒体</a></span></span></p><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/0?wx_fmt=png" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-service_type="1" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-from="0" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/0?wx_fmt=png" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-service_type="2" data-verify_status="2"></mp-common-profile></p></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="2247503693">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=2bf65f5e&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247503693%26idx%3D1%26sn%3D3d65c30c986bc3c51f2f924b1ea5f158">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 07 Nov 2025 12:02:00 +0800</pubDate>
    </item>
    <item>
      <title>RIVAL：面向机器翻译的迭代对抗强化学习</title>
      <link>https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247503686&amp;idx=1&amp;sn=fb40d52cc0b3be6fee309aa932a1f4fa</link>
      <description>本文提出 RIVAL 框架，通过对抗式迭代优化解决了RLHF在口语字幕翻译中的分布偏移问题。</description>
      <content:encoded><![CDATA[<p>
原创 <span>AI</span> <span>2025-10-31 12:04</span> <span style="display: inline-block;">上海</span>
</p>




<p><img src="https://wechat2rss.xlab.app/img-proxy/?k=58ac3964&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2F1BMf5Ir754TwYty6lLz4xEw9Sb1zse5icxSUUlpL1EcLYjHPFmsKiahrvaIbibR8IWHiaw8yP3E7FaubMIWkpNLPbw%2F0%3Fwx_fmt%3Djpeg"/></p>

<p>本文提出 RIVAL 框架，通过对抗式迭代优化解决了RLHF在口语字幕翻译中的分布偏移问题。</p>

<div style="box-sizing: border-box;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);" data-pm-slice="0 0 []"><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">一、概述</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">本文提出 RIVAL（Reinforcement Learning with Iterative and Adversarial Optimization），一种针对机器翻译（MT）的迭代对抗强化学习框架。我们发现基于人类反馈的强化学习（RLHF）在口语化字幕翻译任务中表现不佳，主要是因为奖励模型（RM）与翻译模型（LLM）之间存在分布偏移，导致训练失效。RIVAL通过以下创新解决该问题：</span></p><ol style="list-style-type: decimal;box-sizing: border-box;padding-left: 20px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">对抗博弈机制：将RM与LLM的优化过程建模为最小化-最大化博弈，RM负责区分强弱翻译，LLM负责优化弱翻译，以缩小与强翻译的质量差距。</span></p></li><li style="box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">双奖励设计：结合语义对齐的定性偏好奖励与定量偏好奖励（如：BLEU分数），提升迭代强化学习训练的稳定性与泛化性。</span></p></li></ol><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">实验表明，RIVAL在口语字幕和WMT数据集上显著优于监督微调（SFT）和专用翻译模型（如：Tower-7B-v0.2），同时保持跨语言泛化能力。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">论文已被EMNLP 2025收录，链接：</span><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;color: rgb(12, 182, 242);"><em style="box-sizing: border-box;"><span leaf=""><a href="https://arxiv.org/abs/2506.05070" target="_blank">https://arxiv.org/abs/2506.05070</a></span></em></span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">二、动机</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">大语言模型（LLM）在多任务中展现出突破性能力，其强大的多语言理解与生成能力为MT提供了新范式。大部分研究是基于极大似然估计的SFT，这种方法容易受到暴露偏差的影响，导致错误累积与翻译质量退化。同时，有限的句子级上下文建模能力难以保证全局连贯性。所以另一种可选的方案是RLHF。当前MT研究主要聚焦于正式的书面语，而口语化字幕翻译面临独特挑战：口语化字幕具有高度非正式性（如俚语、语气词、语法省略）、结构松散及多领域混杂性等特点，在真实场景中缺乏高质量平行语料，传统依赖人工标注的评估方法（如BLEU）在语义对齐优先的场景中失效。为填补这一空白，我们首次构建了大规模口语化字幕数据集，并尝试应用RLHF优化翻译质量。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们在探索LLM在机器翻译中的应用时，发现使用RLHF优化口语化字幕翻译任务的效果不佳。具体示例如下：LLM对源文本翻译完成后，又额外补充了“It&#39;s ok! It&#39;s great!”的正向翻译，但源文本中并没有对应的原文。这种“投机行为”导致翻译失真，违背语义忠实性原则，是典型的Reward Hacking问题。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020003" class="rich_pages wxw-img" data-ratio="0.3741794" data-s="300,640" data-type="png" data-w="914" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=e6ea7345&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TwYty6lLz4xEw9Sb1zse5ic3FEz5cELjqicGz2Xq8kT5wTcfnqiaXV6xXhiahCg0JhwDr5XWkm3iczc1Q%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">Reward Hacking示例</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">为了探究出现Reward Hacking的原因，我们对比了RM与GPT-4o的评分差异。我们发现RM的评分差（强翻译-弱翻译）持续下降：随着LLM优化，评分差越来越大，RM误判弱翻译的质量越来越好。然而，GPT-4o的评分差先降后升，表明真实的弱翻译质量先因初始正确的奖励信号不断提升，后因翻译模型过拟合RM而偏离真实的质量评分。追溯其根本原因，离线RM是基于初始的弱翻译训练得到的，无法适应LLM优化过程中数据的分布偏移，导致给出的奖励信号失效。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020004" class="rich_pages wxw-img" data-ratio="0.4898148" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=07da05de&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TwYty6lLz4xEw9Sb1zse5icYto7tWvJpa5ibsySh4vkwXxOU4Ccuv088hLiaXDg9Rp6kukO4eJyGygQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">RM和GPT-4o对强弱翻译的评分差</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">受生成对抗网络（GAN）的启发，我们提出RIVAL框架：将RM与LLM的优化过程建模为最小化-最大化博弈，二者可通过博弈共同进化，离线RM被转化为在线RM，从而避免数据分布偏移问题。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">三、</span></strong><strong style="box-sizing: border-box;"><span leaf="">方法</span></strong></p></div></div></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.1 RIVAL框架：对抗式迭代优化范式</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">RIVAL框架将传统RLHF的两阶段训练重构为RM与LLM的对抗博弈。其核心思想源自GAN的生成-判别机制，形式化为以下最小化-最大化目标：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020002" class="rich_pages wxw-img" data-ratio="0.0703704" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=00a47fbc&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TwYty6lLz4xEw9Sb1zse5icadvb33icSCCvw9hmT5UjNFs8Zu1qicLLkqDubWckepwDkxovVJ0ibBd5g%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">其中，r_Phi是奖励模型，作为判别器来区分强弱翻译，pi_theta是翻译模型，作为生成器逼近来强翻译分布P_strong，pi_ref是参考模型，即初始化的模型，通过KL散度约束防止模型过度偏移。通过不断地迭代优化，并且利用当前轮的LLM构造RM的训练数据，RM能够有效地学习并适应新的数据分布。同时，LLM也能在准确的奖励信号监督下不断探索新的动作空间，从而逐渐变成强翻译模型。RIVAL框架的示意图如下：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020006" class="rich_pages wxw-img" data-ratio="0.5453446" data-s="300,640" data-type="png" data-w="827" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=e9462168&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TwYty6lLz4xEw9Sb1zse5icjbGuyXkLXBaeb0KCncyicFUgia9NicX4lia0nOd7IaVbKkkErib8TAfGwyA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">RIVAL框架</span></sup></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.2 RM和LLM优化</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在RM优化时，固定LLM的参数，其优化目标简化为：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020005" class="rich_pages wxw-img" data-ratio="0.0824074" data-s="300,640" data-type="png" data-w="1080" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=491c31a3&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TwYty6lLz4xEw9Sb1zse5icNZGpC5dPetTYUswLuWlnlA2GffkwfMvTmLx5L3RSR01eAaYLtmugUA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">其中，x 是输入的源文本，y_strong是GPT-4o生成的强翻译，y_weak是当前LLM生成的弱翻译。其物理含义为尽可能增大强弱翻译之间的差距，损失函数的形式为rank loss。在本文中，我们将其命名为定性的偏好损失。此外，在每一轮的迭代训练中，我们不仅只利用当前轮LLM生成的弱翻译，也会回放历史轮数据，来增强数据的多样性以及防止数据分布偏移。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">相似地，LLM优化时，我们需要固定RM的参数。其优化目标被简化为：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020008" class="rich_pages wxw-img" data-ratio="0.1028226" data-s="300,640" data-type="png" data-w="992" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=e607214d&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TwYty6lLz4xEw9Sb1zse5icMOwOdC2dH2ibDOpOLpicmNVzBsuC40c9Qz1HSIib4zDDj0exCwtSOOLjA%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">其物理含义为尽可能最大化RM给出的奖励分数。我们采用GRPO算法来优化LLM模型。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: left;box-sizing: border-box;"><div style="display: inline-block;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;text-align: center;font-size: 18px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">3.3 结合定量偏好奖励</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">由于翻译任务的动作探索空间比较大，在GRPO训练中，只依赖定性偏好奖励可能会导致训练不稳定。另外，考虑到计算开销，我们设计了多头RM，一个输出头用来预测定性偏好奖励，另一个输出头用来预测定量偏好奖励，例如：BLEU分数。所以，最终我们的RM损失函数除来上述介绍的rank loss，还包含了对BLEU分数预测的mae loss。具体形式如下：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020007" class="rich_pages wxw-img" data-ratio="0.1420765" data-s="300,640" data-type="png" data-w="732" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=40824539&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TwYty6lLz4xEw9Sb1zse5ictQn2MufLGHDFqVZUWibh0C0gBS4Khu08tYFssVnXRFBxBCdticc30ukw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">详细的算法流程图如下：</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: auto;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020010" class="rich_pages wxw-img" data-ratio="1.8837838" data-s="300,640" data-type="png" data-w="370" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=a66fe942&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TwYty6lLz4xEw9Sb1zse5icQIAdiamZ6tFzuyELwRsYic3O2zN3ibQk4Zloxvibq57IuH91mfJrlVqlJg%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">RIVAL算法流程图</span></sup></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">四、</span></strong><strong style="box-sizing: border-box;"><span leaf="">实验</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">我们在自建的口语字幕数据集和WMT标准数据集上验证RIVAL框架的有效性。针对两个任务的特性，我们选用了不同的评估指标：口语字幕任务采用GPT-4o多维度评分（准确性、完整性、连贯性、风格一致性）和COMETKiwi指标，因为更侧重语义对齐而非字面匹配；WMT任务则同时使用BLEU和COMETKiwi，以兼顾词汇忠实度与语义充分性。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">在口语字幕翻译任务中，RIVAL框架展现出显著优势。仅使用定性偏好奖励的RIVAL-Iter1模型在GPT-4o评估中达到3.68的平均分，较基线模型提升5.5%，COMETKiwi指标同步改善至66.27。然而，迭代至第三轮时GPT-4o的评分出现回落（平均分3.53），表明纯定性偏好奖励在开放空间中的优化方向存在不稳定性。WMT翻译任务的实验进一步验证了双奖励机制的必要性。当引入定量偏好奖励（BLEU）后，RIVAL-Iter2-Qual+Quant在英中和中英翻译任务上的BLEU分数和COMETKiwi指标都优于使用单独的定性偏好奖励优化的模型。这种提升源于双奖励的协同作用：定量奖励锚定词汇对齐，定性奖励保障语义质量。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020009" class="rich_pages wxw-img" data-ratio="0.5178082" data-s="300,640" data-type="png" data-w="730" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=fa908b68&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TwYty6lLz4xEw9Sb1zse5icohfLj4yCaMtPNdTXXVfJYUNVLlCYXVsvhsVdfw7MpDickR4VstSmHXw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020011" class="rich_pages wxw-img" data-ratio="1.12" data-s="300,640" data-type="png" data-w="575" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=398d07b7&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TwYty6lLz4xEw9Sb1zse5ic5bSdlUONbu9c6CCTproib9w6wEgfTicaCH6YXQ29k5VzhzXCBqx3iaaaw%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="text-align: center;box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><sup style="box-sizing: border-box;"><span leaf="">RIVAL框架在字幕翻译和WMT翻译任务上的效果</span></sup></p></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">在跨语言泛化性测试中，RIVAL展现出优于SFT的鲁棒性。以医疗领域的中德翻译为例，SFT模型在OOD场景下COMETKiwi降至49.15，显著低于原始模型（52.58），而RIVAL-Iter1仍保持53.42的优异表现，甚至在部分OOD任务上超越原始模型，证明其通过探索有效翻译策略而非模式记忆实现泛化。</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">我们也画了后两轮迭代过程中RM和GPT-4o对强弱翻译的评分差，从图中可以看到，RIVAL通过对抗机制将评分差稳定维持在较小范围，有效缓解了奖励模型与翻译模型间的分布偏移问题。</span></p></div><div style="text-align: center;margin-top: 10px;margin-bottom: 10px;line-height: 0;box-sizing: border-box;"><p style="max-width: 100%;vertical-align: middle;display: inline-block;line-height: 0;width: 100%;box-sizing: border-box;" nodeleaf=""><img data-imgfileid="100020012" class="rich_pages wxw-img" data-ratio="0.3178733" data-s="300,640" data-type="png" data-w="884" style="vertical-align: middle;max-width: 100%;width: 100%;box-sizing: border-box;" src="https://wechat2rss.xlab.app/img-proxy/?k=84935b3a&amp;u=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TwYty6lLz4xEw9Sb1zse5icXicqtgvcSLgIU8To1WCciaTTw9tWzeC419Kic9L4KuEZvyZW3AKWFWcoQ%2F640%3Fwx_fmt%3Dpng%26from%3Dappmsg"/></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">五、总结</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">本文提出 RIVAL 框架，通过对抗式迭代优化解决了RLHF在口语字幕翻译中的分布偏移问题。RIVAL将LLM和RM的优化建模为最小化-最大化博弈：RM最大化强弱翻译评分差距，LLM缩小与强翻译质量差距，并创新引入双奖励机制使得训练更稳定。我们在口语字幕翻译任务和WMT英中翻译任务中，验证了RIVAL方法相较基线、SFT模型和专用翻译模型的优越性。此外，RIVAL在OOD测试中的性能也超越SFT，证明其通过探索有效策略避免灾难性遗忘。尽管迭代上限与计算成本仍需优化，但该框架为机器翻译甚至后训练方法提供了兼具理论创新与实用价值的新范式。</span></p></div><div style="margin-top: 10px;margin-bottom: 10px;text-align: center;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;padding-left: 10px;box-sizing: border-box;"><div style="border-bottom: 1px dashed rgb(0, 0, 0);padding-left: 5px;font-size: 20px;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">参考文献</span></strong></p></div></div></div><div style="padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[1] Ouyang L, Wu J, Jiang X, et al. Training language models to follow instructions with human feedback[J]. Advances in neural information processing systems, 2022, 35: 27730-27744.</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[2] Luo W, Li H, Zhang Z, et al. Sambo-rl: Shifts-aware model-based offline reinforcement learning[J]. arXiv preprint arXiv:2408.12830, 2024.</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[3] Goodfellow I J, Pouget-Abadie J, Mirza M, et al. Generative adversarial nets[J]. Advances in neural information processing systems, 2014, 27.</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[4] Shao Z, Wang P, Zhu Q, et al. Deepseekmath: Pushing the limits of mathematical reasoning in open language models[J]. arXiv preprint arXiv:2402.03300, 2024.</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[5] Achiam J, Adler S, Agarwal S, et al. Gpt-4 technical report[J]. arXiv preprint arXiv:2303.08774, 2023.</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[6] Rei R, Treviso M, Guerreiro N M, et al. CometKiwi: IST-unbabel 2022 submission for the quality estimation shared task[J]. arXiv preprint arXiv:2209.06243, 2022.</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[7] Shoeybi M, Patwary M, Puri R, et al. Megatron-lm: Training multi-billion parameter language models using model parallelism[J]. arXiv preprint arXiv:1909.08053, 2019.</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[8] Sheng G, Zhang C, Ye Z, et al. Hybridflow: A flexible and efficient rlhf framework[C]//Proceedings of the Twentieth European Conference on Computer Systems. 2025: 1279-1297.</span></p><p style="word-break: break-all;margin: 0px 0px 15px;white-space: normal;padding: 0px;box-sizing: border-box;"><span leaf="">[9] Guo D, Yang D, Zhang H, et al. Deepseek-r1: Incentivizing reasoning capability in llms via reinforcement learning[J]. arXiv preprint arXiv:2501.12948, 2025.</span></p><p style="word-break: break-all;white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">[10] Alves D M, Pombal J, Guerreiro N M, et al. Tower: An open multilingual large language model for translation-related tasks[J]. arXiv preprint arXiv:2402.17733, 2024.</span></p></div><div style="text-align: center;font-size: 12px;color: rgb(160, 160, 160);padding: 0px 8px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">-End-</span></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf="">作者丨Index MT Team</span></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">开发者问答</span></b></p></div></div></div><div style="text-align: center;padding: 0px 8px;font-size: 12px;box-sizing: border-box;"><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(255, 102, 149);box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">除了机器翻译，你觉得对抗式强化学习还能解决LLM在哪些任务上的&#34;投机行为&#34;问题？</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">欢迎在留言区分享你的见解~</span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">转发本文至朋友圈并留言，即可参与</span><strong style="box-sizing: border-box;"><span style="text-decoration: underline;text-decoration-style: solid;text-decoration-color: rgb(0,0,0);text-decoration-thickness: 2px;"><span leaf="">下方抽奖</span></span></strong><span style=""><strong style="box-sizing: border-box;"><span leaf="">⬇️</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf="">小编将抽取1位幸运的小伙伴获取</span><span style="text-decoration: underline;"><strong style="box-sizing: border-box;"><span leaf="">宝可梦徽章（随机款）</span></strong></span></p><p style="word-break: break-all;margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><strong style="box-sizing: border-box;"><span leaf="">抽奖截止时间：11月7日12:00</span></strong></p><p style="word-break: break-all;margin: 0px;padding: 0px;box-sizing: border-box;"><span style="color: rgb(180, 176, 176);box-sizing: border-box;"><span leaf="">如果喜欢本期内容的话，欢迎点个“在看”吧！</span></span></p><p nodeleaf=""><mp-common-miniprogram class="js_uneditable custom_select_card mp_miniprogram_iframe" data-pluginname="insertminiprogram" data-miniprogram-path="pages/lucky/lottery/detail?id=8NSeUL953GU" data-miniprogram-nickname="抽奖助手" data-miniprogram-avatar="http://mmbiz.qpic.cn/mmbiz_png/Vdys2e8jP1l1clbflznHYO7IRflCZWjPfD4NMn1Xqgr5gZbBy1qVc12cGVG1whLTXiafBT7kiaWRl38HCbqLnRzw/640?wx_fmt=png&amp;wxfrom=200" data-miniprogram-title="宝可梦徽章（随机款）" data-miniprogram-imageurl="http://mmbiz.qpic.cn/mmbiz_jpg/1BMf5Ir754TwYty6lLz4xEw9Sb1zse5icgXmVNWe2AHTJCyeMBg41ianiaBAd7QEslwsBo1WTEVKdzOCaxK4sPBJA/0?wx_fmt=jpeg" data-miniprogram-type="card" data-miniprogram-servicetype="0" data-miniprogram-appid="wx01bb1ef166cd3f4e" data-miniprogram-applink="#小程序://抽奖/eRm5Vz7kTDLcPLf" data-miniprogram-imageurlback="http%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2F1BMf5Ir754TwYty6lLz4xEw9Sb1zse5icKZYZVLE8m1uz8CMo1WMhX1csma77icSVqyPzVUTMEQX6ZmpwCrN0j4w%2F0%3Fwx_fmt%3Dpng" data-miniprogram-cropperinfo="%7B%22c%22%3A%7B%22x%22%3A0%2C%22y%22%3A25%2C%22x2%22%3A245%2C%22y2%22%3A221%2C%22w%22%3A245%2C%22h%22%3A196%7D%7D"></mp-common-miniprogram></p></div><div style="text-align: center;justify-content: center;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;box-sizing: border-box;"><div style="display: inline-block;vertical-align: top;width: auto;align-self: flex-start;flex: 0 0 auto;border-style: solid;border-width: 0px 0px 1px;border-color: rgb(30, 88, 134);min-width: 5%;max-width: 100%;height: auto;padding: 5px;box-sizing: border-box;"><div style="text-align: justify;color: rgb(12, 182, 242);box-sizing: border-box;"><p style="white-space: normal;margin: 0px;padding: 0px;box-sizing: border-box;"><b style="box-sizing: border-box;"><span leaf="">往期精彩指路</span></b></p></div></div></div><div style="text-align: left;justify-content: flex-start;display: flex;flex-flow: row nowrap;margin: 5px 0px 10px;width: 100%;align-self: flex-start;background-color: rgba(234, 244, 255, 0.34);padding: 25px;height: auto;box-sizing: border-box;"><div style="transform: translate3d(-5px, 0px, 0px);-webkit-transform: translate3d(-5px, 0px, 0px);-moz-transform: translate3d(-5px, 0px, 0px);-o-transform: translate3d(-5px, 0px, 0px);width: 100%;box-sizing: border-box;"><p style="text-align: justify;padding: 0px 8px;font-size: 13px;width: 100%;box-sizing: border-box;"><ul style="list-style-type: disc;box-sizing: border-box;padding-left: 40px;list-style-position: outside;" class="list-paddingleft-1"><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247499667&amp;idx=1&amp;sn=380b7ddd0beb06e442c831c4d976f0fd&amp;scene=21#wechat_redirect" textvalue="Introducing Index-1.9B" data-itemshowtype="0" linktype="text" data-linktype="2">Introducing Index-1.9B</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px 0px 15px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247500484&amp;idx=1&amp;sn=d1248740ad3731c943aa001d840213ac&amp;scene=21#wechat_redirect" textvalue="B站开源长文本大模型：我很小但很能“装”" data-itemshowtype="0" linktype="text" data-linktype="2">B站开源长文本大模型：我很小但很能“装”</a></span></p></li><li style="box-sizing: border-box;"><p style="margin: 0px;padding: 0px;box-sizing: border-box;"><span leaf=""><a class="normal_text_link" target="_blank" style="" href="https://mp.weixin.qq.com/s?__biz=Mzg3Njc0NTgwMg==&amp;mid=2247501265&amp;idx=1&amp;sn=c2adc99be2aeecefbae44df81e49cb90&amp;scene=21#wechat_redirect" textvalue="B站自研角色扮演模型背后的技术" data-itemshowtype="0" linktype="text" data-linktype="2">B站自研角色扮演模型背后的技术</a></span></p></li></ul></p></div></div><div data-pm-slice="0 0 []" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;font-style: normal;font-weight: 400;text-align: justify;font-size: 16px;color: rgb(62, 62, 62);"><div style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;font-size: 16px;line-height: 1.6;visibility: visible;"><div style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;line-height: 1.6;visibility: visible;"><div style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;line-height: 1.6;visibility: visible;"><div style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;line-height: 1.6;visibility: visible;"><p style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;font-size: 13px;letter-spacing: 4px;text-align: center;"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3289447926347317252#wechat_redirect" textvalue="通用工程" linktype="text" data-linktype="2">通用工程</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2390333109742534656#wechat_redirect" textvalue="大前端" linktype="text" data-linktype="2">大前端</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=3297757408550699008#wechat_redirect" textvalue="业务线" linktype="text" data-linktype="2">业务线</a></span></span></p><p style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;font-size: 13px;letter-spacing: 4px;text-align: center;"><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2329861166598127619#wechat_redirect" textvalue="大数据" linktype="text" data-linktype="2">大数据</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2782124818895699969#wechat_redirect" textvalue="AI" linktype="text" data-linktype="2">AI</a></span></span><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">丨</span><span style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;color: rgb(12, 182, 242);"><span leaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><a class="normal_text_link album" target="_blank" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);margin: 0px;padding: 0px;outline: 0px;color: rgb(12, 182, 242);text-decoration: none;-webkit-user-drag: none;cursor: pointer;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg3Njc0NTgwMg==&amp;action=getalbum&amp;album_id=2532608330440081409#wechat_redirect" textvalue="多媒体" linktype="text" data-linktype="2">多媒体</a></span></span></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><mp-common-profile class="custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩技术" data-alias="bilibili-TC" data-index="0" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/1BMf5Ir754Sgu8K7dQeQkI2dicoAm7FVlDPmGQJfsRWDUdNDcFC4swWM5h7NXukPhdSr2uTWlSkQ822m29h6snw/300?wx_fmt=png&amp;wxfrom=19" data-signature="提供B站相关技术的介绍和讲解" data-id="Mzg3Njc0NTgwMg==" data-is_biz_ban="0" data-origin_num="351" data-biz_account_status="0" data-verify_status="2"></mp-common-profile></p><p class="mp_profile_iframe_wrp" nodeleaf="" style="-webkit-tap-highlight-color: transparent;margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><mp-common-profile class="custom_select_card mp_profile_iframe js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="哔哩哔哩招聘" data-index="1" data-from="2" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/EVKwaZXNTl9OCCo7pxLHz2e2I3kV3rTPao5LlIickfJS79DNd2yjqjfYEtwtMOyVuKhJoDIq6UU4U9TQbjvOLaQ/300?wx_fmt=png&amp;wxfrom=19" data-signature="生产快乐的地方" data-id="MzUxNTE4OTc0Mg==" data-is_biz_ban="0" data-origin_num="22" data-biz_account_status="0" data-verify_status="2"></mp-common-profile></p></div></div></div></div></div></div><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p>


<p><a href="2247503686">阅读原文</a></p>
<p><a href="https://wechat2rss.xlab.app/link-proxy/?k=eefc90f6&amp;r=1&amp;u=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzg3Njc0NTgwMg%3D%3D%26mid%3D2247503686%26idx%3D1%26sn%3Dfb40d52cc0b3be6fee309aa932a1f4fa">跳转微信打开</a></p>
]]></content:encoded>
      <pubDate>Fri, 31 Oct 2025 12:04:00 +0800</pubDate>
    </item>
  </channel>
</rss>