问今天天气,它有时会编;问你电脑里有没有某份文件,它更不可能知道。后来它又能查天气、读文件了——可为什么还是「记不住」上周聊过什么?
LLM(Large Language Model,大语言模型)做的事很单一:看到一串文字,预测「后面最可能接着什么」。聊天、写代码、做摘要,底层都是这件事。它是后面所有能力的基石,但基石不等于整栋楼。
训练结束后,模型参数就冻住了。它不知道此刻上海下不下雨,也看不见你硬盘里的文件。你若硬问,它往往仍会「答」——那是在续写一个听起来像答案的句子,不是去查了。这种编造,常叫幻觉。
你问一句,它答一句就停
不会自己去查天气、读文件
盯着目标循环:想 → 动手 → 再看结果
直到办完。下面各层都是在给它补零件
Token(词元)是模型读写文字的最小计费与计长单位。英文一个词可能被切成几片,中文一个字常常对应 1~2 个 Token。所以「它读了多少字」和「它吃了多少 Token」不是一回事。
比如这句话,对人是 7 个字;对模型更像若干碎片(切法随分词器而变,用来建立直觉即可):
「上海今天的天气」≈ 几个 Token,不是「7 个字 = 7 个 Token」。
一次能塞进模型的内容有上限,这个上限按 Token 计,不按页数计。工具返回的一长段天气 JSON、你贴进去的整份日志,都会占额度。额度用满,更早的内容就要被丢掉或压成摘要。
上下文窗口约一篇长文
上下文窗口约一本书的量级
上下文窗口约能塞进好几本书
数字会随模型变,用来建立数量级直觉即可:窗口再大,也仍是有限桌面。
Context(上下文)是这一次请求里模型能看见的全部文字:系统设定、可用工具清单、此前的对话、你刚说的话,以及工具刚返回的结果。它不是大脑里的长期记忆,更像一张面积有限的书桌。
模型本身是无状态的:每次调用,对它都像第一次见面。你觉得它「还记得上一句」,是因为中间的平台(ChatGPT、Cursor 这种套在模型外面的程序)把旧消息重新拼进 Context,再整包发给它。关掉会话、换一个窗口,桌上的纸就没了。
Context 窗口是工作台;文件、笔记、记忆工具才是硬盘。查一次天气,返回全文也会占桌面——所以「会用工具」之后,窗口往往比纯聊天更容易被塞满。
Prompt(提示词)不是魔法咒语,就是写进 Context 里、用来规定「你是谁、要干什么、别干什么」的文字。同一模型、同一窗口,指令不同,人设和边界就不同。
系统提示通常藏在产品后台:例如「你是助手,不确定就说不知道,不要假装查过天气」。用户提示是你打出去的那句。后面的工具说明、Skills 手册,本质上都是写得更结构化的 Prompt。
「帮我看看天气」
缺地点、缺时间,模型只能猜
「用天气工具查上海今天;
查不到就直说,不要编」
Tools(工具)把模型够不着的事变成可调用的动作:读本地文件、查天气预报、搜索附近店铺。动机很具体——知识会过期,手也不长在模型身上。
最容易讲错的一点:LLM 并不真正执行工具。它只输出「我想调天气查询」。真正去调接口、读文件、再把结果塞回对话的,是中间的平台(运行时 / Host)。
说出目标,接收最终回答
拼上下文、执行工具、决定何时再问模型
选择工具或给出自然语言答案
查天气、读文件、搜店铺……
各家产品里的 Function Calling / Tool Use,就是约定:模型用一种结构化格式说出「调哪个工具、参数是什么」。平台解析、执行,把结果当作新的上下文再发给模型。模型仍然只在写字,只是这种字可以被程序读懂。
OpenAI 有自己的函数调用写法,Anthropic 有自己的工具协议,其它厂商还有各自的声明方式。同一个「查天气」,换一个模型就要重接一遍。工具越多,对接成本越高。
OpenAI 是一家模型公司;OpenAPI(常被叫 Swagger)是描述 HTTP 接口长什么样的规范,不管模型怎么用;MCP(Model Context Protocol,模型上下文协议)管的是:工具如何被发现、连接、调用。天气预报服务可以做成一个 MCP 服务,但 MCP 本身不是天气预报。
| 名称 | 它在管什么 | 没解决什么 |
|---|---|---|
| OpenAI / Anthropic 工具格式 | 这家模型如何声明和发起一次调用 | 换模型往往要重写一遍对接 |
| OpenAPI | 一个 HTTP 接口的路径、参数、返回值 | 不管大模型怎么发现和调用它 |
| MCP | 工具(以及可读资源等)如何插到各种 Agent 宿主上 | 不代替你实现「查天气」本身的业务逻辑 |
定位、天气、店铺是三个工具。但「先定位 → 再查天气 → 下雨才找伞店」是一套做法。把这套做法写成可复用的说明书,就是 Skills(技能 / 作业手册)。Cursor、Claude 里常见的 SKILL.md,就是这种东西。
Skills 的另一个用处是省窗口:平时只告诉模型「有哪些手册、什么情况下打开」;真正相关时再把详细步骤加载进 Context。过去反复调教出来的标准流程,就不用每次从零写进 Prompt。
SKILL.md 说明书,相关任务时才加载进上下文。它不是另一种 MCP,也不代替工具本身。Agent(智能体)不是另一种模型,而是一套围绕目标转的循环:看桌上的纸 → 决定下一步 → 若需要就调工具 → 把观察结果放回桌上 → 再想,直到能交差,或步数用尽、出错、需要人点头。
「我这里天气怎么样?如果下雨,帮我查附近有没有卖伞的店。」这句话一个工具不够:要先定位,再查天气,满足「有雨」才去查店。Agent 的价值,就是把这种多步、带条件的事串起来。
不停地调工具会烧 Token,也可能误操作。常见刹车:目标已经达成、达到步数上限、工具报错、以及危险动作要人确认(删文件、付款)。有手之后,权限和人在回路不是附加题。
从上往下是「主事人 → 基石」。点一层,看它补上了什么:
你可以试试:下面两张图默认都能看清。点「逐步播放」,会按顺序只亮当前一步;手机上看时序图可左右滑动。
每条色块上写着「谁 → 谁」。点播放,从用户问出「上海今天的天气?」走起。
左右滑动可看完整四列(用户 · 平台 · 大模型 · 天气工具)
四步默认都能看清。点播放,会按「定位 → 天气 → 下雨才找店 → 收束」走一遍。
不知道「这里」是哪,先定位。
调用定位 → 东经 121.5°,北纬 31.2°
有坐标了,可以查天气。
调用天气 → 返回:有雨
条件成立(下雨),才去找店。若没下雨,这里就会直接收束。
调用店铺 → 返回:附近有卖伞的店
信息够了,不再调工具,组织成给用户的话。
最终回答:外面在下雨,附近可以买到伞。
LLM 只会续写;Token 是它咬的碎片;Context 是有限桌面。多轮对话靠平台把旧纸再摆上去。
Prompt 规定怎么演。Tools 让它够得着天气和文件——但伸手的是平台,不是模型。
MCP 统一「怎么插上工具」。Skills 把「下雨才找伞店」这类做法写成可复用说明书。
盯着目标循环:思考 → 调用 → 观察 → 再思考。它统观下面每一层,直到交差或必须停下。