Skill 如何共享 Agent 的上下文(Context)?上下文的数据结构一般如何设计?
面试官:“多个 Skill 之间怎么共享 Agent 的上下文?这个上下文的数据结构你会怎么设计?”
候选人:
“上下文是 Skill 之间无声的默契。设计上下文共享机制时,我最关心的是:怎么让 Skill 既拿到需要的数据,又不会互相踩脚,还能支持断点续执行和跨版本兼容。 我分成机制和结构两层来说。
一、共享机制:基于声明式键映射的全局 TaskContext
每个任务启动时,编排引擎创建一个 TaskContext 对象,这个对象贯穿任务的所有 Skill。上下文不直接传给 Skill,而是 Skill 在元信息里声明“我需要什么”和“我能给什么”,编排引擎负责注入和收集。
-
输入声明:Skill A 的元信息里声明参数
temperature,来源为context:weather.current_temp。执行前,引擎从上下文里取值注入。 -
输出声明:Skill B 执行完后,引擎根据它的输出元信息,把
temperature: 26写回context:weather.current_temp。 -
隔离:Skill 只能读自己声明的键,写自己声明的键。这就在数据层面实现了接口式解耦。
二、数据结构设计:分区命名空间 + 多版本兼容
上下文不是简单的键值堆砌,我把它设计成三层命名空间结构:
TaskContext
├── user_input (用户原始输入及澄清结果)
├── skill_outputs (各 Skill 产生的数据)
│ ├── weather_query
│ │ └── current_temp: 26
│ ├── flight_book
│ │ └── booking_id: "FL123"
│ └── ...
├── task_state (任务状态与断点信息)
│ ├── current_step: "waiting_confirmation"
│ ├── completed_steps: ["weather_query", "flight_search"]
│ └── pending_skill: "hotel_booking"
└── metadata (任务元信息)
├── task_id: "task_abc123"
├── user_id: "u_10086"
├── locale: "zh-CN"
└── created_at: "2026-06-23T10:00:00Z"
每层具体设计考虑:
-
user_input:保存用户的原始自然语言指令和后续交互中澄清的参数,比如“下周二去深圳”解析后的结构化参数。这样任何 Skill 都能回溯用户的原始意图,而不是只看上游 Skill 转换后的结果。
-
skill_outputs:按 Skill 名称划分命名空间,每个 Skill 只在自己的子空间写入。这防止了键冲突,也方便调试——一眼就知道哪个数据是哪个 Skill 产生的。每个值除了数据本身,还可以附带类型信息和生成时间戳,方便校验和排序。
-
task_state:记录编排引擎的状态机状态,用于断点恢复。它不是给 Skill 看的,而是给编排引擎自己用的。
-
metadata:跨所有 Skill 共享的全局信息,如用户 ID、语言偏好、租户 ID。这些信息由 Agent 核心在任务创建时注入,Skill 可以直接读取但不可修改。
三、值的设计:带元信息的包装
普通字符串或数字太脆弱,我让上下文中的每个值都带一些元信息,以方便调试和智能决策:
{
"current_temp": {
"value": 26,
"type": "number",
"source": "weather_query_v2.1",
"produced_at": "2026-06-23T10:00:05Z",
"confidence": 0.98,
"ttl_ms": 1800000
}
}
-
source:记录是哪个 Skill 产生的,方便溯源。
-
confidence:有些 Skill 可能产出不确定的结果,下游可以据此决定是否采用或重新查询。
-
ttl:时效性。比如天气数据 30 分钟后过期,下游若发现已过期,可触发重新获取而非用旧数据。