用大白话讲清楚 ChatGPT 背后的 Chat API:系统提示词、历史消息、工具调用,以及一串 HTTP 请求里的文字,是怎么一步步变成「Token 数字」、再变成最终回复的。
模型眼里没有「网页、JSON、函数」,只有一串数字。
你可以把一次 API 调用想象成给一个「只会算数字的翻译官」下达任务:
核心就一个 messages 数组,外加几个「旋钮」参数。
拆开看,每个字段各司其职:
| 字段 | 作用 | 通俗理解 |
|---|---|---|
model | 指定用哪个模型 | 「叫哪位员工来干活」 |
messages | 完整的对话上下文 | 「把之前说过的话都给他看」 |
temperature | 回答的随机程度 | 「是死板照搬,还是天马行空」 |
max_tokens | 最多输出多少字 | 「回答长度的上限」 |
messages 里 没有所谓「会话状态」。模型是无记忆的 —— 每次调用你都得把整段历史重新发一遍,它才能「记得」前面聊了什么。在下面填内容,右侧会实时拼出真实的请求体:
给模型「戴上的角色面具」和「立下的规矩」,优先级最高。
system 角色放在消息列表最前面,用来告诉模型三件事:
"system": "..."),而 OpenAI 是放进 messages 里用 role="system"。本质一样 —— 都是最高优先级的指令。
记忆是「假象」,真相是每次都把聊天记录重新喂回去。
一次多轮对话,请求体是滚雪球式增长的:
| role | 是谁说的话 | 作用 |
|---|---|---|
system | 你给模型的设定 | 立规矩、定人设 |
user | 用户说的话 | 问题本身 |
assistant | 模型之前说的话 | 让模型「接得上」上下文 |
messages 越长,消耗的 Token 越多(也就越贵、越慢)。所以工程上才会有「截断旧对话」「做摘要压缩」这些优化手段。
模型不会自己「打电话查天气」,它只会说「我想调用这个函数,参数是……」,真正执行靠你。
get_weather(),再带着真实结果回来。这叫「模型动嘴,程序跑腿」。
不是所有字段都会进模型。有些是「给模型看的话」,有些只是「给推理引擎的旋钮」。
| 内容 | 是否进入模型计算 | 说明 |
|---|---|---|
system 系统提示词 | ✔ 进 | 变成上下文 Token |
user 用户消息 | ✔ 进 | 变成上下文 Token |
assistant 历史回复 | ✔ 进 | 变成上下文 Token |
| RAG 检索到的知识 | ✔ 进 | 拼进 Prompt 一起处理 |
tools 工具定义 | ✔ 通常进 | 进入上下文,占用 Token |
temperature | ✘ 不进 | 采样参数,改的是选词随机性 |
max_tokens | ✘ 不进 | 只是限制输出长度 |
模型不识字,只认数字。Tokenizer 就是那个「翻译成数字」的分词器。
⚠️ 这是教学用简化演示(按常见子词规则模拟分割并伪造 ID)。真实的 Tokenizer(如 GPT 的 BPE)更细:常见词可能 1 个词 = 1 个 Token,生僻词会被拆成多个小片段。
每个模型自带一套「词表 + 切分规则」。同一个词,在 GPT、Qwen、DeepSeek 里的切法和 ID 可能完全不同。所以计算长度、显存、费用时,只能按 Token 数,不能按字数估算。
| 概念 | 含义 | 通俗理解 |
|---|---|---|
| 输入长度 Input Tokens | 进入模型的 Token 数(system+历史+问题+RAG+工具) | 「他看了多少」 |
| 输出长度 Output Tokens | 模型新生成的 Token 数 | 「他说了多少」 |
| 上下文窗口 Context Window | 模型能处理的最大 Token 数 | 「他的脑容量上限」 |
处理输入阶段。你输入的 1 万个 Token 一次性并行算完,同时生成缓存(KV Cache)。主要影响首字延迟(TTFT)和长文本处理速度。
生成阶段。借助 KV Cache,每次只算一个新 Token,一个一个往外吐,循环直到结束。这就是为什么回答长内容像「逐字打印」而不是「瞬间整段弹出」。
x₁, x₂, …, xₜ,预测下一个 Token 的概率分布 P(xₜ₊₁ | x₁…xₜ),再按采样策略(这就是 temperature 起作用的地方)挑出一个,如此反复。
面试和实操都常被问到的几个「旋钮」。
| 参数 | 作用 | 取值范围 / 典型值 | 调整方向 |
|---|---|---|---|
temperature | 采样随机性 | 0 ~ 2,常见 0.7 | ↓ 更稳定死板,↑ 更多样发散 |
max_tokens | 输出上限 | 正整数 | 决定回答最长长度 |
top_p | 核采样,只在累计概率内的词里选 | 0 ~ 1,常见 0.9 | 与 temperature 二选一微调 |
n | 一次返回几个候选回答 | 正整数 | 需要多选一/对比时用 |
stop | 遇到指定字符串就停止生成 | 字符串数组 | 控制生成到哪收尾 |
tools | 声明可用工具 | 函数定义数组 | 开启工具调用能力 |
stream | 是否流式返回(打字机效果) | true / false | 体验好就开 true |
temperature 和 top_p 别同时调大,二选一。需要严谨准确(代码、数学、JSON 输出)就调低 temperature;需要创意发散(文案、脑暴)就调高。
从 HTTP 到回答,完整链路在大脑里过一遍。
| 能力/概念 | OpenAI | Anthropic (Claude) | 更高层的封装 |
|---|---|---|---|
| 消息接口 | Chat / Responses | Messages | LangChain / LangGraph 等 |
| 系统提示词 | role: "system" | 顶层 system 字段 | PromptTemplate |
| 工具调用 | tool_calls | tool_use | Tool / MCP / Skill |
| 工具结果回填 | role: "tool" | tool_result | 由框架自动编排 |
LangGraph(状态图 Agent 编排)、AgentScope(多智能体)、Spring AI Alibaba(Java 生态)这些框架,干的都是同一件事:帮你组织上下文、保存状态、调用工具、控制流程——而底层的「上下文 → Token → 预测下一个 Token」始终没变。