<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>AI on 随手记</title><link>https://www.bufio.cn/tags/ai/</link><description>Recent content in AI on 随手记</description><generator>Hugo</generator><language>zh-cn</language><copyright>© 2026 &lt;a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener"&gt;苏ICP备2023022553号-1&lt;/a&gt;</copyright><lastBuildDate>Tue, 09 Jun 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://www.bufio.cn/tags/ai/index.xml" rel="self" type="application/rss+xml"/><item><title>BiRefNet 深度解读：从图片分割到镜架边缘形态优化</title><link>https://www.bufio.cn/posts/birefnet-segmentation-decoder-morphology/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://www.bufio.cn/posts/birefnet-segmentation-decoder-morphology/</guid><description>&lt;h2 id="开头birefnet-到底在做什么"&gt;开头：BiRefNet 到底在做什么&lt;/h2&gt;
&lt;p&gt;BiRefNet 可以先粗略理解成一个高质量前景分割模型。它拿到一张图片之后，不是直接输出一张透明 PNG，而是先输出一张 mask：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;白色区域：要保留的主体
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;黑色区域：要删除的背景
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;灰色区域：边缘、不确定或半透明过渡
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果我们要做商品抠图，最终流程通常是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;原始图片
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BiRefNet 预测 mask
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mask 作为 alpha 通道
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;得到透明背景 PNG
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;比如一副眼镜放在白色桌面上，BiRefNet 要判断每个像素属于眼镜还是背景。真正的难点不在于“整副眼镜在哪里”，而在于鼻托、镜腿、镜框内侧边缘、镜片孔洞这些细节是否干净、连续、圆润。&lt;/p&gt;
&lt;p&gt;这篇文章按一个完全不懂深度学习的人也能理解的方式，解释 BiRefNet 的工作链路，并重点讨论一个很实际的问题：如果模型整体已经抠得很准，但镜架鼻托边缘还有毛刺和不规整，下一步应该怎么修。&lt;/p&gt;
&lt;h2 id="总览birefnet-的基本分工"&gt;总览：BiRefNet 的基本分工&lt;/h2&gt;
&lt;p&gt;可以先把 BiRefNet 拆成两个大部分：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;图片
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;backbone：提取视觉特征
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;decoder / refinement：融合特征并生成 mask
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;输出前景 mask
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;更通俗一点：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;backbone = 看图并提取证据
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;decoder = 根据证据画出最终 mask
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;backbone 不直接输出“这个像素是前景、那个像素是背景”。它输出的是很多层特征图。decoder 才负责把这些特征图融合起来，变成最终可用的分割结果。&lt;/p&gt;
&lt;h2 id="backbone不是空模型而是视觉特征提取器"&gt;Backbone：不是空模型，而是视觉特征提取器&lt;/h2&gt;
&lt;p&gt;很多人第一次听到 backbone，会以为它是一个空权重模型。其实不是。&lt;/p&gt;
&lt;p&gt;backbone 是整个网络里的视觉主干，它负责把原始 RGB 像素转换成模型内部能理解的特征。以一张 &lt;code&gt;1024x1024&lt;/code&gt; 图片为例，原始输入大概是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[3, 1024, 1024]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里的 3 是 RGB 三个颜色通道。进入 backbone 后，它可能输出多层特征：&lt;/p&gt;</description></item><item><title>客户端、Skill 与 MCP：大模型如何调用本地能力</title><link>https://www.bufio.cn/posts/llm-client-skill-mcp-interaction-flow/</link><pubDate>Sat, 16 May 2026 08:35:00 +0800</pubDate><guid>https://www.bufio.cn/posts/llm-client-skill-mcp-interaction-flow/</guid><description>&lt;p&gt;很多人第一次接触大模型工具调用时，容易把几个角色混在一起：大模型是不是直接读取了本地文件？Skill 是不是一个可执行插件？MCP Server 是不是直接连到了模型？&lt;/p&gt;
&lt;p&gt;实际链路更清晰，也更安全：&lt;strong&gt;模型只看见客户端发给它的上下文和工具定义；真正访问本地文件、数据库、命令行或服务的是客户端；MCP 是客户端调用本地能力的一种标准接口；调用结果再被客户端作为新消息发回模型。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.bufio.cn/images/llm-client-skill-mcp-loop-diagram.svg" alt="客户端、Skill 与 MCP 的交互闭环"&gt;&lt;/p&gt;
&lt;h2 id="总览先看完整链路"&gt;总览：先看完整链路&lt;/h2&gt;
&lt;p&gt;一次完整交互可以拆成四步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;客户端读取用户问题，并加载本地 Skill、系统提示词、可用工具列表。&lt;/li&gt;
&lt;li&gt;客户端把这些信息整理成一次模型请求，发给大模型。&lt;/li&gt;
&lt;li&gt;大模型判断需要调用工具时，不直接执行本地动作，而是返回一个 &lt;code&gt;tool_call&lt;/code&gt; 请求。&lt;/li&gt;
&lt;li&gt;客户端根据 &lt;code&gt;tool_call&lt;/code&gt; 调用本地 MCP Server，把结果作为 &lt;code&gt;tool&lt;/code&gt; 消息回填给模型，模型再基于结果继续回答。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这里最重要的边界是：&lt;strong&gt;模型提出“我要调用什么”，客户端决定“能不能调用、怎么调用、结果如何回传”。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="skill-是什么给模型看的操作说明"&gt;Skill 是什么：给模型看的操作说明&lt;/h2&gt;
&lt;p&gt;Skill 可以理解成一份本地能力说明书。它通常不是让模型直接执行的程序，而是一组面向模型的规则、流程、约定和示例。&lt;/p&gt;
&lt;p&gt;例如，一个写博客的 Skill 可能告诉模型：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;# Blog Writing Skill
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 写中文技术文章。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 文件名必须是英文小写 slug。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 创建文章前先读取已有标签。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 图片必须通过 blog MCP 上传。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 创建后再次读取文章确认 frontmatter 和图片引用。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;客户端在发起模型请求前，会把匹配到的 Skill 内容放进上下文。于是模型知道：当前任务不是随便写一段 Markdown，而是要按照这个博客系统的规范完成“查标签、写正文、上传图片、创建文章、验证结果”这些步骤。&lt;/p&gt;
&lt;p&gt;注意，Skill 本身不等于工具。它更像操作手册：告诉模型&lt;strong&gt;什么时候应该做什么、输出应该长什么样、有哪些约束不能违反&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="mcp-是什么给客户端调用的本地能力接口"&gt;MCP 是什么：给客户端调用的本地能力接口&lt;/h2&gt;
&lt;p&gt;MCP Server 则更接近真正的本地工具提供者。它把本地能力包装成结构化接口，比如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;blog.create_post&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;创建一篇 Hugo 博客文章&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;input_schema&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;object&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;string&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;string&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tags&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;array&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;items&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;string&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;draft&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;boolean&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;required&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;客户端启动或连接 MCP Server 后，会拿到这些工具定义。随后客户端可以把工具名、描述和参数结构告诉模型，让模型知道有哪些工具可用。&lt;/p&gt;</description></item><item><title>从标量、向量到张量：深度学习里的“数字容器”到底是什么？</title><link>https://www.bufio.cn/posts/scalar-vector-tensor-deep-learning/</link><pubDate>Thu, 14 May 2026 09:55:14 +0800</pubDate><guid>https://www.bufio.cn/posts/scalar-vector-tensor-deep-learning/</guid><description>&lt;p&gt;刚接触深度学习时，很多人会被一堆词劝退：标量、向量、矩阵、张量、维度、形状、通道、批次……这些词看起来像数学课，其实它们背后的核心很简单：&lt;strong&gt;深度学习处理的东西，本质上是一堆数字；这些概念只是说明数字被怎样摆放。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你可以先把它们理解成不同大小、不同结构的“数字容器”：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;标量：一个数字。&lt;/li&gt;
&lt;li&gt;向量：一排数字。&lt;/li&gt;
&lt;li&gt;矩阵：一张表格。&lt;/li&gt;
&lt;li&gt;张量：更通用的多维数字容器。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这篇文章不要求你有高等数学基础。我们只抓住一个目标：以后看到 &lt;code&gt;shape = (32, 3, 224, 224)&lt;/code&gt; 这种写法时，你知道它大概在说什么。&lt;/p&gt;
&lt;h2 id="先建立直觉模型只认识数字"&gt;先建立直觉：模型只认识数字&lt;/h2&gt;
&lt;p&gt;人看到一张猫的图片，会说“这是一只猫”。但神经网络不能直接理解“猫”这个字，也不能像人一样直接理解图像含义。它真正拿到的是数字。&lt;/p&gt;
&lt;p&gt;比如一张图片，在计算机里通常可以表示成很多像素点；每个像素点又可以用数字表示颜色。文本、声音、表格数据也一样，最后都要转成数字，模型才能计算。&lt;/p&gt;
&lt;p&gt;所以深度学习里的问题，经常会变成：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这些数字怎么组织？模型每一步拿到的数字长什么样？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这就是标量、向量、矩阵、张量这些概念的用处。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.bufio.cn/images/tensor-concepts.svg" alt="标量、向量、矩阵、张量的递进关系"&gt;&lt;/p&gt;
&lt;h2 id="标量一个单独的数字"&gt;标量：一个单独的数字&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;标量就是一个数。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0.01
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-2.7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在深度学习中，很多结果都是标量：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;学习率 &lt;code&gt;0.001&lt;/code&gt; 是一个标量。&lt;/li&gt;
&lt;li&gt;某次训练的损失值 &lt;code&gt;1.26&lt;/code&gt; 是一个标量。&lt;/li&gt;
&lt;li&gt;一个分类结果的概率 &lt;code&gt;0.87&lt;/code&gt; 也可以是一个标量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;标量没有方向，也没有一排、一列、几行几列这些结构。它就是一个孤零零的数字。&lt;/p&gt;
&lt;p&gt;如果用“维度”来描述，标量通常可以理解为 &lt;strong&gt;0 维&lt;/strong&gt;。这里的 0 维不是说它不重要，而是说它没有展开成列表或表格。&lt;/p&gt;
&lt;h2 id="向量一排数字"&gt;向量：一排数字&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;向量是一组按顺序排好的数字。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[170, 65, 23]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你可以把它理解成一个人的三个特征：身高 170、体重 65、年龄 23。单个数字只能表达一个量，一排数字就可以一起描述一个对象。&lt;/p&gt;
&lt;p&gt;在机器学习里，一个样本经常会被表示成一个向量：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[面积, 卧室数量, 楼层, 距离地铁距离]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果我们要预测房价，就可以把每套房子变成这样一排数字。模型拿到的不是“这套房子不错”这种自然语言，而是一组可以计算的数。&lt;/p&gt;
&lt;p&gt;向量通常可以理解为 &lt;strong&gt;1 维&lt;/strong&gt;。这里的 1 维指的是它只有一个方向可以数：从左到右数第 1 个、第 2 个、第 3 个……&lt;/p&gt;</description></item><item><title>RapidOCR 入门：英文 OCR 识别、常规测评与使用注意事项</title><link>https://www.bufio.cn/posts/rapidocr-english-ocr-evaluation-usage-notes/</link><pubDate>Wed, 06 May 2026 11:17:28 +0800</pubDate><guid>https://www.bufio.cn/posts/rapidocr-english-ocr-evaluation-usage-notes/</guid><description>&lt;p&gt;OCR 这类工具最容易被误用：看起来只要把图片丢进去就能得到文字，但真正放到项目里时，还会遇到图片质量、方向、字体、语言、速度、批量处理和错误纠正等问题。本文以一个最小的 RapidOCR 英文识别项目为例，整理它适合做什么、怎么跑起来、怎么做常规测评，以及使用时需要注意哪些细节。&lt;/p&gt;
&lt;p&gt;本文不是完整排行榜式横向评测，而是偏工程落地的使用说明：先让脚本能稳定运行，再用一组可复现的指标判断它是否满足当前业务。&lt;/p&gt;
&lt;h2 id="rapidocr-是什么"&gt;RapidOCR 是什么&lt;/h2&gt;
&lt;p&gt;RapidOCR 可以理解为一个轻量级 OCR 推理方案。当前示例项目使用的是 &lt;code&gt;rapidocr-onnxruntime==1.2.3&lt;/code&gt;，底层通过 ONNX Runtime 执行 OCR 模型推理，典型链路包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;文本检测：先在图片中找出可能包含文字的区域。&lt;/li&gt;
&lt;li&gt;方向分类：判断文本是否需要旋转或方向修正。&lt;/li&gt;
&lt;li&gt;文本识别：对检测出来的文字区域逐行识别。&lt;/li&gt;
&lt;li&gt;结果整理：输出文本框、文字内容和置信度等结果。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在这个项目里，我们只保留最常用的输出：把图片中的文字逐行打印出来。它适合做轻量脚本、批处理、小工具、后台任务，也适合在正式接入大系统前做 OCR 方案验证。&lt;/p&gt;
&lt;h2 id="适用场景"&gt;适用场景&lt;/h2&gt;
&lt;p&gt;RapidOCR 更适合这些场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;识别清晰图片里的英文、数字、短标签、票据字段、车牌周边信息等。&lt;/li&gt;
&lt;li&gt;在本地或服务器上离线运行，不想依赖外部 OCR API。&lt;/li&gt;
&lt;li&gt;希望用 Python 快速接入，先验证效果，再决定是否封装成服务。&lt;/li&gt;
&lt;li&gt;对部署体积、调用方式、推理依赖有一定要求，希望用 ONNX Runtime 这类通用推理后端。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它不太适合直接裸用在这些场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;图片严重模糊、过曝、反光、压缩严重。&lt;/li&gt;
&lt;li&gt;版面复杂，需要结构化还原表格、段落、字段层级。&lt;/li&gt;
&lt;li&gt;需要极高准确率的财务、证件、合同等强校验场景。&lt;/li&gt;
&lt;li&gt;需要直接理解语义，而不只是把图片转成文字。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些场景不是不能做，而是要加预处理、后处理、规则校验，甚至引入专门模型或人工复核流程。&lt;/p&gt;
&lt;h2 id="最小项目结构"&gt;最小项目结构&lt;/h2&gt;
&lt;p&gt;当前项目可以保持很简单：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rapidOCR/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── README.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── ocr.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── IMG_20260506_110642.jpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── IMG_20260506_110656.jpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── venv/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;核心脚本 &lt;code&gt;ocr.py&lt;/code&gt; 的职责很清楚：接收一张图片路径，调用 RapidOCR，然后把识别出的每行文字打印出来。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;argparse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;rapidocr_onnxruntime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RapidOCR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ArgumentParser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;OCR text recognition using RapidOCR&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;--input&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Path to input image file&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RapidOCR&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;No text detected.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里的 &lt;code&gt;result&lt;/code&gt; 通常包含文本框坐标、识别文本、置信度等信息。示例脚本只打印 &lt;code&gt;line[1]&lt;/code&gt;，也就是文字内容。如果后续要做测评或业务校验，建议保留完整结果，不要过早只取纯文本。&lt;/p&gt;</description></item><item><title>大模型周边概念速通：MCP、Skill、Agent、Tool 到底是什么</title><link>https://www.bufio.cn/posts/llm-mcp-skill-agent-concepts/</link><pubDate>Wed, 29 Apr 2026 16:05:00 +0800</pubDate><guid>https://www.bufio.cn/posts/llm-mcp-skill-agent-concepts/</guid><description>&lt;p&gt;大模型应用发展到现在，很多词会一起出现：MCP、Skill、Agent、Tool、Prompt、Resource、Memory、Guardrail、Handoff、Plugin、Connector。它们看起来都像“给 AI 增强能力”的东西，但实际所在的层级完全不同。&lt;/p&gt;
&lt;p&gt;如果把大模型应用想成一个软件系统：大模型负责理解和生成，Agent 负责决策和调度，Tool 负责执行动作，MCP 负责把外部能力标准化接进来，Skill 负责沉淀一套可复用的任务方法。理解这些边界之后，再看各种 AI IDE、智能客服、自动化助手、博客发布机器人，就不会被概念绕晕。&lt;/p&gt;
&lt;h2 id="总览先看一条完整链路"&gt;总览：先看一条完整链路&lt;/h2&gt;
&lt;p&gt;一次典型的大模型应用调用，可以拆成这条链路：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用户请求
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 应用 / Agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 组装 Prompt、历史记录、上下文 Resource、Memory
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 调用大模型
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 大模型决定是否调用 Tool
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; Tool 可能来自本地代码、平台内置能力，或 MCP Server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 工具返回结果
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; Agent 继续推理、校验、生成最终回答
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里最容易混淆的是三层：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;层级&lt;/th&gt;
 &lt;th&gt;解决的问题&lt;/th&gt;
 &lt;th&gt;典型概念&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;模型层&lt;/td&gt;
 &lt;td&gt;负责语言理解、推理、生成&lt;/td&gt;
 &lt;td&gt;LLM、大模型、多模态模型&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;编排层&lt;/td&gt;
 &lt;td&gt;决定怎么完成任务&lt;/td&gt;
 &lt;td&gt;Agent、Prompt、Memory、Guardrail、Handoff&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;能力接入层&lt;/td&gt;
 &lt;td&gt;连接外部数据和动作&lt;/td&gt;
 &lt;td&gt;Tool、MCP、Resource、Connector、Plugin、Skill&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一句话概括：大模型是大脑，Agent 是工作流控制器，Tool 是手，MCP 是标准插口，Skill 是做事手册和工具包。&lt;/p&gt;
&lt;h2 id="大模型能力核心但不是完整应用"&gt;大模型：能力核心，但不是完整应用&lt;/h2&gt;
&lt;p&gt;大模型，也就是 LLM 或多模态模型，核心能力是根据上下文预测和生成内容。它可以读文字、写代码、解释日志、分析图片、生成计划，但它本身通常不直接拥有你的文件系统、数据库、浏览器、Git 仓库、公司内部系统权限。&lt;/p&gt;
&lt;p&gt;所以，大模型应用真正要解决的是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;给模型什么上下文。&lt;/li&gt;
&lt;li&gt;允许模型调用哪些能力。&lt;/li&gt;
&lt;li&gt;模型何时该自己回答，何时该查数据或执行动作。&lt;/li&gt;
&lt;li&gt;工具调用前后如何校验安全性和结果质量。&lt;/li&gt;
&lt;li&gt;多步骤任务失败时如何恢复。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这就是 Agent、Tool、MCP、Skill 等概念出现的原因。&lt;/p&gt;</description></item></channel></rss>