<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>盛溪的博客</title>
        <link>https://tangly1024.com/</link>
        <description>畅所欲言、自由评论</description>
        <lastBuildDate>Sun, 02 Aug 2026 08:10:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en-US</language>
        <copyright>All rights reserved 2026, 盛溪</copyright>
        <item>
            <title><![CDATA[Agent-后端协作的三种模式]]></title>
            <link>https://tangly1024.com/article/Agent-后端协作的三种模式</link>
            <guid>https://tangly1024.com/article/Agent-后端协作的三种模式</guid>
            <pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-39c7c1d5a1e98021b7ffdc62f5798912"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-39c7c1d5a1e9805f8b41cb70ce5ad488" data-id="39c7c1d5a1e9805f8b41cb70ce5ad488"><span><div id="39c7c1d5a1e9805f8b41cb70ce5ad488" class="notion-header-anchor"></div><a class="notion-hash-link" href="#39c7c1d5a1e9805f8b41cb70ce5ad488" title="一、Agent-后端协作的三种模式（演进路径）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">一、Agent-后端协作的三种模式（演进路径）</span></span></h4><table class="notion-simple-table notion-block-39c7c1d5a1e9800db4f2d618549ba79a"><tbody><tr class="notion-simple-table-row notion-simple-table-header-row notion-block-39c7c1d5a1e98095b938db8b4b00a27f"><td class="" style="width:120px"><div class="notion-simple-table-cell">模式</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">说明</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">状态</div></td></tr><tr class="notion-simple-table-row notion-block-39c7c1d5a1e9809ab870f53e5293ac87"><td class="" style="width:120px"><div class="notion-simple-table-cell">纯后端无 Agent</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">Web Coding 直接开发，大模型仅作代码生成辅助工具，无自主决策</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">传统模式</div></td></tr><tr class="notion-simple-table-row notion-block-39c7c1d5a1e98089ba27e9253ccf2004"><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>Skill 接入模式</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">Agent 独立于后端，通过 Skills（CLI/脚本/Workflow）调用后端能力；Agent 只负责编排与思考</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>推荐</b></div></td></tr><tr class="notion-simple-table-row notion-block-39c7c1d5a1e980faa178fee4f7e4786c"><td class="" style="width:120px"><div class="notion-simple-table-cell">对话式 Agent</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">Agent 直接对话操控全部后端能力（取数、AB实验、MySQL巡查等），生成可视化看板</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">未来方向</div></td></tr></tbody></table><div class="notion-text notion-block-39c7c1d5a1e980f2a97cdb622b46769e"><b>Skill 接入模式关键点</b>：</div><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e98041b6a0cb6d89cbb84f"><li>Agent 不嵌入后端代码，后端也不感知 Agent 逻辑</li></ul><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e9809cb55bf6fc7d90c2aa"><li>可参考项目：GitHub <code class="notion-inline-code">cli anything</code>（README 讲清了&quot;暴露 CLI 给 Agent 控制后端&quot;的原理）</li></ul><div class="notion-text notion-block-39c7c1d5a1e9802c887dfae3edc620a5"><b>对话式 Agent 安全边界</b>：</div><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e9802bbc3cd66a7b275c69"><li>严格遵循用户权限隔离</li></ul><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e980cb8859d908d92f0ddc"><li>核心系统（删库、管理员权限）不暴露给 Agent</li></ul><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e980ba8d03c651056cb723"><li>仅开放可读 / 受控写入权限</li></ul><hr class="notion-hr notion-block-39c7c1d5a1e980938e88db1b4825385f"/><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-39c7c1d5a1e980d18cd9c47df7e6aad0" data-id="39c7c1d5a1e980d18cd9c47df7e6aad0"><span><div id="39c7c1d5a1e980d18cd9c47df7e6aad0" class="notion-header-anchor"></div><a class="notion-hash-link" href="#39c7c1d5a1e980d18cd9c47df7e6aad0" title="二、核心工程实现"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">二、核心工程实现</span></span></h4><div class="notion-text notion-block-39c7c1d5a1e980798336d26aa35547f2"><b>编排（Orchestration）/ 工作流（Workflow）</b></div><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e9803b988cd007704b6d7c"><li>Agent 推理过程本质是 DAG，应做并发优化（如 A、D 可并行执行），而非线性串行</li></ul><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e980859b55d1f2d51a8b71"><li>Workflow 用 Prompt 或 Skills 内逻辑约束 Agent 行为边界，防止发散、提高稳定性</li></ul><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e98061adc0f184ce5b035b"><li>Harness 工程：限制系统调用边界和脚本规划范围，让 Agent 在有限框架内自由思考</li></ul><div class="notion-text notion-block-39c7c1d5a1e9805a9d11c90e96c906c3"><b>知识库 / 幻觉抑制</b></div><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e9801bab8cc31d7999cd5f"><li>建议用纯推理能力的原生模型 + 注入公司私有知识库，避免通用知识和内部知识冲突</li></ul><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e9807a9a9fd33f59bf1c74"><li>用 RAG + 向量数据库做高价值文档召回，解决上下文长度限制</li></ul><hr class="notion-hr notion-block-39c7c1d5a1e9802b8111e7e1bb6677db"/><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-39c7c1d5a1e980a79319d63dbcf6382a" data-id="39c7c1d5a1e980a79319d63dbcf6382a"><span><div id="39c7c1d5a1e980a79319d63dbcf6382a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#39c7c1d5a1e980a79319d63dbcf6382a" title="三、技术选型"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">三、技术选型</span></span></h4><div class="notion-text notion-block-39c7c1d5a1e980829cabdf4347665754"><b>语言/框架</b></div><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e980d0af64cb38849b1b42"><li>Agent 侧：Python（LangChain/LangGraph）——计算密集型，生态丰富</li></ul><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e9803d80ebfb782d26ddd3"><li>后端侧：Go/Java/Rust 任意语言，通过 Skills 暴露能力，语言层面完全解耦</li></ul><div class="notion-text notion-block-39c7c1d5a1e98062aa1eff376b7157ca"><b>网络/基础设施</b></div><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e9801aae56e15dbe027c93"><li>独立中转网关（如 Model Port）：统一处理外网访问（Web Search）、Token 消耗监控</li></ul><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e98046ae38f378c1102bea"><li>代理策略：用一台具外网能力的机器（如 Mac Mini）做网关，内网机器统一走网关访问外部资源，保证网络行为可控</li></ul><div class="notion-blank notion-block-39c7c1d5a1e980a2b732ff74e75da5f8"> </div><div class="notion-blank notion-block-39c7c1d5a1e9806f8bddfcf5db6824c0"> </div><div class="notion-text notion-block-39c7c1d5a1e980239027f3e12fbb5509">CLI的这种命令行天然适合Agent去操作</div><div class="notion-text notion-block-39c7c1d5a1e9802ca593ecb69c3cb34a"><a class="notion-link" href="https://github.com/HKUDS/CLI-Anything#-real-world-demos" target="_blank" rel="noopener noreferrer">https://github.com/HKUDS/CLI-Anything#-real-world-demos</a></div><div class="notion-text notion-block-39c7c1d5a1e980e0ad3ecfedf9a492cd"><b>普通 CLI vs &quot;Agent-native&quot; CLI 的区别：</b></div><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e980edbde8eddb510aaecf"><li>普通 CLI 是给人用的：交互式提示、彩色输出、需要人工判断下一步</li></ul><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e980f694d5c2a394d8d4c4"><li>Agent-native CLI 强调 <code class="notion-inline-code">-json</code> 结构化输出（人读格式 + 机器读格式并存）、无状态可脚本化、错误信息可解析、幂等性强，本质是把 CLI 当函数调用来设计，而不是当终端会话设计</li></ul><div class="notion-text notion-block-39c7c1d5a1e980109e52d952671c97f8">CLI-Anything 做的事情，是把这套&quot;Agent-native 化&quot;变成了自动化流水线：给一个软件的源码/仓库，7 阶段（分析→设计→实现→测试→文档→发布）自动扫描 GUI 操作背后的真实后端调用（比如 GIMP 的 ImageMagick、Blender 的 Python API），生成保留全部核心功能的 CLI 封装，而不是&quot;玩具级&quot;重新实现。这解决的是一个结构性问题：以前想让 Agent 深度操控专业软件，要么自己手写适配（成本高、覆盖窄），要么退化成截图点击（不稳定）。它相当于把&quot;人操作软件&quot;和&quot;Agent 调度软件&quot;这两条路径解耦了。</div><div class="notion-blank notion-block-39c7c1d5a1e980e9b935cb9389adfdb6"> </div><div class="notion-blank notion-block-39c7c1d5a1e9809d923ac25e8b354c01"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[状态机]]></title>
            <link>https://tangly1024.com/article/状态机</link>
            <guid>https://tangly1024.com/article/状态机</guid>
            <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-39c7c1d5a1e980e2997cc122f978ab02"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-39c7c1d5a1e980e7b8abd3ea39bfbaf3" data-id="39c7c1d5a1e980e7b8abd3ea39bfbaf3"><span><div id="39c7c1d5a1e980e7b8abd3ea39bfbaf3" class="notion-header-anchor"></div><a class="notion-hash-link" href="#39c7c1d5a1e980e7b8abd3ea39bfbaf3" title="形式化定义"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">形式化定义</span></span></h4><div class="notion-text notion-block-39c7c1d5a1e9808b855dc58f522cb319">状态机(有限状态机 FSM)是一个五元组:</div><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e980ef9a21d6df5afa58c6"><li><b>S</b>:所有可能状态的集合(比如 <code class="notion-inline-code">{待检索, 已检索, 已生成, 已校验, 完成, 失败}</code>)</li></ul><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e980cd8aa4ddbe67052066"><li><b>Σ</b>:输入/事件的集合(触发状态转移的东西,比如&quot;检索结果为空&quot;、&quot;重试次数超限&quot;、&quot;用户确认&quot;)</li></ul><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e980aba8f8e0f3d47d0aaa"><li><b>δ</b>:转移函数,<code class="notion-inline-code">δ: S × Σ → S</code>,即&quot;当前在状态 A,收到事件 X,下一个状态是 B/&quot;</li></ul><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e98031a265c6d5fc320371"><li><b>s0</b>:初始状态</li></ul><ul class="notion-list notion-list-disc notion-block-39c7c1d5a1e980c79901ca61f24cb243"><li><b>F</b>:终止状态集合(可以有多个,比如&quot;成功完成&quot;和&quot;失败退出&quot;都是终止态)</li></ul><div class="notion-blank notion-block-39c7c1d5a1e9803fac8eecd01b3298cd"> </div><div class="notion-text notion-block-39c7c1d5a1e980adbd9ee83772e7ebdd">状态机做的事是把这个隐式的&quot;执行到哪了&quot;<b>显式化成一个数据结构</b>。好处:</div><ol start="1" class="notion-list notion-list-numbered notion-block-39c7c1d5a1e980c59decd03b61c7c6a9" style="list-style-type:decimal"><li><b>可暂停/可恢复</b>:状态存下来,随时能从任意状态继续跑,不需要从头执行</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-39c7c1d5a1e9807d8720f3f9b7667f03" style="list-style-type:decimal"><li><b>可检查</b>:循环外部(或者决策模块)可以随时问&quot;你现在在哪个状态&quot;,而不需要理解整个执行逻辑</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-39c7c1d5a1e980658ac3cf114c435526" style="list-style-type:decimal"><li><b>转移逻辑和状态本身解耦</b>:δ函数可以单独改,不用动每个状态内部具体做什么</li></ol><div class="notion-blank notion-block-39c7c1d5a1e980d39b7ef52d935944dd"> </div><details class="notion-toggle notion-block-39c7c1d5a1e980b5a0adfd96084fbcde"><summary>拿 RAG 场景举例</summary><div><h4 class="notion-h notion-h3 notion-block-39c7c1d5a1e980728791d43ca34085f4" data-id="39c7c1d5a1e980728791d43ca34085f4"><span><div id="39c7c1d5a1e980728791d43ca34085f4" class="notion-header-anchor"></div><a class="notion-hash-link" href="#39c7c1d5a1e980728791d43ca34085f4" title="拿 RAG 场景举例"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">拿 RAG 场景举例</span></span></h4><div class="notion-text notion-block-39c7c1d5a1e980d4be68d964a174732b">如果不用状态机,skill 大概是:</div><div class="notion-text notion-block-39c7c1d5a1e98094880ded49b38f1c5c">线性写死,检索失败或结果质量差就直接崩,或者只能靠 if-else 在同一个函数里硬堆。</div><div class="notion-text notion-block-39c7c1d5a1e9801e805ae794b654fa25">用状态机,你先定义状态和转移:</div><div class="notion-text notion-block-39c7c1d5a1e9805d8631ee9dcc10049a">这样,循环体每一轮只需要做两件事:<b>看当前状态是什么</b> + <b>根据观察结果查 δ 决定下一个状态</b>。这就是我之前说的&quot;从脚本变成循环体&quot;——循环本身逻辑很薄,复杂度都下沉到状态定义和转移表里。</div></div></details><div class="notion-blank notion-block-39c7c1d5a1e980abb6e7c6be3cde0c59"> </div><div class="notion-blank notion-block-39c7c1d5a1e980fcb754f85cebab3d66"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SKU和GMV是什么意思]]></title>
            <link>https://tangly1024.com/article/SKU和GMV是什么意思</link>
            <guid>https://tangly1024.com/article/SKU和GMV是什么意思</guid>
            <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-3617c1d5a1e9802a8f92ed0f29561396"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-text notion-block-38e7c1d5a1e9805787a9c1f1c2399212"><b>SKU</b>（Stock Keeping Unit，库存量单位）：库存管理的最小单位。同一款薯片，70g 装和 120g 装是两个 SKU；原味和番茄味也是两个 SKU。所以「3000+ SKU」指的是这个品牌在售的、需要分开管理库存的商品规格总数，不是 3000 种零食。</div><div class="notion-text notion-block-38e7c1d5a1e9807ba41ec8d73c66953f"><b>GMV</b>（Gross Merchandise Volume，商品交易总额）：一段时间内成交的订单总金额（通常按下单口径算，含未付款、退货等，所以 GMV ≠ 实际营收）。「月度 GMV 过亿」就是这个品牌一个月的成交流水超过 1 亿元。</div><div class="notion-text notion-block-38e7c1d5a1e980c69710cd650f9c0c46">放到这道题的语境里：</div><ul class="notion-list notion-list-disc notion-block-38e7c1d5a1e98033a5a2dbbbbbe8293d"><li><b>3000+ SKU</b> → 商品种类多、库存结构复杂，所以才会出现「爆款断货、滞销积压」的结构性矛盾。</li></ul><ul class="notion-list notion-list-disc notion-block-38e7c1d5a1e980e482c8cb0dd386fd89"><li><b>月 GMV 过亿</b> → 体量大，库存周转每多 1 天，压的都是真金白银，60 天周转意味着大量资金沉淀在仓库里。</li></ul><div class="notion-blank notion-block-38e7c1d5a1e980b3b485e014aed38081"> </div><div class="notion-blank notion-block-38e7c1d5a1e9806aafe0f3afc3a840e7"> </div><div class="notion-blank notion-block-38e7c1d5a1e980018c9ed34edf73a456"> </div><div class="notion-blank notion-block-3617c1d5a1e980e29152f8e1fc600167"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SDK 是什么]]></title>
            <link>https://tangly1024.com/article/SDK 是什么</link>
            <guid>https://tangly1024.com/article/SDK 是什么</guid>
            <pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-38c7c1d5a1e9804d9eb5c05361a3c98e"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><blockquote class="notion-quote notion-block-38c7c1d5a1e980dcad6dc079f7cad2e9"><div>把 JSON 的 HTTP 请求封装好 → 再把返回内容变成 Python 能直接读取的对象</div></blockquote><div class="notion-text notion-block-38c7c1d5a1e9800aa84ec5d0c15ed5ea">去程封装、回程解析,两头都包。这就是 SDK 的全部本质</div><div class="notion-blank notion-block-38c7c1d5a1e980c4829beed6d0ec335e"> </div><div class="notion-text notion-block-38c7c1d5a1e980d69850edc432a2ae77">无论是 OpenAI 还是 Anthropic 的 SDK 都是同样的道理，它们只是两种不同的方言，但是干的事情都是同样的一件事情。</div><div class="notion-blank notion-block-38c7c1d5a1e98078bc6eefe80e7a81f9"> </div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-38c7c1d5a1e98062b666dce0d4a14e14"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A5e97c072-a813-45b0-8a17-74384d956768%3Aimage.png?table=block&amp;id=38c7c1d5-a1e9-8062-b666-dce0d4a14e14&amp;t=38c7c1d5-a1e9-8062-b666-dce0d4a14e14" alt="notion image" loading="lazy" decoding="async"/></div></figure><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-38c7c1d5a1e9805290a4ed576c4bea61" data-id="38c7c1d5a1e9805290a4ed576c4bea61"><span><div id="38c7c1d5a1e9805290a4ed576c4bea61" class="notion-header-anchor"></div><a class="notion-hash-link" href="#38c7c1d5a1e9805290a4ed576c4bea61" title="SDK 到底是什么"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>SDK 到底是什么</b></span></span></h3><div class="notion-text notion-block-38c7c1d5a1e980768ee6d78ef401e957"><code class="notion-inline-code">SDK</code> = Software Development Kit。但在我们这个场景里，它更准确的名字是<b>客户端库（client library）</b>——一包别人替你写好的 Python 代码。你做两件事就能用：<code class="notion-inline-code">pip install openai</code> 把它下载下来，<code class="notion-inline-code">from openai import OpenAI</code> 把它导进你的程序。</div><div class="notion-text notion-block-38c7c1d5a1e980589549ec358703854f">它们是<b>两个不同的库，各自匹配各自公司服务器听得懂的&quot;方言&quot;</b>。你不用想象这个区别——你今天<b>亲手经历过</b>：我们就是因为换 SDK，把 <code class="notion-inline-code">agent.py</code> 里一堆字段名改了一遍。这就是全部区别：</div><table class="notion-simple-table notion-block-38c7c1d5a1e980228adefb791ff78800"><tbody><tr class="notion-simple-table-row notion-simple-table-header-row notion-block-38c7c1d5a1e9804db6e8d8622e0a5972"><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>同一件事</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>Anthropic SDK 的说法</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>OpenAI SDK 的说法</b></div></td></tr><tr class="notion-simple-table-row notion-block-38c7c1d5a1e980c8983ffdd909548eba"><td class="" style="width:120px"><div class="notion-simple-table-cell">发起对话</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">client.messages.create()</code></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">client.chat.completions.create()</code></div></td></tr><tr class="notion-simple-table-row notion-block-38c7c1d5a1e980debbcdcc42ec9c766f"><td class="" style="width:120px"><div class="notion-simple-table-cell">&quot;还要不要工具&quot;的信号</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">stop_reason == &quot;tool_use&quot;</code></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">finish_reason == &quot;tool_calls&quot;</code></div></td></tr><tr class="notion-simple-table-row notion-block-38c7c1d5a1e980f186c8f688c06f7eed"><td class="" style="width:120px"><div class="notion-simple-table-cell">模型想调工具</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">tool_use</code> 块</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">tool_calls</code> 列表</div></td></tr><tr class="notion-simple-table-row notion-block-38c7c1d5a1e980e0adb1e2acab385f81"><td class="" style="width:120px"><div class="notion-simple-table-cell">工具参数 schema</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">input_schema</code></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">parameters</code>（外面还套 <code class="notion-inline-code">function</code>）</div></td></tr><tr class="notion-simple-table-row notion-block-38c7c1d5a1e980fbb87dcfbffd6fcd97"><td class="" style="width:120px"><div class="notion-simple-table-cell">工具结果喂回去</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">tool_result</code> 块</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">一条 <code class="notion-inline-code">role: &quot;tool&quot;</code> 消息</div></td></tr></tbody></table><div class="notion-text notion-block-38c7c1d5a1e98035ac5acc094d44727d">骨架（那个 <code class="notion-inline-code">while</code> 循环）一模一样，因为两家干的是同一件事；不同的只是字段名、方法名、数据的包装形状。就像同一份合同，一个用中文写、一个用英文写——内容相同，词不同。</div><div class="notion-blank notion-block-38c7c1d5a1e98032ba07cbcea3f841ab"> </div><div class="notion-blank notion-block-38c7c1d5a1e98065881bf7e5900cc897"> </div><div class="notion-blank notion-block-38c7c1d5a1e9804faa9dcb16e9fb99dd"> </div><div class="notion-blank notion-block-38c7c1d5a1e98098af63d73fbfdab161"> </div><div class="notion-blank notion-block-38c7c1d5a1e9806da4e3cb46a29129cf"> </div><div class="notion-blank notion-block-38c7c1d5a1e980149291eb0973b62021"> </div><div class="notion-blank notion-block-38c7c1d5a1e9802e8941ebd5dd72354c"> </div><div class="notion-blank notion-block-38c7c1d5a1e980d9ad65f909720586da"> </div><div class="notion-blank notion-block-38c7c1d5a1e980f8a3bfc27bdef29877"> </div><div class="notion-blank notion-block-38c7c1d5a1e980a5b9a3e8729d798f0d"> </div><div class="notion-blank notion-block-38c7c1d5a1e980439bd8e9b1215032e5"> </div><div class="notion-blank notion-block-38c7c1d5a1e9806490ceee49631c48ae"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[tool-call具体执行]]></title>
            <link>https://tangly1024.com/article/tool-call具体执行</link>
            <guid>https://tangly1024.com/article/tool-call具体执行</guid>
            <pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-38c7c1d5a1e98051b4c5e4cbde04a58d"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-text notion-block-38c7c1d5a1e98060b9a8c29352dd8cb4">模型不负责具体的调用，它只传递出我要做什么，</div><div class="notion-text notion-block-38c7c1d5a1e98060bf5fc5d079eae5c3">比如，我要申请一个工具调用</div><div class="notion-text notion-block-38c7c1d5a1e980d09622d6e00fd72e21">然后它会指出，我要调用什么 工具名称 和 参数</div><div class="notion-blank notion-block-38c7c1d5a1e980f1bfd5fcf6ee81761f"> </div><div class="notion-blank notion-block-38c7c1d5a1e9800f95ddc5e7110c0662"> </div><div class="notion-blank notion-block-38c7c1d5a1e9804295d5df71392f1298"> </div><div class="notion-text notion-block-38c7c1d5a1e980fe9c54c60112a27e66"><b>模型返回的不是执行结果，是一个&quot;调用请求&quot;。</b></div><div class="notion-text notion-block-38c7c1d5a1e9808384e4ef39ab73c3b7">当模型决定用工具，它的响应里会出现一个 <code class="notion-inline-code">tool_use</code> 块，长这样（Anthropic 格式）：</div><div class="notion-text notion-block-38c7c1d5a1e980d8a88bf77d61b95691">注意：模型只是<b>说</b>&quot;我要用 query_supplier，参数是这个&quot;。它没执行任何东西，也没能力执行——它只产出了这段结构化文本。真正跑代码是你的事。</div><div class="notion-text notion-block-38c7c1d5a1e9808cb8e5c4822110aff1">你接到后，执行分四步：</div><div class="notion-text notion-block-38c7c1d5a1e980279314f637cef397ac">第四步是关键，也是最多人漏的：把结果塞回对话，再调一次模型。</div><div class="notion-text notion-block-38c7c1d5a1e98000b652c37061b2b248"><b>所以一个完整的 tool-call 是一个回合（round-trip），不是一次单向调用：</b></div><div class="notion-text notion-block-38c7c1d5a1e980ae81bad0fcaecb757e"><b>这就是 ReAct / Agent loop 的内核</b>——把第四步包进一个 <code class="notion-inline-code">while</code> 循环：只要模型还在返回 <code class="notion-inline-code">tool_use</code> 就继续执行、回灌、再问；直到它返回纯文本（不再要工具），循环结束。</div><div class="notion-blank notion-block-38c7c1d5a1e9801ebd00d406ed7b1d05"> </div><div class="notion-blank notion-block-38c7c1d5a1e9802582e1d37143fdd38c"> </div><div class="notion-blank notion-block-38c7c1d5a1e980c6b415f7fe1acd3a0a"> </div><div class="notion-blank notion-block-38c7c1d5a1e980d4914bf016abc08946"> </div><div class="notion-blank notion-block-38c7c1d5a1e98061ad37f4da9cbad541"> </div><div class="notion-blank notion-block-38c7c1d5a1e980db8763ff10aa0a67a9"> </div><div class="notion-blank notion-block-38c7c1d5a1e9807994bfddf91c6122cc"> </div><div class="notion-blank notion-block-38c7c1d5a1e98053ab27ef804c8270b7"> </div><div class="notion-blank notion-block-38c7c1d5a1e980418faafcb1c880fd80"> </div><div class="notion-blank notion-block-38c7c1d5a1e9801fb47ceb14cfdba52e"> </div><div class="notion-blank notion-block-38c7c1d5a1e980fcabfcffa5c44abe7f"> </div><div class="notion-blank notion-block-38c7c1d5a1e980259815dfdf6fdc9a2f"> </div><div class="notion-blank notion-block-38c7c1d5a1e980f6831ec640003debee"> </div><div class="notion-blank notion-block-38c7c1d5a1e98034b7ddceee50bc805e"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Python 协程]]></title>
            <link>https://tangly1024.com/article/Python 协程</link>
            <guid>https://tangly1024.com/article/Python 协程</guid>
            <pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-37d7c1d5a1e9806da5aff00b3747e9b2"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-37d7c1d5a1e9807ab752de35638d75da" data-id="37d7c1d5a1e9807ab752de35638d75da"><span><div id="37d7c1d5a1e9807ab752de35638d75da" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37d7c1d5a1e9807ab752de35638d75da" title="核心 analogy"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">核心 analogy</span></span></h4><details class="notion-toggle notion-block-37d7c1d5a1e980d3a6c6c10b6f374e0e"><summary></summary><div><div class="notion-text notion-block-37d7c1d5a1e9803d95b2e59d28dd72ec">协程 = <b>能暂停和恢复的函数</b>。普通函数一旦调用就跑到底；协程跑到一半可以主动&quot;让出&quot;控制权（<code class="notion-inline-code">await</code>），等条件满足再从断点继续。</div><div class="notion-blank notion-block-37d7c1d5a1e9803e9ec7c689a9a7a3e8"> </div><div class="notion-text notion-block-37d7c1d5a1e980a7b627ec5376218088">把 event loop 想成一个<b>单线程的调度员</b>：手里攥着一堆协程，谁卡在 I/O（网络、磁盘）就把谁挂起，转去跑别的，等 I/O 好了再回来。所以是 <b>concurrency（并发）不是 parallelism（并行）</b>——始终一个线程，靠&quot;填补等待空隙&quot;提速。</div><div class="notion-blank notion-block-37d7c1d5a1e9803fb92ff74918fec747"> </div><h4 class="notion-h notion-h3 notion-block-37d7c1d5a1e980059022cc97a643a1ac" data-id="37d7c1d5a1e980059022cc97a643a1ac"><span><div id="37d7c1d5a1e980059022cc97a643a1ac" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37d7c1d5a1e980059022cc97a643a1ac" title="为什么需要它"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">为什么需要它</span></span></h4><div class="notion-text notion-block-37d7c1d5a1e980bbb179ebc930aadc7f">I/O-bound 场景下，线程大部分时间在 <b>等</b>（等 LLM 返回、等 DB 查询）。多线程能解决但有 GIL + 线程切换开销 + 锁。协程在用户态切换，没有 OS 线程开销，单线程就能扛上万并发连接。</div><div class="notion-text notion-block-37d7c1d5a1e980cc85c1da3061823ca8">对你做 Agent 直接相关：<b>并行发多个 tool-call、同时打多个 LLM 请求</b>，本质都是用 <code class="notion-inline-code">asyncio</code> 把等待时间复用起来。</div><div class="notion-blank notion-block-37d7c1d5a1e980aeb294e89c61dea2f6"> </div><h4 class="notion-h notion-h3 notion-block-37d7c1d5a1e98046892fd4bccd64c3df" data-id="37d7c1d5a1e98046892fd4bccd64c3df"><span><div id="37d7c1d5a1e98046892fd4bccd64c3df" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37d7c1d5a1e98046892fd4bccd64c3df" title="技术实现"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">技术实现</span></span></h4><div class="notion-text notion-block-37d7c1d5a1e98042864ffb26d34e295d"><b>定义与运行</b></div><div class="notion-text notion-block-37d7c1d5a1e9807fb1f7ec003e9b649b">注意：<code class="notion-inline-code">fetch(&quot;a&quot;)</code> 本身<b>只是返回一个 coroutine 对象，不执行</b>。必须丢给 event loop（<code class="notion-inline-code">await</code> 它 / 包成 Task / <code class="notion-inline-code">asyncio.run</code>）才真正跑。这是新手最常踩的坑。</div><div class="notion-text notion-block-37d7c1d5a1e980e5b12dcb4911de4939"><b>串行 vs 并发</b></div><div class="notion-text notion-block-37d7c1d5a1e980c99ddff7128ae37377"><code class="notion-inline-code">gather</code> 就是你做 <b>parallel tool dispatch</b> 的核心原语。</div><div class="notion-text notion-block-37d7c1d5a1e980399536f11210453aed"><b>Task：手动调度</b></div><div class="notion-text notion-block-37d7c1d5a1e98089beaeea37b98332af"><code class="notion-inline-code">create_task</code> 和 <code class="notion-inline-code">gather</code> 的区别：前者<b>立刻开始执行</b>并返回句柄，后者是&quot;打包 + 等全部完成&quot;。</div><h4 class="notion-h notion-h3 notion-block-37d7c1d5a1e980a49a68e07403caca98" data-id="37d7c1d5a1e980a49a68e07403caca98"><span><div id="37d7c1d5a1e980a49a68e07403caca98" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37d7c1d5a1e980a49a68e07403caca98" title="await 能 await 什么"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">await 能 await 什么</span></span></h4><div class="notion-text notion-block-37d7c1d5a1e980e8b3ebea3b4124b60d">只能 await <b>awaitable</b>：coroutine、Task、Future。底层是对象实现了 <code class="notion-inline-code">__await__</code>。<code class="notion-inline-code">asyncio.sleep</code> 是 awaitable，而 <code class="notion-inline-code">time.sleep</code> 是<b>阻塞调用</b>——在协程里用 <code class="notion-inline-code">time.sleep</code> 会卡死整个 event loop，所有协程一起停。这是另一个高频翻车点。</div><h4 class="notion-h notion-h3 notion-block-37d7c1d5a1e980c28193dd35b8a76209" data-id="37d7c1d5a1e980c28193dd35b8a76209"><span><div id="37d7c1d5a1e980c28193dd35b8a76209" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37d7c1d5a1e980c28193dd35b8a76209" title="历史包袱（面试可能问）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">历史包袱（面试可能问）</span></span></h4><ul class="notion-list notion-list-disc notion-block-37d7c1d5a1e98037bcfec3f362b34861"><li>Python 3.4：<code class="notion-inline-code">@asyncio.coroutine</code> + <code class="notion-inline-code">yield from</code>，基于 generator</li></ul><ul class="notion-list notion-list-disc notion-block-37d7c1d5a1e980a0b62af6b013812973"><li>Python 3.5+：原生 <code class="notion-inline-code">async</code>/<code class="notion-inline-code">await</code> 语法糖，语义上和 generator coroutine 同源（都靠暂停/恢复），但成了独立类型</li></ul><div class="notion-text notion-block-37d7c1d5a1e9800e964ff32d6cf97d7a">所以协程本质是 <b>generator 的泛化</b>：generator 用 <code class="notion-inline-code">yield</code> 把值送出去，coroutine 用 <code class="notion-inline-code">await</code> 把控制权让出去。</div></div></details><div class="notion-blank notion-block-37d7c1d5a1e98096b9adf888a85d114c"> </div><div class="notion-text notion-block-37d7c1d5a1e9809b960fef5bebc3610d">一个线程跑 event loop,轮询式地问 OS &quot;谁的 I/O 好了&quot;。某协程要做 I/O 时,<b>把 fd（ file descriptor） 注册给 OS 就让出</b>,线程转身去 resume 其他就绪协程。等待全程由 OS 负责,线程只在彻底没活时才阻塞在 <code class="notion-inline-code">kqueue</code> 上。</div><div class="notion-blank notion-block-37d7c1d5a1e980dcac44c1570a5d6950"> </div><div class="notion-text notion-block-37d7c1d5a1e98084b3acd224785ac39e">协程发起网络请求 → OS 给这个连接分配一个 fd(比如 7 号)→ event loop 把&quot;7 号&quot;登记进 <code class="notion-inline-code">kqueue</code>:&quot;盯着 7 号,它可读了喊我&quot; → 线程撒手去跑别人 → 网卡数据到了,内核标记 7 号就绪 → <code class="notion-inline-code">select()</code> 返回&quot;7 号好了&quot; → loop 凭这个号找到对应协程,resume 它。</div><div class="notion-blank notion-block-37d7c1d5a1e980e586c4c3fd00ca5baf"> </div><div class="notion-text notion-block-37d7c1d5a1e9809a95dac800804e152d">协程要 I/O → 把 fd 注册给 OS → 协程让出 → 线程转去跑别的协程 → OS 处理完 I/O 标记 fd 就绪 → loop 发现后唤醒(resume)对应协程从断点继续。</div><div class="notion-blank notion-block-37d7c1d5a1e9809eac98fd5e9bd93fe9"> </div><div class="notion-blank notion-block-37d7c1d5a1e98066a149ee7d246d8c6c"> </div><div class="notion-blank notion-block-37d7c1d5a1e98071adfac0b334842543"> </div><div class="notion-blank notion-block-37d7c1d5a1e98012b22bc769587302ef"> </div></main></div>]]></content:encoded>
        </item>
    </channel>
</rss>