附录C - 智能体框架快速概述

智能体设计模式:构建智能系统的实战指南 阅读 24 次

附录C - 智能体框架快速概述

LangChain

LangChain是一个由大型语言模型(LLM)驱动的应用程序开发框架。其核心优势在于LangChain表达式语言(LCEL),它允许您将组件“管道”连接成链。这创建了一个清晰、线性的序列,其中一步的输出成为下一步的输入。它专为有向无环图(DAGs)的工作流程构建,意味着流程单向流动,没有循环。

用于:

  • 简单RAG:检索文档,创建提示,从LLM获取答案。 摘要:接收用户文本,将其输入到摘要提示中,并返回输出结果。
  • 提取:从一段文本中提取结构化数据(如JSON)。

Python 是一种广泛使用的高级编程语言,以其简洁明了的语法和强大的标准库而闻名。它被设计为易于学习和阅读,同时提供了丰富的库和框架,支持多种编程范式,包括面向对象、命令式和函数式编程。Python 在许多领域都有应用,包括网站开发、数据分析、人工智能、自动化和科学计算等。由于其跨平台特性和强大的社区支持,Python 成为了全球开发者社区中非常受欢迎的语言之一。

# A simple LCEL chain conceptually # (This is not runnable code, just illustrates the flow)
chain = prompt | model | output_parse

LangGraph

LangGraph 是建立在 LangChain 之上的库,用于处理更高级的智能体系统。它允许您将工作流程定义为一个由节点(函数或 LCEL 链)和边(条件逻辑)组成的图。其主要优势是能够创建循环,使应用程序能够循环、重试或以灵活的顺序调用工具,直到任务完成。它显式管理应用程序状态,该状态在节点之间传递并在整个过程中更新。

用于:

多智能体系统:一个监督智能体将任务路由到专门的工人智能体,可能循环执行,直到达到目标。 计划与执行智能体:智能体创建一个计划,执行一个步骤,然后根据结果回环更新计划。 人机协同:该图在决定下一步访问哪个节点之前,可以等待人类输入。

Feature LangChain LangGraph
Core Abstraction Chain (using LCEL) Graph of Nodes
Workflow Type Linear (Directed Acyclic Graph) Cyclical (Graphs with loops)
State Management Generally stateless per run Explicit and persistent state object
Primary Use Simple, predictable sequences Complex, dynamic, stateful agents

您应该使用哪一个?

选择LangChain,当您的应用程序具有清晰、可预测且线性的步骤流程时。如果您能够从A到B再到C定义流程,而不需要回环,带有LCEL的LangChain就是完美的工具。 选择LangGraph,当您的应用程序需要在循环中进行推理、规划或操作时。如果您的智能体需要使用工具、反思结果,并可能尝试不同的方法,您就需要LangGraph的循环和状态化特性。

Python(Python是一种广泛使用的高级编程语言,具有简洁明了的语法,广泛应用于网站开发、数据分析、人工智能等领域。)

# Graph state class
class State(dict):
    topic: str
    joke: str
    story: str
    poem: str
    combined_output: str

# Nodes
def call_llm_1(state: State) -> dict:
    """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) -> dict:
    """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) -> dict:
    """Third LLM call to generate poem"""
    msg = llm.invoke(f"Write a poem about {state['topic']}")
    return {"poem": msg.content}

def aggregator(state: State) -> dict:
    """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)
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工作流程。其主要目的是针对给定主题同时生成一个笑话、一个故事和一个诗歌,然后将它们合并成一个格式化的文本输出。

谷歌的ADK

谷歌的智能体开发工具包(ADK)提供了一个高级、结构化的框架,用于构建和部署由多个相互作用的AI智能体组成的应用程序。它与LangChain和LangGraph形成对比,通过提供一个更具观点性和面向生产的系统来协调智能体的协作,而不是提供构建智能体内部逻辑的基本构建块。

LangChain在最基础层面运行,提供创建操作序列的组件和标准化接口,例如调用模型并解析其输出。LangGraph通过引入更灵活、更强大的控制流来扩展这一功能;它将智能体的工作流程视为一个有状态的图。使用LangGraph,开发者可以明确定义节点,这些节点是函数或工具,以及边,这些边规定了执行路径。这种图结构允许进行复杂的循环推理,系统可以在节点之间循环、重试任务,并基于一个明确管理的状态对象(在节点之间传递)做出决策。它赋予了开发者对单个智能体思维过程的细粒度控制,或者从第一原理构建多智能体系统的能力。

谷歌的ADK将许多底层图构建的工作抽象化。它不是要求开发者定义每一个节点和边,而是提供了预构建的架构模式,用于多智能体交互。例如,ADK内置了诸如SequentialAgent(顺序智能体)或ParallelAgent(并行智能体)等智能体类型,这些类型可以自动管理不同智能体之间的控制流。它围绕“智能体团队”的概念进行架构设计,通常有一个主要智能体将任务委派给专门的子智能体。状态和会话管理由框架更隐式地处理,提供了一种比LangGraph显式状态传递更统一但更细粒度的方法。因此,虽然LangGraph为你提供了详细工具来设计单个机器人或团队的复杂连接,但谷歌的ADK为你提供了一个工厂装配线,旨在构建和管理一支已经知道如何协同工作的机器人车队。

Python(Python)是一种广泛使用的高级编程语言,它具有简洁明了的语法,易于学习,同时支持多种编程范式,包括面向对象、命令式和函数式编程。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],
)

此代码创建了一个搜索增强型智能体。当该智能体接收到一个问题,它不仅会依赖其预先存在的知识。相反,遵循其指示,它将使用谷歌搜索工具从网络中查找相关、实时的信息,然后利用这些信息构建其答案。

Crew.AI

CrewAI提供了一种编排框架,用于构建多智能体系统,它专注于协作角色和结构化流程。它的工作抽象层次高于基础工具包,提供了一个与人类团队相对应的概念模型。开发者不是将逻辑流程的细粒度定义为图,而是定义演员及其分配的任务,CrewAI则管理它们的交互。

该框架的核心组件包括智能体、任务和船员。智能体的定义不仅限于其功能,还包括一个角色,一个目标以及一个背景故事,这些因素指导其行为和沟通风格。任务是一个具有明确描述和预期输出的独立工作单元,分配给特定的智能体。船员是一个包含智能体和任务列表的凝聚力单元,它执行预定义的过程。这个过程规定了工作流程,通常是顺序型,即一个任务的输出成为下一个任务的输入,或者层次型,其中类似管理员的智能体分配任务并协调其他智能体之间的工作流程。

与其他框架相比,CrewAI占据了一个独特的位置。它摆脱了LangGraph的低级、显式的状态管理和控制流,在LangGraph中,开发者需要连接每个节点和条件边。CrewAI不是构建状态机,而是开发者设计团队章程。虽然Google的ADK为整个智能体生命周期提供了一个全面、面向生产的平台,但CrewAI专注于智能体协作的逻辑,并模拟一个专家团队。

Python

Python 是一种广泛使用的高级编程语言,以其简洁明了的语法和强大的标准库而闻名。它被设计为易于学习,同时提供了丰富的库和框架,支持多种编程范式,包括面向对象、命令式和函数式编程。

Python 的特点包括:

  • 简洁的语法:Python 的语法接近英语,易于阅读和编写。
  • 跨平台:Python 可以在多种操作系统上运行,包括 Windows、macOS 和 Linux。
  • 丰富的库:Python 拥有庞大的标准库,以及大量的第三方库,用于各种应用,如数据分析、机器学习、网络开发等。
  • 动态类型:Python 是动态类型的语言,这意味着变量不需要在声明时指定类型。
  • 解释型:Python 是解释型语言,这意味着代码在运行时被解释器逐行执行,而不是编译成机器码。

Python 在许多领域都有应用,包括但不限于:

  • Web 开发:使用 Django、Flask 等框架。
  • 数据科学和机器学习:使用 NumPy、Pandas、Scikit-learn、TensorFlow 和 PyTorch 等库。
  • 自动化脚本:用于自动化日常任务和测试。
  • 科学计算:使用 SciPy 和 Matplotlib 等库。
  • 网络编程:使用 Socket 编程和第三方库如 Requests。

Python 的这些特点使其成为初学者和专业人士都非常受欢迎的编程语言。

@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的主要优势在于其灵活的、以对话驱动的 approach,支持动态和复杂的智能体交互。然而,这种对话范式可能导致执行路径的不确定性,并可能需要复杂的提示工程来确保任务高效收敛。

  • LlamaIndex:LlamaIndex 基本上是一个数据框架,旨在将大型语言模型与外部和私有数据源连接起来。它在创建复杂的数据摄取和检索管道方面表现出色,这对于构建能够执行 RAG 的知识型智能体至关重要。虽然其数据索引和查询能力对于创建具有上下文感知能力的智能体非常强大,但其原生工具在复杂智能体控制流和多智能体编排方面相较于以智能体为中心的框架发展较为不足。当核心技术挑战是数据检索和综合时,LlamaIndex 是最佳选择。

  • Haystack:Haystack是一个开源框架,旨在构建由语言模型驱动的可扩展和适用于生产的搜索系统。其架构由模块化、可互操作的节点组成,这些节点形成用于文档检索、问答和摘要的管道。Haystack的主要优势在于其专注于性能和可扩展性,适用于大规模信息检索任务,使其适用于企业级应用。潜在的权衡是,其设计针对搜索管道进行了优化,对于实现高度动态和创造性的智能体行为可能更为僵化。

  • MetaGPT:MetaGPT通过根据预定义的一组标准操作程序(SOPs)分配角色和任务,实现了一个多智能体系统。该框架通过模拟软件开发公司的协作结构,让智能体承担产品经理或工程师等角色,以完成复杂任务。这种以SOP驱动的方案产生了高度结构化和连贯的输出,这对于代码生成等特定领域来说是一个显著的优势。该框架的主要局限性是其高度专业化,使其在核心设计之外,对通用目的的智能体任务适应性较差。

  • SuperAGI:SuperAGI是一个开源框架,旨在为自主智能体提供完整的生命周期管理系统。它包括智能体配置、监控和图形界面等功能,旨在提高智能体执行的可靠性。其关键优势在于专注于生产就绪性,内置处理常见故障模式(如循环)的机制,并提供对智能体性能的可观察性。潜在的缺点是其全面平台方法可能比更轻量级的基于库的框架引入更多的复杂性和开销。

  • 语义内核:由微软开发,语义内核是一个SDK,它通过“插件”和“规划器”系统将大型语言模型与传统的编程代码集成。它允许LLM调用本地函数并编排工作流程,将模型作为一个推理引擎嵌入到更大的软件应用中。其主要的优势在于与现有企业代码库的无缝集成,尤其是在.NET和Python环境中。与更直接的智能体框架相比,其插件和规划器架构的概念开销可能会带来更陡峭的学习曲线。

  • Strands智能体:一款轻量级且灵活的AWS SDK,采用模型驱动的方法来构建和运行AI智能体。它旨在简单且可扩展,支持从基本的对话助手到复杂的多元智能体自主系统的一切。该框架对模型无特定要求,为各种LLM提供商提供广泛支持,并原生集成MCP,便于访问外部工具。其核心优势在于其简单性和灵活性,拥有可定制的智能体循环,易于上手。潜在的权衡在于,其轻量级设计意味着开发者可能需要构建更多的周边运营基础设施,如高级监控或生命周期管理系统,而这些可能是在更全面的框架中即提供的。

结论

智能体框架的领域提供了多样化的工具,从用于定义智能体逻辑的低级库到用于协调多智能体协作的高级平台。在基础层面,LangChain实现了简单、线性的工作流程,而LangGraph则引入了具有状态和循环的图,以支持更复杂的推理。像CrewAI和谷歌的ADK这样的高级框架将重点转向协调具有预定义角色的智能体团队,而像LlamaIndex这样的框架则专注于数据密集型应用。这种多样性为开发者带来了核心权衡:在基于图的系统的细粒度控制与更简洁的、具有特定观点的平台开发之间。因此,选择合适的框架取决于应用是否需要简单的序列、动态推理循环或管理团队的专业人员。最终,这个不断发展的生态系统使开发者能够通过选择项目所需的确切抽象级别来构建越来越复杂的AI系统。

参考文献

  1. LangChain
  2. LangGraph
  3. Google的ADK
  4. Crew.AI