附录 C - Agentic 框架快速概览
LangChain
LangChain 是一个用于开发由 LLM 驱动的应用程序的框架。其核心优势在于 LangChain 表达语言(LCEL),它允许您将组件“串联”到一个链中。这创建了一个清晰的线性序列,其中一个步骤的输出成为下一个步骤的输入。它专为有向无环图(DAG)的工作流而设计,这意味着流程以一个方向流动,没有循环。
适用于:
- 简单的 RAG:检索文档,创建提示,获取 LLM 的回答。
- 摘要生成:接收用户文本,将其输入到摘要生成提示中,并返回输出。
- 数据提取:从文本块中提取结构化数据(如 JSON)。
Python
| `# 一个简单的 LCEL 链的概念 # (这不是可运行代码,仅用于说明流程) chain = prompt | model | output_parse` |
|---|---|---|
LangGraph
LangGraph 是一个基于 LangChain 构建的库,用于处理更高级的 Agentic 系统。它允许您将工作流定义为一个具有节点(函数或 LCEL 链)和边(条件逻辑)的图。其主要优势在于能够创建循环,使应用程序能够灵活地循环、重试或调用工具,直到任务完成。它显式管理应用程序状态,该状态在节点之间传递并在整个过程中更新。
适用于:
- 多智能体系统:一个监督智能体将任务分配给专业的工作智能体,可能循环执行直到目标完成。
- 计划与执行智能体:智能体创建计划,执行步骤,然后基于结果循环更新计划。
- 人类参与:图可以等待人类输入,然后决定接下来进入哪个节点。
| 功能 | LangChain | LangGraph |
|---|---|---|
| 核心抽象 | 链(使用 LCEL) | 节点图 |
| 工作流类型 | 线性(有向无环图) | 循环(带有循环的图) |
| 状态管理 | 通常每次运行时无状态 | 显式且持久的状态对象 |
| 主要用途 | 简单、可预测的序列 | 复杂、动态、状态化的智能体 |
应该选择哪一个?
- 当您的应用程序具有清晰、可预测的线性步骤流程时,请选择 LangChain。如果您可以从 A 到 B 到 C 定义流程,而无需回到之前的步骤,使用 LCEL 的 LangChain 是完美的工具。
- 当您的应用程序需要推理、规划或在循环中操作时,请选择 LangGraph。如果您的智能体需要使用工具、反思结果,并可能尝试不同的方法,您需要 LangGraph 的循环和状态化特性。
Python
# 图状态类
```python
class State(TypedDict):
topic: str
joke: str
story: str
poem: str
combined_output: str
# 节点
def call_llm_1(state: State):
"""第一次调用 LLM 以生成初始笑话"""
msg = llm.invoke(f"Write a joke about {state['topic']}")
return {"joke": msg.content}
def call_llm_2(state: State):
"""第二次调用 LLM 以生成故事"""
msg = llm.invoke(f"Write a story about {state['topic']}")
return {"story": msg.content}
def call_llm_3(state: State):
"""第三次调用 LLM 以生成诗歌"""
msg = llm.invoke(f"Write a poem about {state['topic']}")
return {"poem": msg.content}
def aggregator(state: State):
"""将笑话和故事组合成一个输出"""
combined = f"Here's a story, joke, and poem about {state['topic']}!\n\n"
combined += f"STORY:\n{state['story']}\n\n"
combined += f"JOKE:\n{state['joke']}\n\n"
combined += f"POEM:\n{state['poem']}"
return {"combined_output": combined}
构建工作流
parallel_builder = StateGraph(State)
# 添加节点
parallel_builder.add_node("call_llm_1", call_llm_1)
parallel_builder.add_node("call_llm_2", call_llm_2)
parallel_builder.add_node("call_llm_3", call_llm_3)
parallel_builder.add_node("aggregator", aggregator)
# 添加边以连接节点
parallel_builder.add_edge(START, "call_llm_1")
parallel_builder.add_edge(START, "call_llm_2")
parallel_builder.add_edge(START, "call_llm_3")
parallel_builder.add_edge("call_llm_1", "aggregator")
parallel_builder.add_edge("call_llm_2", "aggregator")
parallel_builder.add_edge("call_llm_3", "aggregator")
parallel_builder.add_edge("aggregator", END)
parallel_workflow = parallel_builder.compile()
# 显示工作流
display(Image(parallel_workflow.get_graph().draw_mermaid_png()))
# 调用
state = parallel_workflow.invoke({"topic": "cats"})
print(state["combined_output"])
Google 的 ADK
Google 的 Agent Development Kit(简称 ADK)提供了一个高层次的结构化框架,用于构建和部署由多个交互式 AI 智能体组成的应用程序。与 LangChain 和 LangGraph 相比,ADK 提供了一个更具指导性和面向生产的系统,用于协调智能体之间的协作,而不是仅仅提供构建智能体内部逻辑的基本构件。
LangChain 处于最基础的层面,提供组件和标准化接口,用于创建操作序列,例如调用模型和解析其输出。LangGraph 通过引入更灵活且强大的控制流扩展了这一功能;它将智能体的工作流视为一个有状态的图。使用 LangGraph,开发者可以显式定义节点(函数或工具)和边(执行路径)。这种图结构允许复杂的循环推理,系统可以循环、重试任务,并基于显式管理的状态对象做出决策。它为开发者提供了对单个智能体思维过程的细粒度控制,或者从零开始构建多智能体系统的能力。
```markdown
Google的ADK抽象化了许多底层的图构建工作。开发者无需定义每个节点和边,ADK提供了用于多智能体交互的预构建架构模式。例如,ADK内置了智能体类型,如SequentialAgent或ParallelAgent,这些智能体可以自动管理不同智能体之间的控制流。它围绕“团队”智能体的概念进行架构设计,通常由一个主智能体将任务分配给专门的子智能体。状态和会话管理由框架隐式处理,这种方式比LangGraph的显式状态传递更具整体性但粒度较低。因此,虽然LangGraph提供了设计单个机器人或团队复杂连接的详细工具,Google的ADK则提供了一个工厂流水线,用于构建和管理一支已经具备协作能力的机器人团队。
### Python
```python
from google.adk.agents import LlmAgent
from google.adk.tools import google_Search
dice_agent = LlmAgent(
model="gemini-2.0-flash-exp",
name="question_answer_agent",
description="A helpful assistant agent that can answer questions.",
instruction="""Respond to the query using google search""",
tools=[google_search],
)
这段代码创建了一个增强搜索功能的智能体。当该智能体接收到问题时,它不仅依赖于自身的预先知识,还会按照指令使用Google搜索工具从网络中查找相关的实时信息,并基于这些信息构建答案。
Crew.AI
CrewAI提供了一个专注于协作角色和结构化流程的多智能体系统编排框架。它以更高的抽象层次运作,提供了一个反映人类团队的概念模型。开发者无需像定义图形逻辑流那样进行细粒度设计,而是定义参与者及其任务分配,CrewAI则负责管理它们的交互。
该框架的核心组件包括智能体(Agents)、任务(Tasks)和团队(Crew)。智能体不仅通过其功能定义,还包括一个角色、目标和背景故事,这些元素指导其行为和沟通风格。任务是一个具有明确描述和预期输出的独立工作单元,分配给特定智能体。团队是包含智能体和任务列表的整体单元,并执行预定义的流程。该流程通常是顺序的(一个任务的输出成为下一个任务的输入),或者是层级式的(类似经理的智能体分配任务并协调其他智能体之间的工作流)。
与其他框架相比,CrewAI占据了独特的位置。它摒弃了LangGraph中低级、显式状态管理和控制流的方式,开发者无需连接每个节点和条件边。与其构建状态机,开发者更像是在设计团队章程。而Google的ADK提供了一个全面的、面向生产的智能体生命周期平台,CrewAI则专注于智能体协作逻辑以及模拟专家团队的功能。
Python
@crew
def crew(self) -> Crew:
"""Creates the research crew"""
return Crew(
agents=self.agents,
tasks=self.tasks,
process=Process.sequential,
verbose=True,
)
这段代码为一组AI智能体设置了一个顺序工作流,智能体将按照特定顺序处理任务列表,并启用详细日志记录以监控其进展。
其他智能体开发框架
```markdown
**Microsoft AutoGen**: AutoGen 是一个框架,专注于通过对话协调多个智能体以解决任务。其架构使具有不同能力的智能体能够交互,从而实现复杂问题的分解和协作解决。AutoGen 的主要优势在于其灵活的、以对话为驱动的方法,支持动态且复杂的多智能体交互。然而,这种对话范式可能导致执行路径的不确定性,并可能需要复杂的提示工程以确保任务高效收敛。
**LlamaIndex**: LlamaIndex 本质上是一个数据框架,旨在将大型语言模型与外部和私有数据源连接起来。它擅长创建复杂的数据摄取和检索管道,这对于构建能够执行 RAG(检索增强生成)的智能智能体至关重要。尽管其数据索引和查询能力在创建上下文感知智能体方面极为强大,但与以智能体为核心的框架相比,其在复杂智能体控制流和多智能体协调方面的原生工具较为欠缺。当核心技术挑战是数据检索和综合时,LlamaIndex 是最佳选择。
**Haystack**: Haystack 是一个开源框架,专为构建由语言模型驱动的可扩展且生产就绪的搜索系统而设计。其架构由模块化、可互操作的节点组成,这些节点构成了文档检索、问答和摘要的管道。Haystack 的主要优势在于其专注于性能和可扩展性,适用于大规模信息检索任务,使其成为企业级应用的理想选择。一个潜在的权衡是,其设计优化于搜索管道,在实现高度动态和创造性的智能体行为方面可能较为僵化。
**MetaGPT**: MetaGPT 通过基于预定义的标准操作程序(SOPs)分配角色和任务来实现多智能体系统。该框架结构化智能体协作,模拟软件开发公司,智能体承担产品经理或工程师等角色以完成复杂任务。这种基于 SOP 的方法能够生成高度结构化和连贯的输出,这对于代码生成等专业领域来说是显著优势。该框架的主要局限性在于其高度专业化,使其在核心设计之外的通用智能体任务中适应性较低。
**SuperAGI**: SuperAGI 是一个开源框架,旨在为自主智能体提供完整的生命周期管理系统。它包含智能体配置、监控以及图形界面等功能,旨在提高智能体执行的可靠性。其关键优势在于专注于生产就绪性,内置机制处理常见故障模式(如循环问题),并提供对智能体性能的可观察性。一个潜在的缺点是,其综合平台方法可能比更轻量级的库框架引入更多的复杂性和开销。
**Semantic Kernel**: 由 Microsoft 开发的 Semantic Kernel 是一个 SDK,通过“插件”和“规划器”系统将大型语言模型与传统编程代码集成。它允许 LLM 调用原生函数并编排工作流,有效地将模型视为更大软件应用中的推理引擎。其主要优势在于与现有企业代码库(特别是 .NET 和 Python 环境)的无缝集成。然而,其插件和规划器架构的概念复杂性可能比更简单的智能体框架呈现更高的学习曲线。
Strands Agents:
一种轻量且灵活的 AWS SDK,采用模型驱动的方法来构建和运行 AI 智能体。其设计注重简单性和可扩展性,支持从基础的对话助手到复杂的多智能体自主系统。该框架具有模型无关性,广泛支持各种大型语言模型(LLM)提供商,并与 MCP 原生集成,便于访问外部工具。其核心优势在于简单和灵活,提供易于上手的可定制智能体循环。潜在的权衡在于其轻量化设计可能需要开发者构建更多的外围运营基础设施,例如高级监控或生命周期管理系统,而这些功能可能在更全面的框架中开箱即用。
结论
智能体框架的生态系统提供了多样化的工具,从用于定义智能体逻辑的低级库到用于协调多智能体协作的高级平台。在基础层面,LangChain 支持简单的线性工作流,而 LangGraph 引入了用于更复杂推理的有状态循环图。更高级的框架如 CrewAI 和 Google 的 ADK 将重点转向协调具有预定义角色的智能体团队,而像 LlamaIndex 这样的框架则专注于数据密集型应用。这种多样性为开发者提供了在基于图的系统的精细控制和更具主观性的开发平台之间的核心权衡。因此,选择合适的框架取决于应用是否需要简单的顺序流程、动态推理循环或一个管理良好的专家团队。最终,这个不断发展的生态系统通过选择项目所需的精确抽象级别,使开发者能够构建越来越复杂的 AI 系统。
参考文献
- LangChain, https://www.langchain.com/
- LangGraph, https://www.langchain.com/langgraph
- Google's ADK, https://google.github.io/adk-docs/
- Crew.AI, https://docs.crewai.com/en/introduction