Agent 架构¶
许多 LLM 应用程序在 LLM 调用之前和/或之后会执行特定的控制流步骤。例如,RAG 会检索与用户问题相关的文档,并将这些文档传递给 LLM,以便将模型的响应建立在所提供的文档上下文中。
我们有时希望 LLM 系统能够选择自己的控制流来解决更复杂的问题,而不是硬编码一个固定的控制流!这是 Agent 的一个定义:Agent 是一个使用 LLM 来决定应用程序控制流的系统。 LLM 可以通过多种方式控制应用程序
- LLM 可以在两个潜在路径之间进行路由
- LLM 可以决定调用众多工具中的哪一个
- LLM 可以决定生成的答案是否足够,或者是否需要更多工作
因此,存在许多不同类型的 Agent 架构,它们赋予 LLM 不同程度的控制权。
路由器¶
路由器允许 LLM 从一组指定的选项中选择一个步骤。这是一种控制程度相对有限的 Agent 架构,因为 LLM 通常专注于做出单个决策,并从一组有限的预定义选项中产生特定输出。路由器通常采用几种不同的概念来实现这一点。
结构化输出¶
LLM 的结构化输出通过提供 LLM 在其响应中应遵循的特定格式或模式来工作。这与工具调用类似,但更通用。虽然工具调用通常涉及选择和使用预定义函数,但结构化输出可用于任何类型的格式化响应。实现结构化输出的常用方法包括
- 提示工程:通过系统提示指示 LLM 以特定格式响应。
- 输出解析器:使用后处理从 LLM 响应中提取结构化数据。
- 工具调用:利用某些 LLM 内置的工具调用功能来生成结构化输出。
结构化输出对于路由至关重要,因为它们确保系统的 LLM 决策能够被可靠地解释和执行。在此操作指南中了解更多关于结构化输出的信息。
工具调用 Agent¶
虽然路由器允许 LLM 做出单个决策,但更复杂的 Agent 架构在两个关键方面扩展了 LLM 的控制能力
- 多步决策:LLM 可以做出一系列决策,一个接一个,而不仅仅是一个。
- 工具访问:LLM 可以从各种工具中进行选择和使用,以完成任务。
ReAct 是一种流行的通用 Agent 架构,它结合了这些扩展,集成了三个核心概念。
这种架构允许更复杂和灵活的 Agent 行为,超越了简单的路由,实现了多步骤的动态问题解决。与原始论文不同,今天的 Agent 依赖于 LLM 的工具调用能力,并在一系列消息上操作。
在 LangGraph 中,您可以使用预构建的 Agent 开始使用工具调用 Agent。
工具调用¶
当您希望 Agent 与外部系统交互时,工具非常有用。外部系统(例如 API)通常需要特定的输入模式或有效负载,而不是自然语言。例如,当我们将 API 绑定为工具时,我们让模型了解了所需的输入模式。模型将根据用户的自然语言输入选择调用工具,并返回符合工具所需模式的输出。
许多 LLM 提供商都支持工具调用,并且 LangChain 中的工具调用接口非常简单:您只需将任何 Python function
传递到 ChatModel.bind_tools(function)
中即可。
内存¶
记忆对 Agent 至关重要,使其能够在解决问题的多个步骤中保留和利用信息。它在不同尺度上运作
LangGraph 提供了对记忆实现的完全控制
State
:用户定义的模式,指定要保留的记忆的确切结构。Checkpointer
:在会话中跨不同交互的每一步存储状态的机制。Store
:跨会话存储用户特定或应用程序级别数据的机制。
这种灵活的方法允许您根据特定的 Agent 架构需求来定制记忆系统。有效的记忆管理增强了 Agent 维持上下文、从过去经验中学习并随时间做出更明智决策的能力。有关添加和管理记忆的实用指南,请参阅记忆。
规划¶
在工具调用 Agent 中,LLM 在一个 while 循环中被反复调用。在每一步,Agent 决定调用哪些工具,以及这些工具的输入应该是什么。然后执行这些工具,并将输出作为观察结果反馈给 LLM。当 Agent 决定它有足够的信息来解决用户请求,并且不值得再调用任何工具时,while 循环终止。
自定义 Agent 架构¶
虽然路由器和工具调用 Agent(如 ReAct)很常见,但自定义 Agent 架构通常能为特定任务带来更好的性能。LangGraph 提供了几个强大的功能来构建量身定制的 Agent 系统
人机协作 (Human-in-the-loop)¶
人的参与可以显著提高 Agent 的可靠性,尤其是在处理敏感任务时。这可以包括
- 批准特定操作
- 提供反馈以更新 Agent 状态
- 在复杂的决策过程中提供指导
当完全自动化不可行或不可取时,人在回路(Human-in-the-loop)模式至关重要。在我们的人在回路指南中了解更多。
并行化¶
并行处理对于高效的多 Agent 系统和复杂任务至关重要。LangGraph 通过其 Send API 支持并行化,从而实现
- 并发处理多个状态
- 实现类似 map-reduce 的操作
- 高效处理独立的子任务
有关实际实现,请参阅我们的 map-reduce 教程
子图¶
子图对于管理复杂的 Agent 架构至关重要,尤其是在多 Agent 系统中。它们允许
- 为单个 Agent 进行隔离的状态管理
- Agent 团队的层级化组织
- Agent 与主系统之间的受控通信
子图通过状态模式中的重叠键与父图通信。这实现了灵活、模块化的 Agent 设计。有关实现细节,请参阅我们的子图操作指南。
反思¶
反思机制可以通过以下方式显著提高 Agent 的可靠性
- 评估任务完成度和正确性
- 为迭代改进提供反馈
- 实现自我纠正和学习
虽然反思通常基于 LLM,但也可以使用确定性方法。例如,在编码任务中,编译错误可以作为反馈。这种方法在这个使用 LangGraph 进行自我纠正代码生成的视频中得到了演示。
通过利用这些功能,LangGraph 能够创建复杂的、特定于任务的 Agent 架构,这些架构可以处理复杂的工作流,有效协作,并持续提高其性能。