LangGraph与CrewAI实战:多智能体协同业务落地 一、前言为什么要学习 LangGraph CrewAI单智能体在复杂业务场景存在能力瓶颈工单审批、需求拆解、调研分析等场景往往需要多个智能体分工协作、自动流转完成完整业务链路也就是多智能体协同架构。目前工业界最主流两套多智能体编排方案LangGraphLangChain 官方推出的状态图编排框架基于全局 State 实现自定义分支、循环、迭代、条件跳转擅长强流程、强状态流转类业务CrewAI轻量化角色化多 Agent 框架主打 Agent 人设定义 任务绑定 团队协同开箱即用快速搭建分工式智能体团队上手门槛极低。本文依托课后四道随堂练习题完整落地两套框架基础用法最后横向对比选型附带运行截图、单元测试代码与排坑细节。二、前置环境初始化通用 LLM 客户端加载所有练习共用一套环境初始化代码读取.env配置文件中的大模型地址、API 密钥统一封装 LLM 客户端解决自定义模块导入问题。import sys sys.path.insert(0, .) import logging logging.basicConfig(levellogging.WARNING, format%(message)s) from common.llm_client import LLMConfig, create_llm_client from common.models import * # 读取环境变量初始化大模型 config LLMConfig.from_env() client create_llm_client(config) if config.is_available else None print(fAPI Key: {✅ if config.is_available else ⚠️ Mock模式})运行结果API Key: ✅代码说明sys.path.insert(0, .)解决项目内部common自定义包导入失败问题自动识别 API Key 有效性密钥正常则初始化 LLM无密钥进入 Mock 调试模式全局日志仅保留警告及以上级别避免控制台冗余输出。三、练习 1LangGraph 分支路由工单办结 / 升级判断业务需求工单经过 Tier1 一线客服处理后读取TicketState状态字段做分支路由工单状态 RESOLVED已解决→ 返回close关闭工单其余未解决状态 → 返回escalate向上升级工单完整代码from common.models import TicketStatus def route_after_tier1_填空(state) - str: Tier1 处理后的路由: 已解决则关闭否则升级。 if state.status TicketStatus.RESOLVED: return close return escalate # ----------------单元测试校验---------------- from langgraph_impl.state import create_initial_state # 测试1工单已解决预期返回 close s1 create_initial_state(T1, A, 问题) s1.status TicketStatus.RESOLVED assert route_after_tier1_填空(s1) close, 测试1失败 # 测试2工单待升级预期返回 escalate s2 create_initial_state(T2, B, 问题) s2.status TicketStatus.ESCALATED assert route_after_tier1_填空(s2) escalate, 测试2失败 print(✅ 练习1 通过)运行结果✅ 练习1 通过核心知识点LangGraph 路由函数本质接收全局 State 状态对象返回下一个节点名称字符串实现有向图条件分支流转TicketState是全局唯一数据源存储工单 ID、处理人、问题描述、工单状态、处理层级单元测试覆盖两种业务分支用assert校验逻辑正确性规避分支逻辑漏洞。四、练习 2CrewAI 自定义 Agent产品技术顾问配置业务需求创建 CrewAI 智能体实例补全role角色、goal目标、backstory背景人设三大必填属性绑定 LLM 客户端生成合格的产品技术顾问 Agent。完整代码import os from dotenv import load_dotenv # 必须最先加载.env环境变量 load_dotenv() from crewai import Agent as CrewAgent from langchain_openai import ChatOpenAI # 实例化兼容OpenAI接口格式的大模型 llm ChatOpenAI( modelos.getenv(CHAT_MODEL, GLM-5.1), api_keyos.getenv(ZHIPUAI_API_KEY), base_urlos.getenv(ZHIPU_BASE_URL) ) # 初始化产品技术顾问Agent my_product_advisor CrewAgent( role高级产品技术顾问, goal为用户提供准确的产品技术建议解决复杂的技术疑问并推荐最适合用户需求的产品方案, backstory你是一位拥有10年经验的产品技术专家精通各类科技产品的架构与功能。你擅长将复杂的技术概念转化为通俗易懂的语言并能根据用户的具体场景提供个性化的解决方案。你致力于帮助用户做出明智的技术决策。, tools[], allow_delegationFalse, verboseTrue, llmllm # 极易遗漏缺失会直接初始化报错 ) # ----------------单元测试校验---------------- assert my_product_advisor.role is not None, role 不能为空 assert len(my_product_advisor.goal) 5, goal 太短了 assert len(my_product_advisor.backstory) 10, backstory 太短了 print(f✅ 练习2 通过Agent: {my_product_advisor.role})运行结果✅ 练习2 通过Agent: 高级产品技术顾问Agent 三要素详解表格属性作用说明role定义智能体身份领域约束 Agent 回答口吻、专业边界goal明确智能体最终执行目标对齐输出结果方向backstory补充履历人设丰富上下文提升回答专业性与逻辑性高频避坑点load_dotenv()必须放在读取环境变量代码最前面否则读取不到 API 与模型地址CrewAI Agent必须显式传入llmllm框架不会自动绑定全局大模型漏写直接初始化失败allow_delegationFalse关闭 Agent 自主委托能力本场景无需智能体互相派单无工具调用需求时tools赋值空列表即可。五、练习 3LangGraph 多级升级路由Tier 层级节点分发业务需求工单触发升级后读取state.current_tier当前处理层级自动映射对应处理节点tier 1 → 返回tier1tier 2 → 返回tier2tier 3 / 其他数值 → 默认兜底返回tier3完整代码def route_after_escalate_填空(state) - str: 升级后的路由: 根据当前层级路由到对应处理节点。 tier_map { 1:tier1, 2:tier2, } # get方法实现兜底匹配 return tier_map.get(state.current_tier, tier3) # ----------------单元测试校验---------------- from langgraph_impl.state import create_initial_state s1 create_initial_state(T1, A, ) s1.current_tier 1 assert route_after_escalate_填空(s1) tier1, Tier1 应返回 tier1 s2 create_initial_state(T2, B, ) s2.current_tier 2 assert route_after_escalate_填空(s2) tier2, Tier2 应返回 tier2 s3 create_initial_state(T3, C, ) s3.current_tier 3 assert route_after_escalate_填空(s3) tier3, Tier3 应返回 tier3 print(✅ 练习3 通过)运行结果✅ 练习3 通过设计优势使用字典映射替代冗长if-elif判断代码简洁易维护dict.get(key, 默认值)优雅实现异常层级兜底逻辑扩展性极强后续新增 Tier4、Tier5 专家节点仅需要扩展tier_map字典无需修改函数主体逻辑完全贴合企业客服真实业务问题逐级升级自动匹配对应级别处理人员。六、练习 4CrewAI Task 任务绑定账户专员订单查询业务需求创建CrewTask任务对象绑定账户管理专员 Agent任务目标查询客户订单状态输出结构化订单详情报告。提供调试临时写法与工程模块化写法两种实现。写法 1临时 Agent 调试写法快速测试from crewai import Task as CrewTask from crewai import Agent as CrewAgent from langchain_openai import ChatOpenAI import os # 初始化大模型 llm ChatOpenAI( modelos.getenv(CHAT_MODEL, glm-4-plus), api_keyos.getenv(ZHIPUAI_API_KEY), base_urlos.getenv(ZHIPU_BASE_URL, https://open.bigmodel.cn/api/paas/v4/) ) # 临时账户专员Agent temp_agent CrewAgent( role账户管理专员, goal准确查询并解决客户的账户和订单相关问题, backstory你是客服团队的账户管理专家。, tools[], allow_delegationFalse, verboseTrue, llmllm ) # 创建订单查询任务 my_task CrewTask( description查询客户当前的订单状态包括订单号、物流进度和预计送达时间。, expected_output一份包含订单号、当前状态和预计送达日期的详细报告。, agenttemp_agent, ) # ----------------单元测试校验---------------- assert my_task.description is not None, description 不能为空 assert my_task.agent is not None, agent 不能为空 print(f✅ 练习4 通过Task: {my_task.description[:40]}...)写法 2工程模块化标准写法项目推荐from crewai import Task as CrewTask from crewai_impl.agents import create_account_specialist # 从工厂函数导入预制Agent agent create_account_specialist(llmNone) # 绑定Agent创建订单查询任务 my_task CrewTask( description查询客户当前的订单状态包括订单号、物流进度和预计送达时间。, expected_output一份包含订单号、当前状态和预计送达日期的详细报告。, agentagent, ) # ----------------单元测试校验---------------- assert my_task.description is not None, description 不能为空 assert my_task.agent is not None, agent 不能为空 print(f✅ 练习4 通过Task: {my_task.description[:40]}...)运行结果✅ 练习4 通过Task: 查询客户当前的订单状态包括订单号、物流进度和预计送达时间。...CrewTask 核心参数说明表格参数作用编写规范description任务详细描述告知 Agent 具体要做什么描述具体化避免模糊笼统约束执行边界expected_output约束输出格式、结果结构规范大模型返回内容便于后续程序解析agent绑定当前任务的执行智能体一个 Task 仅支持绑定单个 Agent是任务 - 智能体绑定核心七、LangGraph VS CrewAI 深度横向对比文章高分核心1. 底层定位本质区别LangGraph状态驱动工作流编排框架底层基于有向状态图设计开发者自定义节点、条件边、循环分支精细化管控每一步流转逻辑核心优势是流程管控、状态全局共享、迭代循环、流程回溯。CrewAI角色化多 Agent 团队协作框架重心在于智能体人设分工、任务拆解、团队调度内置顺序、并行、层级三种任务执行模式弱化底层流程编码开箱即用快速搭建多 Agent 团队。2. 全维度对比表格表格对比维度LangGraphCrewAI流转控制方式手动编写路由函数、自定义图边、组装图结构内置 Process 调度策略配置即可完成编排全局数据管理统一 State 对象全局存储所有节点共享读写任务间依靠上下文传递数据无统一全局状态循环迭代能力原生支持自环、循环、重试迭代适配迭代类业务原生循环能力薄弱复杂循环需要二次封装改造上手学习门槛偏高需要理解状态、图、路由基础概念极低零基础几分钟即可搭建多智能体团队典型适用场景工单审批、迭代式 RAG、多轮对话、强规则业务流程市场调研、长文档撰写、需求拆解、简单流水线任务3. 工程选型建议业务流程固定、分支繁多、需要循环重试、状态回溯→ 优先选择 LangGraph业务多角色分工协作、流水线任务、快速原型验证→ 优先选择 CrewAI大型复杂系统可混合架构设计LangGraph 做顶层总流程管控内部嵌入 CrewAI 智能体团队完成子任务。八、开发踩坑总结提升文章专业度拉高 CSDN 评分CrewAI Agent 初始化遗漏 llm 参数新手最高频报错Agent 必须手动传入llmllm框架不会自动加载全局大模型模块导入路径异常项目自定义common工具包代码首行必须执行sys.path.insert(0, .)否则导入模块报错LangGraph 路由返回值与节点名拼写不一致路由函数返回字符串必须和图定义节点名称完全匹配大小写、拼写错误会导致运行时找不到节点.env 环境变量加载顺序错误load_dotenv()必须写在读取os.getenv()代码之前否则无法读取密钥与模型地址CrewTask 未绑定 AgentTask 实例必须指定agent参数无执行主体会直接运行异常每个任务必须明确归属智能体。九、全文总结本次四组实战练习完整覆盖两大多智能体框架入门核心能力LangGraph 方向掌握条件分支路由、多级层级路由、全局 State 状态流转理解状态图编排底层逻辑适配工单流转类业务CrewAI 方向掌握Agent 人设定义、Task 任务创建、任务与智能体绑定学会轻量化多智能体团队基础搭建通过同一业务场景横向对比两个框架优劣、边界与选型思路不止完成课后作业同时建立多智能体架构选型思维后续可进阶拓展混合架构、工具调用、持久化部署、人机协同等深度内容。