微信反截图

如果你用 claude computer use 在一些软件上,可能会触发他的保护机制,比如反截图,截图出来都是空的。这是当前 computer-use 方式的一个根本性限制。

nano vllm:prefill 和 decode 的本质

一句话本质区别:

Prefill:  100个token 同时进GPU  → 很快,GPU全力开工
Decode:   每次只出1个token     → 慢,GPU大部分时间在等显存

Scheduler 管的是两个队列

  • waiting 队列:新来的请求,还没开始处理
  • running 队列:正在 decode 的请求(已经 prefill 完,正在一个个吐 token)

每次 schedule() 的决策逻辑:有 waiting 里的请求 → 做 PREFILL,把它移到 running;没有 → 做 DECODE,处理所有 running 里的请求。这就是 continuous batching 的精髓。

preempt(抢占):如果显存不够了 → 把 running 里某个请求"踢回" waiting → 释放它占的 KV cache 显存 → 等有空间了再重新 prefill 它。

KV Cache

没有 KV cache 时:生成第 2 个字之前,对所有字重新算一遍 K 和 V——其中之前算过的全部重算,浪费。

KV cache 就是把算过的结果存起来:直接从显存读取已缓存的 K、V,只需要算新字的 K6、V6。

KV cache = 草稿纸

Prefill 阶段:把 prompt 里每个字的"理解结果"全写到草稿纸上
Decode 阶段:每生成一个新字,只在草稿纸上加一行,不用重写前面的

为什么 decode 慢:每生成 1 个 token,都要把整张"草稿纸"从显存读一遍。草稿纸越来越长 → 读的数据越来越多 → 瓶颈在显存带宽,不在计算。

PagedAttention

朴素 KV cache 的问题:连续内存分配。请求 A 的 cache 越来越长但 A 后面紧跟着 B,没地方扩展。

PagedAttention 的解法——像操作系统管内存一样管显存:把显存切成固定大小的"块"(每块 16 个 token 的 KV cache),请求用不连续的块——就像电脑硬盘的文件系统。

请求A:  [块1] → [块3] → [块7]   ← 不连续没关系!
请求B:  [块2] → [块5]
请求C:  [块4] → [块6] → [块8]

Notion 分享:模型行为工程师(MBE)

这个角色是数据科学家 + PM + 提示工程师的混合体。核心产出是 eval 和 LLM judge,而非功能代码。为什么不是软件工程师?大量工作是定性判断——理解"这个任务算失败还是成功",背后需要品味和直觉。Notion 有意识地把这个岗位做成了独立晋升路径,欢迎"misfit"——背景可以不是工程,但必须有对"什么叫做得好"的判断力。

Notion 把 eval 分成三层:CI 中的回归测试(必须达标)、发布质量报告卡(80-90% 通过才能上线)、以及"前沿/余量 eval"(故意只过 30%,用于理解模型天花板在哪里)。MBE 团队专门负责第三层,相当于 Notion 的"自己的期末考试"。

"软件工厂"的设计思路

  • 规范层(Spec):用 Markdown 文件提交到代码仓库。要求人类可读、可浏览、可修改,是 agent 行动的"宪法"。
  • 自验证(Self-verification):需要非常完善的测试层,agent 能够执行代码、看到测试结果、自己 debug、自己提 PR——整个闭环在同一个运行时环境里完成。
  • 缺陷流(Defect flow):给 agent 群建一个内部 issue tracker(一个 Notion 数据库),manager agent 订阅并处理,把 30 个 agent 产生的 70 条日通知压缩到 5 条。
  • 保留关键不变性:最重要的例子是权限模型。agent 不能自行修改自己的权限——这是设计上刻意保留的人工干预点。