带不走的会话:推理API正在剥夺你的对话所有权

推理API最初的承诺非常简单:发送输入,接收输出。如果你两者都保留了,那你就已经有了对话。你可以检查它、归档、重放,或者给别的型号。
这种抽象从来都不完全正确。例如:提示缓存实时更新在别人的GPU上,不同型号的分词方式不同,采样不可复现(而且是有意为之)。但是语义记录以文字记录形式存在的会话仍可能属于用户。
转录稿应包含说明、信息、工具调用和工具结果。另一个足够强大的模型可能不会完全一样,但它能理解发生了什么并接管。
推理API令人沮丧地在某种程度上逐渐远离了这一特性。它们越来越多地返回文本和提供者绑定状态混合的信号,这种状态非常刻意地不适合携带。
- 这些推理令牌向用户计费,但只以不透明的加密块形式返回,充其量只有无用的摘要
- 模型看到的源材料而客户端从未见过的网页搜索
- 只有原始提供者能够解密的压缩上下文
- 子代理的指令和消息以加密载荷的形式隐藏在运行代理的应用程序之外
- 文件、矢量存储、容器和缓存引用,这些引用在其他地方无法解析。
- 响应和对话状态完全由存储在提供商服务器上的ID键控
每个功能都有一个简单的理由,服务商很容易提出,同时也有合理的理由说明这对用户有利。所有这些因素共同改变了人工智能会话的所有权现实:你机器上的文字记录不再是你的会话,而是部分会话视图,其运行状态属于推理提供者而非你。
我们并不支持这种方向,想谈谈它对你作为用户意味着什么,对我们这些在这个领域开发工具的人意味着什么。
会话所有权的实用测试
我们所说的可移植会话并不意味着从一个模型切换到另一个模型时必须产生相同的下一个令牌。这是必然的,因为模型有不同的能力、训练过的个性、上下文窗口以及与工具的协作方式。
而且,这本来就相当非确定性。便携性意味着更为谦逊的含义:
const transcript = session.export();
revokeCredentials(oldProvider);
session = newProvider.continueFrom(transcript);
档案应包含足够可理解的信息,供其他模型继续工作。它不应要求旧提供者取消引用ID、解密blob、记住搜索结果或重建摘要。
这给出了五个有用的检验方法:
- 检查:用户能看到模型看到了什么,工具做了什么,以及代理之间互相告诉了什么吗?
- 导出:会话是自成体系的吗?除了普通的伪造物也可以下载吗?
- 回放:另一个实现能否重建一个语义等价的上下文?
- 审计:人类能解释系统为何事后采取行动吗?
- 删除:用户能否识别并删除会话所依赖的所有服务器端副本?
响应ID不是转录(因为数据存储在服务器上),密文不是用户控制的(因为用户无法解密),引用列表也不是通过搜索结果放置在模型上下文中的证据(因为通常无法获取与模型相同的数据)。
加密是为谁而设?
围绕这些功能的命名和营销可能具有误导性。encrypted_content听起来像是用户控制的隐私功能。通常这是一个客户无法读取、只有服务提供者能打开的胶囊。
提供者选择密钥,解密其自身模型的内容,并定义数据可重放的位置。
更好的说法是提供者密封状态.
提供者封存确实有隐私方面的好处。例如,OpenAI 可以通过以下方式返回加密推理给客户端store: false然后在下一次请求中解密,不保持中间状态。
这比要求服务器端的对话存储要好,尤其是对于零数据保留客户来说。但请记住,实际上并没有什么东西需要加密!
这种加密不会对推理提供商隐藏数据,但会对你隐藏数据。
存储的对话将文字记录转化为指针
OpenAI 的 Responses API 默认存储响应。其文档中说,响应对象默认至少保留30天。store: false可用且应被使用,因为它更像完成任务:数据不存储在OpenAI的服务器上。
新的Gemini Interactions API也做出了类似的选择。它默认为store: true.付费套餐的互动保留55天,免费套餐保留一天。
显然,将状态存储在服务器上的想法非常有吸引力:
const first = responses.create({
model: "frontier-model",
input: "Investigate this production failure",
store: true,
});
const second = responses.create({
model: "frontier-model",
previousResponseId: first.id,
input: "Now implement the fix",
store: true,
});
应用程序发送的数据更少,提供者可以保留隐藏的推理和工具状态,缓存路由也变得更简单。但如果本地应用只记录用户消息和最终文本,first.id现在是它不控制的数据库的外钥。
你没理由
所有主要实验室都声称有正当理由不暴露原始思维链。因此,在非开放权重模型中,我们通常看不到这些代币。
原始推理在API中是看不到的。通过存储的响应,可以通过以下方式恢复先前的推理previous_response_id.其中store: false,API 返回encrypted_content客户端必须保留并重放该数据。
持续推理即使如此,依然是不透明的reasoning.context: "all_turns"让后续的样本用它。
人类主义返回加密的完整思维signature田野。当启用可读的思维文本时,是由另一个模型生成的摘要,而不是原始的思维链。思考块必须在工具使用回合中保持不变地传回。
Anthropic的文档还说,思维块与产生它们的模型绑定,切换模型时应当被剥离。因此,这些推理痕迹并不试图在Anthropic中移植。
所有封闭权重模型的情况也相同。
这些加密机制允许连续性里面一个生态系统,但他们不会创建可携带到其他供应商模式的便携式转录本。会话归档可以包含blob,但其他模型不能使用其含义:
{"type": "reasoning", "encrypted_content": "gAAAAAB..."}
{"type": "thinking", "thinking": "", "signature": "EqQBCg..."}
{"type": "thought", "summary": [], "signature": "EpoGCp..."}
隐藏的搜索
服务器端网页搜索是转录记录中隐藏漏洞最明显的例子之一。客户端搜索工具的行为与其他工具类似:
const result = search(query);
record({
query,
retrievedAt: now(),
results: result.map((item) => ({
url: item.url,
title: item.title,
passages: item.passages,
})),
});
model.send({ toolResult: result });
用户可以检查排名和段落,重新获取页面,缓存副本,或将相同的证据提供给其他模型。
在托管搜索中,提供者执行私有工具循环。OpenAI、谷歌和Anthropic只会提供搜索操作、引用,并可选地提供源URL列表,但不包括用于生成答案的完整文本上下文。
URL不是稳定的回放,其内容可能会变化,或者在模型看到之前被简化为更短的片段。
最终的答案可能完全正确。问题是......