LangGraph 实战:搭建智能研发多 Agent 协作系统(含 CI/CD 集成)

关键词:LangGraph, 多 Agent 协作, 智能研发, Agent 编排, CI/CD 集成, LLM, 工具调用

摘要:本文将以**“开发一款 Python Flask 后端 + React 前端的简易 todo 管理系统”**这个真实且完整的研发全流程为载体,一步一步分析推理思考如何从零开始搭建一套基于 LangGraph 的智能研发多 Agent 协作系统。从核心概念的“小学生故事式”讲解,到研发全流程 Agent 的角色划分、逻辑编排,再到工具集成(代码生成、Git/GitHub/GitLab、Docker、Kubernetes、CI/CD平台)、系统的 Python 源代码实现、CI/CD 流水线配置、最佳实践 tips,最后还会讨论这套系统的行业应用场景、未来发展趋势与挑战,让读者既能看懂,又能直接上手落地!全文约 9800 字。


1. 背景介绍

1.1 目的和范围

1.1.1 目的

在当今快节奏的软件开发行业,**“需求→设计→编码→测试→部署→运维”**的全流程不仅耗时耗力,还经常因为开发人员之间、开发人员与产品经理/测试人员之间的沟通成本、返工成本、重复劳动成本等问题拖慢项目进度。

而大语言模型(LLM)的出现,让我们看到了自动化软件开发全流程的可能性——但单个 LLM 往往存在能力边界:它可能只会写前端 React 组件,不会写 Python 后端接口;可能只会写代码,不会用 Git 提交、不会用 CI/CD 平台部署;可能只会部署静态页面,不会处理 K8s 集群的滚动更新;甚至可能因为一次逻辑分支处理错误就“卡壳”,无法自主修复问题、自主调用工具解决。

LangGraph 就是解决这个问题的“神器”!它允许我们把不同能力的“智能体(Agent)像搭积木一样组合起来,像写代码一样精确控制它们之间的通信、协作、状态流转、条件分支、循环迭代、错误处理**,从而构建出一套端到端的、自主可控的、有记忆的、可调试的智能系统!

本文的核心目的就是:

  1. 用通俗易懂的方式,让小学生都能听懂LangGraph 的核心概念、原理和架构;
  2. 开发 Python Flask + React todo 管理系统为真实案例,手把手教读者一步一步分析推理思考如何设计研发全流程的多 Agent 角色、如何用 LangGraph 编排它们的逻辑、如何集成各种常用的研发工具(GitHub Actions CI/CD、Docker、Git、Docker Hub、Kubernetes(可选本地 Minikube))、如何实现代码生成、测试、部署的自动化;
  3. 提供完整的、可直接运行的 Python 源代码GitHub Actions CI/CD 配置文件Docker Compose 本地测试环境配置文件
  4. 总结这套系统的最佳实践 tips行业应用场景未来发展趋势与挑战
1.1.2 范围

本文的范围限定在:

  1. 核心技术栈:LangChain 0.2.x 版本、LangGraph 0.2.x 版本、OpenAI GPT-4o Mini(或者任何兼容 OpenAI API 接口的 LLM(如国内的通义千问 4、文心一言 4.0、Claude 3.5 Sonnet)、Python 3.10+、React 18+、Flask 3.x、GitHub Actions CI/CD、Docker、Docker Compose、Minikube(可选)、Git。
  2. 研发全流程:需求分析与拆解、技术方案设计、前后端代码生成、代码静态检查、单元测试编写与集成测试、代码格式化、Git 提交与 Pull Request(PR)、CI/CD 自动构建与测试、Docker 镜像构建与推送、本地 Docker Compose 本地部署测试、(可选)Minikube K8s 集群滚动更新部署、问题自主修复与迭代。
  3. 不包含的内容:生产级别的安全加固(如 API Key 的存储、Agent 的权限控制、生产 K8s 集群的生产配置、复杂系统的性能优化、复杂业务逻辑的代码生成与测试。

1.2 预期读者

本文的预期读者分为以下几类:

  1. 技术小白/入门级程序员:想要了解 LangGraph 和多 Agent 协作系统的核心概念和原理,想要学习如何用 LangChain 和 LangGraph 搭建简单的智能系统;
  2. 中级/高级后端/全栈程序员:想要了解如何将 LLM 集成到自己的研发流程中,想要学习如何用 LangGraph 搭建端到端的智能研发多 Agent 协作系统;
  3. DevOps 工程师:想要了解如何将 LLM 集成到自己的 CI/CD 流水线中,想要学习如何用 LangGraph 自动化部分 DevOps 流程;
  4. 技术架构师:想要了解多 Agent 协作系统的架构设计,想要学习如何将 LangGraph 应用到自己的业务场景中;
  5. 产品经理/项目经理:想要了解 LLM 能为软件开发全流程自动化能带来什么价值,想要学习如何评估和使用多 Agent 协作系统。

1.3 文档结构概述

本文的文档结构按照**“背景介绍→核心概念与联系→核心算法原理与架构→数学模型(可选简化)→项目实战(开发环境搭建→系统功能设计→系统架构设计→系统接口设计→系统核心实现源代码→最佳实践 tips→CI/CD 集成配置→本地测试与运行→可选 Minikube 部署测试)→实际应用场景→工具和资源推荐→行业发展与未来趋势→总结→思考题→附录:常见问题与解答→扩展阅读 & 参考资料**的顺序展开,每个部分都用通俗易懂的语言,像给小学生讲故事一样,清晰透彻地讲解,同时提供完整的、可直接运行的代码和配置文件。


1.4 术语表

1.4.1 核心术语定义
  1. 大语言模型(LLM): 就像一个超级聪明的“百科全书式的小助手,它读过几乎所有的互联网公开内容(包括书籍、论文、代码、博客等),可以回答各种问题、生成各种文本(包括代码、文章、邮件、脚本等)、理解人类的自然语言、进行逻辑推理、翻译语言等。
  2. 智能体(Agent): 就像一个有自己的“大脑”(LLM)、“眼睛”(感知能力)、“手脚”(工具调用能力)、“记忆”(状态存储能力)、“目标”(任务执行能力)的“小机器人”,它可以自主地感知环境、理解目标、调用工具、执行任务、存储和使用记忆、和其他智能体协作。
  3. LangChain: 就像一个智能体的“工具箱”,它提供了各种封装好的组件(如 LLM 调用接口、工具调用接口、记忆存储接口、Chain 链式调用接口、Document Loader 文档加载接口、Text Splitter 文本分割接口、Vector Store 向量存储接口等),帮助我们快速搭建简单的智能体和链式调用系统。
  4. LangGraph: 就像一个智能体的“积木搭建师”,它是 LangChain 的升级版/补充版,专门用于构建复杂的、有状态的、可调试的、自主可控的多 Agent 协作系统**,它允许我们像画流程图一样(或者说像写代码分支、循环、条件判断的代码一样)精确控制智能体之间的通信、协作、状态流转、错误处理等。
  5. 状态(State): 就像一个**“共享的笔记本**,所有参与协作的智能体都可以在上面“读”和“写”,用来存储任务的进展、收集到的信息、生成的内容、调用工具的结果、错误信息等,让智能体之间可以通过这个“共享的笔记本”进行协作。
  6. 节点(Node): 就像一个**“智能体/任务/操作**,是 LangGraph 流程图中的基本单元,每个节点都可以执行一个特定的动作(比如调用 LLM、调用工具、修改状态、判断下一步应该跳转到哪个节点等)。
  7. 边(Edge): 就像一个**“箭头”**,连接两个节点,指定从一个节点跳转到另一个节点的条件和规则(比如无条件跳转、有条件跳转、循环跳转等)。
  8. 起点(Start Node): 就像一个**“比赛的起跑线**,是 LangGraph 流程图的第一个节点,任务从这里开始执行。
  9. 终点(End Node): 就像一个**“比赛的终点线”**,是 LangGraph 流程图的最后一个节点,任务完成后在这里结束执行。
  10. 条件边(Conditional Edge): 就像一个**“十字路口的红绿灯”**,根据当前的状态(比如某个字段的值)来决定下一步跳转到哪个节点。
  11. 循环(Loop): 就像一个**“绕操场跑圈”**,根据当前的状态(比如某个任务是否完成、某个错误是否修复)来决定是否重新执行某个节点或某个子流程。
1.4.2 相关概念解释
  1. Chain 链式调用系统: 就像一个**“流水线”**,任务按照固定的顺序一个接一个地执行,没有状态(或者说只有非常简单的状态),没有条件分支,没有循环迭代,没有错误处理,能力有限,适合简单的任务。
  2. 多 Agent 协作系统: 就像一个**“团队”**,每个智能体都有自己的特长和分工,它们可以通过“共享的笔记本”进行协作,有状态,有条件分支,有循环迭代,有错误处理,能力强大,适合复杂的任务。
  3. 工具调用(Tool Calling): 就像一个**“小机器人使用它的工具”**,智能体可以根据自己的需要,自主地调用外部的工具(比如计算器、搜索引擎、代码编辑器、Git、GitHub、Docker、Kubernetes、CI/CD平台等)来完成自己的任务。
  4. 记忆(Memory): 就像一个**“小机器人的大脑里的记忆”**,智能体可以存储和使用自己的记忆(比如之前的对话历史、之前的任务执行历史、之前调用工具的结果等),还可以存储和使用团队共享的记忆(也就是 LangGraph 中的“共享的笔记本”)。
  5. 可调试性(Debuggability): 就像一个**“小机器人的工作过程可以被录像回放”**,我们可以看到 LangGraph 流程图中每个节点的执行顺序、每个节点的输入输出、每个节点的状态变化等,方便我们调试和优化系统。
  6. 自主可控性(Controllability): 就像一个**“小机器人的工作过程可以被我们精确控制”**,我们可以像写代码分支、循环、条件判断的代码一样)精确控制智能体之间的通信、协作、状态流转、错误处理等,不会让智能体“失控”。
1.4.3 缩略词列表
缩略词 全称 中文翻译
LLM Large Language Model 大语言模型
Agent Agent 智能体
LangChain LangChain LangChain(开源框架)
LangGraph LangGraph LangGraph(开源框架)
State State 状态
Node Node 节点
Edge Edge
Start Node Start Node 起点节点
End Node End Node 终点节点
Conditional Edge Conditional Edge 条件边
Loop Loop 循环
CI/CD Continuous Integration/Continuous Deployment 持续集成/持续部署
PR Pull Request 拉取请求
Docker Docker Docker(容器化技术)
K8s Kubernetes Kubernetes(容器编排技术)
Minikube Minikube Minikube(本地 Kubernetes 集群)
GitHub Actions GitHub Actions GitHub Actions(GitHub 官方 CI/CD 平台)
React React React(前端框架)
Flask Flask Flask(后端框架)
API Application Programming Interface 应用程序编程接口
OpenAI API OpenAI Application Programming Interface OpenAI 应用程序编程接口

2. 核心概念与联系

2.1 故事引入

想象一下,你是一家小型创业公司的老板,你今天接到了一个客户的需求:“开发一款 Python Flask 后端 + React 前端的简易 todo 管理系统,功能包括:用户注册、用户登录、添加 todo、删除 todo、修改 todo、查看 todo 列表、标记 todo 为已完成/未完成”。

但是,你公司的程序员小王只会写前端 React 组件程序员小李只会写 Python 后端接口程序员小张只会做 DevOps(Git、Docker、Kubernetes、CI/CD)产品经理小赵今天请假了测试工程师小钱今天也请假了

这时候,你怎么办?

别急!你可以用LangGraph来搭建一套智能研发多 Agent 协作系统!你可以把这个任务交给这套系统,让系统里的多个“智能体小机器人”代替小王、小李、小张、小赵、小钱来完成所有的工作!

这套系统里的“智能体小机器人”分工如下:

  1. 产品经理 Agent(Product Manager Agent):代替小赵,负责分析和拆解客户的需求,生成需求文档和功能列表
  2. 架构师 Agent(Architect Agent):代替你自己(或者你的技术架构师),负责根据需求文档和功能列表,设计技术方案,生成技术架构图、数据库设计文档、接口设计文档
  3. 前端开发 Agent(Frontend Developer Agent):代替小王,负责根据技术方案、接口设计文档,生成前端 React 代码、代码静态检查、单元测试编写、代码格式化
  4. 后端开发 Agent(Backend Developer Agent):代替小李,负责根据技术方案、数据库设计文档、接口设计文档,生成后端 Flask 代码、代码静态检查、单元测试编写、代码格式化
  5. 测试工程师 Agent(Test Engineer Agent):代替小钱,负责根据前端和后端的代码,生成集成测试代码、运行集成测试、修复集成测试的错误
  6. DevOps Agent(DevOps Engineer Agent):代替小张,负责代码提交到 GitHub/GitLab、创建 PR、触发 GitHub Actions CI/CD 流水线、构建 Docker 镜像、推送 Docker 镜像到 Docker Hub、(可选)部署到 Minikube K8s 集群
  7. 负责人 Agent(Supervisor Agent):代替你自己,负责协调所有其他 Agent 的工作,检查每个 Agent 的工作成果,决定下一步应该跳转到哪个 Agent,处理错误和异常情况,决定是否需要重新执行某个 Agent 的工作,决定任务是否完成

这些“智能体小机器人”可以通过一个**“共享的笔记本(State)”**进行协作:每个 Agent 都会把自己的工作成果写到这个“共享的笔记本”里,下一个 Agent 就可以从这个“共享的笔记本”里读取上一个 Agent 的工作成果,然后继续自己的工作;如果某个 Agent 出错了,负责人 Agent 就可以从这个“共享的笔记本”里读取错误信息,然后决定下一步应该跳转到哪个 Agent(比如修复错误的 Agent,或者重新执行上一个 Agent)。

这样,你只需要把客户的需求告诉这套系统,然后去喝一杯咖啡,等你回来的时候,一套完整的、经过测试的、部署好的 todo 管理系统就已经完成了!是不是很神奇?


2.2 核心概念解释(像给小学生讲故事一样)

2.2.1 核心概念一:什么是 LangGraph?

LangGraph 就像一个**“超级智能的团队协作指挥中心”,它是 LangChain 团队在 2024 年初推出的一个开源框架,专门用于构建复杂的、有状态的、可调试的、自主可控的多 Agent 协作系统**。

之前的 LangChain 主要是用来构建**“流水线式的链式调用系统(Chain)”,就像一个“只有一条路,没有分支,没有回头路,没有暂停键,没有记忆”**的流水线,任务按照固定的顺序一个接一个地执行,能力有限,适合简单的任务(比如“翻译一篇文章→总结这篇文章→生成这篇文章的摘要”)。

而 LangGraph 就不一样了,它允许我们像画流程图一样(或者说像写代码分支、循环、条件判断的代码一样),精确控制智能体之间的通信、协作、状态流转、条件分支、循环迭代、错误处理、暂停/恢复等,能力强大,适合复杂的任务(比如我们刚才讲的“开发一款 Python Flask 后端 + React 前端的简易 todo 管理系统”)。

2.2.2 核心概念二:什么是状态(State)?

状态(State)就像一个**“团队所有成员共享的大笔记本”**,所有参与协作的智能体(Agent)都可以在上面“读”和“写”:

  • “读”:读取之前的任务进展、收集到的信息、生成的内容、调用工具的结果、错误信息等;
  • “写”:写入自己的工作成果、收集到的新信息、调用工具的新结果、错误信息等。

这个“共享的大笔记本”是整个多 Agent 协作系统的核心,因为它是智能体之间进行协作的唯一桥梁——没有这个“共享的大笔记本”,智能体之间就无法沟通,无法协作,就像“盲人摸象”一样,各自为政,无法完成复杂的任务。

在 LangGraph 中,状态(State)可以是任意的 Python 数据类型,比如字典(dict)、列表(list)、类(class)等,但最常用的是字典(dict)类(class)——因为它们可以灵活地存储各种类型的信息。

2.2.3 核心概念三:什么是节点(Node)?

节点(Node)就像一个**“团队里的一个成员/一个任务/一个操作”,是 LangGraph 流程图中的基本单元**,每个节点都可以执行一个特定的动作,比如:

  • 调用 LLM:比如产品经理 Agent 调用 LLM 来分析和拆解客户的需求;
  • 调用工具:比如 DevOps Agent 调用 Git 工具来提交代码到 GitHub;
  • 修改状态:比如架构师 Agent 把自己生成的技术方案写入到“共享的大笔记本”里;
  • 判断下一步应该跳转到哪个节点:比如负责人 Agent 检查测试工程师 Agent 的工作成果,决定下一步应该跳转到 DevOps Agent 还是跳转到修复错误的 Agent;
  • 暂停/恢复任务:比如负责人 Agent 遇到了无法自主解决的错误,暂停任务,等待人工干预。

在 LangGraph 中,我们可以用Python 函数或者Python 类来定义节点——每个节点函数或者类的输入都是当前的状态(State),每个节点函数或者类的输出都是一个字典(dict)或者一个类(class),用来更新状态(State)

2.2.4 核心概念四:什么是边(Edge)?

边(Edge)就像一个**“连接两个团队成员的箭头”**,连接两个节点,指定从一个节点跳转到另一个节点的条件和规则,比如:

  • 无条件边(Unconditional Edge):就像一个**“直走的箭头”**,不管当前的状态是什么,从一个节点执行完之后,无条件跳转到另一个节点;
  • 条件边(Conditional Edge):就像一个**“十字路口的红绿灯”**,根据当前的状态(比如某个字段的值)来决定下一步应该跳转到哪个节点;
  • 循环边(Loop Edge):就像一个**“绕操场跑圈的箭头”**,根据当前的状态(比如某个任务是否完成、某个错误是否修复)来决定是否重新执行某个节点或某个子流程。

在 LangGraph 中,我们可以用Python 函数来定义条件边——每个条件边函数的输入都是当前的状态(State),每个条件边函数的输出都是一个字符串(str),用来指定下一步应该跳转到哪个节点的名称

2.2.5 核心概念五:什么是工具调用(Tool Calling)?

工具调用(Tool Calling)就像一个**“团队成员使用他的工具来完成工作”**,智能体可以根据自己的需要,自主地调用外部的工具来完成自己的任务,比如:

  • 产品经理 Agent:不需要调用工具,只需要调用 LLM 来分析和拆解客户的需求;
  • 架构师 Agent:不需要调用工具,只需要调用 LLM 来设计技术方案;
  • 前端开发 Agent:需要调用**代码生成工具、代码静态检查工具(如 ESLint、Prettier)、单元测试工具(如 Jest)**来完成自己的工作;
  • 后端开发 Agent:需要调用**代码生成工具、代码静态检查工具(如 Pylint、Black)、单元测试工具(如 Pytest)**来完成自己的工作;
  • 测试工程师 Agent:需要调用**集成测试工具(如 Selenium、Cypress、Pytest + Requests)**来完成自己的工作;
  • DevOps Agent:需要调用Git 工具、GitHub/GitLab API、Docker 工具、Kubernetes 工具、Minikube 工具来完成自己的工作。

在 LangGraph(和 LangChain)中,我们可以用LangChain 封装好的工具,也可以自己定义工具——自己定义工具非常简单,只需要用一个 Python 函数,然后用LangChain 的 @tool 装饰器**装饰一下这个函数,就可以了!


2.3 核心概念之间的关系(用小学生能理解的比喻)

2.3.1 概念一和概念二的关系:LangGraph 和 State 的关系

LangGraph 和 State 的关系,就像**“超级智能的团队协作指挥中心和共享的大笔记本的关系**:

  • 超级智能的团队协作指挥中心(LangGraph)负责指挥和协调**团队所有成员(Agent)的工作;
  • 共享的大笔记本(State)负责存储和传递**团队所有成员(Agent)的工作成果、收集到的信息、调用工具的结果、错误信息等;
  • **没有超级智能的团队协作指挥中心(LangGraph),团队所有成员(Agent)就无法被指挥和协调,无法完成复杂的任务;
  • **没有共享的大笔记本(State),团队所有成员(Agent)就无法沟通和协作,无法完成复杂的任务。
2.3.2 概念二和概念三的关系:State 和 Node 的关系

State 和 Node 的关系,就像**“共享的大笔记本和团队成员的关系”:

  • 团队成员(Node)负责执行特定的动作,生成工作成果,收集新信息,调用工具,把这些内容写入共享的大笔记本(State);
  • 团队成员(Node)负责读取**共享的大笔记本(State)里的内容,然后继续自己的工作;
  • **没有共享的大笔记本(State),团队成员(Node)就无法读取之前的工作成果,无法继续自己的工作,无法和其他团队成员(Node)协作;
  • **没有团队成员(Node),共享的大笔记本(State)里的内容就无法被生成和更新,整个任务就无法完成。
2.3.3 概念三和概念四的关系:Node 和 Edge 的关系

Node 和 Edge 的关系,就像**“团队成员和连接团队成员的箭头的关系”:

  • 团队成员(Node)负责执行特定的动作;
  • 连接团队成员的箭头(Edge)负责指定从一个团队成员(Node)执行完之后,下一步应该跳转到哪个团队成员(Node);
  • **没有团队成员(Node),连接团队成员的箭头(Edge)就没有意义;
  • **没有连接团队成员的箭头(Edge),团队成员(Node)就无法知道下一步应该做什么,整个任务就无法完成。
2.3.4 概念三和概念五的关系:Node 和 Tool Calling 的关系

Node 和 Tool Calling 的关系,就像**“团队成员和他的工具的关系”:

  • 团队成员(Node)负责决定什么时候调用工具、调用什么工具、怎么调用工具;
  • 工具(Tool Calling)负责帮助团队成员(Node)完成特定的任务;
  • **没有团队成员(Node),工具(Tool Calling)就无法被使用;
  • **没有工具(Tool Calling),团队成员(Node)就无法完成特定的任务(比如 DevOps Agent 没有 Git 工具就无法提交代码到 GitHub)。

2.4 核心概念原理和架构的文本示意图(专业定义)

┌─────────────────────────────────────────────────────────────────────────────────┐
│                         LangGraph 核心概念原理和架构的文本示意图                         │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                 │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                             用户输入(User Input)                      │  │
│  │  比如:开发一款 Python Flask 后端 + React 前端的简易 todo 管理系统   │  │
│  └──────────────────────────────────────┬────────────────────────────────┘  │
│                                           │                                      │
│                                           ▼                                      │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                          起点节点(Start Node)                       │  │
│  │  功能:初始化状态(State),把用户输入写入到状态里                    │  │
│  └──────────────────────────────────────┬────────────────────────────────┘  │
│                                           │                                      │
│                                           ▼                                      │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                        条件边(Conditional Edge)                     │  │
│  │  功能:根据当前的状态(State),决定下一步应该跳转到哪个节点            │  │
│  └──────────────────────────────────────┬────────────────────────────────┘  │
│                                           │                                      │
│                      ┌────────────────────┼────────────────────┐                  │
│                      │                    │                    │                  │
│                      ▼                    ▼                    ▼                  │
│  ┌─────────────────────────┐ ┌─────────────────────────┐ ┌─────────────────┐│
│  │  产品经理节点(PM Node) │ │ 前端开发节点(FE Node) │ │ 负责人节点(SP Node)│
│  │  功能:调用 LLM,分析  │ │  功能:调用 LLM + 工具,│ │  功能:协调所有其他│
│  │ 拆解客户需求,生成需求  │ │ 生成前端代码,静态检查,│ │ 节点的工作,检查工作│
│  │ 文档,写入状态            │ │ 单元测试,格式化代码,写 │ │ 成果,处理错误,决定下│
│  │                            │ │ 入状态                      │ │ 一步节点,写入状态      │
│  └─────────────────────────┘ └─────────────────────────┘ └─────────────────┘│
│                      │                    │                    │                  │
│                      └────────────────────┼────────────────────┘                  │
│                                           │                                      │
│                                           ▼                                      │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                        条件边(Conditional Edge)                     │  │
│  │  功能:根据当前的状态(State),决定下一步应该跳转到哪个节点            │  │
│  └──────────────────────────────────────┬────────────────────────────────┘  │
│                                           │                                      │
│                                           ▼                                      │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                         终点节点(End Node)                        │  │
│  │  功能:任务完成,输出最终结果                                          │  │
│  └───────────────────────────────────────────────────────────────────────┘  │
│                                                                                 │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                        共享状态(Shared State)                        │  │
│  │  数据结构:字典(dict)/类(class)                                    │  │
│  │  存储内容:用户输入、需求文档、技术方案、前端代码、后端代码、测试结果、  │  │
│  │           Git 提交记录、Docker 镜像信息、K8s 部署信息、错误信息等  │  │
│  └───────────────────────────────────────────────────────────────────────┘  │
│                                                                                 │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                        外部工具(External Tools)                     │  │
│  │  工具列表:LLM、Git、GitHub/GitLab API、Docker、Kubernetes、   │  │
│  │           Minikube、ESLint、Prettier、Jest、Pylint、Black、Pytest、│  │
│  │           Selenium、Cypress 等                                         │  │
│  └───────────────────────────────────────────────────────────────────────┘  │
│                                                                                 │
└─────────────────────────────────────────────────────────────────────────────────┘

2.5 Mermaid 流程图(Mermaid 流程节点中不要有括号()、逗号,等特殊字符)

需要分析需求

需要检查成果

任务完成

需要前端开发

需要后端开发

需要测试

需要DevOps

需要修复错误

用户输入

起点节点

条件边

产品经理节点

负责人节点

终点节点

更新状态

前端开发节点

后端开发节点

测试工程师节点

DevOps节点

错误修复节点

输出最终结果


3. 核心概念核心属性维度对比 markdown 表格

核心概念 核心功能 输入 输出 数据结构 是否必需
LangGraph 指挥协调多Agent协作 用户输入 最终结果
State 存储传递信息 节点输出 节点输入 字典/类
Node 执行特定动作 State 字典/类 Python函数/类
Edge 指定跳转规则 State 字符串/None Python函数/None
Tool Calling 帮助完成任务 函数参数 函数返回值 Python函数

4. 概念联系的ER实体关系 mermaid架构图

输入请求

管理

包含

包含

读写

调用

连接

USER

LANGGRAPH

STATE

NODE

EDGE

TOOL_CALLING


5. 核心算法原理 & 具体操作步骤

5.1 核心算法原理

LangGraph 的核心算法原理其实非常简单,就是**“深度优先搜索(DFS)或者广度优先搜索(BFS)遍历图的节点,根据边的规则(无条件/有条件/循环)来决定下一步应该跳转到哪个节点,同时在遍历的过程中不断更新状态(State)**。

不过,LangGraph 在这个基础上,还增加了**“状态持久化”、“暂停/恢复任务”、“错误处理和回滚”、“可视化调试”、“异步执行”、“子图嵌套”**等高级功能,这些高级功能让 LangGraph 变得非常强大,适合构建复杂的多 Agent 协作系统。


5.2 具体操作步骤

用 LangGraph 构建多 Agent 协作系统的具体操作步骤如下(一步一步分析推理思考):

  1. 第一步:定义状态(State)——就像准备一个团队所有成员共享的大笔记本,决定这个大笔记本里要存储哪些信息;
  2. 第二步:定义节点(Node)——就像确定团队里的所有成员和他们的分工,决定每个成员要执行什么动作;
  3. 第三步:定义边(Edge)——就像画连接团队所有成员的箭头,决定从一个成员执行完之后,下一步应该跳转到哪个成员;
  4. 第四步:构建图(Graph)——就像把所有成员和箭头组合起来,构建出一个完整的流程图;
  5. 第五步:编译图(Compile Graph)——就像把流程图编译成一个可执行的程序
  6. 第六步:运行图(Run Graph)——就像运行这个可执行的程序,输入用户输入,得到最终结果;
  7. 第七步:调试和优化图(Debug and Optimize Graph)——就像调试和优化这个可执行的程序,不断改进团队成员的分工和箭头的规则,不断优化系统的性能和准确性。

6. 项目实战:搭建智能研发多 Agent 协作系统

6.1 开发环境搭建

6.1.1 环境要求
  • Python 3.10+(必须,因为 LangGraph 0.2.x 版本只支持 Python 3.10+)
  • Node.js 18+(必须,因为要生成 React 前端代码需要 Node.js 18+)
  • Git(必须,因为要提交代码到 GitHub)
  • Docker(必须,因为要构建 Docker 镜像)
  • Docker Compose(必须,因为要本地测试部署)
  • Minikube(可选,因为要本地测试 K8s 部署)
  • kubectl(可选,因为要本地测试 K8s 部署)
  • 一个 OpenAI API Key(或者任何兼容 OpenAI API 接口的 LLM 的 API Key,比如通义千问 4、文心一言 4.0、Claude 3.5 Sonnet)
  • 一个 GitHub 账号(因为要使用 GitHub Actions CI/CD 平台)
  • 一个 Docker Hub 账号(因为要推送 Docker 镜像)
6.1.2 安装依赖

首先,我们需要创建一个 Python 虚拟环境,然后安装所有的依赖:

# 创建 Python 虚拟环境(Windows
python -m venv venv

# 激活 Python 虚拟环境(Windows)
venv\Scripts\activate

# 激活 Python 虚拟环境(Linux/MacOS)
source venv/bin/activate

# 升级 pip
pip install --upgrade pip

# 安装所有的依赖
pip install langchain langgraph langchain-openai langchain-community python-dotenv python-multipart gitpython requests beautifulsoup4 black pylint pytest flask flask-cors flask-sqlalchemy flask-jwt-extended

# 安装 Node.js 依赖(用于 React 前端代码的静态检查、格式化、测试)
npm install -g eslint prettier jest @eslint/js @types/react @types/react-dom react-scripts
6.1.3 配置环境变量

然后,我们需要创建一个 .env 文件,配置所有的环境变量:

# LLM 配置
OPENAI_API_KEY=your_openai_api_key_here
# 如果使用兼容 OpenAI API 接口的其他 LLM,请配置下面的变量
# OPENAI_API_BASE=https://api.example.com/v1
# OPENAI_MODEL_NAME=example-model-name

# GitHub 配置
GITHUB_TOKEN=your_github_token_here
GITHUB_REPO_OWNER=your_github_repo_owner_here
GITHUB_REPO_NAME=your_github_repo_name_here

# Docker Hub 配置
DOCKER_HUB_USERNAME=your_docker_hub_username_here
DOCKER_HUB_PASSWORD=your_docker_hub_password_here
DOCKER_HUB_REPOSITORY=your_docker_hub_repository_here

# 数据库配置(用于后端 Flask 代码)
DATABASE_URL=sqlite:///./todo.db
JWT_SECRET_KEY=your_jwt_secret_key_here

# 其他配置
DEBUG=True

6.2 系统功能设计

我们的智能研发多 Agent 协作系统的核心功能如下:

  1. 需求分析与拆解:输入用户的研发需求,生成需求文档和功能列表;
  2. 技术方案设计:根据需求文档和功能列表,设计技术方案,生成技术架构图(用 Mermaid 流程图表示)、数据库设计文档、接口设计文档;
  3. 前端代码生成:根据技术方案、接口设计文档,生成前端 React 代码、代码静态检查(ESLint)、单元测试编写(Jest)、代码格式化(Prettier);
  4. 后端代码生成:根据技术方案、数据库设计文档、接口设计文档,生成后端 Flask 代码、代码静态检查(Pylint)、单元测试编写(Pytest)、代码格式化(Black);
  5. 集成测试编写与运行:根据前端和后端的代码,生成集成测试代码(Pytest + Requests)、运行集成测试、修复集成测试的错误;
  6. 代码提交与 PR 创建:把所有生成的代码提交到 GitHub、创建一个新的分支、创建 PR;
  7. CI/CD 自动触发与监控:触发 GitHub Actions CI/CD 流水线、监控 CI/CD 流水线的执行状态;
  8. Docker 镜像构建与推送:构建前端和后端的 Docker 镜像、推送 Docker 镜像到 Docker Hub;
  9. 本地 Docker Compose 部署测试:用 Docker Compose 本地部署前端和后端的 Docker 镜像、测试部署是否成功;
  10. (可选)Minikube K8s 集群部署测试:用 Minikube 本地部署 K8s 集群、部署前端和后端的 Deployment 和 Service、测试部署是否成功。

6.3 系统架构设计

我们的智能研发多 Agent 协作系统的系统架构设计如下(用 Mermaid 流程图表示):

用户

LangGraph 多 Agent 协作系统

产品经理 Agent

架构师 Agent

前端开发 Agent

后端开发 Agent

测试工程师 Agent

DevOps Agent

负责人 Agent

共享状态 State

外部工具 External Tools

LLM

Git

GitHub API

Docker

Minikube

ESLint Prettier Jest

Pylint Black Pytest

Flask React


6.4 系统接口设计

我们的智能研发多 Agent 协作系统的系统接口设计如下(用 RESTful API 设计风格):

接口路径 请求方法 接口说明 请求参数 响应参数
/api/v1/run POST 运行多 Agent 协作系统 user_requirement: str(用户的研发需求 task_id: str(任务 ID), status: str(任务状态), message: str(消息)
/api/v1/status/<task_id> GET 获取任务的执行状态 task_id: str(任务 ID) task_id: str(任务 ID), status: str(任务状态), message: str(消息), state: dict(当前的状态)
/api/v1/result/<task_id> GET 获取任务的最终结果 task_id: str(任务 ID) task_id: str(任务 ID), status: str(任务状态), message: str(消息), result: dict(最终结果)

6.5 系统核心实现源代码

由于篇幅限制,本文只提供系统的核心实现源代码——完整的源代码可以在本文的扩展阅读 & 参考资料部分找到 GitHub 仓库的链接。

6.5.1 第一步:定义状态(State)
from typing import TypedDict, List, Optional
from langchain_core.messages import BaseMessage, HumanMessage, AIMessage, SystemMessage
from langgraph.graph import add_messages

# 定义共享状态(State)
class R&DState(TypedDict):
    # 用户输入
    user_requirement: str
    # 产品经理生成的内容
    pm_output: Optional[str] = None
    # 架构师生成的内容
    architect_output: Optional[str] = None
    # 前端开发生成的内容
    frontend_output: Optional[str] = None
    # 后端开发生成的内容
    backend_output: Optional[str] = None
    # 测试工程师生成的内容
    test_output: Optional[str] = None
    # DevOps 生成的内容
    devops_output: Optional[str] = None
    # 负责人生成的内容
    supervisor_output: Optional[str] = None
    # 下一步应该跳转到哪个节点
    next_step: Optional[str] = None
    # 错误信息
    error_message: Optional[str] = None
    # 任务状态
    task_status: str = "pending"
    # 对话历史(用于 Agent 的记忆)
    messages: List[BaseMessage] = add_messages

6.5.2 第二步:定义工具(Tool Calling)

由于篇幅限制,本文只提供几个核心工具的实现源代码——完整的工具实现源代码可以在 GitHub 仓库的链接找到。

from langchain_core.tools import tool
import os
import subprocess
from dotenv import load_dotenv
from git import Repo
import requests

# 加载环境变量
load_dotenv()

# 定义工具:代码写入文件
@tool
def write_code_to_file(file_path: str, code_content: str) -> str:
    """
    把代码内容写入到指定的文件路径中
    
    参数:
        file_path: str,文件路径
        code_content: str,代码内容
    
    返回值:
        str,操作结果
    """
    try:
        # 创建目录(如果不存在)
        os.makedirs(os.path.dirname(file_path), exist_ok=True)
        # 写入文件
        with open(file_path, "w", encoding="utf-8") as f:
            f.write(code_content)
        return f"成功把代码写入到文件 {file_path} 中"
    except Exception as e:
        return f"把代码写入到文件 {file_path} 中失败:{str(e)}"

# 定义工具:Git 初始化仓库
@tool
def git
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐