A few things about Code Agent

Feb 1, 2024·
夏 伟
夏 伟

记录一些在实践代码大语言模型过程中的经验和思考总结,本篇是关于代码智能体的相关内容,包括代码智能体的关键功能、关键技术方案等。主要来源于公开论文。

背景

最早接触 Agent 的概念是在控制理论中,Agent 是指能够感知、进行决策和执行控制任务的实体。在强化学习范畴中,Agent 有明确的定义:在与环境交互的过程中,Agent 能够进行学习并做出完成指定目标(最大化累积奖励)的决策。在代码领域,我们一般将 Code Agent 定义为能够帮助用户端到端自主完成代码开发任务的实体(或系统),覆盖代码实现、验证和工具调用等环节。在这里我们暂时不对 Agent 的定义或起源做过多解释。

在软件开发行业,业界已经沉淀了许多成熟流程以及开发体系知识,包括不同角色的分工、不同研发阶段的产出规范等。那么,Code Agent 就可以基于这些成熟、特定的工作流,构建具备一定自主决策和执行能力的智能实体(这里强调了从 workflow 提升到自主决策),帮助提升研发效率。

Code Agent arch
Code Agent 的关键模块拆解

分类

从应用的角度上看,Code Agent 可划分为:

  • 通用型编码 Multi-Agent,定义多角色,通过协作的方式实现编码任务,如 Devin、ChatDev 等
  • 特定功能性 Agent,专注于解决代码场景中的特定问题,如生成单测的 UTAgent、代码审查的 Code Review Agent 等

关键模块拆解

  • 中控模块,包含对用户输入进行意图识别,结合上下文进行 reasoning,对复杂问题进行任务分解和执行策略的规划,如 RethinkMCTS 修改上一步生成的 Thought;LATS 结合 MCTS 的思想对代码的多步生成进行规划。中控的载体可以是结构化文本(JSON)或者(伪)代码,比如 CodeAct 等
  • LLM 进行 inference 生成,得到代码或者其他文本。推理的过程中可能会生成思维链过程,如 CoT、ReAct 以及 Reflexion 等;生成的次数上,覆盖一轮到多轮的生成;在多轮的中间,可以引入对当前输入 Prompt 信息的干预,具体如何干预存在于中控模块的能力,如 LATS、RethinkMCTS 等
  • 代码验证评估,一般呈现为调用不同工具,包括语法检查、编译、解释器执行、直接对生成代码进行打分评估,得到多层次反馈信息等;如 Self-Debugging 注入 Debug 信息到上下文进行代码的重新生成;LDB 注入代码的执行 Trace,重新生成代码等
  • 知识库,包括代码库、代码领域知识等,包括本地高质量的检索库,或者网络云端的开放性信息。它们可以通过 RAG 的思路注入到输入 Prompt 中,如 CodeGRAG、EVOR 等;也可以从领域知识中提取当前任务的 Meta 信息给 Prompt,作为上下文信息使用。如瀑布开发流程的节点输入输出标准,产品经理角色输出需求,架构师输出系统设计等
  • 工具集,包括代码的静/动态分析库、解释器执行验证、浏览器用于获取网络信息,以及 RAG 中常用的召回、排序模型等

经典算法及框架

  • CodeAct,使用 Python 语言来表示 Agent 的动作空间,覆盖对 Thought 的反思过程以及多种工具的调用组合,可有效提升任务完成的成功率
  • CodeAgent,定义了使用编码相关工具的固定 workflow,支持网络浏览器的信息检索、代码解释执行反馈、代码测试工具等,通过 ReAct 和工具规划方式,组合这些预定义的工具来解决 repo-level 的代码生成问题
  • Self-Debugging,通过收集生成代码在解释器执行中的反馈信息并进行解释,然后反馈给模型进行反思推理,以提升多轮场景下的代码生成质量和准确度
  • EVOR,构建一个可演化的 pipeline,多步演化用户的 query 以及知识片段的检索,来提升代码生成的质量
  • ChatDev、MetaGPT、CAMEL、AgentCoder 等多智能体框架,基本上都是从研发流程的 workflow 衍生出来。ChatDev 模拟软件开发公司的不同角色,如 CEO、CTO、Programmer,分别进行不同的工种,构建通信和协作机制,进行软件开发;MetaGPT 模拟标准软件开发 SOP 瀑布流,定义 PM、架构师、工程师和 QA 等不同角色来实现复杂的编程任务;CAMEL 同样是定义多角色的多智能体框架,支持动态的 workflow,可解决相对复杂的问题;AgentCoder 定义三种独立的 Agent,协同编码、测试、执行者这三个角色完成代码生成任务

案例拆解

最近的代码助手 Cursor 成功出圈,在业界引发了一股热潮,它的自动补全和交互模式确实很惊艳。但是为更好呈现 Code Agent 的一些流程,我选择开源的 Cline 框架进行一个交互式代码生成的案例展示。Cline 支持 VS Code 插件,安装后,可以在左边启动对话栏,进入对话栏,输入用户任务后,触发一系列交互动作,这些动作可以设置 auto-approve。

  1. 首先进行任务分解与规划,并与用户进行参数确认
  2. 生成代码后,呈现为 Git 形态,并跟用户确认是否保存生成的代码(可以 auto-approve)
  3. 生成所有的文件后,Cline 会询问是否执行安装 Flask 包的命令 pip install flask,用户确认 run command,会拉起 terminal 进行安装
  4. 安装环境后,Cline 询问是否执行 Python 命令,用户可以点击 run command 直接拉起 Flask server
    cline1
    Cline 任务规划与代码生成
    cline2
    Cline 环境安装与命令执行
    cline3
    Cline 启动 Flask Server

用户场景识别

  • 面向程序员,解决专业问题,包括已有大系统的维护迭代开发工作,辅助补全优先,类似 Cursor 的 Tab 功能
  • 面向非开发者,运营产品经理等,进行快速原型开发,如花生开发小猫补光灯,可以从零开始开发原型,甚至商业化产品的工作(包括项目,小至模块)

未来的形态可能仍会是并存,随着自主能力的增强,两者的边界会越来越模糊。

Reference

  1. https://e2b-landing-page.framer.website/ai-agents/coding
  2. https://www.anthropic.com/research/building-effective-agents
  3. Du, K., Chen, J., Rui, R., Chai, H., Fu, L., Xia, W., Wang, Y., Tang, R., Yu, Y. & Zhang, W. (2024). CodeGRAG: Bridging the Gap between Natural Language and Programming Language via Graphical Retrieval Augmented Generation. arXiv preprint arXiv:2405.02355v3.
  4. Qian, C., Liu, W., Liu, H., Chen, N., Dang, Y., Li, J., Yang, C., Chen, W., Su, Y., Cong, X., Xu, J., Li, D., Liu, Z. & Sun, M. (2023). ChatDev: Communicative Agents for Software Development. arXiv preprint arXiv:2307.07924v5.
  5. Hong, S., Zhuge, M., Chen, J., Zheng, X., Cheng, Y., Zhang, C., Wang, J., Wang, Z., Yau, S.K.S., Lin, Z., Zhou, L., Ran, C., Xiao, L., Wu, C. & Schmidhuber, J. (2023). MetaGPT: Meta Programming for A Multi-Agent Collaborative Framework. arXiv preprint arXiv:2308.00352v7.
  6. Li, G., Hammoud, H.A.A.K., Itani, H., Khizbullin, D. & Ghanem, B. (2023). CAMEL: Communicative Agents for "Mind" Exploration of Large Language Model Society. arXiv preprint arXiv:2303.17760v2.
  7. Wang, X., Chen, Y., Yuan, L., Zhang, Y., Li, Y., Peng, H. & Ji, H. (2024). Executable Code Actions Elicit Better LLM Agents. arXiv preprint arXiv:2402.01030v4.
  8. Zhang, K., Li, J., Li, G., Shi, X. & Jin, Z. (2024). CodeAgent: Enhancing Code Generation with Tool-Integrated Agent Systems for Real-World Repo-level Coding Challenges. arXiv preprint arXiv:2401.07339v2.
  9. Li, Q., Xia, W., Du, K., Dai, X., Tang, R., Wang, Y., Yu, Y. & Zhang, W. (2024). RethinkMCTS: Refining Erroneous Thoughts in Monte Carlo Tree Search for Code Generation. arXiv preprint arXiv:2409.09584v1.
  10. Zhong, L., Wang, Z. & Shang, J. (2024). Debug like a Human: A Large Language Model Debugger via Verifying Runtime Execution Step-by-step. arXiv preprint arXiv:2402.16906v6.
  11. Zhou, A., Yan, K., Shlapentokh-Rothman, M., Wang, H. & Wang, Y. (2023). Language Agent Tree Search Unifies Reasoning Acting and Planning in Language Models. arXiv preprint arXiv:2310.04406v3.
  12. Chen, X., Lin, M., Schärli, N. & Zhou, D. (2023). Teaching Large Language Models to Self-Debug. arXiv preprint arXiv:2304.05128v2.
  13. Yang, K., Liu, J., Wu, J., Yang, C., Fung, Y.R., Li, S., Huang, Z., Cao, X., Wang, X., Wang, Y., Ji, H. & Zhai, C. (2024). If LLM Is the Wizard, Then Code Is the Wand: A Survey on How Code Empowers Large Language Models to Serve as Intelligent Agents. arXiv preprint arXiv:2401.00812v2.
  14. Wang, L., Ma, C., Feng, X., Zhang, Z., Yang, H., Zhang, J., Chen, Z., Tang, J., Chen, X., Lin, Y., Zhao, W.X., Wei, Z. & Wen, J. (2023). A Survey on Large Language Model based Autonomous Agents. arXiv preprint arXiv:2308.11432v6.
  15. Su, H., Jiang, S., Lai, Y., Wu, H., Shi, B., Liu, C., Liu, Q. & Yu, T. (2024). EVOR: Evolving Retrieval for Code Generation. arXiv preprint arXiv:2402.12317v2.
  16. Huang, D., Zhang, J.M., Luck, M., Bu, Q., Qing, Y. & Cui, H. (2023). AgentCoder: Multi-Agent-based Code Generation with Iterative Testing and Optimisation. arXiv preprint arXiv:2312.13010v3.