你有没有想过一个问题:
你给 ChatGPT 发一条消息,和你用 API 写代码调一次模型,和一个 Agent 自己在那儿连续调用工具——这三件事,对模型来说,有什么区别?
答案可能会让你意外:没有本质区别。
模型从头到尾都在做同一件事:看到一串 token,接着往下写。
但你明显感觉到它“变聪明了”——能聊天、能出 JSON、能调工具、能自己规划一整个任务。这些能力不是凭空冒出来的,是因为喂给模型的那串 token 变了。
这篇文章不讲模型参数有多大、训练了多少数据,只聊一个很具体的事:从你按下回车到模型吐出结果,中间那层“输入输出”这几年是怎么一步步演化的,以及为什么会这样演化。
一、先破一个最常见的误解
很多人觉得:早期模型只能补全文本,现在的模型能“理解任务”了,所以本质上变了。
实际上没有。
不管是 GPT-4、Claude、Gemini 还是 Qwen,底层都是同一个逻辑:
输入一串 token → 算出下一个 token 的概率 → 选一个出来 → 接回去继续算
你在 API 里发的 {"role": "user", "content": "你好"},模型看到的其实是类似这样的东西:
<|user|>
你好
<|assistant|>
然后它从 <|assistant|> 后面开始“补全”。
所以真正变化的不是模型“学会了新技能”,而是 塞给它的上下文越来越复杂,它被训练成能在这些复杂上下文里做出正确反应。
理解了这一点,下面的事就好理解了。
二、四次关键升级,每次都是被应用“逼”出来的
与其按时间线逐个罗列,不如直接看四个真正改变了游戏规则的节点。每一次升级的逻辑都一样:应用场景提出了新需求,模型的输入输出格式就得跟着变。
第一跳:从“续写”到“听指令”
最早的语言模型真的就是文本续写机。你输入“今天天气很好,”,它继续写“很多人来到公园散步”。你想让它翻译?它可能翻译完又自己续写了三个例句——因为它不知道自己“应该”只输出答案。
应用痛点: 我想让模型完成一个具体任务,不是让它自由发挥。
怎么解的: Instruction tuning。用大量“指令→回答”的数据训练模型,让它学会一个模式——看到指令格式就输出任务结果,而不是随便往下写。
模型输入从“一段任意文本”变成了“指令 + 输入 + 回答起始标记”。
这是模型从“写作工具”变成“助手”的起点。
第二跳:从“一问一答”到“多轮对话”
指令模型会听话了,但它没有记忆。每次调用都是全新的,它不知道你上一轮说了什么。
应用痛点: 用户会追问、会纠正、会补充上下文,模型得知道“哪句话是谁说的”。
怎么解的: Chat template。输入里加入了角色标记(system / user / assistant)和轮次结构。OpenAI 也是在这个阶段把旧的 Completions API 换成了 Chat Completions API——从发一个 prompt 字符串,变成发一个 messages 列表。
模型输入从“指令+输入”变成了“一段带角色标记的对话历史”。
这是你今天用的所有聊天产品的基础。
第三跳:从“回答问题”到“调用工具”
Chat 模型能聊天了,但它被困在自己的知识里。它不知道今天天气、查不了数据库、发不了邮件。
应用痛点: 我想让模型连接真实世界,不只是用训练数据回答。
怎么解的: Function calling / Tool use。输入里除了对话,还多了一块“工具定义”——告诉模型你有哪些工具可以用,每个工具的参数是什么。模型如果判断需要外部数据,就不直接回答,而是输出一个 tool_call:
{"name":"get_weather","arguments":{"city":"Tokyo"}}
注意——**模型没有真的查天气。**它只是输出了“我想调这个工具”。真正执行是你的代码干的,执行完再把结果塞回上下文,模型再基于结果回答。
模型输入从“对话历史”变成了“对话历史 + 可用工具列表”。 模型输出从“只有文本回答”变成了“文本回答或工具调用”。
这一步打开了所有“模型 + 外部能力”场景的大门。
第四跳:从“单轮调用”到“Agent 循环”
工具调用解决了“模型能连接外部世界”的问题,但它是单轮的——模型调一次工具、看一次结果、给一次回答。
真实任务不是这样的。“帮我分析这份销售数据并生成报告”可能需要:读文件 → 发现异常 → 细查原因 → 写分析 → 整理成报告,好几步。
应用痛点: 模型需要自己规划多步操作,像一个执行者而不是回答者。
怎么解的: Agent loop。模型输入不再只是“对话历史”,而是变成了完整的任务状态——包括目标、当前计划、已执行步骤、每步工具返回的结果、当前状态。模型每次补全的不是“回答”,而是“下一步该做什么”。
目标: 分析销售数据并生成报告
已执行: read_spreadsheet → 发现三月销售额异常下降
当前状态: 需要深入分析下降原因
下一步: ?
模型补全出下一步动作,工具执行,结果回到上下文,模型再决定下一步……直到任务完成。
模型输入从“对话历史”变成了“任务状态机”。
这就是 Chat 和 Agent 的本质差异:Chat 的输入是对话,Agent 的输入是任务运行状态。
三、还有两个容易忽略的变化:输出也在被“收紧”
上面四跳主要讲输入怎么变的。但输出端也发生了两件重要的事:
第一件:Structured Outputs——模型输出被程序接管了一半。
早期你想让模型输出 JSON,只能在 prompt 里写“请只输出 JSON,不要解释”。模型可能听话,也可能在前面加一句“当然可以,以下是结果:”——对人没问题,对程序就炸了。
现在的 Structured Outputs 不是事后检查格式对不对,而是在生成过程中就限制模型只能输出符合你 schema 的 token。模型管语义(该填什么值),解码器管格式(只能走合法的 JSON 路径)。
第二件:多模态输入——模型能“看”了。
文本时代,模型输入只有文字 token。现在可以同时喂入图片、音频、PDF、视频。模型不再只根据文字回答,而是根据多种模态的信息回答。这对 Agent 特别重要——Agent 需要读文件、看截图、理解表格,不只是聊天。
四、一张图看全貌
把上面的变化压缩成一条线:
每一行的逻辑都一样:应用场景变复杂了,所以塞给模型的上下文变复杂了,模型被训练成能在这种复杂上下文里正确反应。
五、但模型不是一个人在战斗
读到这里你可能会觉得:这一路都是模型在进化。
其实不是。模型从始至终只做一件事——吃 token、吐 token。真正让这些进化“落地”的,是模型外面的那层系统。我们姑且叫它 harness。
你用的 ChatGPT 界面是一个 harness,你写的调 API 的代码也是一个 harness,Claude Code、Cursor、Manus 背后都是一个 harness。
回头看上面的四跳,每一跳其实都是模型和 harness 配对升级才产生的效果:
第一跳,harness 几乎不用变。 模型学会了听指令,harness 只要把用户输入拼成指令格式就行。增益主要来自模型端。
第二跳,harness 开始干活了。 模型学会了多轮对话,但“记住历史”这件事不是模型做的——模型没有记忆,每次调用都是全新的。是 harness 在维护整个 messages 列表,每次调用前把所有历史序列化成 token 喂进去,上下文太长了还要负责截断或压缩。
第三跳,harness 变成了中间人。 模型学会输出 tool_call,但它输出的只是一串 token。谁来解析这串 token、真正去调 API、拿到结果、再包装成 tool_result 塞回上下文?全是 harness 干的。如果 harness 不接住这个 tool_call,它就只是一段没人理的文本。
第四跳,harness 变成了任务编排器。 模型学会了在任务状态里补全“下一步动作”,但整个循环——执行动作、收集结果、拼回上下文、判断什么时候停——全是 harness 在编排。Agent 不是模型一个人跑起来的,是模型和 harness 组成的循环跑起来的。
越往后,harness 的戏份越重。到 Agent 这一步,模型和 harness 的关系已经像大脑和身体——模型负责“想”下一步该做什么,harness 负责“做”、负责“看到结果”、负责把结果送回给模型再“想”。
只升级模型不升级 harness,或者只升级 harness 不升级模型,都不会产生新能力。 这也是为什么同一个模型接不同的 harness,表现天差地别——同样的 Claude,裸调 API 就是聊天机器人,接上 Claude Code 的 harness 就能自主写代码改 bug。模型没变,变的是 harness。
六、所以,这些跟你有什么关系?
如果你在用模型 API 做开发,上面这些就归结为一句话:
你写的代码,就是那个 harness。
你怎么组装 system prompt,怎么管理对话历史,怎么定义工具的 description 和 schema,怎么处理 tool_call 和结果回传,怎么设计 agent loop 的状态——这些全是 harness 的工程。模型再强,你的 harness 不到位,它也发挥不出来:
- 模型回答得不好?可能不是模型笨,是你的 system prompt 没给够上下文
- 工具调用不稳定?检查一下工具的 description 和 schema 写得够不够清晰——那是模型做决策的全部依据
- 想做 Agent?别急着套框架,先想清楚每一轮喂给模型的“任务状态”长什么样
- JSON 输出偶尔格式错?用 Structured Outputs,别靠 prompt 祈祷
说到底,从 chat 到 agent 的演进,不是模型单方面变强的故事,而是模型和 harness 不断配对升级的故事。



