8.1 Agent 工程化与框架选型:LangChain、LangGraph、AutoGen、CrewAI、LlamaIndex 「原理我都懂,但真要造一个 Agent,从哪开始?」——这是大多数开发者的真实困境。好消息是,你不用从零造轮子。社区已经沉淀出几大主流框架,每个都有清晰的定位与哲学。这一节把它们摆在一起对比,给一张选型决策树。 8.1.1 框架的本质:抽象与约束 框架(Framework)的本质是提供一层抽象 + 一套约束: 维度 | 含义 抽象 | 把通用模式封装成可复用组件(Agent、Tool、Memory) 约束 | 规定怎么组合(链式?图式?对话式?) 生态 | 提供工具/集成/文档/社区 不同框架的抽象层次与约束风格不同,导出不同的适用场景。 8.1.
「原理我都懂,但真要造一个 Agent,从哪开始?」——这是大多数开发者的真实困境。好消息是,你不用从零造轮子。社区已经沉淀出几大主流框架,每个都有清晰的定位与哲学。这一节把它们摆在一起对比,给一张选型决策树。
框架(Framework)的本质是提供一层抽象 + 一套约束:
| 维度 | 含义 |
|---|---|
| 抽象 | 把通用模式封装成可复用组件(Agent、Tool、Memory) |
| 约束 | 规定怎么组合(链式?图式?对话式?) |
| 生态 | 提供工具/集成/文档/社区 |
不同框架的抽象层次与约束风格不同,导出不同的适用场景。
LangChain(2022 年底)是最早也是最知名的 LLM 应用框架。它的核心抽象是「链(Chain)」——把 LLM 调用、工具、记忆等组件像链条一样串起来。
| 组件 | 含义 |
|---|---|
| Chain | 顺序组合的操作序列 |
| Agent | 自主决策调用工具的循环 |
| Tool | 可被 Agent 调用的能力 |
| Memory | 短期记忆管理 |
| Retriever | 检索器(RAG) |
| 维度 | LangChain |
|---|---|
| 核心抽象 | 链(顺序组合) |
| 灵活性 | 中(链式结构有一定约束) |
| 上手难度 | 中 |
| 生态 | 最丰富(最多集成、文档、社区) |
| 适用 | 通用 LLM 应用、原型 |
⚠️ LangChain 的常见批评:抽象过多、隐藏细节、复杂场景难定制。它的「链」抽象简单场景好用,复杂场景容易「黑盒化」。这也是后来 LangGraph 出现的动机。
LangGraph 是 LangChain 团队推出的下一代框架,专为复杂、有状态的 Agent 流程设计。它把抽象从「链」升级为「图(Graph)」——节点是操作,边是控制流,显式管理状态。
| 组件 | 含义 |
|---|---|
| StateGraph | 状态图(节点 + 边 + 共享状态) |
| Node | 一个操作(LLM 调用、工具执行) |
| Edge | 控制流(含条件分支) |
| State | 显式管理的状态对象 |
| 维度 | LangChain(链) | LangGraph(图) |
|---|---|---|
| 控制流 | 顺序 | 任意(含循环、分支) |
| 状态 | 隐式 | 显式 |
| 可调试 | 难(黑盒) | 易(节点可观测) |
| 适合 | 简单流程 | 复杂 Agent |
💡 LangGraph 的核心价值是「显式状态 + 任意控制流」:它把 Agent 的复杂循环、分支、回溯都变成可建模、可调试的图结构。对生产级复杂 Agent,LangGraph 比 LangChain 更合适。
AutoGen(第 7.3 节已详述)是微软的多 Agent 框架,核心抽象是「可对话的 Agent」。
| 维度 | AutoGen |
|---|---|
| 核心抽象 | 可对话 Agent |
| 适合 | 多 Agent 协作 |
| 灵活性 | 极高(自由组合) |
| 上手难度 | 中 |
| 适用 | 多 Agent 研究、复杂协作 |
CrewAI(第 7.3 节已详述)主打「Crew + Task + Agent」三要素,配置驱动。
| 维度 | CrewAI |
|---|---|
| 核心抽象 | Crew(团队) |
| 配置方式 | 声明式 |
| 上手难度 | 低 |
| 适用 | 中小型多 Agent 任务 |
LlamaIndex 与 LangChain 同期,但它的核心定位是「RAG 与数据增强」——把外部数据接入 LLM。
| 组件 | 含义 |
|---|---|
| Index | 数据索引(向量、树、关键词等) |
| Query Engine | 查询引擎 |
| Retriever | 检索器 |
| Response Synthesizer | 答案合成器 |
| 维度 | LlamaIndex | LangChain |
|---|---|---|
| 强项 | RAG、数据接入 | 通用、链式组合 |
| 抽象 | 数据为中心 | 流程为中心 |
| 适用 | 知识库、问答系统 | 通用 Agent |
💡 LlamaIndex 是「数据为中心」:它的所有抽象都围绕「如何让 LLM 高效使用外部数据」。如果你的 Agent 主要是知识问答/RAG 类,LlamaIndex 比 LangChain 更顺手。
| 框架 | 核心抽象 | 强项 | 上手 | 适用 |
|---|---|---|---|---|
| LangChain | 链 | 通用、生态 | 中 | 通用 LLM 应用 |
| LangGraph | 图 | 复杂状态 | 中高 | 生产级复杂 Agent |
| AutoGen | 可对话 Agent | 多 Agent | 中 | 多 Agent 研究 |
| CrewAI | Crew + Task | 角色协作 | 低 | 中小型多 Agent |
| LlamaIndex | Index | RAG、数据 | 中 | 知识库、问答 |
<svg viewBox="0 0 720 380" xmlns="http://www.w3.org/2000/svg"> <line x1="80" y1="320" x2="680" y2="320" stroke="#475569" stroke-width="2"/> <line x1="80" y1="40" x2="80" y2="320" stroke="#475569" stroke-width="2"/> <text x="680" y="345" font-size="12" fill="#475569" text-anchor="end">单 Agent ↔ 多 Agent</text> <text x="60" y="40" font-size="12" fill="#475569" text-anchor="end" transform="rotate(-90 60 40)">↑ 简单 ↔ 复杂</text> <circle cx="180" cy="120" r="16" fill="#dbeafe" stroke="#2563eb"/> <text x="180" y="125" font-size="12" fill="#1e3a8a" text-anchor="middle" font-weight="bold">LlamaIndex</text> <text x="180" y="155" font-size="10" fill="#475569" text-anchor="middle">RAG 优先</text> <circle cx="280" cy="180" r="16" fill="#fef9c3" stroke="#ca8a04"/> <text x="280" y="185" font-size="12" fill="#713f12" text-anchor="middle" font-weight="bold">LangChain</text> <text x="280" y="215" font-size="10" fill="#475569" text-anchor="middle">链式通用</text> <circle cx="400" cy="120" r="16" fill="#dcfce7" stroke="#16a34a"/> <text x="400" y="125" font-size="12" fill="#14532d" text-anchor="middle" font-weight="bold">LangGraph</text> <text x="400" y="155" font-size="10" fill="#475569" text-anchor="middle">图, 复杂状态</text> <circle cx="540" cy="200" r="16" fill="#fce7f3" stroke="#db2777"/> <text x="540" y="205" font-size="12" fill="#831843" text-anchor="middle" font-weight="bold">CrewAI</text> <text x="540" y="235" font-size="10" fill="#475569" text-anchor="middle">轻量多 Agent</text> <circle cx="600" cy="120" r="16" fill="#f5e1ff" stroke="#9333ea"/> <text x="600" y="125" font-size="12" fill="#581c87" text-anchor="middle" font-weight="bold">AutoGen</text> <text x="600" y="155" font-size="10" fill="#475569" text-anchor="middle">灵活多 Agent</text> <text x="360" y="60" font-size="13" fill="#475569" text-anchor="middle">五大框架定位图</text> </svg>
生产 Agent 不一定只用一个框架——常组合多个框架的优势:
| 组合 | 做法 |
|---|---|
| LangGraph + LangChain | LangGraph 管流程,LangChain 组件当工具 |
| LlamaIndex + LangChain | LlamaIndex 做 RAG,LangChain 做编排 |
| AutoGen + LangChain Tools | AutoGen 做多 Agent,复用 LangChain 工具生态 |
| CrewAI + 自定义工具 | CrewAI 做协作,工具自研 |
💡 框架是工具,不是信仰:不要陷入「我是 LangChain 派」或「我是 AutoGen 派」的派系之争。好的工程师根据任务选工具,必要时混用。
| 反模式 | 表现 | 后果 | 正确做法 |
|---|---|---|---|
| 追新 | 哪个新用哪个 | 频繁迁移 | 看稳定性和生态 |
| 跟风 | 别人用啥我用啥 | 不匹配自己场景 | 按任务选 |
| 死忠一个 | 拒绝其他框架 | 错过更优解 | 按需组合 |
| 过度框架 | 简单任务上重型框架 | 复杂度爆炸 | 简单任务轻量化 |
| 不评估 | 凭感觉选 | 落地变形 | 先 POC 评估 |
| 忽视生态 | 只看核心功能 | 集成困难 | 看工具/文档/社区 |
值得强调:对简单任务,不用框架反而更好。
| 场景 | 推荐 |
|---|---|
| 单步工具调用 | 直接用 LLM SDK |
| 简单 ReAct | 自写循环(几百行代码) |
| 固定流程 | 工作流引擎 |
| 中等复杂 | LangChain/LlamaIndex |
| 复杂多步 | LangGraph |
| 多 Agent | AutoGen/CrewAI |
⚠️ 框架不是必需品:很多优秀 Agent 是直接基于 LLM SDK 写的,没有用任何框架。框架的价值在「省去重复劳动」,但若任务简单,框架带来的复杂度反而超过它省的工作。第 1.2 节的 ReAct 循环用几百行代码就能实现,没必要上框架。