Agent 到底把哪些数据发给大模型?
一篇讲清 Agent、上下文、工具信息和 Skill 工作原理的实战笔记
一、为什么要学这个
这块内容其实是 Agent 的核心。
搞清楚它,你能同时理解三件事:
很多人学 Agent 的时候,容易只看到“会调用工具”“会记住上下文”,但没有意识到,真正起作用的是:
- 每一轮请求里,Agent 都会把一整套上下文重新组织好,再发给模型。
- 模型不是自己记住了上一轮,而是又看到了上一轮。
- 工具不是神秘能力,本质上是一份结构化说明书,告诉模型“你有哪些工具、它们怎么用、什么时候该用”。
二、先给结论
从“模型实际收到的输入”角度看,Agent 每一轮通常会发送 4 类信息:
更准确地说,不是把“整个世界”都发过去,而是把当前上下文窗口内、需要模型看的信息打包发过去。
如果对话太长,历史消息还可能被截断、摘要或压缩。
图 1:Agent 请求大模型的整体结构
#mermaid-svg-RX6I0GpvdgFlnpNx{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-RX6I0GpvdgFlnpNx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-RX6I0GpvdgFlnpNx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-RX6I0GpvdgFlnpNx .error-icon{fill:#552222;}#mermaid-svg-RX6I0GpvdgFlnpNx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RX6I0GpvdgFlnpNx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-RX6I0GpvdgFlnpNx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RX6I0GpvdgFlnpNx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RX6I0GpvdgFlnpNx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-RX6I0GpvdgFlnpNx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RX6I0GpvdgFlnpNx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RX6I0GpvdgFlnpNx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RX6I0GpvdgFlnpNx .marker.cross{stroke:#333333;}#mermaid-svg-RX6I0GpvdgFlnpNx svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RX6I0GpvdgFlnpNx p{margin:0;}#mermaid-svg-RX6I0GpvdgFlnpNx .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-RX6I0GpvdgFlnpNx .cluster-label text{fill:#333;}#mermaid-svg-RX6I0GpvdgFlnpNx .cluster-label span{color:#333;}#mermaid-svg-RX6I0GpvdgFlnpNx .cluster-label span p{background-color:transparent;}#mermaid-svg-RX6I0GpvdgFlnpNx .label text,#mermaid-svg-RX6I0GpvdgFlnpNx span{fill:#333;color:#333;}#mermaid-svg-RX6I0GpvdgFlnpNx .node rect,#mermaid-svg-RX6I0GpvdgFlnpNx .node circle,#mermaid-svg-RX6I0GpvdgFlnpNx .node ellipse,#mermaid-svg-RX6I0GpvdgFlnpNx .node polygon,#mermaid-svg-RX6I0GpvdgFlnpNx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RX6I0GpvdgFlnpNx .rough-node .label text,#mermaid-svg-RX6I0GpvdgFlnpNx .node .label text,#mermaid-svg-RX6I0GpvdgFlnpNx .image-shape .label,#mermaid-svg-RX6I0GpvdgFlnpNx .icon-shape .label{text-anchor:middle;}#mermaid-svg-RX6I0GpvdgFlnpNx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-RX6I0GpvdgFlnpNx .rough-node .label,#mermaid-svg-RX6I0GpvdgFlnpNx .node .label,#mermaid-svg-RX6I0GpvdgFlnpNx .image-shape .label,#mermaid-svg-RX6I0GpvdgFlnpNx .icon-shape .label{text-align:center;}#mermaid-svg-RX6I0GpvdgFlnpNx .node.clickable{cursor:pointer;}#mermaid-svg-RX6I0GpvdgFlnpNx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-RX6I0GpvdgFlnpNx .arrowheadPath{fill:#333333;}#mermaid-svg-RX6I0GpvdgFlnpNx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RX6I0GpvdgFlnpNx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RX6I0GpvdgFlnpNx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RX6I0GpvdgFlnpNx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-RX6I0GpvdgFlnpNx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RX6I0GpvdgFlnpNx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-RX6I0GpvdgFlnpNx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RX6I0GpvdgFlnpNx .cluster text{fill:#333;}#mermaid-svg-RX6I0GpvdgFlnpNx .cluster span{color:#333;}#mermaid-svg-RX6I0GpvdgFlnpNx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RX6I0GpvdgFlnpNx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-RX6I0GpvdgFlnpNx rect.text{fill:none;stroke-width:0;}#mermaid-svg-RX6I0GpvdgFlnpNx .icon-shape,#mermaid-svg-RX6I0GpvdgFlnpNx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RX6I0GpvdgFlnpNx .icon-shape p,#mermaid-svg-RX6I0GpvdgFlnpNx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-RX6I0GpvdgFlnpNx .icon-shape .label rect,#mermaid-svg-RX6I0GpvdgFlnpNx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RX6I0GpvdgFlnpNx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-RX6I0GpvdgFlnpNx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-RX6I0GpvdgFlnpNx :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
用户输入
Agent
拼装上下文
大模型推理
模型回复 / 工具调用
工具执行
三、四大区块分别是什么
| model 区 | 选择模型和推理参数 | gpt-4.1、temperature、max_tokens | 这是请求配置,不是模型“理解”的正文 |
| 系统提示词区 | 定义角色、规则和边界 | 身份、风格、优先级、约束 | 对模型影响最大,通常优先级很高 |
| 历史消息区 | 让模型看到上下文 | 过去的用户、助手、工具消息 | 让对话保持连贯 |
| 工具信息区 | 告诉模型有哪些工具能用 | 工具名、描述、参数结构 | 决定模型会不会发起工具调用 |
四、历史消息区:对话为什么能连起来
历史消息区就是把前面的对话一条条喂给模型。
一个最常见的对话长这样:
用户:你好
助手:我是一个大模型
用户:中国首都是哪
助手:北京
在请求里,这些内容通常会被组织成带 role 的消息列表:
[
{ "role": "user", "content": "你好" },
{ "role": "assistant", "content": "我是一个大模型" },
{ "role": "user", "content": "中国首都是哪" },
{ "role": "assistant", "content": "北京" }
]
role 是什么
role 的意思是:这一条消息是谁说的、在上下文里扮演什么角色。
常见角色有:
- system:系统级规则,优先级最高。
- developer:开发者给模型的内部约束,某些平台会使用。
- user:用户输入。
- assistant:模型输出。
- tool:工具执行结果。
你最开始笔记里写的 user 和 assistant 是最核心的两类,但在真实 Agent 里,system 和 tool 往往也很关键。
为什么说大模型是无状态的
这里要讲得严谨一点:
- 模型本身不是像人一样“自己记得上一次说了什么”。
- 它之所以能接着聊,是因为 Agent 又把前面的消息发给它了。
- 所以,对模型来说,状态不是存在“脑子里”,而是存在上下文输入里。
这就是常说的“无状态”:
模型在每一次推理时,看到的都是一份新的输入。
图 2:一次对话的消息流
大模型Agent用户大模型Agent用户#mermaid-svg-QYf4hXibA89zYNPv{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-QYf4hXibA89zYNPv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-QYf4hXibA89zYNPv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-QYf4hXibA89zYNPv .error-icon{fill:#552222;}#mermaid-svg-QYf4hXibA89zYNPv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-QYf4hXibA89zYNPv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-QYf4hXibA89zYNPv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-QYf4hXibA89zYNPv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-QYf4hXibA89zYNPv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-QYf4hXibA89zYNPv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-QYf4hXibA89zYNPv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-QYf4hXibA89zYNPv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-QYf4hXibA89zYNPv .marker.cross{stroke:#333333;}#mermaid-svg-QYf4hXibA89zYNPv svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-QYf4hXibA89zYNPv p{margin:0;}#mermaid-svg-QYf4hXibA89zYNPv .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-QYf4hXibA89zYNPv text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-QYf4hXibA89zYNPv .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-QYf4hXibA89zYNPv .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-QYf4hXibA89zYNPv .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-QYf4hXibA89zYNPv .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-QYf4hXibA89zYNPv #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-QYf4hXibA89zYNPv .sequenceNumber{fill:white;}#mermaid-svg-QYf4hXibA89zYNPv #sequencenumber{fill:#333;}#mermaid-svg-QYf4hXibA89zYNPv #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-QYf4hXibA89zYNPv .messageText{fill:#333;stroke:none;}#mermaid-svg-QYf4hXibA89zYNPv .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-QYf4hXibA89zYNPv .labelText,#mermaid-svg-QYf4hXibA89zYNPv .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-QYf4hXibA89zYNPv .loopText,#mermaid-svg-QYf4hXibA89zYNPv .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-QYf4hXibA89zYNPv .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-QYf4hXibA89zYNPv .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-QYf4hXibA89zYNPv .noteText,#mermaid-svg-QYf4hXibA89zYNPv .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-QYf4hXibA89zYNPv .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-QYf4hXibA89zYNPv .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-QYf4hXibA89zYNPv .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-QYf4hXibA89zYNPv .actorPopupMenu{position:absolute;}#mermaid-svg-QYf4hXibA89zYNPv .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-QYf4hXibA89zYNPv .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-QYf4hXibA89zYNPv .actor-man circle,#mermaid-svg-QYf4hXibA89zYNPv line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-QYf4hXibA89zYNPv :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}你好system + history + 当前用户消息我是一个大模型中国首都是哪system + 更新后的 history + 当前用户消息北京
一个很重要的现实问题:上下文窗口
历史消息不是无限长的。
如果对话越来越长,会出现几个问题:
所以真实 Agent 往往会配合:
- 历史摘要
- 长期记忆
- 检索增强(RAG)
- 任务状态压缩
来保持“像有记忆”,但又不至于把所有历史都原封不动塞进去。
五、系统提示词区:Agent 的总规则
系统提示词区一般负责回答这些问题:
- 你是谁?
- 你要扮演什么角色?
- 你要遵守什么规则?
- 你能不能胡编?
- 什么时候必须调用工具?
- 回复风格应该是什么?
例如:
你是一个严谨的中文助手。
回答要优先准确,其次简洁。
如果信息不足,先澄清再回答。
需要外部信息时,优先使用工具。
它的作用很像“总开关”。
如果说历史消息负责“记住发生了什么”,那么系统提示词负责“决定你该怎么做”。
六、工具信息区:大模型为什么会用工具
工具信息区是很多人第一次看 Agent 时最容易忽略、但其实最关键的一块。
它不是把工具代码直接塞给模型,而是给模型一份结构化说明,告诉它:
- 工具叫什么。
- 工具是干什么的。
- 工具需要什么参数。
- 参数怎么组织。
你笔记里写的:
- name
- desc
就是最简化的表达。
真实场景里通常还会有参数结构,比如:
{
"name": "search_web",
"description": "搜索网络信息,适合查最新事实、定义或外部资料。",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "要搜索的关键词"
}
},
"required": ["query"]
}
}
工具信息区的作用
模型看到这份描述后,会判断:
所以工具信息区本质上是在给模型做“能力说明书”。
七、Skill 的工作原理,为什么能理解
Skill 可以理解成一套打包好的任务能力。
它通常不是“单独魔法”,而是下面几部分的组合:
- 任务说明
- 操作步骤
- 工具描述
- 输出约束
- 示例或模板
也就是说,Skill 的工作原理,本质上还是把“怎么做”这件事写成模型能读懂的上下文或工具信息。
你可以把它理解成:
Skill = 规则 + 工具 + 示例 + 约束
当 Agent 加载某个 Skill 时,它就相当于把这份能力说明放进了模型能看到的内容里。
于是模型就能更容易判断:
- 什么时候该用这个 Skill。
- 用这个 Skill 时要遵守什么格式。
- 产出应该长什么样。
八、一次完整请求到底长什么样
下面是一个简化版请求示意:
{
"model": "gpt-4.1",
"messages": [
{
"role": "system",
"content": "你是一个严谨的中文助手。"
},
{
"role": "user",
"content": "帮我解释一下 Agent 为什么是无状态的。"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "search_web",
"description": "搜索网络信息",
"parameters": {
"type": "object",
"properties": {
"query": { "type": "string" }
},
"required": ["query"]
}
}
}
],
"temperature": 0.7
}
这份请求可以拆成三层理解:
具体工作流如下:

