1. 首页
  2. 精选文章
  3. 从Text-in-Text-out到Object-in-Object-out:LLM Agent工具调用的范式转变

从Text-in-Text-out到Object-in-Object-out:LLM Agent工具调用的范式转变

  • 发布于 2026-03-13
  • 12 次阅读

CaveAgent:一个面向工程落地的有状态Agent运行时框架

  • 论文地址:https://arxiv.org/abs/2601.01569
  • 项目地址:https://github.com/acodercat/cave-agent
  • 安装:pip install 'cave-agent[all]'

这项由香港科技大学(HKUST)主导的研究,为我们展示了一种"Code as Action, State as Memory"的全新可能性。当LLM不再局限于生成文本,而是能够直接操作和持久化Python运行时中的原生对象时,Agent的工程化落地将进入一个新阶段。


研究动机

当前所有主流Agent框架都遵循同一个交互范式:Text-in-Text-out——LLM只能接收文本、输出文本,所有数据必须经过序列化/反序列化。这带来一个核心工程问题:外部系统无法直接将Python对象(DataFrame、模型、数据库连接)交给Agent操作,Agent的产出也无法作为原生对象直接对接下游应用(数据可视化、Agentic UI、数据库写入)。 中间永远隔着一层文本解析和对象重建。

CaveAgent提出了有状态运行时管理(Stateful Runtime Management),将Agent的交互范式扩展为 (Text & Object)-in-(Text & Object)-out——通过变量注入与检索机制,让LLM直接操作运行时中的原生Python对象,并将结果作为原生对象输出给下游系统。


亮点

  • CaveAgent将持久化Python运行时提升为Agent的主工作空间,LLM退化为轻量控制器,实现了从"以文本上下文为中心"到"以运行时为中心"的架构反转。
  • 通过变量注入(Injection)和检索(Retrieval),外部系统可以将任意Python对象直接推入Agent运行时,Agent处理后取回的依然是带有完整类型和方法的原生对象——直接对接可视化、数据库等下游流水线,零文本解析。
  • 提出运行时中介的多Agent协作:多个Agent共享同一个Python运行时,通过对象引用实现零开销状态同步,替代传统的文本消息传递。
  • 扩展了Agent Skills开放标准(Claude Code、Gemini CLI、Cursor通用),新增 injection.py模块,激活技能时将函数、变量、类型直接注入运行时命名空间。
  • 运行时状态的确定性可检查性,为可验证评估和RLVR(Reinforcement Learning with Verifiable Rewards)提供了程序化奖励信号生成的结构性基础。
  • 内置基于AST的静态安全分析(ImportRule / FunctionRule / AttributeRule / RegexRule),生产环境可叠加容器或微虚拟机实现多层防御。
  • Tau²-bench上12个设置中11个胜出(最高+13.5%),多轮交互token减少28.4%,数据密集型任务token减少59%。

核心方法

双流架构

fig-framework.png

CaveAgent采用语义流 + 运行时流的双流架构。语义流中LLM负责推理和代码生成;运行时流是一个持久的IPython内核,承载数据存储、状态管理和代码执行。语义流生成代码,运行时流执行并更新状态,执行结果经过截断和格式化后反馈回语义流引导下一步决策。

变量注入与检索:Object-in-Object-out的核心机制

注入:外部系统将DataFrame、模型、数据库连接等任意Python对象直接推入运行时全局命名空间。LLM获得的是轻量元数据描述(变量名、类型、docstring),实际数据驻留在运行时内存中,不消耗context token。

runtime = PythonRuntime(
    variables=[
        Variable("df", stock_dataframe, "5年的股票行情数据"),
        Variable("model", trained_xgboost, "已训练的XGBoost模型"),
    ],
    functions=[Function(get_market_cap)],
)
agent = CaveAgent(model, runtime=runtime)

LLM生成代码时直接通过变量名引用这些对象,新创建的变量自动持久化,后续轮次直接引用无需重新序列化。

检索:Agent执行完毕后,取回原生Python对象,保留完整类型信息和方法接口:

result_df = runtime.retrieve("high_vol")     # pandas.DataFrame
preds = runtime.retrieve("predictions")       # numpy.ndarray

这些对象可直接送进可视化渲染、写入数据库、传递给另一个Agent——不需要任何解析或重建。

与CodeAct等代码Agent的关键区别在于运行时的开放性:CodeAct的变量只能通过 print()输出为文本,CaveAgent将运行时开放为双向接口。

Agent Skills:从文本指令到运行时注入

CaveAgent扩展了Agent Skills开放标准,在 SKILL.md旁增加 injection.py。激活技能时,函数、变量、类型定义直接注入运行时命名空间——技能从"LLM读说明书"变成"运行时里多了一组可直接调用的工具"。采用渐进式加载,启动仅约100 token元数据开销。

安全机制

LLM生成的代码在执行前经过基于AST的静态分析,四类可配置规则拦截危险操作。违规不中断交互,而是返回结构化错误引导LLM自我修正。AST分析提供应用层安全策略,生产环境可叠加容器(Docker + gVisor)或微虚拟机(Firecracker)实现系统级隔离。


下游应用场景

数据分析与可视化

fig-geospatial.png

用户在地图上画两个区域查询人口密度差异。GeoJSON多边形直接注入运行时作为Python变量,LLM生成一个代码块引用几何体执行区域统计,一轮完成。JSON范式下至少需要五个LLM轮次,且面临坐标截断和精度损失。CaveAgent在数据查询任务上以123K token达到100%准确率,JSON方案和CodeAct均在80%处溢出失败。

可验证评估与RLVR

运行时状态确定性可检查,可以像写单元测试一样验证Agent行为:

order = runtime.retrieve("target_order")
assert order.status == "cancelled"
assert order.refund_amount == order.total_price

直接对Python对象做程序化断言,为强化学习提供细粒度奖励信号,无需人工标注。

多Agent协作

fig-automl.png

提出运行时中介的状态流,三种模式:元Agent控制(子Agent作为对象注入编排器运行时)、类型化交接(retrieve + inject传递原生对象)、共享运行时同步(多Agent操作同一运行时,修改即时可见)。以AutoML训练循环演示:数据以原生对象形式在Agent间流动,全类型保真,每步可程序化验证。

共享运行时示例:城镇模拟

fig-town-simulation.png

多个Agent共享同一个Python Runtime。编排器执行 town.weather = "storm_warning",所有Agent通过对象引用立刻感知。新实体动态注入后即时可交互。全程零消息传递,零序列化。


总结

CaveAgent的核心范式转变:将LLM的交互模式从Text-in-Text-out扩展为(Text & Object)-in-(Text & Object)-out。通过变量注入与检索,LLM可以直接操作原生Python对象并将结果作为原生对象输出给下游系统,解决了Agent在处理真实数据、对接下游应用、嵌入工程流水线时的结构性瓶颈。

📄 论文: https://arxiv.org/abs/2601.01569 💻 GitHub: https://github.com/acodercat/cave-agent

如果这个方向对你有帮助,欢迎在GitHub上给个 ⭐ 支持。