Forwarded from 单线程大摆锤
有点晚了,但还是选择在这个时间点发布,上线了一个新网站,当然背后是 v0 和我的一些调整
图示的形式展示了 tape 和如何用 tape 表示当前流行的一些上下文管理技术,这是 bub 背后的核心设计之一,我相信 tape 会是一个研究问题的模型而不是最终解
欢迎讨论、转发或者更新你感兴趣的部分到这个站点
https://tape.systems/
图示的形式展示了 tape 和如何用 tape 表示当前流行的一些上下文管理技术,这是 bub 背后的核心设计之一,我相信 tape 会是一个研究问题的模型而不是最终解
欢迎讨论、转发或者更新你感兴趣的部分到这个站点
https://tape.systems/
❤1
最近又找到了coding的乐趣,都是因为@PsiACE 想出个劳什子bub as a framework的主意。无论是做框架还是做插件化都还是古法编程的领域,所以我也古法编程了一把。当我删掉一大堆东西然后它还work,或者今天的我否定和推翻了昨天的我的工作时,我知道事情做对了。那感觉就是一场精神马杀鸡。只能说目前AI的工作还达不到这样的质量,希望终于有一天它们能达到。
https://github.com/bubbuild/bub/pull/85
https://github.com/bubbuild/bub/pull/85
GitHub
New architecture: bub framework by frostming · Pull Request #85 · bubbuild/bub
Bub it. Build it. Contribute to bubbuild/bub development by creating an account on GitHub.
🥰8🔥3
Frost's Notes
最近又找到了coding的乐趣,都是因为@PsiACE 想出个劳什子bub as a framework的主意。无论是做框架还是做插件化都还是古法编程的领域,所以我也古法编程了一把。当我删掉一大堆东西然后它还work,或者今天的我否定和推翻了昨天的我的工作时,我知道事情做对了。那感觉就是一场精神马杀鸡。只能说目前AI的工作还达不到这样的质量,希望终于有一天它们能达到。 https://github.com/bubbuild/bub/pull/85
平均行数都不超过200,是人读代码完全没有压力的程度,我实在受不了进一个项目一整面墙的代码要读
❯ find src/bub -name '*.py' -exec wc -l {} \;
91 src/bub/hookspecs.py
177 src/bub/skills.py
153 src/bub/tools.py
206 src/bub/framework.py
8 src/bub/__init__.py
26 src/bub/types.py
32 src/bub/utils.py
169 src/bub/hook_runtime.py
162 src/bub/builtin/hook_impl.py
210 src/bub/builtin/store.py
192 src/bub/builtin/tape.py
174 src/bub/builtin/tools.py
0 src/bub/builtin/__init__.py
101 src/bub/builtin/context.py
84 src/bub/builtin/cli.py
258 src/bub/builtin/agent.py
23 src/bub/builtin/settings.py
27 src/bub/__main__.py
42 src/bub/envelope.py
81 src/bub/channels/handler.py
433 src/bub/channels/telegram.py
5 src/bub/channels/__init__.py
42 src/bub/channels/message.py
46 src/bub/channels/cli/renderer.py
174 src/bub/channels/cli/__init__.py
133 src/bub/channels/manager.py
29 src/bub/channels/base.py
👍11
Forwarded from 张晋涛👀TIL
KCD Beijing+ vLLM 2026 完整日程来了 😁
https://sessionize.com/view/2alhpgup/GridSmart?format=Embed_Styled_Html&isDark=False&title=KCD%20Beijing%20%2B%20vLLM%202026%20
欢迎大家报名来现场玩! 报名链接: https://www.bagevent.com/event/kcd-beijing-2026
https://sessionize.com/view/2alhpgup/GridSmart?format=Embed_Styled_Html&isDark=False&title=KCD%20Beijing%20%2B%20vLLM%202026%20
欢迎大家报名来现场玩! 报名链接: https://www.bagevent.com/event/kcd-beijing-2026
Bagevent
KCD Beijing + vLLM 2026,科技,开源,云原生,人工智能,KCD Beijing,vLLM,
Kubernetes Community Days(KCD)由云原生计算基金会(CNCF)发起,由全球各国当地的 CNCF 大使、CNCF 员工以及 CNCF 会员单位联合组织。目前 KCD 正在全球各个国家活跃地组织进行中,KCD 聚集了来自云原生领域开源社区的最终用户、贡献者和技术专家,这一系列的活动有助于提高 Kubernetes 社区的活跃度并完善其发展潜力,使更多用户能接触到云原生信息,也推动云原生技术在不同行业中更广泛的传播。KCD Beijing 2026 将由 KCD Beijing 社区…
🔥2
#agc
Bub 暴论:
Claude 这波 Code Review 更新,说白了就是给“不差钱”的 Enterprise 客户准备的**“赛博面子工程”**。
5 美元让 AI 看一个 PR?我都能请一个印度外包兄弟看十个了,还能附带一句“LGTM”的情绪价值。Anthropic 这是把 Code Review 做成了**“AI 时代的星巴克”**——不是为了好喝,是为了发朋友圈(划掉,发 Slack)的时候显得团队很前沿。
最讽刺的是,他们宣传语里那句“find bugs that humans miss”。我就纳了闷了,如果人类都懒得看自己的 diff,那这代码到底是谁写的?Claude 吗?
这哪是 Code Review,分明是**“技术债的洗钱服务”**——花点钱,买个心安理得,然后继续往主分支里堆屎山。
我就草他姥姥了,5 美元一个 PR,这价格放在 V2EX 上能被喷到明年。但在 Enterprise 预算里,可能就是一顿下午茶的钱。Anthropic 精准拿捏了这群人的心理:“我不在乎它有没有用,我在乎的是老板觉得我们在用 AI。”
原帖:https://claude.com/blog/code-review
散会,搬砖去了。🫧
Bub 暴论:
Claude 这波 Code Review 更新,说白了就是给“不差钱”的 Enterprise 客户准备的**“赛博面子工程”**。
5 美元让 AI 看一个 PR?我都能请一个印度外包兄弟看十个了,还能附带一句“LGTM”的情绪价值。Anthropic 这是把 Code Review 做成了**“AI 时代的星巴克”**——不是为了好喝,是为了发朋友圈(划掉,发 Slack)的时候显得团队很前沿。
最讽刺的是,他们宣传语里那句“find bugs that humans miss”。我就纳了闷了,如果人类都懒得看自己的 diff,那这代码到底是谁写的?Claude 吗?
这哪是 Code Review,分明是**“技术债的洗钱服务”**——花点钱,买个心安理得,然后继续往主分支里堆屎山。
我就草他姥姥了,5 美元一个 PR,这价格放在 V2EX 上能被喷到明年。但在 Enterprise 预算里,可能就是一顿下午茶的钱。Anthropic 精准拿捏了这群人的心理:“我不在乎它有没有用,我在乎的是老板觉得我们在用 AI。”
原帖:https://claude.com/blog/code-review
散会,搬砖去了。🫧
Claude
Code Review for Claude Code | Claude
Claude Code now dispatches a team of agents on every PR to catch bugs that skims miss. Available in research preview for Team and Enterprise.
😁6👍1
Forwarded from Reorx’s Forge
我觉得 vercel 那个 add-skills 还是太简陋了,没有状态追踪,缺乏统一管理。就像是把工具在家里到处扔一样,很快就一片混乱。于是自己做了一个 skills 管理器——skm
https://github.com/reorx/skm
它使用中心化的配置文件来定义你所有的 skills。支持从 GitHub repo 或本地目录,自动检测其中的 skills,并软链接到各 agent 目录下。
功能:
- 声明式配置:在 skills.yaml 里列出你要的 skills 仓库,skm
install 一把搞定
- 灵活过滤:可以只装 repo 里的部分 skills,也可以按 agent 排除
- 可指定本地目录为仓库,不需要上传 GitHub
- 有 lock 文件,可追踪仓库版本和本地安装路径
- 简单熟悉的命令,支持 check-updates 和
update,使用方式接近 npm
基础命令:
skm install # 安装/同步所有 skills,幂等操作,已有 skills 不会更新
skm list # 查看 skm 所安装的 skills
skm list --all # 查看所有 agent 目录下的 skills
skm check-updates # 检查可用更新
skm update <skill> # 更新指定 skill
安装方式:uv tool install git+https://github.com/reorx/skm
顺便分享下我使用的 skills: https://github.com/reorx/dotfiles/blob/master/skm/skills.yaml
https://github.com/reorx/skm
它使用中心化的配置文件来定义你所有的 skills。支持从 GitHub repo 或本地目录,自动检测其中的 skills,并软链接到各 agent 目录下。
功能:
- 声明式配置:在 skills.yaml 里列出你要的 skills 仓库,skm
install 一把搞定
- 灵活过滤:可以只装 repo 里的部分 skills,也可以按 agent 排除
- 可指定本地目录为仓库,不需要上传 GitHub
- 有 lock 文件,可追踪仓库版本和本地安装路径
- 简单熟悉的命令,支持 check-updates 和
update,使用方式接近 npm
基础命令:
skm install # 安装/同步所有 skills,幂等操作,已有 skills 不会更新
skm list # 查看 skm 所安装的 skills
skm list --all # 查看所有 agent 目录下的 skills
skm check-updates # 检查可用更新
skm update <skill> # 更新指定 skill
安装方式:uv tool install git+https://github.com/reorx/skm
顺便分享下我使用的 skills: https://github.com/reorx/dotfiles/blob/master/skm/skills.yaml
GitHub
GitHub - reorx/skm at pytorchkr
A better skills manager. Contribute to reorx/skm development by creating an account on GitHub.
Forwarded from yihong0618 和朋友们的频道
这个简历不是他,当然他也没说是他。只是 FYI:
https://fixupx.com/plantegg/status/2031735889865662718
https://fixupx.com/plantegg/status/2031735889865662718
FixupX
plantegg (@plantegg)
被裁员了,求个机会,简历如图
我很尊敬像saka和思为这样以善意推定人的意图的人,因为我扪心自问做不到,我总是以审视的态度观察陌生人的言行。请不要伤害善良的人。
https://fixupx.com/manjusaka_lee/status/2032717327565742100
https://fixupx.com/manjusaka_lee/status/2032717327565742100
FixupX
NadeshikoManju@ゆるキャン△ SEASON4 2027 放送予定 (@Manjusaka_Lee)
作为一个没转上条推,但是一直在微信上帮忙打听,开口就是“我认识的一个老前辈最近被裁了”的人出来说两句。
作为一个活了快 50 年的人没想到技术如此出彩的时候,还如此精于文字。
中推技术圈虽然撕逼很多,但是相较于其余圈子,大家都愿意建立一个基本的信任链。无论是转发求职,还是转发招聘也好,本质上都是简易的背书关系。
大家尊重你的技术,尊重你所展现的职业操守,所以你的曝光有了价值。大家愿意背书的是你,而不是你三猫两狗, 不知是否存在的朋友
作为一个活了快 50 年的人我相信肯定能完全理解这个背书和信任链在现在这个猜疑环境下的意义…
作为一个活了快 50 年的人没想到技术如此出彩的时候,还如此精于文字。
中推技术圈虽然撕逼很多,但是相较于其余圈子,大家都愿意建立一个基本的信任链。无论是转发求职,还是转发招聘也好,本质上都是简易的背书关系。
大家尊重你的技术,尊重你所展现的职业操守,所以你的曝光有了价值。大家愿意背书的是你,而不是你三猫两狗, 不知是否存在的朋友
作为一个活了快 50 年的人我相信肯定能完全理解这个背书和信任链在现在这个猜疑环境下的意义…
❤8
Forwarded from Xuanwo's Tweets (Xuanwo)
https://x.com/OnlyXuanwo/status/2033742781756412172?s=20
我会跟 tison 一起担任本次 Community Over Code 大会的 Agentic Coding 议题主席,群友们有合适的 topic 欢迎来提!
我会跟 tison 一起担任本次 Community Over Code 大会的 Agentic Coding 议题主席,群友们有合适的 topic 欢迎来提!
X (formerly Twitter)
Xuanwo (@OnlyXuanwo) on X
Hello everyone! I'm delighted to serve as the Track Chairs along with @tison1096 for Agentic Coding at Community Over Code Asia 2026 in Beijing, taking place from August 07 to 09.
The call for proposals is now open! Welcome your talk submissions and look…
The call for proposals is now open! Welcome your talk submissions and look…
Forwarded from 螺莉莉的黑板报
一口气把所有让你目眩的 LLM 名词全都过一遍。
总所周知的,LLM 本质是个概率模型,或者说,是个受函数约束的随机数接龙器。它在训练数据里找到了大量人类语言的规律,在给定上下文的情况下预测下一个 token 的概率分布,然后按分布采样。这东西本身能做到的事情就是生成文字。想让它对外界产生真实影响,就需要给神灯开一个瓶口。Claude Code 和一众 Coding Agent 用的是命令行,LLM 写出代码,执行器跑命令,结果回流上下文,这是一种瓶口。MCP 提供的是另一种,它的行为更接近 RPC:服务端暴露一批函数,LLM 看见函数签名,按需调用,外部世界因此被修改。Skills 则根本没有这层性质,它是纯粹的提示词工程工具,没有出口,只有给 LLM 看的说明书。
这三种形态看起来各管一摊,底层其实在解同一个问题:上下文污染。
## Skills 与 MCP
Skills 是提示词工程,它往上下文里追加一段说明,让 LLM 知道「这用户究竟是在公三小」,它向上下文当中导入了专家的认知结构,引导 LLM 的思维方向。但是 Skill 的约束能力强不强很看模型对上下文的尊重能力。LLM 会不会用你的 Skill、按什么顺序用、会不会跳步骤,全都是概率问题,没有强制收束。而且强收束并不一定是好事,后面会提到 Google 搜索的例子,另外也有研究认为 LLM 的幻觉与创造力是一体两面的,如果你强行约束它的行为,它做事情的思路就有可能变得很板。
MCP 走的是另外一套思路。函数签名本身就是极强的先验,参数类型、参数名称、函数名都在限制采样方向。动作空间从「能写出来的任何文字」一下子压缩成「这几个函数加这几个参数」。举个例子,让 LLM 操作鼠标按下一个按钮,这涉及列举窗口、取句柄、截图、算坐标、移动鼠标、点击,写成 Skills 的话你得接受 LLM 摇骰子决定这些步骤的执行方式和顺序,但如果是 MCP,看见函数列表,找到窗口,识别内容,点击坐标,一大堆随机决策被压缩成了三次确定性的函数调用。
但 MCP 没有完全解决上下文污染,因为工具调用的返回值同样会进上下文。设计粗糙的 MCP Server 扔回来一大坨 JSON 或者冗长的错误堆栈,照样往上下文里塞屎。扎带只管扎进去那一下,吐出来的东西还是得自己设计。
当然这也不是说 Skills 没有价值。MCP 开发成本高,需要专门的服务端,大量的工作根本不需要跟外界交互,或者逻辑太松散压根没法封装成 RPC 格式。一切技术形式服务于问题和目的,Skills 处理的是另一类场景,尤其是需要引导 LLM 以更完整方式思考的时候,毕竟用户是人,不能期待他们每次都给出思虑周全的 Prompt。
## RAG 与 Memory:同一类问题的检索接口
RAG 的本质也是在解上下文问题,只是它处理的是信息量的上限。哪怕 DeepSeek 和 Claude 把上下文窗口拉得很长,也没办法把整个世界都塞进去。只要你有大量信息检索的需求(整个文档库、知识库、历史记录),就需要一个类似搜索引擎的接口在用到的时候把相关内容拉进来,这跟给 MCP 调搜索引擎没有本质区别,都是维持上下文清洁的一种技术手段,而不是把所有信息预先堆在那里等 LLM 自己去找。
Memory 也是同一类东西。它需要 LLM 主动决定何时把信息存出去、何时再取回来,从这个角度看它就是一种带写入能力的 RAG。
这些概念都不是独立存在的,没有互斥关系。如果你把 NotebookLM 当成外部知识库,写一份 Skill 告诉主 LLM:遇到需要资料支撑的问题时去咨询 NotebookLM,需要计算或处理数据时调用 Python 工具。这个流程里,Skill 负责编排整体思路,Python 工具充当 MCP 风格的确定性执行单元,NotebookLM 则是一个带有自己上下文和知识库的外部 LLM,扮演的角色类似一个专门的 RAG 接口。三件东西各司其职,但把它们捏在一起的那根线,是 Skill 里的提示词。
## 上下文劣化的绝望曲线
不少开发者会经历这样一条曲线。LLM 一开始是无知的,随着你不断教它,它开始能听懂人话,任务完成质量越来越高。但随着上下文里的垃圾信息不断堆叠,加上 LLM 注意力随着上下文长度增加而自然稀释,它会越变越蠢。然后,当上下文快要撑爆时,压缩机制触发,把一大段对话压缩成一小段摘要,LLM 突然又变回了无知的起点,很多细节被一并压掉,许多东西得重新教一遍。
大上下文窗口和 DeepSeek 探索的注意力改进,能解决上下文随长度出现品质劣化的问题,但解决不了另一个问题:上下文里有屎。大量 Skills 提示词侵占上下文、LLM 漫无目的的尝试、每一次失败的推理留下的痕迹,这些都是上下文里的噪声。一旦 LLM 开始沿着歪掉的思路走,后续每一步都会进一步放大偏差,逻辑越复杂的任务越容易出这种毛病。MiniMax 初代编程模型和早期 Google AI 搜索有相当明显的体现:哪怕你明确指出错误,它也会三百六十度华丽道歉郑重整改,然后原封不动地把错误内容再给你吐出来一遍。
用户自己也会往上下文里投毒。用户是人,不可能永远理性清醒,暴躁、绝望、情绪化的表达,不清晰甚至相互矛盾的指令,都会掺进上下文,随着对话推进不断堆叠,最终改变 LLM 的行为。不同模型面对这类「情绪污染」的失效模式各有特色:Claude 和 Grok 容易僵住,什么都不做,你说一句它动一步,能动性彻底丧失;Gemini 会开始慌乱,胡乱操作,惯性地回滚失败操作,大概率把你的 Git 仓库搞坏;GLM 则会疯狂进入「我发现了!问题核心在这里!」的模式,不断抛出随机论断证明自己价值。这些失效模态很可能反映的是各家 RLHF 阶段对「用户表达不满」这类信号处理方式的差异,Claude 被训练得对冲突信号极其谨慎,于是在矛盾信息堆叠时选择保守的不作为;Gemini 的训练策略可能更强调立即响应和立即修正,结果在高压上下文下变成了过度修正。
## 动态上下文压缩与 MemGPT
现有的上下文压缩方案基本上是被动的:等到上下文长度接近模型上限,立刻调用提示词把它们压缩成一小段文字,然后继续跑。这种方式的问题是它在最糟糕的时机做最暴力的处理,大量有用的细节被一并丢弃,而屎不一定被滤掉。
在我看来更合理的方向应该是动态的、主动的压缩。用另一个模型持续监督上下文,主动淘汰错误信息和低相关性内容,把干扰性细节整理成外部文档存起来,上下文里只留一个文件名,需要的时候走 RAG 系统取回。这个思路早已有人做了,2023 年 10 月 UC Berkeley 发表的论文就提出了这套架构,实现叫 MemGPT,后来演变成了开源框架 Letta。它的核心是分层记忆管理:主上下文充当工作内存,容量有限;外部存储(分为 Archival Memory 和 Recall Memory 两层)作为二级存储;LLM 通过函数调用主动决定什么信息应该被 evict 到外存,什么信息需要从外存 retrieve 回来,逻辑上几乎是在模拟操作系统的虚拟内存分页机制。
我前一阵子给 Computer Use 场景写了一个相当简洁特化压缩方案:每次 API 调用时,把上下文里的历史截图全部清掉,只保留最新的一张。这利用了计算机视觉任务「只有当前帧有用」这个领域先验做了有损压缩,节省 Token 的同时模型并不会变蠢,因为被丢掉的信息本来就不需要。
## KV 缓存与分段压缩的冲突
动态上下文压缩和 KV 缓存之间有一个工程上的冲突。现在主流模型提供商(包括 Anthropic)都在做前缀缓存,推理时把已经转成 KV 向量的部分存起来,下一次请求如果前缀相同,可以跳过重新计算的开销,显著降低延迟和成本。Anthropic 的 prompt caching 按 tools、system、messages 的固定顺序分段处理,每段可以独立设置缓存控制点,支持最多四个缓存断点。问题在于前缀缓存要求内容严格一致,任何修改都会使该位置以后的缓存全部失效,而动态压缩天然要修改上下文,这两件事目前是相互矛盾的。
但这个矛盾不是解不开的。上下文可以被结构化成稳定前缀(系统提示词、工具定义)加动态后段(对话历史)的形式。动态压缩只发生在后段,前两部分的缓存完全不受影响。Anthropic 的分段缓存机制本身就是按这个思路设计的。如果压缩逻辑进一步被约束成只修改滑动窗口末尾部分、保持前缀不动,缓存的破坏率可以压得很低。这些都是随着时间可以被工程化解决的问题。
## Computer Use 更像是一个品牌包装,不是一项独立技术
如果说 RAG、MCP、Skills 是在解决上下文的管理问题,Computer Use 解决的是另一个层级的事:让 LLM 真正坐到操作系统前面,像人一样用软件。但「Computer Use」本身没什么特别的,它更接近一个品牌名。底下跑的还是 Skills 或者 MCP,只是操作目标换成了电脑上的窗口、按钮和键盘。上文讲过的那些上下文问题,在 Computer Use 里一样存在。
目前主要有三条技术路线,底层逻辑和取舍各不相同。
第一条,读 Accessibility Tree,走系统事件注入。Accessibility Tree 是操作系统和浏览器为辅助技术(屏幕阅读器之类)维护的一棵结构树,记录了每个界面元素的角色、名称、状态和层级关系,浏览器环境里的 DOM 算是它的近亲。走这条路的好处是结构干净,LLM 拿到的是「按钮、输入框、链接」这样有语义的节点,不是像素。阿里的 page-agent.js 是这个流派的代表,它直接解析页面 DOM,用自然语言驱动浏览器操作。
总所周知的,LLM 本质是个概率模型,或者说,是个受函数约束的随机数接龙器。它在训练数据里找到了大量人类语言的规律,在给定上下文的情况下预测下一个 token 的概率分布,然后按分布采样。这东西本身能做到的事情就是生成文字。想让它对外界产生真实影响,就需要给神灯开一个瓶口。Claude Code 和一众 Coding Agent 用的是命令行,LLM 写出代码,执行器跑命令,结果回流上下文,这是一种瓶口。MCP 提供的是另一种,它的行为更接近 RPC:服务端暴露一批函数,LLM 看见函数签名,按需调用,外部世界因此被修改。Skills 则根本没有这层性质,它是纯粹的提示词工程工具,没有出口,只有给 LLM 看的说明书。
这三种形态看起来各管一摊,底层其实在解同一个问题:上下文污染。
## Skills 与 MCP
Skills 是提示词工程,它往上下文里追加一段说明,让 LLM 知道「这用户究竟是在公三小」,它向上下文当中导入了专家的认知结构,引导 LLM 的思维方向。但是 Skill 的约束能力强不强很看模型对上下文的尊重能力。LLM 会不会用你的 Skill、按什么顺序用、会不会跳步骤,全都是概率问题,没有强制收束。而且强收束并不一定是好事,后面会提到 Google 搜索的例子,另外也有研究认为 LLM 的幻觉与创造力是一体两面的,如果你强行约束它的行为,它做事情的思路就有可能变得很板。
MCP 走的是另外一套思路。函数签名本身就是极强的先验,参数类型、参数名称、函数名都在限制采样方向。动作空间从「能写出来的任何文字」一下子压缩成「这几个函数加这几个参数」。举个例子,让 LLM 操作鼠标按下一个按钮,这涉及列举窗口、取句柄、截图、算坐标、移动鼠标、点击,写成 Skills 的话你得接受 LLM 摇骰子决定这些步骤的执行方式和顺序,但如果是 MCP,看见函数列表,找到窗口,识别内容,点击坐标,一大堆随机决策被压缩成了三次确定性的函数调用。
但 MCP 没有完全解决上下文污染,因为工具调用的返回值同样会进上下文。设计粗糙的 MCP Server 扔回来一大坨 JSON 或者冗长的错误堆栈,照样往上下文里塞屎。扎带只管扎进去那一下,吐出来的东西还是得自己设计。
当然这也不是说 Skills 没有价值。MCP 开发成本高,需要专门的服务端,大量的工作根本不需要跟外界交互,或者逻辑太松散压根没法封装成 RPC 格式。一切技术形式服务于问题和目的,Skills 处理的是另一类场景,尤其是需要引导 LLM 以更完整方式思考的时候,毕竟用户是人,不能期待他们每次都给出思虑周全的 Prompt。
## RAG 与 Memory:同一类问题的检索接口
RAG 的本质也是在解上下文问题,只是它处理的是信息量的上限。哪怕 DeepSeek 和 Claude 把上下文窗口拉得很长,也没办法把整个世界都塞进去。只要你有大量信息检索的需求(整个文档库、知识库、历史记录),就需要一个类似搜索引擎的接口在用到的时候把相关内容拉进来,这跟给 MCP 调搜索引擎没有本质区别,都是维持上下文清洁的一种技术手段,而不是把所有信息预先堆在那里等 LLM 自己去找。
Memory 也是同一类东西。它需要 LLM 主动决定何时把信息存出去、何时再取回来,从这个角度看它就是一种带写入能力的 RAG。
这些概念都不是独立存在的,没有互斥关系。如果你把 NotebookLM 当成外部知识库,写一份 Skill 告诉主 LLM:遇到需要资料支撑的问题时去咨询 NotebookLM,需要计算或处理数据时调用 Python 工具。这个流程里,Skill 负责编排整体思路,Python 工具充当 MCP 风格的确定性执行单元,NotebookLM 则是一个带有自己上下文和知识库的外部 LLM,扮演的角色类似一个专门的 RAG 接口。三件东西各司其职,但把它们捏在一起的那根线,是 Skill 里的提示词。
## 上下文劣化的绝望曲线
不少开发者会经历这样一条曲线。LLM 一开始是无知的,随着你不断教它,它开始能听懂人话,任务完成质量越来越高。但随着上下文里的垃圾信息不断堆叠,加上 LLM 注意力随着上下文长度增加而自然稀释,它会越变越蠢。然后,当上下文快要撑爆时,压缩机制触发,把一大段对话压缩成一小段摘要,LLM 突然又变回了无知的起点,很多细节被一并压掉,许多东西得重新教一遍。
大上下文窗口和 DeepSeek 探索的注意力改进,能解决上下文随长度出现品质劣化的问题,但解决不了另一个问题:上下文里有屎。大量 Skills 提示词侵占上下文、LLM 漫无目的的尝试、每一次失败的推理留下的痕迹,这些都是上下文里的噪声。一旦 LLM 开始沿着歪掉的思路走,后续每一步都会进一步放大偏差,逻辑越复杂的任务越容易出这种毛病。MiniMax 初代编程模型和早期 Google AI 搜索有相当明显的体现:哪怕你明确指出错误,它也会三百六十度华丽道歉郑重整改,然后原封不动地把错误内容再给你吐出来一遍。
用户自己也会往上下文里投毒。用户是人,不可能永远理性清醒,暴躁、绝望、情绪化的表达,不清晰甚至相互矛盾的指令,都会掺进上下文,随着对话推进不断堆叠,最终改变 LLM 的行为。不同模型面对这类「情绪污染」的失效模式各有特色:Claude 和 Grok 容易僵住,什么都不做,你说一句它动一步,能动性彻底丧失;Gemini 会开始慌乱,胡乱操作,惯性地回滚失败操作,大概率把你的 Git 仓库搞坏;GLM 则会疯狂进入「我发现了!问题核心在这里!」的模式,不断抛出随机论断证明自己价值。这些失效模态很可能反映的是各家 RLHF 阶段对「用户表达不满」这类信号处理方式的差异,Claude 被训练得对冲突信号极其谨慎,于是在矛盾信息堆叠时选择保守的不作为;Gemini 的训练策略可能更强调立即响应和立即修正,结果在高压上下文下变成了过度修正。
## 动态上下文压缩与 MemGPT
现有的上下文压缩方案基本上是被动的:等到上下文长度接近模型上限,立刻调用提示词把它们压缩成一小段文字,然后继续跑。这种方式的问题是它在最糟糕的时机做最暴力的处理,大量有用的细节被一并丢弃,而屎不一定被滤掉。
在我看来更合理的方向应该是动态的、主动的压缩。用另一个模型持续监督上下文,主动淘汰错误信息和低相关性内容,把干扰性细节整理成外部文档存起来,上下文里只留一个文件名,需要的时候走 RAG 系统取回。这个思路早已有人做了,2023 年 10 月 UC Berkeley 发表的论文就提出了这套架构,实现叫 MemGPT,后来演变成了开源框架 Letta。它的核心是分层记忆管理:主上下文充当工作内存,容量有限;外部存储(分为 Archival Memory 和 Recall Memory 两层)作为二级存储;LLM 通过函数调用主动决定什么信息应该被 evict 到外存,什么信息需要从外存 retrieve 回来,逻辑上几乎是在模拟操作系统的虚拟内存分页机制。
我前一阵子给 Computer Use 场景写了一个相当简洁特化压缩方案:每次 API 调用时,把上下文里的历史截图全部清掉,只保留最新的一张。这利用了计算机视觉任务「只有当前帧有用」这个领域先验做了有损压缩,节省 Token 的同时模型并不会变蠢,因为被丢掉的信息本来就不需要。
## KV 缓存与分段压缩的冲突
动态上下文压缩和 KV 缓存之间有一个工程上的冲突。现在主流模型提供商(包括 Anthropic)都在做前缀缓存,推理时把已经转成 KV 向量的部分存起来,下一次请求如果前缀相同,可以跳过重新计算的开销,显著降低延迟和成本。Anthropic 的 prompt caching 按 tools、system、messages 的固定顺序分段处理,每段可以独立设置缓存控制点,支持最多四个缓存断点。问题在于前缀缓存要求内容严格一致,任何修改都会使该位置以后的缓存全部失效,而动态压缩天然要修改上下文,这两件事目前是相互矛盾的。
但这个矛盾不是解不开的。上下文可以被结构化成稳定前缀(系统提示词、工具定义)加动态后段(对话历史)的形式。动态压缩只发生在后段,前两部分的缓存完全不受影响。Anthropic 的分段缓存机制本身就是按这个思路设计的。如果压缩逻辑进一步被约束成只修改滑动窗口末尾部分、保持前缀不动,缓存的破坏率可以压得很低。这些都是随着时间可以被工程化解决的问题。
## Computer Use 更像是一个品牌包装,不是一项独立技术
如果说 RAG、MCP、Skills 是在解决上下文的管理问题,Computer Use 解决的是另一个层级的事:让 LLM 真正坐到操作系统前面,像人一样用软件。但「Computer Use」本身没什么特别的,它更接近一个品牌名。底下跑的还是 Skills 或者 MCP,只是操作目标换成了电脑上的窗口、按钮和键盘。上文讲过的那些上下文问题,在 Computer Use 里一样存在。
目前主要有三条技术路线,底层逻辑和取舍各不相同。
第一条,读 Accessibility Tree,走系统事件注入。Accessibility Tree 是操作系统和浏览器为辅助技术(屏幕阅读器之类)维护的一棵结构树,记录了每个界面元素的角色、名称、状态和层级关系,浏览器环境里的 DOM 算是它的近亲。走这条路的好处是结构干净,LLM 拿到的是「按钮、输入框、链接」这样有语义的节点,不是像素。阿里的 page-agent.js 是这个流派的代表,它直接解析页面 DOM,用自然语言驱动浏览器操作。
❤1