LangGraph 实战:搭建智能研发多 Agent 协作系统(含 CI_CD 集成)
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)像搭积木一样组合起来,像写代码一样精确控制它们之间的通信、协作、状态流转、条件分支、循环迭代、错误处理**,从而构建出一套端到端的、自主可控的、有记忆的、可调试的智能系统!
本文的核心目的就是:
- 用通俗易懂的方式,让小学生都能听懂LangGraph 的核心概念、原理和架构;
- 以开发 Python Flask + React todo 管理系统为真实案例,手把手教读者一步一步分析推理思考如何设计研发全流程的多 Agent 角色、如何用 LangGraph 编排它们的逻辑、如何集成各种常用的研发工具(GitHub Actions CI/CD、Docker、Git、Docker Hub、Kubernetes(可选本地 Minikube))、如何实现代码生成、测试、部署的自动化;
- 提供完整的、可直接运行的 Python 源代码、GitHub Actions CI/CD 配置文件、Docker Compose 本地测试环境配置文件;
- 总结这套系统的最佳实践 tips、行业应用场景、未来发展趋势与挑战。
1.1.2 范围
本文的范围限定在:
- 核心技术栈: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。
- 研发全流程:需求分析与拆解、技术方案设计、前后端代码生成、代码静态检查、单元测试编写与集成测试、代码格式化、Git 提交与 Pull Request(PR)、CI/CD 自动构建与测试、Docker 镜像构建与推送、本地 Docker Compose 本地部署测试、(可选)Minikube K8s 集群滚动更新部署、问题自主修复与迭代。
- 不包含的内容:生产级别的安全加固(如 API Key 的存储、Agent 的权限控制、生产 K8s 集群的生产配置、复杂系统的性能优化、复杂业务逻辑的代码生成与测试。
1.2 预期读者
本文的预期读者分为以下几类:
- 技术小白/入门级程序员:想要了解 LangGraph 和多 Agent 协作系统的核心概念和原理,想要学习如何用 LangChain 和 LangGraph 搭建简单的智能系统;
- 中级/高级后端/全栈程序员:想要了解如何将 LLM 集成到自己的研发流程中,想要学习如何用 LangGraph 搭建端到端的智能研发多 Agent 协作系统;
- DevOps 工程师:想要了解如何将 LLM 集成到自己的 CI/CD 流水线中,想要学习如何用 LangGraph 自动化部分 DevOps 流程;
- 技术架构师:想要了解多 Agent 协作系统的架构设计,想要学习如何将 LangGraph 应用到自己的业务场景中;
- 产品经理/项目经理:想要了解 LLM 能为软件开发全流程自动化能带来什么价值,想要学习如何评估和使用多 Agent 协作系统。
1.3 文档结构概述
本文的文档结构按照**“背景介绍→核心概念与联系→核心算法原理与架构→数学模型(可选简化)→项目实战(开发环境搭建→系统功能设计→系统架构设计→系统接口设计→系统核心实现源代码→最佳实践 tips→CI/CD 集成配置→本地测试与运行→可选 Minikube 部署测试)→实际应用场景→工具和资源推荐→行业发展与未来趋势→总结→思考题→附录:常见问题与解答→扩展阅读 & 参考资料**的顺序展开,每个部分都用通俗易懂的语言,像给小学生讲故事一样,清晰透彻地讲解,同时提供完整的、可直接运行的代码和配置文件。
1.4 术语表
1.4.1 核心术语定义
- 大语言模型(LLM): 就像一个超级聪明的“百科全书式的小助手,它读过几乎所有的互联网公开内容(包括书籍、论文、代码、博客等),可以回答各种问题、生成各种文本(包括代码、文章、邮件、脚本等)、理解人类的自然语言、进行逻辑推理、翻译语言等。
- 智能体(Agent): 就像一个有自己的“大脑”(LLM)、“眼睛”(感知能力)、“手脚”(工具调用能力)、“记忆”(状态存储能力)、“目标”(任务执行能力)的“小机器人”,它可以自主地感知环境、理解目标、调用工具、执行任务、存储和使用记忆、和其他智能体协作。
- LangChain: 就像一个智能体的“工具箱”,它提供了各种封装好的组件(如 LLM 调用接口、工具调用接口、记忆存储接口、Chain 链式调用接口、Document Loader 文档加载接口、Text Splitter 文本分割接口、Vector Store 向量存储接口等),帮助我们快速搭建简单的智能体和链式调用系统。
- LangGraph: 就像一个智能体的“积木搭建师”,它是 LangChain 的升级版/补充版,专门用于构建复杂的、有状态的、可调试的、自主可控的多 Agent 协作系统**,它允许我们像画流程图一样(或者说像写代码分支、循环、条件判断的代码一样)精确控制智能体之间的通信、协作、状态流转、错误处理等。
- 状态(State): 就像一个**“共享的笔记本**,所有参与协作的智能体都可以在上面“读”和“写”,用来存储任务的进展、收集到的信息、生成的内容、调用工具的结果、错误信息等,让智能体之间可以通过这个“共享的笔记本”进行协作。
- 节点(Node): 就像一个**“智能体/任务/操作**,是 LangGraph 流程图中的基本单元,每个节点都可以执行一个特定的动作(比如调用 LLM、调用工具、修改状态、判断下一步应该跳转到哪个节点等)。
- 边(Edge): 就像一个**“箭头”**,连接两个节点,指定从一个节点跳转到另一个节点的条件和规则(比如无条件跳转、有条件跳转、循环跳转等)。
- 起点(Start Node): 就像一个**“比赛的起跑线**,是 LangGraph 流程图的第一个节点,任务从这里开始执行。
- 终点(End Node): 就像一个**“比赛的终点线”**,是 LangGraph 流程图的最后一个节点,任务完成后在这里结束执行。
- 条件边(Conditional Edge): 就像一个**“十字路口的红绿灯”**,根据当前的状态(比如某个字段的值)来决定下一步跳转到哪个节点。
- 循环(Loop): 就像一个**“绕操场跑圈”**,根据当前的状态(比如某个任务是否完成、某个错误是否修复)来决定是否重新执行某个节点或某个子流程。
1.4.2 相关概念解释
- Chain 链式调用系统: 就像一个**“流水线”**,任务按照固定的顺序一个接一个地执行,没有状态(或者说只有非常简单的状态),没有条件分支,没有循环迭代,没有错误处理,能力有限,适合简单的任务。
- 多 Agent 协作系统: 就像一个**“团队”**,每个智能体都有自己的特长和分工,它们可以通过“共享的笔记本”进行协作,有状态,有条件分支,有循环迭代,有错误处理,能力强大,适合复杂的任务。
- 工具调用(Tool Calling): 就像一个**“小机器人使用它的工具”**,智能体可以根据自己的需要,自主地调用外部的工具(比如计算器、搜索引擎、代码编辑器、Git、GitHub、Docker、Kubernetes、CI/CD平台等)来完成自己的任务。
- 记忆(Memory): 就像一个**“小机器人的大脑里的记忆”**,智能体可以存储和使用自己的记忆(比如之前的对话历史、之前的任务执行历史、之前调用工具的结果等),还可以存储和使用团队共享的记忆(也就是 LangGraph 中的“共享的笔记本”)。
- 可调试性(Debuggability): 就像一个**“小机器人的工作过程可以被录像回放”**,我们可以看到 LangGraph 流程图中每个节点的执行顺序、每个节点的输入输出、每个节点的状态变化等,方便我们调试和优化系统。
- 自主可控性(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 协作系统!你可以把这个任务交给这套系统,让系统里的多个“智能体小机器人”代替小王、小李、小张、小赵、小钱来完成所有的工作!
这套系统里的“智能体小机器人”分工如下:
- 产品经理 Agent(Product Manager Agent):代替小赵,负责分析和拆解客户的需求,生成需求文档和功能列表;
- 架构师 Agent(Architect Agent):代替你自己(或者你的技术架构师),负责根据需求文档和功能列表,设计技术方案,生成技术架构图、数据库设计文档、接口设计文档;
- 前端开发 Agent(Frontend Developer Agent):代替小王,负责根据技术方案、接口设计文档,生成前端 React 代码、代码静态检查、单元测试编写、代码格式化;
- 后端开发 Agent(Backend Developer Agent):代替小李,负责根据技术方案、数据库设计文档、接口设计文档,生成后端 Flask 代码、代码静态检查、单元测试编写、代码格式化;
- 测试工程师 Agent(Test Engineer Agent):代替小钱,负责根据前端和后端的代码,生成集成测试代码、运行集成测试、修复集成测试的错误;
- DevOps Agent(DevOps Engineer Agent):代替小张,负责代码提交到 GitHub/GitLab、创建 PR、触发 GitHub Actions CI/CD 流水线、构建 Docker 镜像、推送 Docker 镜像到 Docker Hub、(可选)部署到 Minikube K8s 集群;
- 负责人 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 流程节点中不要有括号()、逗号,等特殊字符)
3. 核心概念核心属性维度对比 markdown 表格
| 核心概念 | 核心功能 | 输入 | 输出 | 数据结构 | 是否必需 |
|---|---|---|---|---|---|
| LangGraph | 指挥协调多Agent协作 | 用户输入 | 最终结果 | 图 | 是 |
| State | 存储传递信息 | 节点输出 | 节点输入 | 字典/类 | 是 |
| Node | 执行特定动作 | State | 字典/类 | Python函数/类 | 是 |
| Edge | 指定跳转规则 | State | 字符串/None | Python函数/None | 是 |
| Tool Calling | 帮助完成任务 | 函数参数 | 函数返回值 | Python函数 | 否 |
4. 概念联系的ER实体关系 mermaid架构图
5. 核心算法原理 & 具体操作步骤
5.1 核心算法原理
LangGraph 的核心算法原理其实非常简单,就是**“深度优先搜索(DFS)或者广度优先搜索(BFS)遍历图的节点,根据边的规则(无条件/有条件/循环)来决定下一步应该跳转到哪个节点,同时在遍历的过程中不断更新状态(State)**。
不过,LangGraph 在这个基础上,还增加了**“状态持久化”、“暂停/恢复任务”、“错误处理和回滚”、“可视化调试”、“异步执行”、“子图嵌套”**等高级功能,这些高级功能让 LangGraph 变得非常强大,适合构建复杂的多 Agent 协作系统。
5.2 具体操作步骤
用 LangGraph 构建多 Agent 协作系统的具体操作步骤如下(一步一步分析推理思考):
- 第一步:定义状态(State)——就像准备一个团队所有成员共享的大笔记本,决定这个大笔记本里要存储哪些信息;
- 第二步:定义节点(Node)——就像确定团队里的所有成员和他们的分工,决定每个成员要执行什么动作;
- 第三步:定义边(Edge)——就像画连接团队所有成员的箭头,决定从一个成员执行完之后,下一步应该跳转到哪个成员;
- 第四步:构建图(Graph)——就像把所有成员和箭头组合起来,构建出一个完整的流程图;
- 第五步:编译图(Compile Graph)——就像把流程图编译成一个可执行的程序;
- 第六步:运行图(Run Graph)——就像运行这个可执行的程序,输入用户输入,得到最终结果;
- 第七步:调试和优化图(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 协作系统的核心功能如下:
- 需求分析与拆解:输入用户的研发需求,生成需求文档和功能列表;
- 技术方案设计:根据需求文档和功能列表,设计技术方案,生成技术架构图(用 Mermaid 流程图表示)、数据库设计文档、接口设计文档;
- 前端代码生成:根据技术方案、接口设计文档,生成前端 React 代码、代码静态检查(ESLint)、单元测试编写(Jest)、代码格式化(Prettier);
- 后端代码生成:根据技术方案、数据库设计文档、接口设计文档,生成后端 Flask 代码、代码静态检查(Pylint)、单元测试编写(Pytest)、代码格式化(Black);
- 集成测试编写与运行:根据前端和后端的代码,生成集成测试代码(Pytest + Requests)、运行集成测试、修复集成测试的错误;
- 代码提交与 PR 创建:把所有生成的代码提交到 GitHub、创建一个新的分支、创建 PR;
- CI/CD 自动触发与监控:触发 GitHub Actions CI/CD 流水线、监控 CI/CD 流水线的执行状态;
- Docker 镜像构建与推送:构建前端和后端的 Docker 镜像、推送 Docker 镜像到 Docker Hub;
- 本地 Docker Compose 部署测试:用 Docker Compose 本地部署前端和后端的 Docker 镜像、测试部署是否成功;
- (可选)Minikube K8s 集群部署测试:用 Minikube 本地部署 K8s 集群、部署前端和后端的 Deployment 和 Service、测试部署是否成功。
6.3 系统架构设计
我们的智能研发多 Agent 协作系统的系统架构设计如下(用 Mermaid 流程图表示):
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
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)