LangChain
LangChain 是一个用于开发由 LLMs 驱动的应用的框架。其核心优势在于 LangChain 表达式语言(LCEL),它允许你将组件"管道化"组合成一条链。这会创建一个清晰的线性序列,其中一步的输出成为下一步的输入。它为有向无环图(DAG)的工作流而构建,意味着流程单向流动且没有循环。
适用场景:
- 简单 RAG:检索文档、创建提示词,并从 LLM 获取答案。
- 摘要:获取用户文本,输入到摘要提示词中,并返回输出。
- 抽取:从一段文本中抽取结构化数据(如 JSON)。
py
# A simple LCEL chain conceptually
# (This is not runnable code, just illustrates the flow)
chain = prompt | model | output_parse
LangGraph
LangGraph 是构建在 LangChain 之上的库,用于处理更高级的智能体系统。它允许你将工作流定义为一个图,包含节点(函数或 LCEL 链)和边(条件逻辑)。其主要优势是能够创建循环,使应用可以灵活地循环、重试或按任意顺序调用工具,直到任务完成。它显式管理应用状态,状态在节点之间传递并在整个过程中更新。
适用场景:
- 多智能体系统:一个监督智能体将任务分配给专业的工作智能体,并可能循环执行直到达成目标。
- 计划与执行智能体:智能体先制定计划,执行一步,然后根据结果回到更新计划的循环中。
- 人类参与:图形流程可以在决定下一个要前往的节点之前等待人类输入。
特征 | LangChain | LangGraph |
---|---|---|
核心抽象 | Chain(使用 LCEL) | 节点图 |
工作流类型 | 线性(有向无环图) | 循环(包含循环的图) |
状态管理 | 通常每次运行是无状态的 | 显式且持久的状态对象 |
主要用途 | 简单、可预测的序列 | 复杂、动态、具状态的智能体 |
你该选择哪一个?
- 当你的应用具有清晰、可预测且线性的步骤流程时,选择 LangChain。如果你能将流程定义为从 A 到 B 再到 C 而无需回环,使用带有 LCEL 的 LangChain 是完美工具。
- 当你的应用需要进行推理、规划或在循环中运行时,选择 LangGraph。如果你的智能体需要使用工具、反思结果,并可能以不同方法重试,那么你需要 LangGraph 的循环性和有状态特性。
py
# Graph state
class State(TypedDict):
topic: str
joke: str
story: str
poem: str
combined_output: str
# Nodes
def call_llm_1(state: State):
"""First LLM call to generate initial joke"""
msg = llm.invoke(f"Write a joke about {state['topic']}")
return {"joke": msg.content}
def call_llm_2(state: State):
"""Second LLM call to generate story"""
msg = llm.invoke(f"Write a story about {state['topic']}")
return {"story": msg.content}
def call_llm_3(state: State):
"""Third LLM call to generate poem"""
msg = llm.invoke(f"Write a poem about {state['topic']}")
return {"poem": msg.content}
def aggregator(state: State):
"""Combine the joke and story into a single output"""
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}
# Build workflow
parallel_builder = StateGraph(State)
# Add nodes
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)
# Add edges to connect nodes
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()
# Show workflow
display(Image(parallel_workflow.get_graph().draw_mermaid_png()))
# Invoke
state = parallel_workflow.invoke({"topic": "cats"})
print(state["combined_output"])
这段代码定义并运行了一个并行执行的 LangGraph 工作流。它的主要目的,是同时围绕给定主题生成一个笑话、一篇故事和一首诗,然后将它们合并为一个格式化的文本输出。
Google's ADK
Google 的 Agent Development Kit(ADK,智能体开发工具包)提供了一个用于构建和部署由多个、可交互的 AI 智能体组成的应用的高级、结构化框架。与 LangChain 和 LangGraph 相比,它提供的是更具主见且面向生产的智能体协作编排系统,而不是为智能体内部逻辑提供基础构件。
LangChain 处于最基础的层级,提供用于创建操作序列(例如调用模型并解析其输出)的组件与标准化接口。LangGraph 在此基础上引入了更灵活且更强大的控制流;它将智能体的工作流视为一个有状态的图。使用 LangGraph,开发者会显式定义节点(即函数或工具)以及边(决定执行路径)。这种图结构支持复杂的循环式推理,使系统能够循环、重试任务,并基于在节点之间传递的显式管理的状态对象做出决策。它为开发者提供对单个智能体思考过程的精细控制,或从第一性原理构建一个多智能体系统的能力。
Google 的 ADK 抽象掉了大量底层的图构建工作。它并不是要求开发者定义每一个节点和边,而是提供了用于多智能体交互的预构建架构模式。例如,ADK 内置了像 SequentialAgent 或 ParallelAgent 这样的智能体类型,能够自动管理不同智能体之间的控制流。其架构围绕"团队"的概念展开,通常由一个主智能体将任务委派给专业的子智能体。状态与会话管理更多由框架隐式处理,相较于 LangGraph 显式传递状态的方式,它提供了更统一但粒度更粗的方案。因此,LangGraph 为你提供了精细设计单个机器人或团队内部复杂连线的工具,而 Google 的 ADK 则更像是一条工厂装配线,用于构建并管理一支已经懂得协作的机器人队伍。
py
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 Search 工具从网络中查找相关的实时信息,然后基于这些信息构建答案。
Crew.AI
CrewAI 提供了一个面向协作角色与结构化流程的多智能体系统编排框架。它工作的抽象层级高于基础型工具包,提供了一种贴近人类团队的概念模型。开发者无需像构图那样定义细粒度的逻辑流,而是定义参与者及其分工,随后由 CrewAI 管理他们的交互。
该框架的核心组成包括 Agents、Tasks 和 Crew。Agent 不仅由其功能定义,还由其人设来定义,包括特定的角色、目标与背景故事,这些会引导其行为与沟通风格。Task 是一个离散的工作单元,具有清晰的描述与预期输出,并分配给特定的 Agent。Crew 是包含 Agents 和任务列表的整体单元,并执行预定义的 Process。该流程规定了工作流,通常要么是顺序式(一个任务的输出成为下一个任务的输入),要么是分层式(类似经理的智能体进行任务分派并协调其他智能体的工作流)。
与其他框架相比,CrewAI 处于一个独特的位置。它摆脱了 LangGraph 低层的、显式的状态管理与控制流(开发者需要连好每个节点和条件边)。开发者不再构建状态机,而是设计团队章程。虽然 Google 的 ADK 为整个智能体生命周期提供了全面、面向生产的平台,CrewAI 则专注于智能体协作逻辑以及模拟专家团队。
py
@crew
def crew(self) -> Crew:
"""Creates the research crew"""
return Crew(
agents=self.agents,
tasks=self.tasks,
process=Process.sequential,
verbose=True,
)
这段代码为一支 AI 智能体团队设定了顺序式工作流,他们将按特定顺序处理一系列任务,并启用详细日志以监控其执行进度。
其他智能体开发框架
Microsoft AutoGen
AutoGen 是一个以编排多智能体对话协作完成任务为中心的框架。其架构使具备不同能力的智能体能够交互,从而实现复杂问题的分解与协同解决。AutoGen 的主要优势在于其灵活的、以对话驱动的方式,支持动态且复杂的多智能体交互。但这种对话范式可能带来较难预测的执行路径,并可能需要复杂的提示工程以确保任务高效收敛。
LlamaIndex
LlamaIndex 本质上是一个将大语言模型与外部及私有数据源连接起来的数据框架。它擅长构建复杂的数据摄取与检索管道,这对于构建能够执行 RAG 的知识型智能体至关重要。尽管其数据索引与查询能力在打造具备上下文感知的智能体方面极为强大,但与以智能体为先的框架相比,其原生的复杂智能体控制流与多智能体编排工具相对不够完善。当核心技术挑战是数据检索与综合时,LlamaIndex 是最优选择。
Haystack
Haystack 是一个开源框架,专为构建由语言模型驱动、可扩展且可投入生产的搜索系统而设计。其架构由模块化、可互操作的节点组成,这些节点可构成用于文档检索、问答与摘要的管道。Haystack 的主要优势在于其对大规模信息检索任务的性能与可扩展性的专注,使其适用于企业级应用。一个潜在权衡在于,其为搜索管道优化的设计在实现高度动态与创造性的智能体行为时可能更为刚性。
MetaGPT
MetaGPT 通过基于预定义的标准操作流程(SOP)分配角色与任务来实现多智能体系统。该框架将智能体协作结构化,模拟一家软件开发公司,智能体承担如产品经理或工程师等角色以完成复杂任务。这种以 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, www.langchain.com/
- LangGraph, www.langchain.com/langgraph
- Google's ADK, google.github.io/adk-docs/
- Crew.AI, docs.crewai.com/en/introduc...