电视剧《愿为你重来一次》剧情说明
2026-08-15 3450883
2026-08-15 0
大模型 API 核心概念笔记需要先看清适用场景和关键步骤,避免只记结论却忽略实际限制。
核心结论:模型无状态,上下文靠框架维护。

模型每次被调用,都是"全新的"——它不记得上一次对话说了什么。就像一个失忆症患者,每次见面都得重新自我介绍。
因此,Agent 框架必须每次都把完整的对话历史打包发给模型。
第一轮调用:
messages: [{ "role": "system","content": "你是一个编程助手" },{ "role": "user","content": "你好,你是谁?" }]
第二轮调用(必须带上历史):
messages: [{ "role": "system","content": "你是一个编程助手" },{ "role": "user","content": "你好,你是谁?" },{ "role": "assistant", "content": "我是编程助手,有什么可以帮你?" },{ "role": "user","content": "帮我写个冒泡排序" }]
如果只发最后一条,模型完全不知道前面聊了什么,上下文全丢了。
| 角色 | 谁写的 | 作用 |
|---|---|---|
system | 开发者 | 定义模型的"人设"和行为规则,通常只有一条,放在最前面 |
user | 用户 | 用户的输入和请求 |
assistant | 模型(上一轮) | 模型之前的回答,拼回去让它"记住"自己说过什么 |
tool | Agent 框架 | 工具执行完的结果,通过 tool_call_id 与对应请求关联 |
模型只动嘴,框架负责动手。
以"Vancouver 现在天气怎么样?"为例:
第一次调用用户提问 → 发给模型模型返回:我需要调用 get_weather 和 get_current_time(并行)Agent 框架执行两个工具,拿到结果第二次调用把工具结果追加到 messages → 再发给模型模型读到结果 → 直接回答用户
模型返回工具调用时,content 为 null,实际指令在 tool_calls 字段里:
{"role": "assistant","content": null,"tool_calls": [{"id": "call_abc123","function": {"name": "get_current_time","arguments": "{"timezone": "America/Vancouver"}"}}]}
这个"请求 → 工具调用 → 执行 → 送回结果 → 再请求"的循环,就是 ReAct 循环(Reason → Act → Observe)在 API 层面的具体实现。
API 返回的顶层是 choices 数组,因为支持 n=3 这样的参数,让模型一次生成多个候选回答供你挑选。
实际开发中 99% 的情况都是 n=1(默认),直接取 choices[0].message 即可。
包一层数组是为了格式统一——不管要 1 个还是 N 个回复,调用方的处理代码不需要做特殊判断。
TTFT = Time To First Token,即从发出请求到第一个字出现的等待时间。
名字虽然带 token,说的是时间,是衡量响应速度的延迟指标。
模型处理每个 token 时,会产生 Key 和 Value 两种中间计算结果。
messages 中已存在的 token(system prompt、历史对话)→ 直接读 KV Cache,跳过计算。
新增的 token(新的用户输入)→ 实时计算。
实际效果:
这也是为什么 system prompt 要放在 messages 最前面——它永远不变,最容易被缓存复用。