LLM 是内核,Harness 是操作系统:Karpathy 类比详解
你天天在用操作系统,却没意识到 Agent 就是一台微缩的电脑。把"进程调度、内存管理、系统调用、访问控制"这八个字翻译成 Agent 的语言,你会发现复杂的东西突然全通了。
本文导航
- 为什么是操作系统
- 四个核心映射:一次看个透
- 映射一:工具系统 = 系统调用
- 映射二:权限模型 = 访问控制
- 映射三:上下文管理 = 内存管理
- 映射四:多 Agent 编排 = 进程调度
- 用一张表收尾
- 从类比到工程:你接下来要造什么
- 小结
- 下节预告
上一节我们把 LLM 的四块短板摆上了解剖台:没手、没眼、没记忆、没缰绳。这一节换个更爽的视角——用你每天都在用的操作系统来重新认识 Agent。
Karpathy 有个特别出名的说法:大模型 Agent 就像一台微缩的电脑。我当时第一反应是"夸张了吧",但等我真把两个系统逐项对照之后,我信了。因为这套类比不是比喻着玩玩,它精确到能指导工程——你按操作系统的思路去设计 Agent,设计出来就是对的。
不瞒你说,我早期做 Agent 时架构一团糟,就是因为我没意识到:我其实是在"写操作系统",却用"写普通应用"的思路在写。意识错位,代码全是歪的。
为什么是操作系统
先想清楚一件事:操作系统到底解决了什么问题?
答案是四个字——管理资源。把 CPU、内存、磁盘、外设这些有限的硬件资源,安全、高效、公平地分给一个个进程用,同时不让进程互相踩踏、不让进程越权。
Agent 的问题一模一样。它也有"资源":模型调用额度(=CPU/算力)、上下文窗口(=内存)、文件系统和外部 API(=外设)、以及一个个工具调用(=进程)。你怎么把这些资源管起来,不让工具调用互相越权、不让上下文撑爆窗口、不让调用额度烧光——这就是操作系统的活。
所以 Karpathy 类比不是玄学,它把 Agent 的本质问题——资源编排——翻译成了你早就烂熟于心的领域。
四个核心映射:一次看个透
下面这四组映射是整套类比的骨架,我画成一张总表:
| 操作系统概念 | Agent 对应物 | 解决的问题 | 课程章节 |
|---|---|---|---|
| 系统调用(syscall) | 工具系统 | 进程怎么安全地碰外设 | 第9章 工具集 |
| 访问控制/权限 | 权限模型 | 谁被允许动什么 | 第10章 安全权限 |
| 内存管理 | 上下文引擎 | 有限的窗口怎么装得下无限历史 | 第11章 上下文工程 |
| 进程调度 | 多 Agent 编排 | 多个子任务怎么协同不打架 | 第12章 子 Agent |
一个个拆开讲。
映射一:工具系统 = 系统调用
操作系统里,用户进程不能直接碰硬件。你想读磁盘,得通过系统调用(read、write、open)向内核申请,内核检查完再去碰硬件,再把结果返回给你。为什么这么设计?因为直接碰硬件,进程 A 可能把进程 B 的数据搞坏,系统就乱了。
Agent 里也一样。模型这个"进程"不能直接碰你的文件系统、终端、网络(这就是上一节的"没手")。它要读文件、跑命令,必须通过 Harness 提供的"系统调用"——也就是工具。
# 操作系统:进程 -> syscall(read) -> 内核 -> 磁盘# Agent :模型 -> tool(read_file) -> Harness -> 文件系统# 注册工具 = 暴露"系统调用"给模型tools=[{"type":"function","function":{"name":"read_file","description":"读取指定路径的文件内容(等同于 read 系统调用)","parameters":{"type":"object","properties":{"path":{"type":"string"}},"required":["path"],},}}]关键洞察:工具就是"受控的副作用入口"。模型没有权限直接做任何事,它只能"点菜"(发 tool_call),Harness 这个"内核"负责实际执行。这跟系统调用的设计哲学一模一样:权力上收,能力下放。这也是为什么第 21 节工具系统的设计,内核就是"注册表 + 执行器"两层——跟内核的系统调用表如出一辙。
映射二:权限模型 = 访问控制
光有系统调用还不够。内核里还有一个东西叫访问控制:不同进程有不同的权限。普通进程删不了系统文件,root 才能改/etc。这是安全的第一道闸。
Agent 里呢?如果模型能调用所有工具、访问所有路径,那它跟"拿到了 root 权限的恶意进程"没区别——太危险了。所以 Harness 必须有一套权限模型:
PERMISSIONS={"read_file":{"paths":["/workspace/project"],"mode":"read"},"write_file":{"paths":["/workspace/project"],"mode":"write"},"run_command":{"allow":["python","pytest"],"deny":["rm -rf","sudo"]},# 没列进来的工具,模型根本调不到 → 相当于没授权}defcheck_permission(tool_name,args):iftool_name=="run_command":cmd=args["command"]ifany(badincmdforbadinPERMISSIONS["run_command"]["deny"]):raisePermissionError(f"命令{cmd}被权限模型拒绝")returnTrue# 通过授权才放行看到没有——默认拒绝,显式放行。这跟操作系统的权限检查一模一样:不在白名单里的,一律拒绝。模型再"聪明",也翻不了你给它划的墙。这正好呼应上一节的"安全哲学":模型不可信但可约束,约束就靠这套权限模型。
映射三:上下文管理 = 内存管理
内存管理是操作系统最核心的活之一:内存是有限的,进程想要的内存往往比物理内存大。怎么办?虚拟内存、页交换、LRU 淘汰——把有限的物理内存,尽量高效地分给多个进程。
Agent 的上下文窗口(比如 DeepSeek 的 1M token)就是"物理内存"。模型需要的"历史信息"往往远超窗口。怎么办?Harness 的上下文引擎对应操作系统三大内存技术:
| 内存管理技术 | Agent 对应物 | 作用 |
|---|---|---|
| 虚拟内存 | 把"完整任务状态"映射到窗口内 | 让模型感觉记忆是连续的 |
| 页交换 | 滑动窗口:旧的滚出,新的进来 | 保住当前焦点,忘掉久远细节 |
| LRU 淘汰/压缩 | 摘要压缩 / RAG 检索 | 窗口不够时,浓缩旧内容 |
# 内存不够 -> 页交换/压缩;上下文不够 -> 摘要/检索defmanage_memory(messages,window=10):iflen(messages)<=window:returnmessages# 内存够,直接用old,recent=messages[:-window],messages[-window:]summary=LLM.summarize(old)# 压缩久远页 -> 摘要return[{"role":"system","content":f"[历史]:{summary}"}]+recent核心思想:状态永远在 Harness 侧(=内存管理方),模型只看到"被调度进窗口的那一页"。谁管内存,谁就拥有"记忆"——这句话我在上一节说过,到这里你该有更深体会了。
映射四:多 Agent 编排 = 进程调度
现代操作系统是多进程并发的:CPU 把时间片分给多个进程,让它们看起来在同时跑,还要处理进程间通信(IPC)、避免死锁。
Agent 到复杂阶段也一样。一个任务会长出多个"子 Agent"(对应多个进程):一个负责写代码,一个负责跑测试,一个负责找资料。谁先跑、谁后跑、结果怎么拼、互相怎么通信——这就是进程调度。
多 Agent 有三件事必须处理,件件都对应操作系统进程管理的经典问题:
- 优先级/调度顺序:主 Agent 决定哪个子任务先执行(=CPU 调度)
- 进程间通信:子 Agent 之间的结果传递要结构化(=IPC)
- 死锁与超时:某个子 Agent 卡住了要有熔断机制(=死锁检测)
第 12 章我会带你手写一个带优先级和超时的子 Agent 调度器,那会儿你回头看这里的类比,会觉得当初自己怎么没早点想到。
用一张表收尾
把整个操作系统类比浓缩成一张"翻译对照表",以后你设计 Agent 卡壳了,就回头查:
| 操作系统问题 | Agent 问题 | 标准解法 |
|---|---|---|
| 进程怎么碰外设? | 模型怎么做事? | 系统调用 = 工具注册表 |
| 谁有权动什么? | 模型能碰哪些资源? | 访问控制 = 权限白名单 |
| 内存不够怎么办? | 上下文超窗口怎么办? | 虚拟内存 = 摘要/检索 |
| 多进程怎么协同? | 多子任务怎么编排? | 调度 + IPC = 编排器 |
| 死锁/失控怎么办? | 子 Agent 卡住怎么办? | 超时/熔断 = max_iters |
从类比到工程:你接下来要造什么
前六篇其实都在搭认知,从这一节起,你要开始"造操作系统"了。用 Karpathy 类比的眼光看,你的 DeepPilot 从骨架到血肉,就是一台完整的微缩操作系统:
- 第 3 章"API 协议"= 理解 CPU 指令集(模型怎么说话)
- 第 9 章"工具集" = 实现系统调用层
- 第 11 章"上下文工程" = 实现内存管理器
- 第 10 章"安全权限" = 实现访问控制
- 第 12 章"子 Agent" = 实现进程调度器
你不再是"调 API 的",你是"造系统的"。这句话就是第 2 章章节名的含义,也是你身份升级的起点。
小结
- Agent = 微缩操作系统,它和操作系统解决的是同一个问题:有限资源的编排。
- 工具系统 = 系统调用:权力上收、能力下放,模型只能"点菜",Harness 负责执行。
- 权限模型 = 访问控制:默认拒绝、显式放行,模型再强也翻不了你划的墙。
- 上下文管理 = 内存管理:滑动窗口/摘要/检索,对应页交换/LRU/压缩。
- 多 Agent 编排 = 进程调度:优先级、IPC、超时熔断,一应俱全。
下节预告
认知搭建完毕,下一节我直接把"这台操作系统"的完整剖面图摊开给你看——六层架构解剖图:模型接入、工具系统、上下文引擎、安全权限、编排、可观测性,一个生产级 Agent 到底由哪六层组成,每一层对应课程的哪几章,一次讲透。这张图,就是整个课程的总纲。
如果觉得本文对你有帮助,欢迎点赞、收藏、关注三连!
本系列持续更新中,80篇硬核实战,关注不迷路~