【免费下载链接】OpenRath
An open-source, PyTorch-like runtime for dynamic multi-agent and multi-session workflows.
📌OpenRath是一个开源的、PyTorch 风格的多智能体运行时,其flow.Compressor组件专为上下文压缩而生:它把越来越长的会话记录交给 LLM 总结成一段精简摘要,在不丢失关键事实的前提下,让后续对话保持低成本、可追踪。本文带你从零理解 OpenRath 的上下文压缩机制,并掌握最佳实践。
为什么多智能体会话会"上下文爆炸"?
在使用 Agent 构建应用时,几乎所有开发者都遇到过同一个问题:对话轮次一多,上下文窗口就被撑爆——要么报错、要么响应变慢、要么费用飙升。
OpenRath 的解法源于它对会话(Session)的独特设计:上下文不再是一坨反复复制的消息字符串,而是一张按时间顺序排列的ChunkTable(块表),每一行都有明确的角色类型:
| 块类型 | 说明 |
|---|---|
system | Agent 的系统提示 |
user | 用户消息 |
assistant | 模型回复(可含工具调用) |
tool_result | 工具执行结果 |
轮次越多,块表越长,每次请求都要把整张表发给模型——这就是"上下文爆炸"的根源。
OpenRath 的 Session 是可流动的结构化状态,支持 fork(分叉)、detach(脱离)、merge(合并)、loop(循环)与compress(压缩)等操作,压缩只是 Session 生命周期中的标准一环。
Compressor 是什么:一个可组合的 Workflow
在 OpenRath 中,Compressor是一个标准的 Workflow,源码非常简洁:
compressor = flow.Compressor( "把目前对话总结成一条简洁的助手消息,保留关键事实,去掉冗余", provider, ) session = compressor.forward(session)它接收两个核心参数:
- 压缩指令(
compress_instruction):告诉模型"怎么压",比如保留哪些关键信息; - Provider:执行压缩的 LLM 提供方。
和Agent一样,Compressor的输入输出都是Session,因此可以无缝嵌进任何工作流里,与 Agent、工具、子工作流自由嵌套:
官方 README.md 中的最小工作流就展示了 Agent + Compressor 的经典组合:Agent 负责处理任务,Compressor 负责在返回前把上下文"瘦身"。
三步上手:运行最简压缩示例
项目内置了官方示例 example/08_compress.py,核心逻辑只有三步:
# 1. 用 Agent 产生一段较长的对话 session = agent(Session.from_user_message("……").to("local")) # 2. 用 Compressor 压缩 session = compressor.forward(session) # 3. 对比压缩前后的块数量 print(len(session.chunk_table.rows))运行前只需配置一个 OpenAI 兼容的 API Key(见 example/_shared/provider.py),然后执行:
python example/08_compress.py你会直观地看到压缩前后的 chunk 数量对比——几十行块表被折叠成一行摘要。
压缩内部如何工作?
Compressor底层调用的是 run_session_compress 函数,一次 LLM 调用完成压缩。它有几个值得新手了解的设计细节:
1. 无损血缘(Lineage)记录压缩是有损操作(lossy),但 OpenRath 不会让你"压完就忘"。返回的新 Session 会带上完整的血缘元数据——父会话 ID、操作符(run_session_compress)、压缩标记——你随时可以回溯"这段摘要来自哪次对话"。
2. 安全兜底,拒绝截断摘要摘要会整体替换原有转录,如果模型输出因 token 上限被截断(finish_reason='length'),OpenRath 会直接抛出RuntimeError拒绝该摘要,而不是悄悄丢失历史尾部——这是一个非常贴心的防坑设计(src/rath/session/compress.py)。
3. 沙箱与工具隔离
- 压缩请求会显式禁用工具(
tool_choice="none"),防止模型"跑偏"去调工具; - 若原 Session 绑定了 Sandbox(执行环境),新 Session 会共享同一沙箱引用,执行上下文不丢失。
4. 可选持久化通过persist=True或指定persist_path,压缩结果会写入.openrath/sessions/<session.id>.jsonl,方便审计与恢复。
压缩指令怎么写?
compress_instruction决定了摘要的质量。不传时,OpenRath 使用内置默认指令(src/rath/session/compress.py),其要点是:
将上方转录压缩成更短的叙事,保留事实、用户目标和未完成任务,只输出纯文本。
实际项目中建议按业务场景定制指令,例如:
- 结构化输出:要求输出 JSON,包含
summary(摘要)与guards(必须原样保留的关键字串),测试用例 tests/integration/test_session_compress_real.py 就用这种"摘要 + 守卫字面量"的方式验证关键信息不丢失; - 面向下游:明确告诉模型"这是给下游 LLM 看的上下文",让摘要语言风格更适合再次作为提示输入。
💡经验法则:指令里写清楚"保留什么、丢弃什么、输出什么格式",压缩质量就有保障。
与 Token 预算护栏搭配使用
压缩是"治本",预算护栏是"治标",两者配合效果最佳:
- 压缩前:在
Provider上设置budget_total_tokens指定会话累计 token 上限,超限后触发on_budget_exceeded回调(src/rath/llm/provider.py); - 回调中:可以选择记录告警,或抛出 BudgetExceededError 主动中止循环,为下一次压缩争取时机;
- 压缩后:新 Session 的
cumulative_usage会重新累计,长任务可以"边聊边压",把上下文稳定控制在窗口之内。
相关测试见 tests/session/test_token_budget.py。
小结
OpenRath 把"上下文压缩"做成了会话生命周期中的一等公民:
- ✅
flow.Compressor一行接入,可自由组合进任意工作流; - ✅ 压缩全程有血缘记录,摘要可追溯、可审计;
- ✅ 拒绝截断摘要、禁用工具调用,细节安全兜底;
- ✅ 与 Token 预算护栏、沙箱共享、JSONL 持久化无缝配合。
长会话不再是负担,压缩得当的多智能体系统才能跑得久、算得省。🚀
延伸阅读
- 官方示例:example/08_compress.py
- Compressor 实现:src/rath/flow/compressor.py
- 压缩核心逻辑:src/rath/session/compress.py
- 块表与角色类型:src/rath/session/chunk.py
- 预算护栏:src/rath/llm/budget.py
【免费下载链接】OpenRath
An open-source, PyTorch-like runtime for dynamic multi-agent and multi-session workflows.
相关推荐
ComfyUI-LTXVideo 完整上手指南:10 分钟跑通 LTX-2 AI 视频生成
ComfyUI LTXVideo 完整上手指南:10 分钟跑通 LTX 2 AI 视频生成 把深度图和边缘图塞进同一个控制 LoRA(给模型叠加特定能力的轻量微
人工智能大模型媒体生成视频AuC上下文管理揭秘:两级压缩与Token预算控制如何防止AI大模型「上下文爆炸」
AuC上下文管理揭秘:两级压缩与Token预算控制如何防止AI大模型「上下文爆炸」 AuC(Agents ufy Core)是一个基于 Python 与 asy
使用 LongLLMLingua 压缩检索上下文:AutoRAG Passage Compressor 节点实战指南
使用 LongLLMLingua 压缩检索上下文:AutoRAG Passage Compressor 节点实战指南 AutoRAG 的 Long LLM Li
人工智能AI AgentRAGMCP 服务工具调用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考