在 ARC-AGI-3 这类需要连续观察、推理和行动的基准中,模型能力并不是唯一变量。来源材料指出,为 GPT-5.6 开启两个 API 设置后,评测得分提升到原来的三倍,同时执行效率也得到改善:一个设置负责保留跨请求的推理信息,另一个负责在上下文增长时启用压缩。
这个结果提醒我们:评测智能体时,API 调用方式本身就是系统的一部分。模型如果每一步都要重新建立问题表征,或者上下文膨胀到挤占有效信息,再强的推理能力也会被调用链路消耗掉。
保留推理状态:避免每一步都从零开始
ARC-AGI-3 任务通常不是一次请求即可完成。智能体需要读取当前状态、选择动作、观察反馈,再决定下一步。整个过程更接近一个循环:
观察状态 -> 更新假设 -> 选择动作 -> 接收反馈 -> 修正假设
如果每次调用只传入表面的历史消息,模型可能需要反复推导已经得到的结论。例如,它已经发现“红色方块会阻挡移动”,下一轮却不得不从若干条历史记录中重新归纳这条规则。这会增加 token 消耗,也可能导致前后判断不一致。
保留推理信息的设置改变了这一点。后续请求能够延续前一次调用形成的推理状态,使模型把计算预算用于新观察和新决策,而不是重复恢复旧结论。
这里需要区分“保留推理状态”和“要求模型输出完整思维过程”。工程上需要的是可延续的内部状态或服务端推理条目,而不是把冗长的隐式推理全部展示给应用程序。后者既会增加上下文体积,也可能带来安全和可维护性问题。
自动压缩:控制长任务的上下文成本
状态保留解决了重复推导,但长轨迹仍会持续积累内容。几十轮之后,上下文中可能混杂:
- 已经失效的早期假设;
- 重复出现的环境描述;
- 大量低价值动作记录;
- 当前决策真正需要的规则和目标。
启用压缩后,系统可以在上下文接近阈值时,把冗长历史整理为更紧凑的表示。它的价值不只是减少 token。更短、更聚焦的上下文还能降低噪声,让模型更容易找到当前步骤需要的信息。
压缩也不是无损操作。如果摘要遗漏了位置、计数、失败条件或尚未验证的假设,后续动作可能建立在错误状态上。因此,适合压缩的是叙述性历史和重复观察;目标、约束、关键变量与未决问题则应保留为结构化状态。
可以这样实践:构造支持状态延续与压缩的调用循环
来源摘要没有给出具体 SDK 字段名,下面是一个可运行、便于改造的 Python 示例。示例默认只打印请求,不访问网络;其中 retain_reasoning 和 compaction 是说明性字段,接入实际 API 时,需要替换为服务商文档中的准确参数。
将以下内容保存为 agent_loop.py,直接运行即可查看三轮请求如何关联:
import json
import os
import urllib.request
API_URL = os.getenv("MODEL_API_URL")
API_KEY = os.getenv("MODEL_API_KEY")
def call_model(observation, previous_response_id=None):
payload = {
"model": "gpt-5.6",
"input": {
"observation": observation,
"instruction": "Infer the current rule and return the next action."
},
# Illustrative names: replace them with the actual API fields.
"retain_reasoning": True,
"compaction": {"mode": "auto"}
}
if previous_response_id:
payload["previous_response_id"] = previous_response_id
if not API_URL:
print(json.dumps(payload, indent=2, ensure_ascii=False))
return {"id": f"dry-run-{observation['step']}"}
request = urllib.request.Request(
API_URL,
data=json.dumps(payload).encode("utf-8"),
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
},
method="POST"
)
with urllib.request.urlopen(request, timeout=60) as response:
return json.load(response)
def main():
observations = [
{"step": 1, "state": "Agent is left of a red block"},
{"step": 2, "state": "Moving right failed; position unchanged"},
{"step": 3, "state": "The cell above is empty"}
]
previous_response_id = None
for observation in observations:
result = call_model(observation, previous_response_id)
previous_response_id = result["id"]
if __name__ == "__main__":
main()
运行命令:
python agent_loop.py
接入真实服务时,可以这样提供地址和密钥:
export MODEL_API_URL="https://api.example.com/v1/responses"
export MODEL_API_KEY="replace-with-your-key"
python agent_loop.py
生产实现还应把任务事实与请求链标识分开保存。previous_response_id 用于延续服务端状态;当前坐标、剩余步数、已确认规则等关键事实则应保存在应用自己的状态对象中。这样即使请求链失效、超时或需要切换模型,任务也能恢复。
评测时不要只比较最终分数
“三倍得分”很醒目,但无法单独说明改进来自哪里。验证这两个设置时,建议至少记录以下指标:
| 指标 | 要回答的问题 |
|---|---|
| 任务得分 | 设置是否真的提高了解题能力? |
| 成功率 | 提升是否集中在少数高分轨迹? |
| 平均请求次数 | 模型是否用更少步骤完成任务? |
| 输入与输出 token | 压缩是否降低了上下文成本? |
| 单任务延迟 | 状态管理是否引入额外等待? |
| 压缩发生次数 | 哪些轨迹依赖压缩才能继续? |
| 状态恢复失败率 | 请求链中断后能否可靠恢复? |
可以使用四组对照实验隔离变量:全部关闭、仅保留推理、仅启用压缩、两者同时开启。每组应使用相同任务、相同随机性配置和相同最大步数。否则,分数差异可能来自采样波动或执行预算变化,而不是设置本身。
上线前的边界与检查项
这两个设置更适合多轮、长轨迹、需要持续修正规则的任务。对于一次性分类、短文本抽取等请求,保留状态和压缩可能只会增加系统复杂度。
采用前应确认:
- API 是否真的跨请求保留推理状态,以及状态保存多久;
- 压缩由什么阈值触发,是否能观察到触发事件;
- 数据保留策略是否符合隐私和合规要求;
- 请求重试后是否会重复动作或创建分叉状态;
- 关键任务事实是否独立存储,而不是完全依赖模型上下文;
- 成本、延迟和得分是否在同一批实验中测量。
ARC-AGI-3 上的提升说明,模型评测不能只盯着提示词和模型版本。对于持续行动的智能体,推理状态如何传递、历史如何压缩,会直接影响模型能够使用多少有效计算。把这两项能力纳入调用层设计,往往比继续堆叠历史消息更有效,但它们仍需要通过对照实验、状态审计和故障恢复测试来验证。