清华团队开源 · PyTorch风格API · 多Agent多Session协作框架
一、OpenRath是什么?
OpenRath是一个类PyTorch风格的多Agent多Session运行时框架,由清华团队开发。
简单说:它让你用写PyTorch神经网络的方式,来构建复杂的AI Agent系统。
为什么需要OpenRath?
想象一下,你要管理一个AI团队:
- Agent A负责搜索信息
- Agent B负责分析数据
- Agent C负责生成报告
- 它们需要共享上下文、分工协作、并行工作
传统方式就像让一群人用对讲机乱成一团,OpenRath则给了你一套清晰的组织架构。
核心理念:多Agent × 多Session
大多数Agent框架是”单Agent单Session”(像ChatGPT对话)。OpenRath支持:
| 模式 | 说明 | 场景 |
|---|
|——|——|——|
| 单Agent单Session | 普通聊天 | 简单问答 |
|---|---|---|
| 多Agent单Session | 多个Agent协作 | 团队协作 |
| 单Agent多Session | 一个Agent处理多个任务 | 批量处理 |
| 多Agent多Session | 多个Agent处理多个任务 | 复杂业务系统 |
二、PyTorch类比:秒懂核心概念
OpenRath最大的特点是用PyTorch的思维方式设计Agent系统:
| PyTorch概念 | OpenRath对应 | 作用 |
|---|
|————-|————-|——|
Tensor(张量) |
Session(会话) | 承载所有状态数据 |
|---|---|---|
nn.Linear(线性层) |
Agent(智能体) | 处理输入,产出输出 |
nn.Module(模块) |
Workflow(工作流) | 组合多个Agent |
Function(函数) |
Tool(工具) | Agent可调用的能力 |
Device(设备) |
Sandbox(沙箱) | 工具执行的环境 |
| 控制流 | Selector(选择器) | LLM驱动的动态路由 |
| 持久化状态 | Memory(记忆) | Agent的长期记忆 |
一句话理解:
- Session = 流动的数据(像Tensor)
- Agent = 处理数据的层(像nn.Linear)
- Workflow = 组合层的网络(像nn.Module)
三、快速开始
3.1 安装
`bash
# 基础安装
pip install openrath
# 带可选依赖
pip install “openrath[opensandbox]” # 云端沙箱
pip install “openrath[openviking]” # 记忆后端
`
3.2 最小示例:Hello Agent
`python
from rath import Agent, Session, Workflow
# 创建一个Agent(像定义一个神经网络层)
agent = Agent(
name=”helper”,
prompt=”你是一个有用的助手,请简洁回答问题。”
)
# 创建一个Session(像创建一个Tensor)
session = Session()
session.add_user_message(“你好,请介绍一下自己”)
# 运行Agent(像前向传播)
result = agent.forward(session)
# 查看结果
print(result.last_message())
`
3.3 带工具的Agent
`python
from rath import Agent, Tool, Session
# 定义一个工具(像定义一个函数)
@Tool(
name=”search”,
description=”搜索网络信息”,
parameters={
“query”: {“type”: “string”, “description”: “搜索关键词”}
}
)
def search(query: str) -> str:
# 这里调用实际的搜索API
return f”搜索结果:关于'{query}’的信息…”
# 创建Agent并绑定工具
agent = Agent(
name=”researcher”,
prompt=”你是一个研究员,使用搜索工具查找信息。”,
tools=[search]
)
session = Session()
session.add_user_message(“帮我搜索一下Python最新版本”)
result = agent.forward(session)
print(result.last_message())
`
四、核心组件详解
4.1 Session:会话状态
Session是OpenRath的核心,就像PyTorch的Tensor。
`python
from rath import Session
# 创建Session
session = Session()
# 添加消息
session.add_system_message(“你是一个Python专家”)
session.add_user_message(“解释一下装饰器”)
session.add_assistant_message(“装饰器是…”)
session.add_tool_result(“search”, “搜索结果…”)
# Session操作(像Tensor操作)
forked = session.fork() # 分支(创建副本)
merged = session.merge(other) # 合并两个Session
compressed = session.compress() # 压缩(减少token)
detached = session.detach() # 断开(独立副本)
`
Session的魔力:
- 分支:一个Session可以分成多个分支,每个分支独立发展
- 合并:多个Session可以合并,综合结果
- 追踪:每个Session都有血缘关系,可以追溯来源
4.2 Agent:智能体
Agent是处理Session的”层”,像nn.Linear:
`python
from rath import Agent
# 基础Agent
agent = Agent(
name=”summarizer”,
prompt=”请将以下内容总结成3个要点。”
)
# 带记忆的Agent
agent = Agent(
name=”assistant”,
prompt=”你是一个有用的助手。”,
memory=my_memory, # 绑定长期记忆
tools=[search, calculator] # 绑定工具
)
# 前向传播(处理Session)
output_session = agent.forward(input_session)
`
Agent特点:
- 轻量:一个Agent只做一件事
- 可复用:同一个Agent可以用在不同Workflow中
- 可组合:多个Agent可以串联或并联
4.3 Workflow:工作流
Workflow是组合Agent的容器,像nn.Module:
`python
from rath import Workflow, Agent
# 定义Agent
researcher = Agent(name=”researcher”, prompt=”搜索信息…”)
analyzer = Agent(name=”analyzer”, prompt=”分析数据…”)
writer = Agent(name=”writer”, prompt=”撰写报告…”)
# 组合成Workflow
class ReportWorkflow(Workflow):
def __init__(self):
self.researcher = researcher
self.analyzer = analyzer
self.writer = writer
def forward(self, session):
# 1. 搜索
session = self.researcher.forward(session)
# 2. 分析
session = self.analyzer.forward(session)
# 3. 写报告
session = self.writer.forward(session)
return session
# 使用Workflow
workflow = ReportWorkflow()
result = workflow.forward(initial_session)
`
4.4 Tool:工具
Tool是Agent可以调用的函数:
`python
from rath import Tool
# 定义工具
@Tool(
name=”calculator”,
description=”计算数学表达式”,
parameters={
“expression”: {“type”: “string”, “description”: “数学表达式”}
}
)
def calculator(expression: str) -> str:
try:
result = eval(expression)
return str(result)
except Exception as e:
return f”计算错误: {e}”
# 工具会自动注册到Agent
agent = Agent(
name=”math_helper”,
prompt=”你是一个数学助手,使用calculator工具计算。”,
tools=[calculator]
)
`
4.5 Sandbox:沙箱
Sandbox是工具执行的环境:
`python
from rath import Sandbox
# 本地沙箱(默认)
local_sandbox = Sandbox(type=”local”)
# 云端沙箱(需要opensandbox)
cloud_sandbox = Sandbox(type=”opensandbox”, config={…})
# 工具在沙箱中执行
@Tool(sandbox=cloud_sandbox)
def run_code(code: str) -> str:
# 代码在云端安全执行
…
`
4.6 Memory:记忆
Memory是Agent的长期记忆:
`python
from rath import Memory
# 创建记忆
memory = Memory(type=”local”) # 或 “openviking” 云端
# Agent使用记忆
agent = Agent(
name=”assistant”,
prompt=”你是一个助手。”,
memory=memory
)
# 记忆会自动:
# – recall:在需要时回忆过去的信息
# – commit:在对话后保存新的信息
`
4.7 Selector:选择器
Selector是LLM驱动的动态路由:
`python
from rath import Selector, Workflow
# 定义多个Workflow
coding_workflow = Workflow(name=”coding”, …)
research_workflow = Workflow(name=”research”, …)
writing_workflow = Workflow(name=”writing”, …)
# 创建Selector(让LLM决定走哪条路)
selector = Selector(
name=”task_router”,
prompt=”根据用户任务类型,选择合适的工作流:”,
options=[coding_workflow, research_workflow, writing_workflow]
)
# 运行时,LLM会自动选择最合适的Workflow
result = selector.forward(session)
`
五、实战案例
5.1 案例1:智能客服系统
`python
from rath import Agent, Workflow, Tool, Session
# 定义工具
@Tool(name=”query_order”, description=”查询订单状态”)
def query_order(order_id: str) -> str:
# 查询数据库
return f”订单{order_id}状态:已发货”
@Tool(name=”refund”, description=”申请退款”)
def refund(order_id: str, reason: str) -> str:
# 处理退款
return f”订单{order_id}退款申请已提交”
# 定义Agent
classifier = Agent(
name=”classifier”,
prompt=”判断用户问题类型:订单查询、退款申请、其他”
)
order_agent = Agent(
name=”order_agent”,
prompt=”处理订单相关问题”,
tools=[query_order]
)
refund_agent = Agent(
name=”refund_agent”,
prompt=”处理退款相关问题”,
tools=[refund]
)
# 定义Workflow
class CustomerServiceWorkflow(Workflow):
def forward(self, session):
# 1. 分类
session = classifier.forward(session)
category = session.get_metadata(“category”)
# 2. 路由到对应Agent
if category == “订单查询”:
return order_agent.forward(session)
elif category == “退款申请”:
return refund_agent.forward(session)
else:
return session.add_assistant_message(“抱歉,我无法处理这个问题。”)
# 使用
workflow = CustomerServiceWorkflow()
session = Session()
session.add_user_message(“我的订单12345到哪了?”)
result = workflow.forward(session)
print(result.last_message())
`
5.2 案例2:研究助手(多Agent协作)
`python
from rath import Agent, Workflow, Session
# 定义专业Agent
searcher = Agent(name=”searcher”, prompt=”搜索相关文献和资料”)
reader = Agent(name=”reader”, prompt=”阅读和理解文档内容”)
summarizer = Agent(name=”summarizer”, prompt=”总结关键发现”)
critic = Agent(name=”critic”, prompt=”批判性分析和提出问题”)
# 定义研究Workflow
class ResearchWorkflow(Workflow):
def forward(self, session, topic):
# 1. 搜索资料
session.add_user_message(f”搜索关于{topic}的资料”)
session = searcher.forward(session)
# 2. 并行阅读多个文档
sessions = []
for doc in session.get_documents():
doc_session = session.fork()
doc_session.add_user_message(f”阅读这篇文档:{doc}”)
sessions.append(reader.forward(doc_session))
# 3. 合并阅读结果
merged = Session.merge(sessions)
# 4. 总结
merged.add_user_message(“总结所有发现”)
summary = summarizer.forward(merged)
# 5. 批判性分析
summary.add_user_message(“分析这些发现的局限性和问题”)
final = critic.forward(summary)
return final
# 使用
workflow = ResearchWorkflow()
result = workflow.forward(Session(), “大语言模型的最新进展”)
print(result.last_message())
`
5.3 案例3:代码生成与测试
`python
from rath import Agent, Workflow, Tool, Session
@Tool(name=”run_python”, description=”运行Python代码”)
def run_python(code: str) -> str:
# 在沙箱中安全执行
import subprocess
result = subprocess.run([“python3”, “-c”, code],
capture_output=True, text=True)
return result.stdout if result.returncode == 0 else result.stderr
@Tool(name=”write_file”, description=”写入文件”)
def write_file(path: str, content: str) -> str:
with open(path, ‘w’) as f:
f.write(content)
return f”文件{path}已写入”
# 定义Agent
coder = Agent(
name=”coder”,
prompt=”根据需求编写Python代码”,
tools=[run_python, write_file]
)
tester = Agent(
name=”tester”,
prompt=”编写测试用例并运行测试”,
tools=[run_python]
)
debugger = Agent(
name=”debugger”,
prompt=”分析测试失败原因并修复代码”,
tools=[run_python, write_file]
)
# 定义Workflow
class CodeGenerationWorkflow(Workflow):
def forward(self, session, requirement):
# 1. 生成代码
session.add_user_message(f”需求:{requirement}”)
session = coder.forward(session)
# 2. 测试
session.add_user_message(“为这段代码编写测试”)
session = tester.forward(session)
# 3. 如果测试失败,调试修复
if “FAIL” in session.last_message():
session.add_user_message(“测试失败,请修复代码”)
session = debugger.forward(session)
return session
# 使用
workflow = CodeGenerationWorkflow()
result = workflow.forward(Session(), “实现一个快速排序算法”)
print(result.last_message())
`
六、高级特性
6.1 Session分支与合并
`python
# 分支:一个任务分成多个子任务
main_session = Session()
main_session.add_user_message(“分析这个产品的优缺点”)
# 分支1:分析优点
pros_session = main_session.fork()
pros_session.add_user_message(“只分析优点”)
# 分支2:分析缺点
cons_session = main_session.fork()
cons_session.add_user_message(“只分析缺点”)
# 并行处理
pros_result = pros_agent.forward(pros_session)
cons_result = cons_agent.forward(cons_session)
# 合并结果
final = Session.merge([pros_result, cons_result])
`
6.2 Agent记忆系统
`python
from rath import Agent, Memory
# 创建长期记忆
memory = Memory(type=”local”, path=”./agent_memory”)
# Agent使用记忆
agent = Agent(
name=”personal_assistant”,
prompt=”你是一个个人助手,记住用户的偏好。”,
memory=memory
)
# 第一次对话
session1 = Session()
session1.add_user_message(“我喜欢Python,不喜欢Java”)
agent.forward(session1)
# 第二次对话(Agent会记得之前的偏好)
session2 = Session()
session2.add_user_message(“推荐一个编程语言”)
result = agent.forward(session2)
# Agent会推荐Python,因为它记得你的偏好
`
6.3 动态路由(Selector)
`python
from rath import Selector, Workflow
# 定义不同场景的Workflow
coding_wf = Workflow(name=”coding”, …)
research_wf = Workflow(name=”research”, …)
chat_wf = Workflow(name=”chat”, …)
# Selector让LLM决定走哪条路
router = Selector(
name=”smart_router”,
prompt=”根据用户输入的类型,选择最合适的工作流。”,
options=[coding_wf, research_wf, chat_wf]
)
# 运行时自动路由
session = Session()
session.add_user_message(“帮我写一个Python脚本”)
result = router.forward(session) # LLM会选择coding_wf
`
七、OpenRath vs 其他框架
| 特性 | OpenRath | LangChain | AutoGPT | CrewAI |
|---|
|——|———-|———–|———|——–|
| 设计风格 | PyTorch风格 | 链式调用 | 自主Agent | 角色扮演 |
|---|---|---|---|---|
| Session管理 | ✅ 分支/合并 | ❌ 单Session | ❌ 单Session | ❌ 单Session |
| 多Agent协作 | ✅ 原生支持 | ⚠️ 需要额外配置 | ⚠️ 有限 | ✅ 角色协作 |
| 记忆系统 | ✅ 内置 | ⚠️ 需要集成 | ⚠️ 有限 | ⚠️ 有限 |
| 工具沙箱 | ✅ 内置 | ❌ 无 | ❌ 无 | ❌ 无 |
| 动态路由 | ✅ Selector | ⚠️ 需要自定义 | ❌ 无 | ❌ 无 |
| 学习曲线 | 中等 | 低 | 高 | 低 |
| 适合场景 | 复杂业务系统 | 快速原型 | 自主任务 | 团队协作 |
OpenRath的优势:
- Session分支/合并:唯一支持复杂Session管理的框架
- PyTorch风格:对AI开发者非常友好
- 工具沙箱:内置安全执行环境
- 动态路由:LLM驱动的智能路由
八、最佳实践
8.1 设计原则
- 一个Agent只做一件事
`python
# ❌ 错误:一个Agent做太多事
agent = Agent(prompt=”搜索、分析、总结、写报告”)
# ✅ 正确:拆分成多个专注的Agent
searcher = Agent(prompt=”搜索信息”)
analyzer = Agent(prompt=”分析数据”)
summarizer = Agent(prompt=”总结要点”)
writer = Agent(prompt=”撰写报告”)
`
- 用Session分支处理并行任务
`python
# ✅ 并行处理多个文档
for doc in documents:
forked = session.fork()
forked.add_user_message(f”处理文档:{doc}”)
results.append(agent.forward(forked))
`
- 用Memory避免重复工作
`python
# ✅ Agent记住已经处理过的内容
agent = Agent(prompt=”…”, memory=memory)
`
8.2 性能优化
- 压缩长Session
`python
# 当Session太长时,压缩历史
if session.token_count > 4000:
session = session.compress(keep_recent=10)
`
- 并行执行独立Agent
`python
import asyncio
# 并行执行多个Agent
async def parallel_agents(session, agents):
tasks = [agent.forward_async(session) for agent in agents]
return await asyncio.gather(*tasks)
`
- 缓存重复查询
`python
# 使用Memory缓存常见问题的答案
if memory.has_cache(question):
return memory.get_cache(question)
`
8.3 调试技巧
- 查看Session血缘
`python
# 追踪Session是怎么来的
print(session.lineage())
# 输出:root -> fork_1 -> agent_1 -> merge_1
`
- 记录Agent调用
`python
# 开启详细日志
import logging
logging.getLogger(“rath”).setLevel(logging.DEBUG)
`
- 可视化Workflow
`python
# 生成Workflow的可视化图
workflow.visualize(“workflow.png”)
`
九、常见问题
Q1: OpenRath和LangChain有什么区别?
A: LangChain是链式调用,适合快速原型。OpenRath是PyTorch风格,适合复杂业务系统,特别是需要Session分支/合并的场景。
Q2: OpenRath支持哪些LLM?
A: 支持所有兼容OpenAI API的模型,包括:
- OpenAI GPT-4/3.5
- Claude
- 本地模型(Ollama、vLLM等)
- 国产模型(通义千问、文心一言等)
Q3: 如何处理长文本?
A: 使用Session的压缩功能:
`python
session = session.compress(
strategy=”sliding_window”,
max_tokens=4000,
keep_recent=10
)
`
Q4: 如何部署到生产环境?
A: OpenRath支持:
- Docker容器化部署
- Kubernetes集群部署
- 云端沙箱(OpenSandbox)
十、资源链接
- GitHub: https://github.com/Rath-Team/OpenRath
- 官方文档: https://docs.openrath.com
- PyPI: https://pypi.org/project/openrath
- 示例代码: https://github.com/Rath-Team/OpenRath/tree/main/example
十一、总结
OpenRath是一个面向复杂业务场景的多Agent框架,它的PyTorch风格设计让AI开发者感到亲切。
核心优势:
- Session分支/合并:唯一支持复杂Session管理
- PyTorch风格:学习曲线平缓
- 工具沙箱:安全执行环境
- 动态路由:智能任务分配
适合场景:
- 需要多Agent协作的复杂系统
- 需要并行处理多个任务
- 需要长期记忆的Agent应用
- 需要动态路由的智能系统
不适合场景:
- 简单的聊天机器人
- 快速原型验证
- 单Agent单Session应用
💡 一句话总结:如果你想用写PyTorch的方式来构建AI Agent系统,OpenRath是你的最佳选择。
发表回复