CodeAct Agent 框架概览


CodeAct Agent 是 OpenHands 的核心组件之一,其设计理念在于将所有 LLM 代理的行为统一归纳到一个「代码」操作空间中,从而实现更简洁、高效的执行方式。受 CodeAct 概念(参考论文与相关推文)的启发,该代理能够在与人类进行自然对话的同时,直接执行代码操作,从而在任务处理上既实现了自然语言交流,又兼顾了直接代码执行的能力。

在每轮交互中,该代理可选择以下两种主要模式之一:

  1. 对话模式
    代理可与用户进行自然语言交流,用以询问澄清问题、进行确认或请求更多细节,帮助更好地理解任务需求或解决不明确之处。
  2. 代码执行模式
    代理根据任务需求,直接通过执行代码来完成相应操作,具体包括:
    • 运行任何合法的 Linux bash 命令;
    • 通过模拟 IPython 的交互式 Python 解释器(实际上通过 bash 命令来模拟)运行有效的 Python 代码。

总之,CodeAct Agent 使代理可以将语言指令「转化」为具体代码操作,从而在同一个系统中统一管理对话与代码执行。


内置工具与功能

为了实现上述双重能力,CodeAct Agent 集成了多个内置工具,每个工具承担特定任务:

  • execute_bash
    该工具用于运行 Linux bash 命令,具备处理长时间运行命令的能力(自动后台运行并重定向输出),支持交互式进程(通过 STDIN 输入),并能在出现超时情况时自动重试。
  • execute_ipython_cell
    该工具允许代理在 IPython 环境中执行 Python 代码,支持如 %pip 等魔法命令,同时管理环境中的变量作用域。通过这种方式,代理能够模拟一个交互式 Python 终端来完成任务。
  • web_read 与 browser
    • web_read 可获取网页内容并将其转换为 Markdown 格式。
    • browser 则使代理能够通过 Python 代码与网页进行交互,实现网页导航、点击、表单填写、滚动操作,甚至支持文件上传和拖拽操作。
  • str_replace_editor 与 edit_file (基于 LLM)
    文件编辑提供两种方式:
    • str_replace_editor 通过字符串替换方式进行文件查看与编辑,支持行号显示与精确匹配,还具备撤销功能。
    • edit_file 利用 LLM 生成内容来进行文件编辑,支持限定行范围进行部分编辑,并能够高效处理大文件。

此外,代理还提供多种配置选项,允许用户根据需要启用或禁用浏览器交互、IPython 执行或基于 LLM 的文件编辑功能,从而实现灵活定制。


专用微代理

CodeAct Agent 进一步通过专用微代理扩展了其能力,这些微代理针对特定的常见任务进行了定制,例如:

  • npm 微代理
    用于处理 npm 包的安装问题,并提供针对非交互式 shell 的解决方案。
  • github 微代理
    用于管理 GitHub 操作,支持 API token,并提供拉取请求(PR)创建的相关指导。
  • flarglebargle 微代理
    用作彩蛋响应处理器,通常用于测试或特殊功能展示。

这些微代理将特定的领域功能封装在独立模块中,使整个框架更具模块化,便于后续扩展。


如何运作——CodeActAgent 实现细节

CodeActAgent 的实际实现见于其 Python 源码,以下几点为关键内容:

  1. 初始化与配置
    • CodeActAgent 类继承自通用 Agent 类。
    • 在初始化过程中,代理设置了内部数据结构(如存储待执行动作的 deque),同时创建了提示管理器(PromptManager)和对话内存(ConversationMemory)的实例。
    • 通过调用专用函数(来自 function_calling 模块),代理根据当前配置(例如是否启用浏览器或 Jupyter 支持)获取可用工具列表,并将这些工具存储在内部供后续使用。
  2. 对话处理与步骤执行
    • 代理的核心工作由 step 方法驱动,该方法在每个循环内负责汇总交互历史、构建对话上下文,并请求 LLM 给出下一步操作建议。
    • 方法首先检查是否存在待处理的动作;若无,则根据最新的用户消息(例如检测到退出命令)作出相应处理。
    • 代理利用 Condenser 对交互历史进行「压缩」,以整理出简洁的事件视图;在某些情况下,压缩过程可能产生一个特殊的动作(Condensation action),代理会立即返回该动作,待控制器重新调度后再继续。
    • 经过对话内存的处理后,构建出结构化消息历史,再将这些消息、工具列表等参数传递给 LLM,通过函数调用接口获得响应。
  3. 函数调用与动作解析
    • 构造好的对话消息经过格式化后传递给 LLM 接口,LLM 返回的响应将通过 response_to_actions 函数转换为具体动作。
    • 这些动作可能涉及执行 bash 命令、运行 IPython 代码或继续进行对话等操作,并将其放置于待执行动作队列中。
  4. 消息增强与缓存机制
    • 代理在发送消息给 LLM 之前,会对消息进行增强。例如,为首条用户消息添加示例或上下文;同时在连续用户消息之间插入必要的新行以保证清晰区分。
    • 对于一些 LLM 提供商,代理还会使用缓存机制,以减少重复构建提示所带来的开销。

主代理能力(文档说明)

根据附加的代理文档说明:

  • CodeActAgent 专门设计用于将自然语言交互与代码执行有效整合在一起;
  • 其双重功能得到了充分展示,例如在数据科学任务中应用(如利用 gpt-4-turbo-2024-04-09 执行线性回归操作);
  • 代理不仅可以进行开放式对话,还能通过执行具体代码来完成任务。

总的来说,CodeActAgent 展现了其作为一个精简而强大的代理的设计理念:在一个统一的框架内平衡对话交流与代码执行。通过内置各种工具、灵活的微代理模块以及可靠的对话管理机制,该代理为用户提供了将人类语言指令转化为具体编程操作的有效解决方案。


发表评论

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 知差(chai)网 🐾 DeepracticeX 社区 🐾 老薛主机 🐾 智柴论坛 🐾