
零基础认识大语言模型(LLM)工作原理目录 - GuZhenYin - 博客园
前面的章节,我们分别介绍了:
到这里,又有新的问题出现了。
如果把 Agent 比作一家公司的员工。
那么:
LLM 是大脑。
Tool 是双手。
Memory 是笔记本。
Workflow 是工作流程。
Skill 是专业技能。
那么问题就出现了: 是谁在安排这一切?
谁来负责:
什么时候调用 Tool?
什么时候读取 Memory?
什么时候结束任务?
什么时候重新规划?
答案就是我们本章要讲解的Agent Runtime(智能体运行时)。
很多程序员第一次看到 Runtime 这个词,会想到:
Java Runtime。
.NET Runtime。
Node.js Runtime。
这些 Runtime 都有一个共同特点:负责管理程序整个运行过程。
例如:
.NET Runtime 会负责:
程序真正运行的时候。
真正工作的其实不是入口函数 Main()
而是:.NET Runtime。
Agent 也是一样。
LLM不会自己运行。
Tool不会自己调用。
Memory不会自己搜索。
Skill也不会自己加载。
真正协调它们工作的就是:Agent Runtime。
我们先一句话总结一下,Runtime等于Agent 的总调度中心。
它负责:
接收任务
↓
理解目标
↓
制定计划
↓
调用 Skill
↓
调用 Tool
↓
获取结果
↓
继续推理
↓
判断是否结束
↓
输出最终结果整个 Agent 生命周期,其实全部由 Runtime 控制。
我们还是从例子开始
用户输入:修复这个 Bug。
LLM第一步:
分析 Bug。
结束。
那么问题来了。
怎么继续?
模型不会自己继续。
所以这里,Runtime收到模型输出。
发现需要:Read File
于是调用文件工具。
得到具体代码文件内容。
然后继续调用模型。
模型则继续分析。
输出:Search Symbol
Runtime则继续调用。
......
这整个过程模型一直在思考。
Runtime 则一直在执行。
因此,真正循环工作的不是LLM。
而是Runtime。
前面我们已经知道,Agent Runtime 是整个智能体系统的控制中心。那么,它究竟是如何驱动整个 Agent 持续工作的?
答案其实就是 事件循环(Event Loop)。
很多开发者第一次接触 Agent 时,容易认为它只是"连续调用很多次 LLM"。(当然,如果是简单理解 也没毛病)
上面我们也讲到了,真正持续运行的并不是大模型,而是 Runtime。
我们可以把 Runtime 想象成一位项目经理。
它不会亲自完成开发工作,而是不断地:
整个过程就像一个不断运行的循环。
开始任务
│
▼
加载 Context
│
▼
调用 LLM
│
▼
解析输出
│
▼
是否需要执行 Action?
│
┌────┴────┐
│ │
否 是
│ │
▼ ▼
结束 调用 Tool
│
▼
获取 Observation
│
▼
更新 Context
│
└──────────────┐
│
▼
再次调用 LLM整个过程中,LLM 并不知道自己处于第几轮推理,也不知道之前执行了哪些工具,它只是不断根据当前的 Context 推理"下一步应该做什么"。真正维护整个执行过程的,是 Runtime。
假设用户提出这样一个任务:帮我分析这个 GitHub 项目的整体架构,并生成一份技术报告。
Runtime 接收到任务后,不会一次性把所有工作都交给模型,而是逐步完成。
第一轮,LLM 根据用户目标判断:我需要先了解项目目录结构。
于是输出:
{
"action": "list_files",
"path": "./"
}Runtime 识别到这是一个工具调用请求,于是执行文件工具,返回项目目录。
第二轮,LLM 看到目录结构后,又判断:需要先阅读 README 文件。
于是继续输出:
{
"action": "read_file",
"file": "README.md"
}Runtime 再次执行。
随后模型可能继续要求:
直到最后输出:
{
"finish": true,
"answer": "项目整体采用分层架构……"
}Runtime 收到 finish=true 后,结束整个循环,并把最终结果返回给用户。
可以看到,整个任务实际上经历了几十轮甚至上百轮推理,而不是一次 Prompt 就完成的。
有人可能会问:
为什么不能一次告诉模型:"请先分析目录,再分析代码,最后生成报告。"
原因在于,真实世界的大多数任务都具有不确定性。
例如,在开始分析项目之前,模型并不知道:
这些信息都必须在执行过程中逐步获取。
因此,Agent 的工作方式更像人类解决问题:观察环境 → 决定下一步 → 获取反馈 → 再决定下一步。
而不是提前把所有步骤全部规划好。
这种动态决策能力,也是 Agent 比传统工作流更加灵活的重要原因。(也是今年Agent这么火的原因之一)
如果说 Event Loop 是 Agent 的运行框架,那么 Action(行动) 与 Observation(观察) 就是 Agent 与现实世界交互的核心机制。
很多人误以为,大模型会直接调用工具。
实际上在Agent中,这是错误的。
LLM 并不会真正执行任何操作,它只负责告诉 Runtime:"我下一步希望执行什么。"
真正执行并调用工具的,始终是 Runtime。
Action 可以理解为模型输出的一条"执行指令"。
例如,当模型分析代码时,它可能输出:
{
"action": "read_file",
"path": "Program.cs"
}或者:
{
"action": "search_symbol",
"keyword": "CreateOrder"
}再或者:
{
"action": "execute_shell",
"command": "dotnet test"
}这些都属于 Action。
请注意,它们只是模型的决策结果,然后需要 Runtime去执行后续的动作.
模型并不会真的去读取文件、执行命令或者查询数据库。
Runtime 收到 Action 后,会调用对应的 Tool。
例如:
dotnet test执行完成后,返回:
Total Tests: 128
Passed: 127
Failed: 1
NullReferenceException这段返回结果,就是 Observation(观察结果)。
Runtime 会把 Observation 加入新的 Context,再交给模型继续推理。
于是模型看到:测试失败,异常类型是 NullReferenceException。
它就可以继续思考:下一步应该查看异常堆栈。
于是再次生成新的 Action。
整个过程形成了一个完整的闭环。
LLM 思考
│
▼
生成 Action
│
▼
Runtime 执行
│
▼
得到 Observation
│
▼
加入 Context
│
▼
LLM 再次思考Agent 其实正是依靠这种不断循环的方式,逐步完成复杂任务。
这种"推理—行动—观察"的模式,在学术界被称为 ReAct(Reason + Act)。
它的核心思想非常简单:
Thought(思考)
↓
Action(行动)
↓
Observation(观察结果)
↓
Thought(思考)
↓
Action(行动)
↓
Observation(观察结果)例如,当用户要求:帮我定位这个 Bug。
模型第一次思考:我需要查看日志。
于是生成 Action:Read Log。
Runtime 执行后返回日志。
模型继续思考:日志显示数据库连接失败,需要检查配置文件。
于是再次生成新的 Action:Read appsettings.json。
整个过程中,每一次 Observation 都会影响下一次推理。
因此,Agent 并不是一次性生成完整方案,而是在不断获取反馈、不断修正自己的判断。
早期很多 Agent 产品都会直接展示完整的思考过程,例如:
Thought:
我应该先查看配置文件……
Action:
read_file(appsettings.json)后来,越来越多的商业产品开始隐藏这部分内容。
原因主要有三个:
第一,内部推理过程可能包含大量无意义的中间推断,反而增加用户理解成本。
第二,思考过程可能暴露系统 Prompt、内部规则等敏感信息,存在安全风险。
第三,不同模型的推理方式并不完全相同,直接展示容易造成误解。
因此,现在更多产品会展示类似:
正在分析项目……
正在读取代码……
正在运行测试……
正在生成报告……而不会完整显示内部推理内容。
需要说明的是,这并不代表模型没有推理过程,而是这些过程由 Runtime 在后台协调完成,并不一定需要全部呈现给用户。
在第十一章,我们介绍了 MCP(Model Context Protocol)。
现在可以把几章内容串联起来。
当模型生成 Action,比如:查询医院库存
Runtime 首先判断:这是一个 Tool 调用。
随后通过 MCP Client 找到对应的 MCP Server,由 MCP Server 调用医院库存系统,获取真实数据。
整个过程如下:
用户
↓
LLM
↓
Action
↓
Runtime
↓
MCP Client
↓
MCP Server
↓
医院库存系统
↓
Observation
↓
Runtime
↓
LLM可以看到:LLM 负责决策,Runtime 负责调度,MCP 负责连接,Tool 负责执行。
四者各司其职,这才能共同组成现代 Agent 的完整执行链路。
这是 Runtime 最重要职责。
例如,模型输出:继续搜索。
Runtime:继续。
模型输出:修改代码。
Runtime:继续。
模型输出:运行测试。
Runtime:继续。
直到模型输出:Task Complete
Runtime:停止循环。
然后给用户返回最终答案。
所以Runtime不仅负责执行。
还要负责结束。
假设Agent已经运行50 步。
Context越来越长。
怎么办?
Runtime通常会自动进行:Context Management。
例如:
历史消息
↓
总结(Summarize)
↓
压缩
↓
保留关键结论
↓
继续执行否则,上下文很快超过模型最大窗口。
因此Context Management,其实也是 Runtime 工作之一。
除了总结,现代 Runtime 还可能采用:
这些策略的目标都是一致的:让有限的上下文窗口承载尽可能多的有效信息。
上一章我们介绍了 Skill,并提到它可以把某一领域的专业知识、最佳实践和工作规范封装起来,供 Agent 按需使用。
那么,一个新的问题来了:Runtime 是如何决定什么时候使用 Skill 的?
很多人第一次接触 Skill 时,容易产生一种误解:Runtime 会把所有 Skill 一次性全部发送给大模型。
实际上,现代 Agent 几乎都不会这样设计。
原因很简单。
假设一个企业拥有:
每个 Skill 都包含几千甚至上万 Token。
如果启动 Agent 时就把所有 Skill 一次性放入 Context,不仅会迅速耗尽上下文窗口,还会增加推理成本,降低模型对当前任务的关注度。
因此,现代 Agent 普遍采用一种更加高效的方式,也就事我们上一章也讲过的——渐进式披露(Progressive Disclosure)。
这里我们在简单回溯一下,渐进式披露并不是让模型完全不知道有哪些 Skill。
通常情况下,Runtime 会先向模型提供每个 Skill 的基础信息,例如:
Available Skills:
- Java Development
用于 Java 项目开发与代码分析
- SQL Optimization
用于数据库设计与 SQL 优化
- Docker Expert
用于容器构建与部署
- Kubernetes Expert
用于 Kubernetes 集群运维也就是说,模型知道:
但是,它并不知道每个 Skill 内部包含哪些详细内容。
例如,一个 SQL Skill 里面可能包含:
这些内容通常有几千甚至上万 Token。
Runtime 不会在任务开始时全部加载,而是在真正需要的时候,再把完整内容加入 Context。
这种设计主要有三个优点。
第一,减少 Context 占用。
绝大多数任务只会涉及少量 Skill。
例如,一个 SQL 优化任务,完全没有必要同时加载 Java、Docker、Kubernetes 等大量无关知识。
按需加载能够显著减少 Prompt 长度,提高推理效率。
第二,提高模型注意力。
模型一次接收的信息越多,真正与当前任务相关的信息比例就越低。
只加载当前任务需要的 Skill,可以让模型更加聚焦当前问题,减少无关内容对推理过程的干扰。
第三,方便持续维护。
Skill 通常以独立文件的形式维护。
例如:
skills/
├── java.md
├── dotnet.md
├── sql.md
├── docker.md
├── kubernetes.md
└── security.md新增一个 Skill,只需要增加一个新的文件,而不需要修改整个 Agent 的 Prompt。
企业也可以根据自身业务,不断积累新的 Skill 库,实现知识资产的持续沉淀。
目前,越来越多的 Agent 产品都采用了类似的设计理念。
例如 Claude Code 的 Skills,以及 OpenClaw 新版 Skill 规范,都采用了**元数据(Metadata)+ 按需加载(Lazy Loading)**的模式。
Runtime 首先向模型提供 Skill 的基本信息,例如名称、描述和适用场景;当模型判断某个 Skill 可以帮助完成当前任务时,再由 Runtime 将该 Skill 的完整内容加载到 Context 中。
这种机制正是前一章介绍的**渐进式披露(Progressive Disclosure)**在 Agent Runtime 中的具体体现。
很多人第一次看到Claude Code。
都会觉得太神奇了。
其实Claude模型本身没有连续运行。
真正连续运行的是Runtime。
例如:
读取项目
↓
搜索引用
↓
修改代码
↓
运行测试
↓
失败
↓
再次修改
↓
再次运行
↓
Git CommitClaude模型只是不断思考下一步。
真正执行Shell、Git、文件、测试的,全部是Runtime。
所以Claude Code 并不是一个"会写代码的大模型",而是一个由 Runtime 驱动、能够持续执行开发任务的 Agent 系统。
现在,我们终于可以把Agent相关的内容串起来了:
用户目标
│
▼
Agent Runtime
│
┌───────────────┼────────────────┐
▼ ▼ ▼
Context 管理 Skill Router Workflow
│ │ │
▼ ▼ ▼
Memory 加载 Skill 流程控制
│
▼
Prompt / Tool / MCP
│
▼
LLM
│
Thought / Action
│
▼
Observation
│
└───────────────┐
│
回到 Runtime请注意:Runtime 并不是 LLM 的一部分,而是整个 Agent 系统的控制中心。
LLM 负责生成下一步行动,Runtime 负责让这些行动真正发生。
这一章,我们回答了六个关键问题: