<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
<channel>
<atom:link href="https://carota.site/feed" rel="self" type="application/rss+xml"/>
<title>知行</title>
<link>https://carota.site</link>
<description>欢迎光临~  技术分享，生活感思，好玩的东西</description>
<language>zh-CN</language>
<copyright>© lollapalooza </copyright>
<pubDate>Tue, 19 May 2026 02:16:10 GMT</pubDate>
<generator>Mix Space CMS (https://github.com/mx-space)</generator>
<docs>https://mx-space.js.org</docs>
<image>
    <url>https://avatars.githubusercontent.com/u/17880398?v=4</url>
    <title>知行</title>
    <link>https://carota.site</link>
</image>
<item>
    <title>LLM 也需要虚拟内存：Demand Paging for Context Window</title>
    <link>https://carota.site/posts/tech/arxiv-llms-need-virtual-memory-demand-paging-context-window</link>
    <pubDate>Thu, 12 Mar 2026 08:23:05 GMT</pubDate>
    <description>最近看到一篇非常有意思的论文：

《The Missing Memory Hierarchy: De</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://carota.site/posts/tech/arxiv-llms-need-virtual-memory-demand-paging-context-window'>https://carota.site/posts/tech/arxiv-llms-need-virtual-memory-demand-paging-context-window</a></blockquote>
          <p>最近看到一篇非常有意思的论文：</p>
<p><strong>《The Missing Memory Hierarchy: Demand Paging for LLM Context Windows》</strong></p>
<p>论文地址：</p>
<ul>
<li>The Missing Memory Hierarchy: Demand Paging for LLM Context Windows</li>
<li>原文：<a href="https://arxiv.org/abs/2603.09023">https://arxiv.org/abs/2603.09023</a></li>
</ul>
<p>这篇论文的核心观点非常简单但极具启发性：</p>
<blockquote>
<p><strong>LLM 的上下文窗口，本质上是一个没有内存管理系统的“裸内存”。</strong></p>
</blockquote>
<p>如果把 LLM Agent 看成一个程序，那么当前的设计就像：</p>
<ul>
<li>所有历史数据都一直留在内存里</li>
<li>每次执行都重新扫描整个内存</li>
<li>没有分页</li>
<li>没有缓存</li>
<li>没有工作集</li>
<li>没有淘汰策略</li>
</ul>
<p>这显然是非常原始的。</p>
<p>论文作者做了一件很“操作系统味”的事情：</p>
<blockquote>
<p><strong>给 LLM 上下文加一个虚拟内存系统。</strong></p>
</blockquote>
<hr>
<h1>一、问题：LLM 上下文在大量浪费 token</h1>
<p>作者首先做了一件很重要的事情：</p>
<p><strong>分析真实生产日志。</strong></p>
<p>数据来源：</p>
<ul>
<li>857 个 Claude Code 会话</li>
<li>54,170 次 API 调用</li>
<li>总输入 token：<strong>4.45B</strong></li>
</ul>
<p>作者把每条消息拆成几类：</p>
<ul>
<li>用户输入</li>
<li>模型回复</li>
<li>工具输出（read file / bash / etc）</li>
</ul>
<p>然后统计：</p>
<ul>
<li>token 占比</li>
<li>使用频率</li>
<li>重复读取情况</li>
</ul>
<p>结果非常惊人。</p>
<h2>1 结构性浪费：21.8%</h2>
<p>约 <strong>21.8% 的 token 是结构性浪费</strong>：</p>
<p>主要来自：</p>
<p>1️⃣ <strong>工具定义</strong></p>
<p>很多工具定义几千 token
但会话里从未调用。</p>
<p>却在 <strong>每一轮请求里重复发送</strong>。</p>
<hr>
<p>2️⃣ <strong>旧工具输出</strong></p>
<p>比如：</p>
<pre><code class="language-">Read file: file.py (10KB)</code></pre><p>后续 80 轮对话里：</p>
<ul>
<li>每一轮 API 调用</li>
<li>都重新发送这 10KB</li>
<li>都参与 attention</li>
</ul>
<p>但实际 <strong>再也没被引用过</strong>。</p>
<hr>
<p>3️⃣ <strong>重复配置</strong></p>
<p>例如：</p>
<ul>
<li>skill 列表</li>
<li>agent 说明</li>
<li>prompt 模板</li>
</ul>
<p>经常被复制多份。</p>
<hr>
<h1>二、关键观察：工具输出会被“无限放大”</h1>
<p>论文提出一个概念：</p>
<p><strong>Amplification Factor（放大因子）</strong></p>
<p>例如：</p>
<ul>
<li>第 5 轮读取一个文件</li>
<li>文件大小 10KB</li>
<li>会话共 85 轮</li>
</ul>
<p>那么这个文件会被：</p>
<pre><code class="language-">重复发送 ≈ 80 次</code></pre><p>放大因子：</p>
<pre><code class="language-">80×</code></pre><p>而每一次都要参与 attention 计算。</p>
<hr>
<h1>三、解决方案：给 LLM 上下文做“虚拟内存”</h1>
<p>论文的核心系统叫：</p>
<p><strong>Pichay</strong></p>
<p>它的实现非常巧妙。</p>
<p>不是改模型。</p>
<p>而是：</p>
<blockquote>
<p><strong>在客户端和 LLM API 之间插一个代理。</strong></p>
</blockquote>
<p>架构如下：</p>
<pre><code class="language-">IDE / Agent
      ↓
   Pichay Proxy
      ↓
   LLM API</code></pre><p>代理负责：</p>
<ul>
<li>统计 token</li>
<li>修改上下文</li>
<li>删除旧内容</li>
<li>必要时再恢复</li>
</ul>
<p>模型和客户端完全无感。</p>
<hr>
<h1>四、核心思想：Demand Paging</h1>
<p>作者把 LLM 上下文类比为操作系统内存。</p>
<table>
<thead>
<tr>
<th>OS</th>
<th>LLM</th>
</tr>
</thead>
<tbody><tr>
<td>RAM</td>
<td>Context Window</td>
</tr>
<tr>
<td>Page</td>
<td>工具输出</td>
</tr>
<tr>
<td>Page fault</td>
<td>再次读取文件</td>
</tr>
<tr>
<td>Page eviction</td>
<td>删除旧工具输出</td>
</tr>
</tbody></table>
<hr>
<h2>1 淘汰策略（Eviction）</h2>
<p>非常简单：</p>
<p>当一个工具输出满足：</p>
<pre><code class="language-">大小 &gt; 500B
且
超过 4 个用户回合未使用</code></pre><p>就淘汰。</p>
<hr>
<h2>2 被淘汰的内容如何表示？</h2>
<p>替换成一个 <strong>占位符</strong>：</p>
<pre><code class="language-">[Paged out: Read file.py (8192 bytes). Re-read if needed]</code></pre><p>模型如果需要：</p>
<p>就会再次调用工具。</p>
<hr>
<h2>3 Page Fault（缺页）</h2>
<p>如果模型再次调用：</p>
<pre><code class="language-">Read file.py</code></pre><p>代理检测到：</p>
<pre><code class="language-">刚刚淘汰过这个内容</code></pre><p>于是：</p>
<ul>
<li>重新读取文件</li>
<li>注入上下文</li>
</ul>
<p>这就是：</p>
<p><strong>LLM 的 page fault。</strong></p>
<hr>
<h2>4 Fault-driven Pinning</h2>
<p>如果某个页面：</p>
<pre><code class="language-">被淘汰 → 发生缺页</code></pre><p>说明淘汰太早。</p>
<p>系统就会：</p>
<pre><code class="language-">pin 这个页面</code></pre><p>以后不再淘汰。</p>
<p>除非：</p>
<pre><code class="language-">文件内容发生变化</code></pre><hr>
<h1>五、离线实验：删错概率极低</h1>
<p>作者用 <strong>29 个完整会话</strong>做离线重放实验。</p>
<p>模拟：</p>
<pre><code class="language-">如果当时删掉这些内容
后面会不会再用？</code></pre><p>结果：</p>
<ul>
<li>模拟删除：<strong>1,393,000 次</strong></li>
<li>缺页：<strong>354 次</strong></li>
</ul>
<p>缺页率：</p>
<pre><code class="language-">0.0254%</code></pre><p>也就是说：</p>
<blockquote>
<p><strong>99.97% 的删除都是安全的。</strong></p>
</blockquote>
<hr>
<h1>六、在线实验：token 下降 37%</h1>
<p>作者对比三种策略：</p>
<table>
<thead>
<tr>
<th>模式</th>
<th>策略</th>
</tr>
</thead>
<tbody><tr>
<td>Baseline</td>
<td>不做任何修改</td>
</tr>
<tr>
<td>Trimmed</td>
<td>裁剪工具定义</td>
</tr>
<tr>
<td>Compact+Trim</td>
<td>加分页</td>
</tr>
</tbody></table>
<p>结果：</p>
<pre><code class="language-">Trimmed
↓
token -22.6%

Compact + Trim
↓
token -37.1%</code></pre><p>而任务：</p>
<ul>
<li>全部完成</li>
<li>没有质量下降</li>
</ul>
<p>甚至有些情况下：</p>
<p><strong>回答质量更好。</strong></p>
<p>原因很简单：</p>
<blockquote>
<p>噪音减少，注意力更集中。</p>
</blockquote>
<hr>
<h1>七、真实生产案例</h1>
<p>作者把 Pichay 用在自己的开发环境。</p>
<h2>Case A：正常开发</h2>
<p>原始上下文：</p>
<pre><code class="language-">剩余空间：7%</code></pre><p>启用分页：</p>
<pre><code class="language-">剩余空间：43%</code></pre><p>删除：</p>
<pre><code class="language-">15 个数据块</code></pre><p>缺页：</p>
<pre><code class="language-">1 次</code></pre><p>几乎完美。</p>
<hr>
<h2>Case B：极端长会话</h2>
<p>681 轮。</p>
<p>系统出现：</p>
<p><strong>Thrashing（抖动）</strong></p>
<pre><code class="language-">删除 680 次
缺页 659 次</code></pre><p>原因：</p>
<p>工作集太大。</p>
<p>不断：</p>
<pre><code class="language-">删 → 读 → 删 → 读</code></pre><p>类似操作系统的：</p>
<p><strong>swap storm。</strong></p>
<hr>
<h1>八、最重要的理论结论</h1>
<p>传统操作系统：</p>
<pre><code class="language-">缺页很贵</code></pre><p>所以策略是：</p>
<pre><code class="language-">尽量减少缺页</code></pre><p>但 LLM 完全相反。</p>
<hr>
<h2>LLM 的成本模型</h2>
<p>如果一个内容一直留在上下文：</p>
<p>每生成一个 token
都要重新计算 attention。</p>
<p>复杂度：</p>
<pre><code class="language-">O(n²)</code></pre><p>因此：</p>
<p><strong>保留 token 的累计成本非常高。</strong></p>
<hr>
<p>而重新读取文件：</p>
<p>成本是：</p>
<pre><code class="language-">O(n)</code></pre><p>所以结论是：</p>
<blockquote>
<p><strong>在 LLM 中，宁可多一点 page fault，也不要保留太多 token。</strong></p>
</blockquote>
<hr>
<h1>九、这件事为什么很重要</h1>
<p>这篇论文其实在说一件很大的事情：</p>
<blockquote>
<p><strong>未来的 LLM 系统必须有内存层级。</strong></p>
</blockquote>
<p>可以类比成：</p>
<table>
<thead>
<tr>
<th>层级</th>
<th>含义</th>
</tr>
</thead>
<tbody><tr>
<td>L1</td>
<td>当前上下文</td>
</tr>
<tr>
<td>L2</td>
<td>Working set</td>
</tr>
<tr>
<td>L3</td>
<td>会话总结</td>
</tr>
<tr>
<td>L4</td>
<td>长期记忆</td>
</tr>
</tbody></table>
<p>当前 LLM 系统：</p>
<p>只有 <strong>L1。</strong></p>
<hr>
<h1>十、未来方向</h1>
<p>论文提出了很多值得研究的方向：</p>
<h3>1 成本驱动的 eviction</h3>
<p>不再看：</p>
<pre><code class="language-">回合数</code></pre><p>而是计算：</p>
<pre><code class="language-">未来 attention 成本</code></pre><hr>
<h3>2 phase-aware memory</h3>
<p>识别：</p>
<pre><code class="language-">planning phase
execution phase</code></pre><p>不同阶段使用不同策略。</p>
<hr>
<h3>3 pin decay</h3>
<p>当前：</p>
<pre><code class="language-">缺页一次 → 永久 pin</code></pre><p>未来：</p>
<pre><code class="language-">pin 逐渐衰减</code></pre><hr>
<h3>4 object-level memory</h3>
<p>不再按：</p>
<pre><code class="language-">文件
消息</code></pre><p>分页。</p>
<p>而是：</p>
<pre><code class="language-">决策
任务
debug 会话</code></pre><hr>
<h1>十一、我的一些思考</h1>
<p>这篇论文的最大价值是：</p>
<blockquote>
<p><strong>把 LLM memory 问题彻底系统化。</strong></p>
</blockquote>
<p>它告诉我们：</p>
<p>未来 AI Agent 的架构可能会像这样：</p>
<pre><code class="language-">LLM
 ↓
Memory Manager
 ↓
Context Cache
 ↓
Retrieval System
 ↓
Persistent Memory</code></pre><p>而不是：</p>
<pre><code class="language-">LLM
 ↓
巨大 prompt</code></pre><p>换句话说：</p>
<p><strong>Prompt Engineering → Context Engineering</strong></p>
<hr>
<h1>十二、总结</h1>
<p>这篇论文最核心的发现：</p>
<p>1️⃣ <strong>21.8% token 是结构性浪费</strong></p>
<p>2️⃣ <strong>简单分页策略缺页率只有 0.025%</strong></p>
<p>3️⃣ <strong>token 使用减少 37%</strong></p>
<p>4️⃣ <strong>回答质量没有下降</strong></p>
<p>5️⃣ <strong>LLM 的成本模型与传统虚拟内存完全相反</strong></p>
<hr>
<p>如果未来 LLM agent 真的要：</p>
<ul>
<li>长时间工作</li>
<li>多工具协作</li>
<li>持续项目开发</li>
</ul>
<p>那么：</p>
<blockquote>
<p><strong>Memory hierarchy 可能会成为 AI 系统的核心基础设施。</strong></p>
</blockquote>
<p>而这篇论文很可能会成为这个领域的 <strong>早期经典工作之一</strong>。</p>

          <p style='text-align: right'>
          <a href='https://carota.site/posts/tech/arxiv-llms-need-virtual-memory-demand-paging-context-window#comments'>看完了？说点什么呢</a>
          </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">138265555285590087</guid>
  <category>post</category>
<category>技术</category>
 </item>
  <item>
    <title>在 Agent 时代如何做软件工程</title>
    <link>https://carota.site/posts/books/software-engineering-in-the-agent-era</link>
    <pubDate>Wed, 11 Mar 2026 13:23:45 GMT</pubDate>
    <description>—— OpenAI 如何用 Codex 构建一个 100 万行代码的系统

最近 OpenAI 工程</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://carota.site/posts/books/software-engineering-in-the-agent-era'>https://carota.site/posts/books/software-engineering-in-the-agent-era</a></blockquote>
          <h2>—— OpenAI 如何用 Codex 构建一个 100 万行代码的系统</h2>
<p>最近 OpenAI 工程团队分享了一篇非常值得工程师阅读的文章：</p>
<p><strong>原文：</strong>
<a href="https://openai.com/zh-Hans-CN/index/harness-engineering/">https://openai.com/zh-Hans-CN/index/harness-engineering/</a></p>
<p>文章讲述了他们进行的一次实验：</p>
<blockquote>
<p><strong>构建一个真实的软件产品，但整个代码库没有一行代码是人工编写的。</strong></p>
</blockquote>
<p>所有代码，包括：</p>
<ul>
<li>应用逻辑</li>
<li>测试</li>
<li>CI/CD</li>
<li>文档</li>
<li>运维脚本</li>
<li>内部工具</li>
</ul>
<p><strong>全部由 Codex 生成。</strong></p>
<p>而人类工程师只做一件事：</p>
<blockquote>
<p><strong>设计系统、约束和反馈循环。</strong></p>
</blockquote>
<p>最终他们用 <strong>3 个工程师</strong> 在 <strong>5 个月内构建了一个接近 100 万行代码的系统</strong>。</p>
<p>这篇文章其实揭示了一个重要趋势：</p>
<blockquote>
<p><strong>软件工程正在从 “写代码” 转变为 “设计 AI 能工作的系统”。</strong></p>
</blockquote>
<p>下面我把这篇文章的核心内容拆解出来，分析它对未来工程模式意味着什么。</p>
<hr>
<h1>一、实验：一个完全由 AI 生成代码的产品</h1>
<p>OpenAI 团队从 <strong>一个空 Git 仓库</strong>开始。</p>
<p>初始架构由 Codex + GPT-5 自动生成，包括：</p>
<ul>
<li>项目结构</li>
<li>CI 配置</li>
<li>代码格式规则</li>
<li>包管理</li>
<li>应用框架</li>
<li>AGENTS.md</li>
</ul>
<p>甚至：</p>
<blockquote>
<p><strong>指导 AI 如何在仓库中工作的文档，也是 AI 写的。</strong></p>
</blockquote>
<p>5 个月后结果：</p>
<ul>
<li><strong>约 100 万行代码</strong></li>
<li><strong>1500+ Pull Request</strong></li>
<li><strong>团队只有 3 个工程师</strong></li>
<li>平均 <strong>每人每天处理 3.5 个 PR</strong></li>
</ul>
<p>系统已经有：</p>
<ul>
<li>内部日活用户</li>
<li>外部 Alpha 用户</li>
</ul>
<p>换句话说：</p>
<blockquote>
<p>这不是 Demo，而是一个真实运行的产品。</p>
</blockquote>
<p>他们的核心原则是：</p>
<blockquote>
<p><strong>Humans steer, agents execute.</strong>
人类掌舵，AI 执行。</p>
</blockquote>
<hr>
<h1>二、工程师角色发生了变化</h1>
<p>在这个体系下：</p>
<p><strong>工程师几乎不写代码。</strong></p>
<p>工程师的工作变成：</p>
<p>1️⃣ 设计系统结构
2️⃣ 定义任务目标
3️⃣ 设计反馈循环
4️⃣ 构建 AI 能使用的工具</p>
<p>换句话说：</p>
<p>以前：</p>
<pre><code class="language-">工程师 -&gt; 写代码 -&gt; 提 PR</code></pre><p>现在：</p>
<pre><code class="language-">工程师 -&gt; 描述任务
      -&gt; 运行 Agent
      -&gt; Agent 提 PR
      -&gt; Agent review
      -&gt; 自动修复</code></pre><p>整个流程类似这样：</p>
<pre><code class="language-">Engineer
   ↓
Prompt
   ↓
Codex
   ↓
Open PR
   ↓
Agent Review
   ↓
Fix
   ↓
Merge</code></pre><p>很多时候：</p>
<blockquote>
<p><strong>PR review 也是 AI 做的。</strong></p>
</blockquote>
<hr>
<h1>三、系统必须“对 Agent 可读”</h1>
<p>一个非常重要的经验：</p>
<blockquote>
<p><strong>Agent 看不到的知识 = 不存在。</strong></p>
</blockquote>
<p>例如：</p>
<ul>
<li>Slack 讨论</li>
<li>Google Docs</li>
<li>人脑记忆</li>
</ul>
<p>对 AI 来说都是 <strong>不可见的知识</strong>。</p>
<p>因此他们做了一个关键决定：</p>
<blockquote>
<p><strong>把代码仓库变成唯一的信息来源。</strong></p>
</blockquote>
<p>所有内容都写入 repo：</p>
<ul>
<li>架构文档</li>
<li>设计文档</li>
<li>产品规格</li>
<li>执行计划</li>
<li>技术债务</li>
<li>决策记录</li>
</ul>
<p>目录结构大概是这样：</p>
<pre><code class="language-">AGENTS.md
ARCHITECTURE.md

docs/
 ├ design-docs/
 ├ exec-plans/
 ├ product-specs/
 ├ references/
 ├ SECURITY.md
 ├ RELIABILITY.md
 └ QUALITY_SCORE.md</code></pre><p>AI 通过这个结构：</p>
<ul>
<li>找信息</li>
<li>推理系统</li>
<li>修改代码</li>
</ul>
<p>他们称这种方式为：</p>
<blockquote>
<p><strong>Agent-readable repository</strong></p>
</blockquote>
<hr>
<h1>四、不要写 1000 行 prompt</h1>
<p>他们曾尝试：</p>
<pre><code class="language-">一个巨大 AGENTS.md</code></pre><p>结果完全失败。</p>
<p>原因是：</p>
<h3>1 情境窗口是稀缺资源</h3>
<p>长文档会挤掉：</p>
<ul>
<li>代码</li>
<li>任务</li>
<li>重要上下文</li>
</ul>
<hr>
<h3>2 过多规则会失效</h3>
<p>当所有东西都重要：</p>
<blockquote>
<p>其实没有东西重要。</p>
</blockquote>
<hr>
<h3>3 文档会腐烂</h3>
<p>如果维护成本太高：</p>
<p>文档会变成：</p>
<blockquote>
<p><strong>过期规则的坟场</strong></p>
</blockquote>
<hr>
<p>他们最后采用的方法是：</p>
<p><strong>AGENTS.md 只做目录</strong></p>
<p>类似：</p>
<pre><code class="language-">AGENTS.md
  ↓
ARCHITECTURE.md
  ↓
docs/
  ↓
design-docs/</code></pre><p>也就是：</p>
<blockquote>
<p><strong>给 AI 一张地图，而不是一本说明书。</strong></p>
</blockquote>
<hr>
<h1>五、架构必须严格</h1>
<p>Agent 在这种环境下有一个特点：</p>
<blockquote>
<p><strong>会复制已有模式。</strong></p>
</blockquote>
<p>如果架构不严格：</p>
<p>代码会快速漂移。</p>
<p>因此他们强制使用：</p>
<p><strong>严格分层架构</strong></p>
<p>例如：</p>
<pre><code class="language-">Types
  ↓
Config
  ↓
Repo
  ↓
Service
  ↓
Runtime
  ↓
UI</code></pre><p>规则：</p>
<ul>
<li>只能向下依赖</li>
<li>不允许跨层调用</li>
</ul>
<p>所有规则通过：</p>
<ul>
<li>custom linter</li>
<li>结构测试</li>
</ul>
<p>自动执行。</p>
<p>也就是说：</p>
<blockquote>
<p>架构约束是机器执行的。</p>
</blockquote>
<hr>
<h1>六、吞吐量改变了工程文化</h1>
<p>Agent 写代码的速度远远超过人类。</p>
<p>这带来了一个新问题：</p>
<p><strong>代码吞吐量远大于人类审查能力。</strong></p>
<p>因此他们改变了传统工程文化：</p>
<p>以前：</p>
<pre><code class="language-">严格 gate
必须 review
CI 必须通过</code></pre><p>现在：</p>
<pre><code class="language-">快速 merge
问题后修</code></pre><p>因为：</p>
<blockquote>
<p><strong>等待的成本比修复更高。</strong></p>
</blockquote>
<hr>
<h1>七、AI 可以自动完成整个开发流程</h1>
<p>随着工具完善，现在 Codex 已经可以：</p>
<p>自动完成整个开发流程：</p>
<p>1️⃣ 验证代码库状态
2️⃣ 复现 bug
3️⃣ 录制 bug 视频
4️⃣ 实现修复
5️⃣ 运行应用验证
6️⃣ 录制修复视频
7️⃣ 提 PR
8️⃣ 处理 review
9️⃣ 修复 CI
🔟 自动 merge</p>
<p>人类只在必要时介入。</p>
<hr>
<h1>八、新问题：AI 会制造“技术债”</h1>
<p>完全 AI 开发会带来一个问题：</p>
<blockquote>
<p><strong>AI 会复制错误模式。</strong></p>
</blockquote>
<p>例如：</p>
<ul>
<li>不一致的实现</li>
<li>不合理 abstraction</li>
<li>重复工具</li>
</ul>
<p>他们最初的做法是：</p>
<p><strong>每周五清理 AI 代码。</strong></p>
<p>后来发现不可扩展。</p>
<p>最终解决方法是：</p>
<blockquote>
<p><strong>把工程原则写进代码。</strong></p>
</blockquote>
<p>例如：</p>
<ul>
<li>禁止 YOLO parsing</li>
<li>强制 typed SDK</li>
<li>优先共享工具库</li>
</ul>
<p>然后：</p>
<p>定期运行 <strong>Refactor Agent</strong>。</p>
<p>类似：</p>
<blockquote>
<p><strong>自动垃圾回收（GC）。</strong></p>
</blockquote>
<hr>
<h1>九、真正稀缺的资源：人类注意力</h1>
<p>这篇文章最后总结了一句话：</p>
<blockquote>
<p><strong>软件工程的瓶颈不再是写代码，而是人类注意力。</strong></p>
</blockquote>
<p>未来工程体系的核心问题变成：</p>
<ul>
<li>如何设计环境</li>
<li>如何设计反馈循环</li>
<li>如何设计约束系统</li>
</ul>
<p>而不是：</p>
<blockquote>
<p>写代码。</p>
</blockquote>
<hr>
<h1>十、对未来软件工程的启示</h1>
<p>这篇文章透露了一个非常重要的趋势：</p>
<p>软件工程正在进入：</p>
<blockquote>
<p><strong>Agent-first engineering</strong></p>
</blockquote>
<p>未来工程师更像：</p>
<p><strong>系统设计师</strong></p>
<p>而不是：</p>
<p><strong>代码工人</strong></p>
<p>未来的核心能力可能是：</p>
<ul>
<li>架构设计</li>
<li>Agent workflow</li>
<li>工程自动化</li>
<li>feedback loop 设计</li>
<li>工程知识建模</li>
</ul>
<p>而不是：</p>
<ul>
<li>写 CRUD</li>
</ul>
<hr>
<h1>结语</h1>
<p>这篇文章其实说明了一件事：</p>
<p><strong>AI 不只是写代码工具。</strong></p>
<p>它正在改变：</p>
<blockquote>
<p><strong>软件工程本身的结构。</strong></p>
</blockquote>
<p>未来的软件团队可能会变成：</p>
<pre><code class="language-">少量工程师
+
大量 AI Agent
+
高度结构化的代码仓库</code></pre><p>而工程师的核心价值将变成：</p>
<blockquote>
<p><strong>设计 AI 能高效工作的系统。</strong></p>
</blockquote>

          <p style='text-align: right'>
          <a href='https://carota.site/posts/books/software-engineering-in-the-agent-era#comments'>看完了？说点什么呢</a>
          </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">138265555285590086</guid>
  <category>post</category>
<category>阅读</category>
 </item>
  <item>
    <title>不用 Docker 也能训练 AI 写代码：SWE-MiniSandbox 深度解析</title>
    <link>https://carota.site/posts/tech/arxiv-swe-minisanbox</link>
    <pubDate>Tue, 10 Mar 2026 03:19:12 GMT</pubDate>
    <description>SWE-MiniSandbox: Container-Free Reinforcement Lear</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://carota.site/posts/tech/arxiv-swe-minisanbox'>https://carota.site/posts/tech/arxiv-swe-minisanbox</a></blockquote>
          <blockquote>
<p><strong>SWE-MiniSandbox: Container-Free Reinforcement Learning for Building Software Engineering Agents</strong>
arXiv:2602.11210</p>
</blockquote>
<p>近年来，**Software Engineering Agents（AI 自动修 bug / 改代码）**成为一个热门方向，例如：</p>
<ul>
<li>SWE-agent</li>
<li>OpenHands</li>
<li>Devin 类系统</li>
<li>SWE-bench 等评测体系</li>
</ul>
<p>但这类系统背后有一个 <strong>非常现实的工程问题</strong>：</p>
<blockquote>
<p>如何为 AI agent 提供可执行代码、运行测试、修改仓库的隔离环境？</p>
</blockquote>
<p>传统方案几乎全部依赖 <strong>Docker 容器</strong>。</p>
<p>然而容器带来了新的问题：</p>
<ul>
<li>环境准备慢</li>
<li>镜像非常大</li>
<li>高并发训练成本高</li>
<li>需要 Docker / Kubernetes 基础设施</li>
</ul>
<p>最近的一篇论文 <strong>SWE-MiniSandbox</strong> 提出了一种非常有意思的思路：</p>
<blockquote>
<p><strong>完全不使用容器，而是用 Linux 内核机制实现轻量隔离环境。</strong></p>
</blockquote>
<p>结果是：</p>
<ul>
<li>存储占用减少 <strong>85%+</strong></li>
<li>环境准备时间降低 <strong>75%</strong></li>
<li>RL 训练效果几乎一致</li>
</ul>
<p>本文我们来系统分析这套系统。</p>
<hr>
<h1>一、问题背景：为什么 Docker 会成为瓶颈</h1>
<p>在 SWE Agent 系统中，一个任务通常是：</p>
<pre><code class="language-">1. clone GitHub repo
2. checkout 某个 commit
3. 安装依赖
4. 运行测试
5. agent 修改代码
6. 再次运行测试
7. 判断 patch 是否成功</code></pre><p>为了防止：</p>
<ul>
<li>不同任务互相污染</li>
<li>依赖冲突</li>
<li>agent 执行危险命令</li>
</ul>
<p>通常每个任务都会运行在 <strong>独立 Docker 容器里</strong>。</p>
<p>典型流程：</p>
<pre><code class="language-">task -&gt; docker container
     -&gt; code repo
     -&gt; python env
     -&gt; run tests</code></pre><p>但问题在于：</p>
<h3>1 镜像体积巨大</h3>
<p>很多 SWE-bench 任务的镜像：</p>
<pre><code class="language-">1GB ~ 3GB</code></pre><p>几十个任务就可能：</p>
<pre><code class="language-">&gt; 100GB</code></pre><h3>2 启动时间慢</h3>
<p>容器启动 + 初始化环境：</p>
<pre><code class="language-">~90 秒</code></pre><h3>3 RL 训练并发非常高</h3>
<p>强化学习训练常见：</p>
<pre><code class="language-">128 - 512 parallel environments</code></pre><p>Docker 带来的开销就变得非常明显。</p>
<hr>
<h1>二、核心思想：用 Linux 内核替代容器</h1>
<p>SWE-MiniSandbox 的关键思路是：</p>
<blockquote>
<p><strong>容器其实不是必须的。</strong></p>
</blockquote>
<p>很多隔离能力 <strong>Linux 内核本身就提供了</strong>。</p>
<p>论文选择了两个核心机制：</p>
<pre><code class="language-">mount namespace
+
chroot</code></pre><p>实现隔离 sandbox。</p>
<hr>
<h1>三、核心技术一：mount namespace</h1>
<p>Linux 的 <strong>namespace</strong> 是容器技术的基础。</p>
<p>Docker 本质上就是组合了：</p>
<pre><code class="language-">PID namespace
Network namespace
Mount namespace
User namespace
...</code></pre><p>SWE-MiniSandbox只使用其中一部分。</p>
<h3>mount namespace 的作用</h3>
<p>它可以让一个进程：</p>
<blockquote>
<p>看到 <strong>完全不同的文件系统挂载视图</strong></p>
</blockquote>
<p>例如：</p>
<p>主机目录</p>
<pre><code class="language-">/
├── home
├── usr
└── data</code></pre><p>sandbox 内看到：</p>
<pre><code class="language-">/
├── repo
├── venv
└── tmp</code></pre><p>每个 sandbox：</p>
<pre><code class="language-">文件系统完全独立</code></pre><hr>
<h1>四、核心技术二：chroot</h1>
<p><code>chroot</code> 是 Linux 非常古老但强大的功能。</p>
<p>它可以：</p>
<blockquote>
<p><strong>改变进程的 root 目录</strong></p>
</blockquote>
<p>执行：</p>
<pre><code class="language-">chroot /sandbox/task_001</code></pre><p>后这个进程看到的：</p>
<pre><code class="language-">/ == /sandbox/task_001</code></pre><p>所以：</p>
<pre><code class="language-">/repo
/venv
/tmp</code></pre><p>都变成了独立环境。</p>
<p>结合 <strong>mount namespace + chroot</strong>：</p>
<p>每个任务就像拥有一个 <strong>自己的 Linux 根目录</strong>。</p>
<p>但它仍然共享：</p>
<pre><code class="language-">kernel
系统库
部分资源</code></pre><p>所以非常轻量。</p>
<hr>
<h1>五、核心技术三：Python 环境复用</h1>
<p>SWE-MiniSandbox 的另一个关键优化：</p>
<blockquote>
<p><strong>避免重复创建 Python 环境</strong></p>
</blockquote>
<p>传统 Docker：</p>
<pre><code class="language-">每个镜像包含
OS
Python
依赖</code></pre><p>体积很大。</p>
<p>MiniSandbox 的方案：</p>
<h3>Step 1：共享 miniconda</h3>
<p>宿主机安装：</p>
<pre><code class="language-">miniconda3</code></pre><h3>Step 2：创建 venv</h3>
<p>每个任务：</p>
<pre><code class="language-">python -m venv</code></pre><p>venv 结构：</p>
<pre><code class="language-">venv/
  bin/
  site-packages/
  symlink -&gt; python</code></pre><p>很多文件其实是：</p>
<pre><code class="language-">符号链接</code></pre><p>所以体积只有：</p>
<pre><code class="language-">~100MB</code></pre><hr>
<h1>六、核心技术四：环境缓存</h1>
<p>环境构建最慢的步骤是：</p>
<pre><code class="language-">pip install
repo setup
test run</code></pre><p>MiniSandbox 的做法：</p>
<h3>预构建环境</h3>
<p>第一次：</p>
<pre><code class="language-">repo
+ venv
+ dependencies
+ tests</code></pre><p>全部准备好后：</p>
<pre><code class="language-">tar.gz</code></pre><p>缓存。</p>
<p>之后每个任务只需要：</p>
<pre><code class="language-">untar</code></pre><p>就能直接使用。</p>
<hr>
<h1>七、核心技术五：I/O 并发控制</h1>
<p>解压 tar 包其实是 <strong>磁盘 I/O 密集任务</strong>。</p>
<p>如果 100 个任务同时解压：</p>
<pre><code class="language-">磁盘直接打爆</code></pre><p>作者提出一个简单模型：</p>
<p>假设：</p>
<pre><code class="language-">磁盘带宽 = B
每个解压 = bj</code></pre><p>同时解压数量：</p>
<pre><code class="language-">∑ bj ≤ B</code></pre><p>实现方式：</p>
<pre><code class="language-">Ray resource tags
+
semaphore</code></pre><p>控制同时解压任务数。</p>
<hr>
<h1>八、系统架构</h1>
<p>MiniSandbox 并不是单独系统，而是嵌入 SWE Agent 生态。</p>
<p>整体结构：</p>
<pre><code class="language-">                +-------------------+
                |      SkyRL        |
                |  RL distributed   |
                +---------+---------+
                          |
                          |
               +----------v-----------+
               |      SWE-agent       |
               |   solve issues       |
               +----------+-----------+
                          |
                          |
                +---------v---------+
                |      SWE-Rex      |
                | terminal control  |
                +---------+---------+
                          |
                          |
                +---------v---------+
                |   MiniSandbox     |
                | mount + chroot    |
                +-------------------+</code></pre><p>每个 sandbox：</p>
<pre><code class="language-">repo
venv
terminal</code></pre><hr>
<h1>九、实验结果</h1>
<p>论文使用：</p>
<pre><code class="language-">SWE-smith
SWE-bench Verified</code></pre><h2>1 存储节省</h2>
<table>
<thead>
<tr>
<th>数据集</th>
<th>Docker</th>
<th>MiniSandbox</th>
</tr>
</thead>
<tbody><tr>
<td>SWE-smith</td>
<td>295 GB</td>
<td>13.5 GB</td>
</tr>
<tr>
<td>SWE-bench</td>
<td>605 GB</td>
<td>89 GB</td>
</tr>
</tbody></table>
<p>节省：</p>
<pre><code class="language-">85%+</code></pre><hr>
<h2>2 环境准备时间</h2>
<table>
<thead>
<tr>
<th>方法</th>
<th>时间</th>
</tr>
</thead>
<tbody><tr>
<td>Docker</td>
<td>88.9 s</td>
</tr>
<tr>
<td>MiniSandbox</td>
<td>23.6 s</td>
</tr>
</tbody></table>
<p>加速：</p>
<pre><code class="language-">~4x</code></pre><hr>
<h2>3 rollout 时间</h2>
<p>平均任务时间：</p>
<pre><code class="language-">Docker       ~350s
MiniSandbox  ~250s</code></pre><p>明显更快。</p>
<hr>
<h2>4 训练效果</h2>
<p>论文引入指标：</p>
<pre><code class="language-">Reward MD (Mean Deviation)</code></pre><p>衡量：</p>
<pre><code class="language-">两种框架训练的 reward 差异</code></pre><p>结果：</p>
<pre><code class="language-">≈ 0</code></pre><p>说明：</p>
<blockquote>
<p>RL 训练信号几乎一致。</p>
</blockquote>
<hr>
<h1>十、为什么这项工作重要</h1>
<p>这篇论文并没有提出新的 AI 模型。</p>
<p>但它解决了一个 <strong>非常关键的系统问题</strong>：</p>
<blockquote>
<p>如何低成本运行 SWE agents。</p>
</blockquote>
<p>它带来的影响可能是：</p>
<h3>1 降低研究门槛</h3>
<p>很多团队没有：</p>
<pre><code class="language-">Docker cluster
Kubernetes</code></pre><p>MiniSandbox：</p>
<pre><code class="language-">普通 Linux 服务器
+
Python</code></pre><p>即可运行。</p>
<hr>
<h3>2 大规模 RL 更可行</h3>
<p>强化学习非常依赖：</p>
<pre><code class="language-">并行环境数量</code></pre><p>环境越轻：</p>
<pre><code class="language-">rollout 越快</code></pre><p>训练成本就越低。</p>
<hr>
<h3>3 企业部署更容易</h3>
<p>企业内部：</p>
<pre><code class="language-">CI
测试
自动修 bug</code></pre><p>很多场景其实不需要：</p>
<pre><code class="language-">完整容器</code></pre><p>MiniSandbox 更轻。</p>
<hr>
<h1>十一、局限性</h1>
<p>论文也非常坦诚地指出问题。</p>
<h3>1 安全隔离不如容器</h3>
<p>MiniSandbox 只有：</p>
<pre><code class="language-">mount namespace
chroot</code></pre><p>而 Docker 还有：</p>
<pre><code class="language-">cgroup
seccomp
user namespace
capabilities</code></pre><p>所以安全性略弱。</p>
<hr>
<h3>2 Python 项目为主</h3>
<p>实验主要集中：</p>
<pre><code class="language-">Python repos</code></pre><p>对于：</p>
<pre><code class="language-">C++
Rust
Java
复杂 build system</code></pre><p>仍需验证。</p>
<hr>
<h3>3 I/O 仍然是瓶颈</h3>
<p>即使优化后：</p>
<pre><code class="language-">repo copy
venv copy
untar</code></pre><p>仍然消耗较多时间。</p>
<p>未来可能用：</p>
<pre><code class="language-">overlayfs
copy-on-write</code></pre><p>进一步优化。</p>
<hr>
<h1>十二、我的一些思考</h1>
<p>这篇论文最有意思的地方是：</p>
<blockquote>
<p><strong>很多 AI 系统瓶颈其实不是模型，而是系统工程。</strong></p>
</blockquote>
<p>SWE agent 的发展：</p>
<pre><code class="language-">模型能力
+
工具链
+
环境系统</code></pre><p>缺一不可。</p>
<p>MiniSandbox 本质上是在做：</p>
<pre><code class="language-">AI infra optimization</code></pre><p>类似于：</p>
<pre><code class="language-">RL environment acceleration</code></pre><p>如果未来：</p>
<ul>
<li>SWE agents</li>
<li>Devin 类系统</li>
<li>自动代码修复</li>
</ul>
<p>大规模部署，</p>
<p>这种 <strong>轻量 sandbox</strong> 很可能成为新的基础设施。</p>
<hr>
<h1>总结</h1>
<p>SWE-MiniSandbox 的核心贡献可以总结为一句话：</p>
<blockquote>
<p><strong>用 Linux 原生隔离 + Python 环境缓存，替代 Docker 容器，构建轻量级 SWE agent 运行环境。</strong></p>
</blockquote>
<p>带来的收益：</p>
<ul>
<li>存储降低 <strong>85%+</strong></li>
<li>环境准备 <strong>4x 加速</strong></li>
<li>RL 训练效果 <strong>几乎一致</strong></li>
</ul>
<p>这说明：</p>
<blockquote>
<p>在 AI 系统工程里，很多时候 <strong>更好的系统设计比更大的模型更重要</strong>。</p>
</blockquote>

          <p style='text-align: right'>
          <a href='https://carota.site/posts/tech/arxiv-swe-minisanbox#comments'>看完了？说点什么呢</a>
          </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">138265555285590085</guid>
  <category>post</category>
<category>技术</category>
 </item>
  <item>
    <title>让软件工程 Agent 学会“按步骤复盘”：子任务级记忆机制解读</title>
    <link>https://carota.site/posts/tech/arxiv-saslm-for-se-agents</link>
    <pubDate>Fri, 27 Feb 2026 02:04:05 GMT</pubDate>
    <description>Structurally Aligned Subtask-Level Memory for Soft</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://carota.site/posts/tech/arxiv-saslm-for-se-agents'>https://carota.site/posts/tech/arxiv-saslm-for-se-agents</a></blockquote>
          <blockquote>
<p><strong>Structurally Aligned Subtask-Level Memory for Software Engineering Agents</strong><br>Kangning Shen, Jingyuan Zhang, Chenxi Sun et al.<br>arXiv:2602.21611 (2026)<br>🔗 原论文地址：<a href="https://arxiv.org/abs/2602.21611">https://arxiv.org/abs/2602.21611</a></p>
</blockquote>
<hr>
<h2>✨ 一句话总结</h2>
<p>这篇论文解决的是：</p>
<blockquote>
<p>❌ 过去：AI 只会“按整道题记经验”，容易误用<br>✅ 现在：AI 按 <strong>推理步骤</strong> 记经验，只在对应阶段调用 → 更稳、更准、更能复用</p>
</blockquote>
<p>在 SWE-bench Verified 上：</p>
<ul>
<li><p>平均提升 <strong>+4.7% Pass@1</strong></p>
</li>
<li><p>困难任务最高 <strong>+8.7%</strong></p>
</li>
<li><p>同时 <strong>显著降低结果波动</strong></p>
</li>
</ul>
<p>对于一个已经很难提升的 benchmark，这个增幅非常有含金量。</p>
<hr>
<h1>🧠 问题背景：为什么现有 Agent 的“记忆”不好用？</h1>
<p>现在很多 SWE Agent 的记忆方式是这样的：</p>
<blockquote>
<p>做完一个 issue → 写一份完整复盘 → 下次找“最像的一题”</p>
</blockquote>
<p>问题在于：</p>
<p>看起来像 ≠ 推理过程一样</p>
<p>例如：</p>
<table>
<thead>
<tr>
<th>issue</th>
<th>本质</th>
</tr>
</thead>
<tbody><tr>
<td>登录按钮点不了</td>
<td>前端事件绑定</td>
</tr>
<tr>
<td>登录一段时间后退出</td>
<td>后端 session 超时</td>
</tr>
</tbody></table>
<p>文本都包含 “login”，但解决路径完全不同。</p>
<p>这会导致：</p>
<ul>
<li><p>检索到错误经验</p>
</li>
<li><p>强模型反而被误导</p>
</li>
<li><p>性能波动变大</p>
</li>
</ul>
<hr>
<h1>🧩 核心思想：记忆必须和推理结构对齐</h1>
<p>软件工程任务天然是分阶段的：</p>
<ol>
<li><p>ANALYZE — 分析问题</p>
</li>
<li><p>REPRODUCE — 复现 bug</p>
</li>
<li><p>EDIT — 修改代码</p>
</li>
<li><p>VERIFY — 验证修复</p>
</li>
</ol>
<p>论文的核心设计：</p>
<blockquote>
<p>不再按“整道题”记<br>而是按“子任务阶段”记</p>
</blockquote>
<hr>
<h1>🗂 新的记忆单元长什么样？</h1>
<p>每条记忆变成三元组：</p>
<pre><code class="language-">(z, d, e)</code></pre><h3>1️⃣ z：阶段标签</h3>
<p>例如：</p>
<ul>
<li><p>ANALYZE</p>
</li>
<li><p>EDIT</p>
</li>
<li><p>VERIFY</p>
</li>
</ul>
<hr>
<h3>2️⃣ d：当时的小目标（意图）</h3>
<p>结构化描述：</p>
<ul>
<li><p>当前要解决什么</p>
</li>
<li><p>关键线索（函数名 / 报错）</p>
</li>
</ul>
<hr>
<h3>3️⃣ e：抽象经验</h3>
<p>不是存全过程，而是提炼：</p>
<p>✅ 可迁移策略<br>❌ 仓库特有细节</p>
<p>例如：</p>
<blockquote>
<p>当 a+b 正常但 b+a 报错 → 检查 <strong>radd</strong></p>
</blockquote>
<p>这就是可以跨项目复用的经验。</p>
<hr>
<h1>🔍 检索机制：只在“当前阶段的抽屉”里找</h1>
<p>传统方式：</p>
<blockquote>
<p>在整个记忆库做语义相似度匹配 ❌</p>
</blockquote>
<p>论文方式：</p>
<pre><code class="language-">先按阶段过滤
再做语义匹配</code></pre><p>效果：</p>
<ul>
<li><p>避免跨阶段干扰</p>
</li>
<li><p>Top-1 检索也足够稳</p>
</li>
</ul>
<hr>
<h1>🧠 经验是如何产生的？</h1>
<p>在子任务结束时做一次 <strong>反思</strong>：</p>
<p>成功 → 总结套路<br>失败 → 总结反模式</p>
<p>然后抽象成经验卡片写入记忆。</p>
<p>这是一个 <strong>在线自进化系统</strong>：</p>
<blockquote>
<p>做的任务越多 → Agent 越像老员工</p>
</blockquote>
<hr>
<h1>📊 实验结果</h1>
<h2>总体表现</h2>
<p>在 SWE-bench Verified：</p>
<table>
<thead>
<tr>
<th>模型</th>
<th>提升</th>
</tr>
</thead>
<tbody><tr>
<td>Gemini 2.5 Pro</td>
<td>+6.8%</td>
</tr>
<tr>
<td>平均</td>
<td>+4.7%</td>
</tr>
</tbody></table>
<hr>
<h2>对强模型的影响</h2>
<p>实例级记忆：</p>
<ul>
<li><p>性能下降</p>
</li>
<li><p>方差变大 ❌</p>
</li>
</ul>
<p>子任务级记忆：</p>
<ul>
<li><p>性能提升</p>
</li>
<li><p>更稳定 ✅</p>
</li>
</ul>
<p>说明：</p>
<blockquote>
<p>强模型不怕没记忆<br>怕错误记忆</p>
</blockquote>
<hr>
<h2>对困难任务的提升最大</h2>
<p>按轨迹长度划分：</p>
<table>
<thead>
<tr>
<th>难度</th>
<th>提升</th>
</tr>
</thead>
<tbody><tr>
<td>Easy</td>
<td>+1.8%</td>
</tr>
<tr>
<td>Hard</td>
<td><strong>+8.7%</strong></td>
</tr>
</tbody></table>
<p>因为困难任务最依赖经验复用。</p>
<hr>
<h1>🧪 关键消融实验</h1>
<h3>❌ 只强制分步骤思考（不存记忆）</h3>
<p>仅 +1%</p>
<p>→ 真正的提升来自“经验复用”</p>
<hr>
<h3>❌ 不按阶段分类检索</h3>
<p>提升只剩 +1.6%</p>
<p>→ 阶段对齐是关键</p>
<hr>
<h3>❌ 存原始轨迹</h3>
<p>提升 +1.2%</p>
<p>→ 必须做抽象</p>
<hr>
<h1>🏗 工程视角：这件事为什么重要？</h1>
<p>这篇论文最有价值的地方在于：</p>
<blockquote>
<p>不需要训练新模型<br>只靠系统设计就能提升</p>
</blockquote>
<p>现实系统可以直接复用：</p>
<ul>
<li><p>Cursor / Devin 类 Agent</p>
</li>
<li><p>企业内部 Code Agent</p>
</li>
<li><p>自动化修复 Bot</p>
</li>
</ul>
<hr>
<h2>对团队的意义</h2>
<p>AI 不再是：</p>
<blockquote>
<p>每次都从零开始的实习生</p>
</blockquote>
<p>而是：</p>
<blockquote>
<p>会积累项目经验的老员工</p>
</blockquote>
<p>带来的变化：</p>
<ul>
<li><p>更快修复重复问题</p>
</li>
<li><p>更稳定的 CI 自动修复</p>
</li>
<li><p>更低的 onboarding 成本</p>
</li>
</ul>
<hr>
<h1>🌍 这套范式可以迁移到所有 Agent</h1>
<p>不仅限于写代码：</p>
<h3>数据分析 Agent</h3>
<p>阶段：</p>
<ul>
<li><p>理解需求</p>
</li>
<li><p>找数据</p>
</li>
<li><p>建模</p>
</li>
<li><p>解释结果</p>
</li>
</ul>
<hr>
<h3>客服 Agent</h3>
<p>阶段：</p>
<ul>
<li><p>澄清问题</p>
</li>
<li><p>查政策</p>
</li>
<li><p>给方案</p>
</li>
<li><p>跟进</p>
</li>
</ul>
<hr>
<h3>科研 Agent</h3>
<p>阶段：</p>
<ul>
<li><p>检索文献</p>
</li>
<li><p>提出假设</p>
</li>
<li><p>设计实验</p>
</li>
<li><p>分析结果</p>
</li>
</ul>
<hr>
<h1>⚠️ 局限性</h1>
<p>论文目前还没有解决：</p>
<h3>1️⃣ 记忆无限增长问题</h3>
<p>需要：</p>
<ul>
<li><p>淘汰机制</p>
</li>
<li><p>压缩</p>
</li>
<li><p>分层记忆</p>
</li>
</ul>
<hr>
<h3>2️⃣ 错误经验污染</h3>
<p>现在的系统：</p>
<blockquote>
<p>写进去就信</p>
</blockquote>
<p>未来必须解决：</p>
<ul>
<li><p>记忆可信度</p>
</li>
<li><p>自动降权</p>
</li>
<li><p>版本控制</p>
</li>
</ul>
<hr>
<h3>3️⃣ 子任务划分仍是手工设计</h3>
<p>未来方向：</p>
<blockquote>
<p>自动学习阶段结构</p>
</blockquote>
<hr>
<h1>🔮 未来值得关注的方向</h1>
<p>我认为最有潜力的三个：</p>
<h3>1️⃣ 记忆治理系统</h3>
<p>类似：</p>
<ul>
<li><p>Git for memory</p>
</li>
<li><p>memory diff / rollback</p>
</li>
</ul>
<hr>
<h3>2️⃣ 多 Agent 共享经验库</h3>
<p>团队级 AI 知识沉淀。</p>
<hr>
<h3>3️⃣ 长期运行的代码管家</h3>
<p>真正的：</p>
<blockquote>
<p>AI 老员工</p>
</blockquote>
<hr>
<h1>🏁 我的评价</h1>
<p>这篇论文的价值在于：</p>
<p>它不是做了一个更大的模型<br>而是回答了一个更本质的问题：</p>
<blockquote>
<p>Agent 应该“如何学习经验”</p>
</blockquote>
<p>这是：</p>
<p>LLM → 真正智能体<br>过程中非常关键的一步。</p>
<hr>
<h1>📌 Takeaway</h1>
<p>如果你正在做 Agent 系统，这篇论文给了一个可以直接落地的设计原则：</p>
<h3>✅ 正确的记忆设计</h3>
<ul>
<li><p>记忆单位 = 推理子任务</p>
</li>
<li><p>只存抽象经验</p>
</li>
<li><p>检索必须阶段对齐</p>
</li>
</ul>
<p>而不是：</p>
<ul>
<li><p>存整段对话</p>
</li>
<li><p>全局相似度检索</p>
</li>
</ul>
<hr>
<h1>🧵 最后</h1>
<p>如果你在做：</p>
<ul>
<li><p>AI 编程工具</p>
</li>
<li><p>企业代码 Agent</p>
</li>
<li><p>自动化修复系统</p>
</li>
</ul>
<p>这篇论文属于：</p>
<blockquote>
<p>可以直接改系统设计的那种工作</p>
</blockquote>
<p>而不是“只在 leaderboard 上多 1%”。</p>

          <p style='text-align: right'>
          <a href='https://carota.site/posts/tech/arxiv-saslm-for-se-agents#comments'>看完了？说点什么呢</a>
          </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">138265555285590084</guid>
  <category>post</category>
<category>技术</category>
 </item>
  <item>
    <title>Core 4 框架：重新定义开发者生产力的四个维度</title>
    <link>https://carota.site/notes/10</link>
    <pubDate>Thu, 26 Feb 2026 03:17:57 GMT</pubDate>
    <description>最近看到宝玉叔分享的一场来自 Pragmatic Summit 的演讲总结，主讲人是 DX 公司 C</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://carota.site/notes/10'>https://carota.site/notes/10</a></blockquote>
          <p>最近看到<a href="https://x.com/dotey/article/2026755174761431119">宝玉叔分享的一场来自 Pragmatic Summit 的演讲总结</a>，<a href="https://www.youtube.com/watch?v=LOHgRw43fFk">主讲人是 DX 公司 CTO、<strong>Core 4 开发者生产力框架</strong>的联合作者 Laura Tacho</a>。</p>
<p>她手里有一份非常恐怖的数据集：</p>
<ul>
<li>12 万开发者</li>
<li>450+ 公司真实样本</li>
</ul>
<p>这不是方法论，而是<strong>基于真实组织行为的数据科学结论</strong>。</p>
<p>这篇文章最有价值的点在于：
👉 它重新定义了“开发效率到底是什么”。</p>
<hr>
<h2>一、开发者生产力的误区</h2>
<p>很多公司衡量研发效率的方式：</p>
<ul>
<li>写了多少行代码</li>
<li>提交次数</li>
<li>需求完成数量</li>
<li>工时利用率</li>
</ul>
<p>这些指标有一个共同问题：</p>
<p>❌ 衡量的是「忙碌程度」
而不是「价值交付能力」</p>
<p>真正的问题是：</p>
<blockquote>
<p>我们如何更快、更稳定、更可持续地把价值交付到用户手里？</p>
</blockquote>
<hr>
<h2>二、Core 4：开发者生产力的四个核心维度</h2>
<p>Core 4 并不看“人写了多少代码”，而是看系统是否高效。</p>
<h3>1️⃣ 速度（Speed）</h3>
<p>不是单纯的快，而是：</p>
<ul>
<li>从 idea → production 的时间</li>
<li>PR 合并周期</li>
<li>发布节奏</li>
</ul>
<p>核心问题：</p>
<blockquote>
<p>组织是否能快速把想法变成可运行的软件？</p>
</blockquote>
<hr>
<h3>2️⃣ 易用性（Ease）</h3>
<p>开发环境是否顺滑：</p>
<ul>
<li>本地启动是否痛苦</li>
<li>CI 是否经常炸</li>
<li>调试是否困难</li>
</ul>
<p>这直接决定：</p>
<p>🧠 开发者每天有多少时间在“真正创造价值”</p>
<hr>
<h3>3️⃣ 质量（Quality）</h3>
<p>不是测试覆盖率，而是：</p>
<ul>
<li>变更失败率</li>
<li>线上回滚频率</li>
<li>修复周期</li>
</ul>
<p>高质量团队的特点：</p>
<p>👉 发布更频繁
👉 反而更稳定</p>
<hr>
<h3>4️⃣ 影响力（Impact）</h3>
<p>这是最容易被忽略的：</p>
<p>开发者是否在做：</p>
<ul>
<li>高价值项目</li>
<li>对业务真正重要的事情</li>
</ul>
<p>而不是被：</p>
<ul>
<li>低效流程</li>
<li>组织阻塞</li>
<li>技术债</li>
</ul>
<p>消耗掉。</p>
<hr>
<h2>三、一个反直觉的关键结论</h2>
<p>数据表明：</p>
<blockquote>
<p>提升开发者生产力
❌ 不是靠压榨个人
✅ 而是优化系统体验</p>
</blockquote>
<p>真正高效的公司在做的是：</p>
<ul>
<li>投资 DevEx（开发者体验）</li>
<li>优化 CI/CD</li>
<li>减少等待时间</li>
<li>自动化流程</li>
</ul>
<p>而不是：</p>
<p>❌ 强制加班
❌ 增加 KPI
❌ 用绩效驱动代码产出</p>
<hr>
<h2>四、AI 时代对研发效率的真正影响</h2>
<p>这部分是我认为最值得思考的。</p>
<p>AI 确实在提升：</p>
<ul>
<li>写代码速度</li>
<li>生成样板代码能力</li>
</ul>
<p>但 Core 4 的视角会告诉你：</p>
<p>如果你的系统存在这些问题：</p>
<ul>
<li>发布流程 2 天</li>
<li>CI 30 分钟</li>
<li>环境初始化半天</li>
<li>需求评审一周</li>
</ul>
<p>那么：</p>
<p>🤖 AI 只能让你更快写完
⛔ 但无法让你更快交付</p>
<hr>
<h2>五、高绩效团队真正的投资方向</h2>
<p>数据中表现最好的团队有几个共同点：</p>
<h3>✅ 极度重视开发者体验</h3>
<p>把 DevEx 当作产品在做。</p>
<hr>
<h3>✅ 减少“等待时间”</h3>
<p>包括：</p>
<ul>
<li>等 CI</li>
<li>等评审</li>
<li>等环境</li>
<li>等权限</li>
</ul>
<p>等待 = 最大的生产力黑洞</p>
<hr>
<h3>✅ 小批量、高频发布</h3>
<p>这会带来：</p>
<ul>
<li>更低风险</li>
<li>更快反馈</li>
<li>更高稳定性</li>
</ul>
<hr>
<h2>六、对个人开发者的启示</h2>
<p>很多人关心：</p>
<p>AI 会不会取代程序员？</p>
<p>但从这个模型看，真正的分水岭变成了：</p>
<h3>初级开发者</h3>
<p>只会：</p>
<ul>
<li>写代码</li>
<li>完成功能</li>
</ul>
<h3>高级开发者</h3>
<p>会：</p>
<ul>
<li>优化交付流程</li>
<li>设计工程系统</li>
<li>提升团队整体效率</li>
</ul>
<p>未来最值钱的能力不再是：</p>
<p>❌ 写代码速度</p>
<p>而是：</p>
<p>✅ 提升系统生产力的能力</p>
<hr>
<h2>七、总结</h2>
<p>Core 4 的本质是在说一件事：</p>
<blockquote>
<p>开发者生产力是一个系统问题，而不是个人问题。</p>
</blockquote>
<p>真正决定效率的不是：</p>
<p>“你有多努力”</p>
<p>而是：</p>
<ul>
<li>工程体系是否顺滑</li>
<li>组织是否减少阻力</li>
<li>工具链是否现代化</li>
</ul>
<hr>
<h1>最后的思考</h1>
<p>在 AI 时代，一个非常重要的认知转变是：</p>
<p>个人写代码的速度正在被抹平
但：</p>
<p>🏗 构建高效工程系统的能力
正在成为核心竞争力</p>
<p>这可能才是软件工程的下一个分水岭。</p>
<hr>

          <p style='text-align: right'>
          <a href='https://carota.site/notes/10#comments'>看完了？说点什么呢</a>
          </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">138265555306561543</guid>
  <category>note</category>
false
 </item>
  <item>
    <title>Something Big Is Happening —— 我们可能低估了 AI 的跃迁速度</title>
    <link>https://carota.site/notes/9</link>
    <pubDate>Thu, 12 Feb 2026 10:30:30 GMT</pubDate>
    <description>最近，AI 创业者 Matt Shumer 写了一篇标题颇具张力的文章：

Something Bi</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://carota.site/notes/9'>https://carota.site/notes/9</a></blockquote>
          <p>最近，AI 创业者 <strong>Matt Shumer</strong> 写了一篇标题颇具张力的文章：</p>
<blockquote>
<p><em>Something Big Is Happening</em></p>
</blockquote>
<p>标题看起来像危言耸听，但读完之后，我反而觉得值得认真对待。</p>
<p><a href="https://shumer.dev/something-big-is-happening">这篇文章</a>真正讨论的，并不是“AI 会不会变强”，而是一个更重要的问题：</p>
<blockquote>
<p>AI 是否已经跨过了一条能力分界线？</p>
</blockquote>
<hr>
<h2>1. 从“辅助工具”到“任务执行者”</h2>
<p>过去两年，大多数人对 AI 的理解停留在一个工具层面：</p>
<ul>
<li>帮你写代码</li>
<li>帮你润色文章</li>
<li>帮你总结文档</li>
<li>帮你生成脚本</li>
</ul>
<p>它很强，但仍然需要频繁的人类介入。</p>
<p>Shumer 的判断是：
<strong>最近模型的变化，已经从“能力增强”转向“能力形态改变”。</strong></p>
<p>关键区别在于：</p>
<ul>
<li>能否持续执行多步骤任务</li>
<li>能否发现自身错误并修复</li>
<li>能否在没有人工干预的情况下完成目标</li>
</ul>
<p>如果一个系统可以完成任务闭环，那么它的角色就不再只是工具。</p>
<hr>
<h2>2. 为什么他说这是“质变”</h2>
<p>文章中提到几个信号：</p>
<h3>（1）模型开始参与模型研发</h3>
<p>像 <strong>OpenAI</strong>、<strong>Anthropic</strong> 这样的机构，已经在使用模型辅助代码生成、测试与评估流程。</p>
<p>这意味着：</p>
<blockquote>
<p>AI 不只是被训练的对象，它开始参与自身的改进。</p>
</blockquote>
<p>这在技术史上具有象征意义。</p>
<p>工具开始成为生产工具的组成部分。</p>
<hr>
<h3>（2）认知型任务的边际成本快速下降</h3>
<p>过去十年，自动化主要替代的是：</p>
<ul>
<li>重复劳动</li>
<li>流水线作业</li>
<li>标准化操作</li>
</ul>
<p>而现在，AI 正在逼近的是：</p>
<ul>
<li>分析</li>
<li>推理</li>
<li>写作</li>
<li>编程</li>
<li>决策支持</li>
</ul>
<p>也就是说，它触及的是“认知层工作”。</p>
<p>这才是这篇文章真正令人不安的地方。</p>
<hr>
<h2>3. 但我们需要避免技术情绪化</h2>
<p>我并不完全认同那种“马上全面替代”的叙事。</p>
<p>历史上每一次技术跃迁都经历了三个阶段：</p>
<ol>
<li>技术突破</li>
<li>应用验证</li>
<li>结构重构</li>
</ol>
<p>现在显然处在第一阶段向第二阶段过渡的时期。</p>
<p>真实世界仍然存在：</p>
<ul>
<li>成本约束</li>
<li>可靠性问题</li>
<li>系统整合难度</li>
<li>法律与监管</li>
<li>企业流程惯性</li>
</ul>
<p>技术能力的出现 ≠ 立刻改变产业结构。</p>
<hr>
<h2>4. 真正重要的不是“替代”，而是“结构变化”</h2>
<p>我更关心的是一个趋势：</p>
<blockquote>
<p>认知工作的边际成本正在下降。</p>
</blockquote>
<p>当认知成本下降，会带来什么？</p>
<ul>
<li>小团队能力上限提升</li>
<li>个人生产力极大放大</li>
<li>创业门槛降低</li>
<li>决策周期缩短</li>
</ul>
<p>这意味着竞争模型会变化。</p>
<p>可能不是“你失业”，
而是“你所在的组织结构被重写”。</p>
<hr>
<h2>5. 对个体的现实意义</h2>
<p>如果你是知识型工作者：</p>
<ul>
<li>程序员</li>
<li>产品经理</li>
<li>研究员</li>
<li>分析师</li>
<li>内容创作者</li>
</ul>
<p>真正值得思考的问题不是：</p>
<blockquote>
<p>AI 会不会替代我？</p>
</blockquote>
<p>而是：</p>
<blockquote>
<p>在 AI 存在的情况下，什么能力仍然具有稀缺性？</p>
</blockquote>
<p>可能包括：</p>
<ul>
<li>判断力</li>
<li>系统性思维</li>
<li>抽象建模能力</li>
<li>多领域整合能力</li>
<li>复杂问题拆解能力</li>
</ul>
<p>执行层的价值可能会压缩，
结构层的价值可能会上升。</p>
<hr>
<h2>6. 也许我们低估的不是风险，而是速度</h2>
<p>这篇文章最值得重视的一点，并不是它的语气，而是它的判断：</p>
<blockquote>
<p>能力跃迁往往不是线性的。</p>
</blockquote>
<p>当模型跨过某个阈值时，
它带来的变化会突然显现，而不是渐进体现。</p>
<p>如果这一判断成立，那么真正的挑战不是技术本身，而是：</p>
<blockquote>
<p>我们的认知是否跟得上技术曲线。</p>
</blockquote>
<hr>
<h2>结语</h2>
<p>这篇文章并不是一篇技术论文。
它更像是一种时代感知。</p>
<p>也许时间线会比作者预想得慢。
也许某些行业的变化会更温和。</p>
<p>但有一点越来越清晰：</p>
<p>AI 已经不再处在“实验玩具阶段”。</p>
<p>它正在进入真实生产环境。</p>
<p>真正危险的不是 AI 太快。
而是我们对变化的感知太慢。</p>

          <p style='text-align: right'>
          <a href='https://carota.site/notes/9#comments'>看完了？说点什么呢</a>
          </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">138265555306561542</guid>
  <category>note</category>
false
 </item>
  <item>
    <title>LLM 基础概念分享：从原理到 Function Call -&gt; MCP  -&gt; Agent -&gt; Skills</title>
    <link>https://carota.site/posts/tech/llm-basics-from-principles-to-function-calls-mcp-agent-skills</link>
    <pubDate>Tue, 10 Feb 2026 02:00:17 GMT</pubDate>
    <description>
1. LLM 最简原理：它在做什么？

  

LLM（Large Language Model）</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://carota.site/posts/tech/llm-basics-from-principles-to-function-calls-mcp-agent-skills'>https://carota.site/posts/tech/llm-basics-from-principles-to-function-calls-mcp-agent-skills</a></blockquote>
          <p></p>
<h2>1. LLM 最简原理：它在做什么？</h2>
<p>LLM（Large Language Model）本质上做的是一件事：</p>
<blockquote>
<p>给定上下文，预测下一个 token 是什么。</p>
</blockquote>
<p>它不断生成 token 并拼接成文本，因此看起来能“对话”“写作”“编程”。底层关键架构是 <strong>Transformer</strong>，依靠 <strong>Attention</strong><strong>（注意力机制）</strong> 在上下文里动态关注关键信息。</p>
<p></p>
<h3>图 1：LLM 的生成过程（Next-token prediction）</h3>
<p></p>
<p>工程上要牢记：LLM 的目标是生成“最可能的文本”，不是保证“事实正确”，所以会出现 <strong>幻觉（Hallucination）</strong>。</p>
<hr>
<h2>2. Function Call：让模型能“调用工具”</h2>
<p><strong>Function Call（函数调用）</strong> 让 LLM 不只是输出自然语言，而是输出结构化参数（常见 JSON），由系统执行真实工具/API，再把结果返回给模型总结。</p>
<h3>图 2：Function Call 的基本闭环</h3>
<p></p>
<p></p>
<p>意义：</p>
<ul>
<li><p>避免模型瞎编实时信息</p>
</li>
<li><p>输出可校验、可重试</p>
</li>
<li><p>多次调用可串联成流程</p>
</li>
</ul>
<hr>
<h2>3. MCP：Function Call 之后的“标准工具接入层”</h2>
<p>当工具变多，难点从“能不能调用”变成：</p>
<blockquote>
<p>如何规模化、标准化地把工具暴露给模型？</p>
</blockquote>
<p><strong>MCP（Model Context Protocol）</strong> 提供统一的工具/数据源/上下文暴露方式，让模型用一致方式发现、理解、调用。</p>
<h3>图 3：没有 MCP vs 有 MCP（接入复杂度对比）</h3>
<p></p>
<p>
一句话：</p>
<ul>
<li><p><strong>Function Call</strong> 是“怎么调用一次工具”</p>
</li>
<li><p><strong>MCP</strong> 是“怎么把一堆工具接入做到标准化、可扩展、可管理”</p>
</li>
</ul>
<hr>
<h2>4. Agent：LLM + 多步规划 + 工具循环</h2>
<p><strong>Agent</strong> 是把 LLM 变成“任务执行体”的系统形态。典型循环是：</p>
<ol>
<li><p>理解目标</p>
</li>
<li><p>规划步骤</p>
</li>
<li><p>调用工具</p>
</li>
<li><p>观察结果</p>
</li>
<li><p>迭代直到完成</p>
</li>
</ol>
<h3>图 4：Agent 的多步执行循环（Plan-Act-Observe）</h3>
<p></p>
<p>Agent 的挑战更像系统工程：失败重试、成本控制、权限与安全、结果验证等。</p>
<hr>
<h2>5. Skills：Agent 的“可复用技能模块”（按 Claude Code 定义）</h2>
<p>在 Claude Code 体系里，<strong>Skill</strong>可以理解为：</p>
<blockquote>
<p>把某类能力写成标准化的“技能说明书”，让模型在合适时自动使用，或用户手动触发（例如 <code>/skill-name</code>）。</p>
</blockquote>
<p>Skill 通常通过 <code>name/description</code> 等元信息描述“何时用、怎么用”，把经验沉淀成可复用模块，让能力更产品化、更可控。</p>
<h3>图 5：Skills 在系统中的位置（沉淀与复用）</h3>
<p></p>
<p></p>
<hr>
<h2>6. 一句话串起来</h2>
<blockquote>
<p>LLM 负责理解与生成；Function Call 让它能可靠调用工具；MCP 让工具接入标准化；Agent 用多步规划把工具串成任务；Skills 则把这些能力沉淀成可复用技能库，让系统更稳定、更可控、更易扩展。</p>
</blockquote>

          <p style='text-align: right'>
          <a href='https://carota.site/posts/tech/llm-basics-from-principles-to-function-calls-mcp-agent-skills#comments'>看完了？说点什么呢</a>
          </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">138265555285590083</guid>
  <category>post</category>
<category>技术</category>
 </item>
  <item>
    <title>从 Prompt Engineering 演进到 Agent（Role → Step-by-step → Few-shot → Thinking → ReAct）</title>
    <link>https://carota.site/posts/tech/prompt-engineering-evolution-to-agents-role-step-by-step-few-shot-thinking-react</link>
    <pubDate>Tue, 10 Feb 2026 01:59:33 GMT</pubDate>
    <description>Agent 并不是突然出现的，它更像是 Prompt Engineering 一路“堆能力”的自然结</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://carota.site/posts/tech/prompt-engineering-evolution-to-agents-role-step-by-step-few-shot-thinking-react'>https://carota.site/posts/tech/prompt-engineering-evolution-to-agents-role-step-by-step-few-shot-thinking-react</a></blockquote>
          <p>Agent 并不是突然出现的，它更像是 Prompt Engineering 一路“堆能力”的自然结果。在 Agent 之前，我们主要靠提示词让 LLM 更稳定地完成复杂任务，演进大致经历以下阶段：</p>
<h3>0）Role：最早期的“角色设定”</h3>
<p>最经典、最早期的提示方式是 Role Prompt：</p>
<p>“你是一个资深产品经理 / 你是一个资深 SRE / 你是一个代码审查专家……”</p>
<p>它的作用是给模型一个<strong>行为边界与输出风格</strong>，让回答更贴合领域语境，例如：</p>
<ul>
<li><p>语气更专业</p>
</li>
<li><p>输出结构更像行业习惯</p>
</li>
<li><p>更倾向于该角色的关注点（风险、边界、指标等）</p>
</li>
</ul>
<p><strong>局限</strong>： Role 只能改变“说话方式和偏好”，并不会真正提高事实可靠性或执行能力。</p>
<h3>1）Step by Step：让模型显式分步</h3>
<p>随后常用的是：</p>
<p>“请一步一步思考 / Step by step”</p>
<p>它能显著提升复杂任务的完成率：模型会先拆解再回答，减少跳步错误。</p>
<h3>2）Few-shot：用示例教会模型“套路”</h3>
<p>Few-shot Prompt 是提供几个示例（输入→输出），让模型学习：</p>
<ul>
<li><p>输出格式（如 JSON / 表格）</p>
</li>
<li><p>解决套路（如对比、分类、总结）</p>
</li>
<li><p>任务边界（什么该输出，什么不要输出）</p>
</li>
</ul>
<h3>3）Thinking：从“答案”到“推理过程”</h3>
<p>再进一步，我们希望模型不仅给结论，还能给 reasoning / thinking：</p>
<ul>
<li><p>让复杂任务更稳定</p>
</li>
<li><p>更利于 debug（知道它为什么这么做）</p>
</li>
</ul>
<h3>4）ReAct：把“思考（Reason）”和“行动（Act）”结合起来</h3>
<p>ReAct（Reason + Act）是从 Prompt 到 Agent 的关键跃迁：</p>
<ul>
<li><p>Reason：决定下一步做什么</p>
</li>
<li><p>Act：调用工具（搜索、数据库、API）并获取结果</p>
</li>
</ul>
<p>这让 LLM 从“会推理”变成“会执行”。</p>
<h3>5）Agent：多步循环 + 工具 + 状态</h3>
<p>当 ReAct 再加上：</p>
<ul>
<li><p>多轮循环（Plan-Act-Observe）</p>
</li>
<li><p>状态/记忆（Memory）</p>
</li>
<li><p>失败重试与校验</p>
</li>
</ul>
<p>就形成了我们今天说的 Agent。</p>
<h3>图：从 Prompt Engineering 到 Agent 的演进路径</h3>
<p></p>
<pre class="mermaid"> flowchart LR  

R[Role Prompt] --> A[Step by Step]  
A --> B[Few-shot Examples]  
B --> C[Thinking / Reasoning]  
C --> D[ReAct: Reason + Act]  
D --> E[Agent: Multi-step loop + Tools + Memory]
</pre><h3>小结（可作为补充结尾）</h3>
<p>从 Role 到 Step-by-step、Few-shot、Thinking，本质是在增强 LLM 的“表达质量与推理稳定性”；而从 ReAct 开始，模型被赋予了“行动能力”，再叠加循环与状态管理，就自然演进成 Agent 系统。</p>

          <p style='text-align: right'>
          <a href='https://carota.site/posts/tech/prompt-engineering-evolution-to-agents-role-step-by-step-few-shot-thinking-react#comments'>看完了？说点什么呢</a>
          </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">138265555285590082</guid>
  <category>post</category>
<category>技术</category>
 </item>
  <item>
    <title>别再迷信一个“万能大模型”了：用多专家 LLM 提升电商多语言搜索相关性</title>
    <link>https://carota.site/posts/books/arxiv-orchestrating-heterogeneous-moe</link>
    <pubDate>Thu, 05 Feb 2026 01:58:19 GMT</pubDate>
    <description>在跨境电商搜索里，多语言相关性一直是个又重要又难搞的问题。

英语模型强，不代表它懂泰语；  
懂泰</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://carota.site/posts/books/arxiv-orchestrating-heterogeneous-moe'>https://carota.site/posts/books/arxiv-orchestrating-heterogeneous-moe</a></blockquote>
          <p>在跨境电商搜索里，多语言相关性一直是个<strong>又重要又难搞</strong>的问题。</p>
<p>英语模型强，不代表它懂泰语；<br>懂泰语的模型，可能又看不懂东南亚常见的“混合语言 query”；<br>而现实世界的用户，偏偏就爱这么搜。</p>
<p>最近一篇来自 Lazada 的<a href="https://arxiv.org/abs/2602.00003">论文</a>给了一个非常工程化、可落地的答案：<br><strong>与其训练一个越来越大的“万能模型”，不如让多个各有所长的大模型协同工作。</strong></p>
<p>这篇文章，我想用<strong>尽量少的公式、尽量多的直觉</strong>，讲清楚他们到底做了什么，以及为什么这套方案值得做搜索/推荐/广告的团队认真看一眼。</p>
<hr>
<h2>一、问题背景：一个大模型，真的能覆盖所有语言吗？</h2>
<p>在多国家、多语言电商平台中，搜索 query 往往有这些特点：</p>
<ul>
<li><p><strong>语言混杂</strong>（本地语言 + 英文品牌）</p>
</li>
<li><p><strong>低资源语言多</strong>（泰语、越南语、印尼语等）</p>
</li>
<li><p><strong>query 很短</strong>，语义高度依赖文化和习惯</p>
</li>
</ul>
<p>现实中的情况是：</p>
<ul>
<li><p>Qwen 这类模型英文、中文很强</p>
</li>
<li><p>Sailor 这种模型在东南亚语言上更有优势</p>
</li>
<li><p>Gemma 在某些商品理解上又更稳</p>
</li>
</ul>
<p>👉 <strong>没有一个模型在所有语言、所有市场都同时最强。</strong></p>
<p>那直觉上的做法就来了：</p>
<blockquote>
<p>那我多用几个模型，一起算不就好了？</p>
</blockquote>
<p>问题是：<strong>“一起算”这件事，其实非常容易做错。</strong></p>
<hr>
<h2>二、为什么「简单模型融合」反而会翻车？</h2>
<p>很多工程实践里的“多模型融合”，是这么干的：</p>
<ul>
<li><p>多个模型各自算一个 embedding</p>
</li>
<li><p>然后 <strong>加权平均（weighted sum）</strong></p>
</li>
<li><p>再拿去做打分或分类</p>
</li>
</ul>
<p>这在<strong>同构模型</strong>（同结构、同 tokenizer）下可能还凑合，但在这篇论文的设定里：</p>
<blockquote>
<p>每个专家模型，<strong>结构不同、训练数据不同、embedding 空间完全不对齐</strong></p>
</blockquote>
<p>作者用了一个非常形象的比喻：</p>
<ul>
<li><p>模型 A 的 x 轴表示「颜色」</p>
</li>
<li><p>模型 B 的 x 轴表示「材质」</p>
</li>
<li><p>你把这两个 x 轴直接加起来 —— <strong>语义直接乱套</strong></p>
</li>
</ul>
<p>结果就是：</p>
<ul>
<li><p>有用特征互相抵消</p>
</li>
<li><p>embedding 变得“糊成一团”</p>
</li>
<li><p>效果甚至 <strong>不如用单一模型</strong></p>
</li>
</ul>
<p>👉 这篇论文一个非常重要的观点是：</p>
<blockquote>
<p><strong>多模型 ≠ 简单 ensemble，异构模型必须尊重“表示空间不同”这个事实。</strong></p>
</blockquote>
<hr>
<h2>三、核心思路：多位 LLM 专家 + 智能调度 + 保持各自表达</h2>
<p>他们的整体方案可以概括成一句话：</p>
<blockquote>
<p><strong>冻结多个大模型作为“专家”，用一个轻量路由器挑人干活，再用“拼接而非加权”的方式融合专家意见。</strong></p>
</blockquote>
<p>拆开来看，有三步。</p>
<hr>
<h3>1️⃣ 多个冻结的 LLM 专家</h3>
<p>先准备好几位“专家模型”，比如：</p>
<ul>
<li><p>Qwen2.5-14B</p>
</li>
<li><p>Gemma2-9B</p>
</li>
<li><p>Sailor2-20B</p>
</li>
</ul>
<p>它们：</p>
<ul>
<li><p>用<strong>同一份搜索数据</strong>各自微调一轮</p>
</li>
<li><p>然后 <strong>参数全部冻结</strong></p>
</li>
<li><p>后续不再改动模型本体</p>
</li>
</ul>
<p>这样做的好处是：</p>
<ul>
<li><p>模型稳定、可控</p>
</li>
<li><p>不需要搞复杂的 MoE-aware 微调</p>
</li>
<li><p>非常适合已有多个 LLM 资产的团队</p>
</li>
</ul>
<hr>
<h3>2️⃣ 请求级稀疏路由：只找最合适的专家</h3>
<p>不是每个 query 都要叫上所有专家。</p>
<p>作者设计了一个<strong>轻量路由器</strong>，输入是：</p>
<ul>
<li><p>用户 query</p>
</li>
<li><p>商品标题</p>
</li>
<li><p>国家 / 地区信息</p>
</li>
</ul>
<p>输出是：</p>
<ul>
<li><strong>top-k（比如 2 个）最合适的专家</strong></li>
</ul>
<p>关键点：</p>
<ul>
<li><p>路由是 <strong>端到端训练的</strong></p>
</li>
<li><p>使用 <strong>Hard Routing</strong>（训练和推理一致）</p>
</li>
<li><p>加了 <strong>负载均衡损失</strong>，防止所有流量都挤到一个专家上</p>
</li>
</ul>
<p>结果是：</p>
<ul>
<li><p>每条请求只激活少数专家</p>
</li>
<li><p>效果更好、延迟更低</p>
</li>
<li><p>吞吐率明显提升</p>
</li>
</ul>
<p>👉 实验表明：<br><strong>“挑对人干活”，比“所有人都发言”更重要。</strong></p>
<hr>
<h3>3️⃣ 关键创新：拼接，而不是加权融合</h3>
<p>这是全文<strong>最有价值、也最容易被忽略的一点</strong>。</p>
<p>流程是：</p>
<ol>
<li><p>每个被选中的专家输出一个向量</p>
</li>
<li><p><strong>各自先做线性投影</strong>（只对齐维度，不强行对齐语义）</p>
</li>
<li><p><strong>直接拼接（concatenation）</strong> 成一个大向量</p>
</li>
<li><p>用一个小 MLP 学“怎么综合这些意见”</p>
</li>
</ol>
<p>直觉理解是：</p>
<ul>
<li><p>向量前一段：专家 A 的世界观</p>
</li>
<li><p>向量后一段：专家 B 的世界观</p>
</li>
<li><p>两者互不干扰</p>
</li>
<li><p>决策层来学：什么时候信谁、怎么联合判断</p>
</li>
</ul>
<p>论文用 t-SNE 可视化清楚地展示了这一点：</p>
<ul>
<li><p><strong>拼接后的 embedding：正负样本清晰分离</strong></p>
</li>
<li><p><strong>加权融合的 embedding：纠缠在一起，边界模糊</strong></p>
</li>
</ul>
<p>👉 这在工程上非常重要的启示是：</p>
<blockquote>
<p><strong>不要强迫异构模型共享一个语义坐标系。</strong></p>
</blockquote>
<hr>
<h2>四、工程落地：离线 MoE，当“超级老师”</h2>
<p>当然，现实世界里你不可能：</p>
<ul>
<li>在线对每个 query 调多个 10B+ 的大模型</li>
</ul>
<p>他们的解法非常务实：</p>
<ol>
<li><p><strong>离线用 MoE / LLM 做高质量相关性打分</strong></p>
</li>
<li><p>用这些打分作为 <strong>teacher</strong></p>
</li>
<li><p>蒸馏训练一个小而快的学生模型（ColBERT）</p>
</li>
<li><p><strong>线上只跑学生模型</strong></p>
</li>
</ol>
<p>结果是：</p>
<ul>
<li><p>MoE 不仅自己效果好</p>
</li>
<li><p><strong>作为 teacher 反而比单一 LLM 更稳健</strong></p>
</li>
<li><p>学生模型在真实线上流量中：</p>
<ul>
<li><p>Bad Ratio 更低</p>
</li>
<li><p>AUC 更高</p>
</li>
</ul>
</li>
</ul>
<p>👉 多专家 MoE 的价值，不只是“直接上线”，<br>而是<strong>提升整个检索系统的知识上限</strong>。</p>
<hr>
<h2>五、这篇论文真正值得抄的地方</h2>
<p>如果你在做搜索 / 推荐 / 广告相关性，我认为有三条非常实用的结论：</p>
<h3>✅ 不要迷信“一个更大的模型”</h3>
<p>在多语言、多区域场景下，<br><strong>专家协同 &gt; 单模型扩规模</strong></p>
<hr>
<h3>✅ 异构模型融合，几何结构比参数更重要</h3>
<ul>
<li><p>Weighted sum 很可能是错的</p>
</li>
<li><p>拼接 + 小 MLP 是一个<strong>简单但有效</strong>的工程解法</p>
</li>
</ul>
<hr>
<h3>✅ 把复杂留在离线，把简单留给线上</h3>
<ul>
<li><p>离线：多专家 + 路由 + 融合</p>
</li>
<li><p>在线：蒸馏后的小模型</p>
</li>
<li><p>是一条非常可复制的工业路径</p>
</li>
</ul>
<hr>
<h2>六、写在最后</h2>
<p>这篇论文最难得的地方在于：</p>
<ul>
<li><p><strong>问题来自真实业务</strong></p>
</li>
<li><p><strong>方法不过度理想化</strong></p>
</li>
<li><p><strong>工程细节说得足够清楚</strong></p>
</li>
<li><p><strong>指标提升有实际业务意义</strong></p>
</li>
</ul>
<p>它传递了一个很重要的信号：</p>
<blockquote>
<p>在大模型时代，<br><strong>如何组织和协作已有模型，可能比继续堆参数更重要。</strong></p>
</blockquote>
<p>如果你手上已经有多个微调过的 LLM，<br>这篇论文，真的值得你认真读一遍。</p>

          <p style='text-align: right'>
          <a href='https://carota.site/posts/books/arxiv-orchestrating-heterogeneous-moe#comments'>看完了？说点什么呢</a>
          </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">138265555285590081</guid>
  <category>post</category>
<category>阅读</category>
 </item>
  <item>
    <title>MixLM：让 LLM 排序又强又快的工程级方案</title>
    <link>https://carota.site/posts/books/arxiv-mixlm</link>
    <pubDate>Wed, 04 Feb 2026 02:44:31 GMT</pubDate>
    <description>一句话总结：MixLM 让大模型参与搜索排序不再“贵到用不起”，通过把长文本离线压缩成 embedd</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://carota.site/posts/books/arxiv-mixlm'>https://carota.site/posts/books/arxiv-mixlm</a></blockquote>
          <blockquote>
<p>一句话总结：MixLM 让大模型参与搜索排序不再“贵到用不起”，通过把长文本离线压缩成 embedding token，在线只让 Ranker 看 query + 少量向量，就能把吞吐提升 10×～75×，还保持接近全文本排序的效果。</p>
</blockquote>
<h2><a href="https://arxiv.org/abs/2512.07846">论文原文</a></h2>
<h2>1. 背景：为什么“用 LLM 排序”这么难上线？</h2>
<p>很多人做过类似尝试：</p>
<ul>
<li><p>把 query + 候选 item（比如职位描述、商品详情、文章正文）拼起来</p>
</li>
<li><p>丢给 LLM 问：<strong>“这个 item 和 query 相关吗？”</strong></p>
</li>
<li><p>用 LLM 的 yes/no 或打分当排序依据</p>
</li>
</ul>
<p>这方法确实强，因为 LLM 擅长理解语义、意图、上下文。</p>
<p>但它几乎注定上线困难，原因很现实：</p>
<h3>问题 1：输入太长</h3>
<p>item 文本经常上千 token（职位描述、商品详情都很长），每个 item 都要重复喂一次。</p>
<h3>问题 2：计算量爆炸</h3>
<p>Transformer 注意力复杂度 ~ token²<br>token 一长，成本直接炸裂。</p>
<h3>问题 3：线上排序是“一次对几百上千个 item”</h3>
<p>搜索排序不是问一次问题，而是：</p>
<blockquote>
<p>同一个 query 要对几百～几千个候选 item 打分</p>
</blockquote>
<p>所以成本会乘以 item 数量，完全扛不住。</p>
<hr>
<h2>2. MixLM 的核心思想：别让 Ranker 在线读全文</h2>
<p>MixLM 其实干了一件非常工程化但很聪明的事：</p>
<blockquote>
<p><strong>把 item 的长文本提前离线压缩成少量“向量 token”，在线只喂这些 token 给 LLM。</strong></p>
</blockquote>
<h3>传统方案（全文本 cross-encoder）</h3>
<p>Ranker 输入：</p>
<pre><code class="language-">系统提示 + query + item 全文</code></pre><p>每个 item 都是一大串。</p>
<h3>MixLM（text-embedding mix-interaction）</h3>
<p>把排序拆成两步：</p>
<h4>Step A：离线 Encoder 压缩 item</h4>
<p>用 Encoder LLM 把 item 全文 → embedding tokens（比如 1 个 token）</p>
<h4>Step B：在线 Ranker 只看 query + embedding tokens</h4>
<p>Ranker 输入：</p>
<pre><code class="language-">query 文本 + item embedding tokens</code></pre><blockquote>
<p>类比：<br>以前是“面试官每次都从头看完整简历”<br>现在是“简历提前被浓缩成几行摘要，面试官只看摘要 + 岗位需求”</p>
</blockquote>
<hr>
<h2>3. 为什么这种压缩不会严重掉效果？</h2>
<p>直觉上你可能会怀疑：</p>
<blockquote>
<p>item 全文没了，只剩 1 个 embedding token，Ranker 怎么理解 item？</p>
</blockquote>
<p>MixLM 的关键不在结构，而在训练方法：</p>
<blockquote>
<p><strong>不是随便做 embedding，而是让 Encoder 和 Ranker 在强监督下共同训练，并强制对齐。</strong></p>
</blockquote>
<p>他们用了一个非常“老师带学生”的训练 pipeline。</p>
<hr>
<h2>4. 训练策略：三阶段老师-学生体系（最精华的部分）</h2>
<p>MixLM 的训练可以理解为：<br>先培养一个“超级懂业务的大老师”，再让学生模型继承能力，最后再学会用 embedding 版本输入。</p>
<hr>
<h3>Stage I：先教小模型“怎么思考”（领域推理微调）</h3>
<p>他们先训练一个 7B judge 模型，让它对 query-item 打 0～4 分，并写推理理由（类似 CoT）。</p>
<p>然后用它去蒸馏一个 0.6B 小模型：</p>
<blockquote>
<p>让小模型学会 judge 的“思考方式 + 打分倾向”</p>
</blockquote>
<p>这一步的意义是：<br><strong>让 Ranker 先具备领域推理能力</strong>，否则后面训练会很难。</p>
<hr>
<h3>Stage II：训练一个效果极强的“全文本 Teacher Ranker”</h3>
<p>接着用 Stage I 的小模型，喂入完整文本训练 cross-encoder 排序器：</p>
<p>输入：</p>
<pre><code class="language-">系统提示 + query + item 全文</code></pre><p>输出：</p>
<pre><code class="language-">yes/no 概率</code></pre><p>它效果很强（NDCG@10 0.9432），但太慢不能上线。</p>
<p>于是它变成“teacher”。</p>
<hr>
<h3>Stage III：真正训练 MixLM（embedding 输入版）</h3>
<p>这一步才是 MixLM：</p>
<ul>
<li><p>Encoder：负责 item 全文 → embedding tokens</p>
</li>
<li><p>Ranker：负责 query + embedding tokens → relevance score</p>
</li>
</ul>
<p>并且用三种损失把它拉住：</p>
<ol>
<li><p><strong>SFT（软标签监督）</strong>：对齐 7B judge 的打分倾向</p>
</li>
<li><p><strong>Distillation（蒸馏）</strong>：对齐全文本 teacher 的输出分布</p>
</li>
<li><p><strong>Self-alignment（自对齐）</strong>：强制 “embedding 输入” 和 “全文本输入” 在 Ranker 内部表征一致</p>
</li>
</ol>
<p>这一步非常关键：</p>
<blockquote>
<p>不是让 Ranker 自己适应 embedding，而是用强约束避免它“脑回路跑偏”。</p>
</blockquote>
<hr>
<h2>5. 系统工程：不止模型结构，吞吐靠工程榨出来</h2>
<p>MixLM 另一大亮点是：它不是停在论文结构，而是把系统做到了生产级。</p>
<h3>关键工程点 1：共享 query 前缀（prefix KV cache）</h3>
<p>同一个 query 对几百个 item：</p>
<ul>
<li><p>query 部分完全一样</p>
</li>
<li><p>只需要算一次 prefix KV cache</p>
</li>
<li><p>后面 item 只算 suffix</p>
</li>
</ul>
<p>这能省掉巨量重复计算。</p>
<hr>
<h3>关键工程点 2：多 item 一次性打分（multi-item scoring）</h3>
<p>把多个 item suffix 串起来，做 attention mask 阻止跨 item 信息泄露。</p>
<p>这样 GPU batch 利用率更高。</p>
<hr>
<h3>关键工程点 3：接口直接支持“文本 + embedding”</h3>
<p>他们把 embedding 作为 gRPC 请求字段传给服务端：</p>
<blockquote>
<p>避免 server 重复算 embedding，也方便 embedding 缓存</p>
</blockquote>
<hr>
<h2>6. 效果怎么样？（论文最硬的结果）</h2>
<h3>Offline 指标（排序质量）</h3>
<ul>
<li><p>Full-text teacher：NDCG@10 = 0.9432（最强但慢）</p>
</li>
<li><p>MixLM：NDCG@10 = 0.9239（略低但很接近）</p>
</li>
<li><p>embedding retrieval：0.8380（明显差）</p>
</li>
<li><p>summarized+pruned：0.9218（接近 MixLM）</p>
</li>
</ul>
<p>结论：<strong>MixLM 基本保住了 cross-encoder 的交互能力。</strong></p>
<hr>
<h3>Online 线上指标（工业价值）</h3>
<ul>
<li><p>吞吐：22,000 items/s/GPU（H100，500ms 延迟预算）</p>
</li>
<li><p>相比 full-text LLM：<strong>75.9× 提升</strong></p>
</li>
<li><p>相比 summarized-text：<strong>10× 提升</strong></p>
</li>
<li><p>LinkedIn 全流量 A/B：DAU +0.47%</p>
</li>
</ul>
<p>0.47% 可能看着不大，但在 LinkedIn 这种体量上非常可观。</p>
<hr>
<h2>7. 这篇论文最值得借鉴的点</h2>
<p>我认为它最大的价值是：给了一个“LLM 排序可落地”的标准模板。</p>
<h3>关键 takeaway</h3>
<h4>1）不要让 LLM 在线读长文本</h4>
<p>把长文本变成可预计算的压缩特征（embedding tokens）</p>
<h4>2）embedding 不等于“直接用向量”</h4>
<p>要让 Encoder 和 Ranker 联合训练，并且对齐内部表征</p>
<h4>3）真正的吞吐来自系统工程</h4>
<p>KV cache、batch、prefix sharing、服务栈优化缺一不可</p>
<hr>
<h2>8. 局限与适用场景</h2>
<h3>局限</h3>
<ul>
<li><p>需要大量数据、强 teacher/judge</p>
</li>
<li><p>pipeline 复杂，工程门槛高</p>
</li>
<li><p>token 压缩太狠时（1 token）可能丢细粒度语义</p>
</li>
</ul>
<h3>适用场景</h3>
<p>非常适合：</p>
<ul>
<li><p>搜索排序（job/product/doc）</p>
</li>
<li><p>推荐排序（feed、内容）</p>
</li>
<li><p>广告候选重排</p>
</li>
<li><p>任何 item 文本长、候选多的 rerank 场景</p>
</li>
</ul>
<hr>
<h2>9. 结语</h2>
<p>过去业界对“LLM 排序”的普遍结论是：</p>
<blockquote>
<p>效果好，但太贵，上不了全量。</p>
</blockquote>
<p>MixLM 的贡献在于证明了另一条路：</p>
<blockquote>
<p><strong>LLM 排序不是只能做小流量实验，它可以通过结构 + 蒸馏 + 系统优化变成工业级能力。</strong></p>
</blockquote>
<p>如果未来搜索/推荐要全面 LLM 化，MixLM 这种“模型 + 训练 + serving 一体化设计”的路线，很可能会成为主流范式。</p>

          <p style='text-align: right'>
          <a href='https://carota.site/posts/books/arxiv-mixlm#comments'>看完了？说点什么呢</a>
          </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">138265555285590080</guid>
  <category>post</category>
<category>阅读</category>
 </item>
  
</channel>
</rss>