Composio’s SWE agent advances open-source on SweBench with a 48.6% score using LangGraph and LangSmith

Composio 的 SWE Agent 借助 LangGraph 和 LangSmith 在 SweBench 上取得 48.6% 的评分,推进开源进程

6 分钟阅读

我们很高兴推出 SWE-Kit,这是一款开源的无头 IDE,配备用于 AI Agent 的 AI 原生编码工具包,作为 Composio Agent 工具生态系统的一部分。SWE-Kit 提供无头 IDE,其特点是用于代码智能的语言服务器协议 (LSP) 和用于安全代码执行的开发容器。它还具有全面的编码工具,如代码分析、Shell 工具、文件管理和 Git 工具。

为了展示 SWE-Kit 的效率,我们使用 LangGraph 构建了一个完整的 SWE Agent,并在 SWE Bench 上对其进行了测试。

该基准测试评估了编码 Agent 在真实世界软件工程任务中的有效性。它包含来自流行的 Python 库(如 Django、SymPy、Flask、Scikit-learn 等)的 2294 个 GitHub issue。

验证赛道包含由软件工程师审查的人工验证的 500 个问题子集。我们的 Agent 解决了 243 个 issue,准确率达到 48.60%,总体排名第四,开源类别排名第二。

SWE Agent 架构

使用 LangGraph 构建作为状态机的 Agent

管理 Agent 状态是构建可靠的 Agent 工作流程的关键组成部分。为了超越基本架构,我们采用了基于图的方法,使用 LangGraph 将 Agent 建模为状态机,以实现高效且透明的状态管理。

我们没有依赖路由器或编排器 Agent 来处理通信(这些方法难以有效控制或管理隐藏状态),而是将我们的工作流程扁平化为状态图,其中每个 Agent 都是一个状态机。这种方法为编排 Agent 交互和无缝控制隐藏状态提供了结构化且稳健的解决方案。

使用 LangSmith 进行监控

Agent 自动化的另一个关键方面是监控,由于 Agent 的非确定性特性,监控变得尤为重要。监控可以实现对底层 Agent 操作的细粒度可见性,让您了解正在发生的事情。因此,我们采用了 LangSmith,它提供对 Agent 执行的操作的全面日志记录,从而提供全面的上下文。此外,它与 LangGraph 高度兼容。我们使用它来监控 Agent 在解决 issue 的每个步骤中采取的操作,这随后帮助我们改进了工具。

专家型 Agent 与通用型 Agent

我们的方法使用具有不同工具集的专用 Agent,每个 Agent 专注于特定的任务

  • 软件工程 Agent:负责任务委派、工作流程启动和终止。
  • 代码分析器 Agent:分析代码库以收集关于类、方法和函数的见解。
  • 编辑器 Agent:管理代码库内的导航和文件修改。

这种专业化通过允许每个 Agent 专注于明确定义的任务来提高性能。

工作流程分析

LangGraph 工作流程由三个独立的 Agent 和工具节点组成。每个 Agent 都有预定义的任务和工具,它可以根据当前工作流程利用这些任务和工具。

工作流程节点和转换

  1. 软件工程师节点:
    1. 该 Agent 启动工作流程,并根据其当前状态和消息历史记录确定后续操作。
    2. 如果软件工程师节点确定需要分析,它将转换到代码分析器。如果需要文件编辑,它将转换到编辑器
    3. 根据任务的不同,Agent 可以使用 SWE 工具生成存储库树以更好地理解代码库,并创建补丁文件作为解决方案的一部分。
    4. 当工作流程到达此节点时,代码分析器 Agent 使用代码分析工具执行代码分析任务。完成分析后,它可能
      • 如果分析完成,则返回到软件工程师
      • 如果需要文件编辑,则转换到编辑器
      • 如果需要更多分析,则使用 continue 以保持在代码分析器状态内。
    5. 使用 CodeAnalysis 工具生成完全限定域名 (FQDN) 代码映射,从而能够精确识别和定位项目中的代码。
  2. 代码分析器节点:
    1. 当工作流程到达此节点时,代码分析器 Agent 使用代码分析工具执行代码分析任务。完成分析后,它可能
      • 如果分析完成,则返回到软件工程师
      • 如果需要文件编辑,则转换到编辑器
      • 如果需要更多分析,则使用 continue 以保持在代码分析器状态内。
    2. 使用 CodeAnalysis 工具生成完全限定域名 (FQDN) 代码映射,从而能够精确识别和定位项目中的代码。在代码分析中,FQDN(完全限定域名)是一个唯一的标识符,通过追溯代码元素在代码库中的完整路径来表示特定的代码元素,例如类、方法或函数。在此处了解更多信息:此处
  3. 编辑器节点:
    1. 编辑器 Agent 负责编辑文件。编辑完成后,Agent 可以
      • 如果编辑任务完成,则转换回软件工程师
      • 如果需要更多编辑操作,则在编辑器内继续。
    2. 使用 代码编辑工具 来创建存储库树、导航代码库以及打开和编辑文件。
  4. 工具节点:
  • 代码分析器工具节点:由代码分析器 Agent 用于执行详细的代码分析。
  • 代码编辑器工具节点:由编辑器 Agent 用于文件编辑任务。
  • SWE 工具节点:包含软件工程师 Agent 可以访问的软件工程相关工具。

多 Agent LangGraph 系统中的状态管理

构建复杂的多 Agent 系统时,有效的状态管理对于可靠性和可预测性至关重要。LangGraph 架构实现了一个复杂的状态管理系统,该系统避免了隐藏状态的缺陷,同时保持了清晰的 Agent 边界和转换。

核心 Agent 状态

class AgentState(TypedDict):
    messages: Annotated[Sequence[BaseMessage], operator.add]
    sender: str  
    consecutive_visits: dict

状态对象维护三个关键信息

  • 保留对话上下文的消息历史记录
  • 跟踪 Agent 所有权的当前发送者身份
  • 跟踪重复访问以防止意外循环的访问计数。

状态转换控制

LangGraph 的状态管理允许 Agent 之间进行受控且可预测的转换。每个 Agent 的后续操作由基于其当前状态和消息历史记录的条件逻辑确定,确保 Agent 仅参与相关的任务。

# Router examines message content to determine next state
def router(state):
    messages = state["messages"]
    last_ai_message = get_last_ai_message(messages)

    # Explicit state transitions based on message markers
    if "ANALYZE CODE" in last_ai_message.content:
        return "analyze_code"
    if "EDIT FILE" in last_ai_message.content:
        return "edit_file"
    if "PATCH COMPLETED" in last_ai_message.content:
        return "__end__"

在上面的路由代码块中,router 函数使用最后一条 AI 消息中的特定标记来控制状态转换

  • “ANALYZE CODE”:切换到 analyze_code 状态以进行分析任务。
  • “EDIT FILE”:移动到 edit_file 状态以进行文件编辑。
  • “PATCH COMPLETED”:通过转换到 __end__ 状态来结束工作流程。

此逻辑确保 Agent 仅执行相关操作,从而保持工作流程高效且可预测。

Agent 状态边界

LangGraph 确保每个 Agent 都在明确定义的边界内运行,这意味着他们的操作完全由他们的状态和消息历史记录决定。

# Software Engineer state transitions
workflow.add_conditional_edges(
    software_engineer_name,
    router,
    {
        "continue": software_engineer_name,
        "analyze_code": code_analyzer_name,
        "edit_file": editor_name,
        "__end__": END,
    }
)
# Code Analyzer state transitions
workflow.add_conditional_edges(
    code_analyzer_name,
    code_analyzer_router,
    {
        "continue": code_analyzer_name,
        "done": software_engineer_name,
        "edit_file": editor_name,
    }
)

上面的代码为每个 Agent 定义了特定的状态转换,确保它们在定义的边界内运行

  • 软件工程师 Agent 根据 router 函数中设置的条件进行转换,允许它继续执行其任务、切换到代码分析、启动文件编辑或结束工作流程。
  • 代码分析器 Agent 遵循 code_analyzer_router 中的条件,使其能够继续分析、将控制权返回给软件工程师,或转换到编辑器进行文件修改。

这种设置确保了清晰的任务委派,没有重叠,通过自包含的状态和转换实现模块化,并通过控制状态转换实现可预测性,从而防止意外的副作用。

赋能开发者构建真实世界的 Agent

SWE-Kit 背后的一个动机是让开发者可以方便地构建他们自己的闭环 Agent。该平台的模块化设计使开发者可以混合和匹配工具、框架和 LLM,以创建适合其工作流程的自定义 Agent。

我们的愿景超越了软件工程,扩展到各种真实世界的应用,包括 CRM、HRM 和管理。通过使 Agent 驱动的自动化变得可靠且易于访问,我们的目标是装备开发者构建能够改变跨行业工作流程的智能 Agent。