本指南回顾常见的工作流和智能体模式。
  • 工作流具有预定的代码路径,并被设计为按特定顺序运行。
  • 智能体是动态的,并定义它们自己的流程和工具使用。
智能体工作流 在构建智能体和工作流时,LangGraph 提供了多项优势,包括持久性、流式处理,以及对调试和部署的支持。
使用 LangSmith 追踪并比较这些工作流模式。按照追踪快速入门查看数据如何流经每个步骤。我们还建议您设置 LangSmith Engine,它可以监控您的追踪、检测问题并提出修复方案。

设置

要构建工作流或智能体,您可以使用支持结构化输出和工具调用的任何聊天模型。以下示例使用 Anthropic:
  1. 安装依赖项:
  1. 初始化 LLM:

LLM 与增强

工作流和智能体系统基于 LLM 以及您添加到其中的各种增强功能。工具调用、结构化输出和短期记忆是几种根据您的需求定制 LLM 的选项。 LLM 增强

提示链

提示链是指每次 LLM 调用处理前一次调用的输出。它通常用于执行定义明确、可以分解为更小、可验证步骤的任务。一些例子包括:
  • 将文档翻译成不同语言
  • 验证生成内容的一致性
提示链

并行化

并行化是指 LLM 同时处理一项任务。这可以通过同时运行多个独立的子任务来完成,或者多次运行同一任务以检查不同的输出。并行化通常用于:
  • 分解子任务并并行运行,从而提高速度
  • 多次运行任务以检查不同的输出,从而增加置信度
一些例子包括:
  • 运行一个处理文档关键词的子任务,同时运行另一个子任务检查格式错误
  • 运行一个任务多次,根据不同的标准(如引用数量、使用的来源数量和来源质量)对文档的准确性进行评分
parallelization.png

路由

路由工作流处理输入,然后将其引导至特定上下文的任务。这使您可以为复杂任务定义专门的流程。例如,一个用于回答产品相关问题的工作流可能首先处理问题类型,然后将请求路由到特定流程,如定价、退款、退货等。 routing.png

编排器-工作者

在编排器-工作者配置中,编排器:
  • 将任务分解为子任务
  • 将子任务委派给工作者
  • 将工作者的输出综合成最终结果
worker.png 编排器-工作者工作流提供更高的灵活性,通常用于无法像并行化那样预先定义子任务的情况。这在需要编写代码或需要更新多个文件内容的工作流中很常见。例如,一个需要更新未知数量文档中多个 Python 库安装说明的工作流可能会使用这种模式。

在 LangGraph 中创建工作者

编排器-工作者工作流很常见,LangGraph 对其有内置支持。Send API 允许您动态创建工作者节点并向其发送特定输入。每个工作者都有自己的状态,所有工作者的输出都写入一个共享的状态键,该键对编排器图是可访问的。这使得编排器可以访问所有工作者的输出,并允许将其综合成最终输出。下面的示例遍历章节列表,并使用 Send API 将每个章节发送给一个工作者。

评估器-优化器

在评估器-优化器工作流中,一次 LLM 调用生成响应,另一次评估该响应。如果评估器或人在回路确定响应需要改进,则提供反馈并重新生成响应。此循环持续进行,直到生成可接受的响应。 评估器-优化器工作流通常用于任务有特定成功标准,但需要迭代才能达到该标准的情况。例如,在两种语言之间翻译文本时,并不总是有完美的匹配。可能需要几次迭代才能生成两种语言中含义相同的翻译。 evaluator_optimizer.png

智能体 (Agents)

智能体 (Agents) 通常实现为一个使用 工具 执行操作的 LLM。它们在连续的反馈循环中运行,适用于问题和解决方案无法预测的场景。智能体比工作流拥有更多的自主权,可以决定使用哪些工具以及如何解决问题。你仍然可以定义可用的工具集以及智能体行为的准则。 agent.png
要开始使用智能体,请参阅 快速入门 或阅读更多关于 其工作原理 的内容(在 LangChain 中)。
使用工具

工具节点 (ToolNode)

@[ToolNode] 是一个预构建节点,用于在 LangGraph 工作流中执行工具。它自动处理并行工具执行、错误处理和状态注入。 当你需要精细控制图如何执行工具时,请使用 @[ToolNode]。这是驱动许多 LangGraph 智能体模式中工具执行的基本构建块。

从工具中访问图状态和上下文

由 ToolNode 执行的工具将模型生成的参数作为其第一个参数接收。要读取模型未生成的、图侧的数据,请使用以下选项之一:
  • 在 Python 中,从注入的 @[ToolRuntime] 参数读取状态和运行时作用域上下文。
  • 在 JavaScript 中,从工具的第二个参数(类型为 @[ToolRuntime])读取状态和运行时作用域上下文。
工具只能访问传递给 ToolNode 的状态值。当 ToolNode 直接作为 StateGraph 节点添加时,该输入就是当前的图状态。如果你从另一个节点手动调用 ToolNode,当工具需要自定义状态字段时,请传递完整状态。例如,tool_node.invoke(state) 或 toolNode.invoke(state, config) 会暴露完整状态,而只传递 {"messages": state["messages"]} 或 { messages: state.messages } 则只暴露 messages。