如何构建具有对话状态和压缩功能的长期运行GPT-6 Astra智能体
使用 previous_response_id、对话、显式状态、上下文预算、压缩、检查点和恢复模式,设计持久的 GPT-6 Astra 代理。
| Source: Elser AI

长期运行的智能体不仅仅是拥有庞大对话记录的聊天机器人。它是一个有状态的系统,必须在有限的上下文窗口内保留目标、已完成的工作、工具结果、权限和未解决的决策。GPT-6 Astra 提供了 1,050,000 个令牌的上下文窗口、持久推理支持、对话状态和压缩功能——但架构仍然决定了工作流在数小时或数天后是否仍能保持连贯。
区分四种状态
将每个事件都视为对话文本会使恢复变得困难。保持清晰的层次结构:
- 对话状态: 用户和模型所说的内容。
- 任务状态: 目标、计划、约束条件、已完成步骤以及阻碍因素。
- 世界状态: 记录在数据库、文件、工单及其他外部系统中。
- 执行状态: 工具调用ID、幂等键、审批、重试和检查点。
只有第一层自然属于转录内容。其他三层应有应用自有的表示方式。模型可以帮助更新它们,但不应作为唯一的记录系统。
继续回复的两种方式
最简单的续接机制是 previous_response_id:
// 这是一个示例 TypeScript 代码块
const greeting: string = "你好,世界!";
console.log(greeting);
const first = await client.responses.create({ model: "gpt-6-astra", input: "起草迁移实施计划。" });
const next = await client.responses.create({ model: "gpt-6-astra", previous_response_id: first.id, input: [{ role: "user", content: "从身份验证模块开始。" }] });
这会创建一个响应链。对于会话来说很方便,但这并非计费捷径:OpenAI 文档说明,链中先前的输入令牌会按输入计费。除非使用了 `store: false`,否则响应默认存储 30 天。
对于持久线程,请使用对话API。一个对话可以包含消息、工具调用和工具输出,并且可以在不同会话、设备或任务之间重复使用。对话对象不受30天响应TTL的限制。一个请求不能同时使用`conversation`和`previous_response_id`;请有意识地选择状态模型。
## 在需要之前制定上下文预算
上下文包括输入、输出和推理令牌。不要等到模型达到限制。为下一个工具结果和最终答案预留空间,然后在超过阈值之前进行压缩或修剪。
一个有用的预算可以将百分比分配给:
- 耐用的说明和工具;
- 当前任务摘要;
- 最近的对话详情;
- 检索到的证据;
- 预期的推理和输出;
- 针对异常大的工具结果的紧急余量。
大上下文也会影响定价。GPT-6 Astra 模型页面显示,对于输入超过 272K token 的请求,整个请求将适用更高的费率。这一阈值使得即使远未用尽完整窗口,早期的上下文管理在财务上也变得至关重要。
## 压缩的作用
压缩会减少先前的上下文,同时保留未来轮次所需的信息。OpenAI 提供了一个显式的 `/responses/compact` 端点以及自动上下文管理功能。返回的压缩材料是不透明的:请按照指示将其传递,而不是解析、编辑或将其视为面向用户的摘要。
在语义里程碑处紧凑:
- 在研究综合完成且不再需要进行原始来源探索之后;
- 当代码阶段通过测试后;
- 在用户批准计划后;
- 在开始新的独立阶段之前;
- 当测量的上下文接近您计划的阈值时。
避免每次对话后都进行压缩。这会增加工作量,可能会丢失有用的局部细节,还会改变可复用的提示前缀,从而影响提示缓存的行为。
```ts
// 这是一个示例 TypeScript 代码块
const greeting: string = "你好,世界!";
console.log(greeting);
const compacted = await client.responses.compact({ model: "gpt-6-astra", 累计项目 });
// Persist the returned compacted items and use them as the base for later work.
使用当前SDK参考获取确切类型;测试版和SDK接口可能会演变。持久规则是保持不透明输出不变。
## 检查工作成果,而非仅仅检查文字
生产检查点应记录:
- 用户可见的目标和最新接受的范围;
- 已完成步骤及验证证据;
- 待处理的工具调用和审批状态;
- 外部资源标识符和版本;
- 具有来源的重要决策;
- 响应或对话标识符;
- 单调递增的检查点版本。
假设一个动画工作流已经批准了剧本,生成了角色参考,并开始场景组装。代理应将资产ID、批准信息和场景状态存储在应用程序数据中。像[Elser AI](https://www.elser.ai/)这样的平台是创意资产的自然归宿,但编排层仍需要明确的状态,以便恢复的代理不会重新生成已批准的场景。
## 中断后的恢复
设计为至少一次执行。连接可能在工具执行后、客户端收到结果前断开。每个改变状态的工具都应接受幂等键或支持先读后写检查。恢复时:
1. 加载最新提交的检查点;
2. 检查不确定操作的外部状态;
3. 通过调用或幂等ID协调工具结果;
4. 从压缩状态及近期事件中重建上下文;
5. 要求模型从明确的待办工作继续。
切勿在模型崩溃后仅说“继续”而未附带结构化状态。它可能会重复执行动作或推断错误的里程碑。
## 保持压缩与业务内存分离
压缩是为模型优化的上下文。业务记忆是应用程序的持久化、可检查记录。维护一个简洁的人类可读任务账本,同时保留不透明的压缩项。该账本使操作员能够审计决策、迁移模型,并在响应链不可用时进行恢复。
一个好的账本应包含事实,而非说服性的文字。例如:“客户于14:32 UTC批准了计划v7”比“客户似乎对计划感到满意”更有力。对于从工具中提取的主张,应存储其来源ID。
## 长时间运行的质量控制
测试超越最终答案的准确性。衡量:
- 20、50和100回合后的目标保留率;
- 注入断开连接后出现重复副作用;
- 压缩后正确恢复;
- 工具结果来源;
- 授权持久性与过期;
- 每个里程碑的成本;
- 任务账本与外部状态之间的漂移。
包含对抗性测试,例如旧消息与新指令冲突、工具返回巨大负载、或代理暂停时审批过期。长期运行的可靠性主要在于状态转换。
## 常见问题解答
### 应该使用“对话”还是`previous_response_id`?
使用 `previous_response_id` 进行直接的响应链式连接。当需要跨会话或任务重复使用持久化对象时,请使用对话。它们不能在同一请求中同时提供。
### 百万级令牌窗口能否消除压缩?
不。成本、延迟、相关性和已记录的长上下文定价阈值都使得在达到硬性限制之前,上下文管理变得有用。
### 我可以编辑压缩后的内容吗?
将压缩项视为不透明。请单独保留您自己的可编辑任务台账。
### `store: false` 改变了什么?
它会禁用响应的默认存储。您的应用程序随后必须显式携带所需的状态,并满足自身的保留和恢复要求。
## 结论
持久化GPT-6 Astra智能体融合了API管理的对话连续性以及应用拥有的任务和执行状态。有选择地链接或持久化响应,在上下文变得昂贵之前预算把控,在里程碑处压缩,保留不透明的压缩项,并确保每次外部操作都可恢复。由此产生的智能体能够安全地恢复工作——而不仅仅是记住一次冗长的对话。






























































































