跳到主要内容

Agent(智能代理)概念

引言

在人工智能的发展历程中,我们从简单的规则系统发展到了能够自主决策的智能代理。Agent(智能代理)代表了 AI 应用的一个重要进化方向:让 AI 系统能够自主选择执行路径,而不是被动地遵循预定义的流程。

本节将深入探讨 Agent 的核心概念、不同的架构类型,以及它们在 LangGraph 中的实现思路。

Agent 的核心定义

什么是 Agent?

Agent(智能代理) 是一个使用 LLM 来决定应用控制流的系统。与传统的固定流程不同,Agent 能够:

  • 自主决策:根据当前情况选择下一步行动
  • 动态适应:根据环境变化调整策略
  • 工具使用:选择和使用各种外部工具
  • 学习记忆:从历史经验中学习和改进

Agent vs 传统应用

理解 Agent 与传统应用的区别,是掌握 Agent 概念的关键。

传统应用的特点

传统应用采用固定流程:预处理 → LLM调用 → 后处理。执行顺序是预定义的,无论输入是什么,都走相同的路径。

优点:高效、可预测、易于调试 缺点:缺乏灵活性,难以应对复杂场景

Agent 应用的特点

Agent 采用动态决策流程:在一个循环中,Agent 不断地「分析当前状态 → 做出决策 → 执行行动 → 观察结果」,直到任务完成。

核心区别在于:Agent 会根据每一步的执行结果,动态决定下一步该做什么。如果需要调用工具就调用工具,如果需要收集更多信息就继续收集,如果可以回答就直接回答。

优点:灵活、智能、能处理复杂任务 缺点:需要更多设计考虑,执行路径不确定

Agent 架构类型

LangGraph 支持多种 Agent 架构,每种都有其适用场景。

1. 路由器(Router)

路由器是最简单的 Agent 类型,它从预定义的选项中选择单一路径

工作原理

  1. 分析节点解析用户查询,判断其类别(如订单、技术、投诉等)
  2. 根据分类结果和置信度,路由到对应的处理节点
  3. 各处理节点返回专门化的响应

实现要点

  • 使用 addConditionalEdges 实现路由逻辑
  • 路由函数返回目标节点名称
  • 适合有明确分类边界的场景

特点

  • ✅ 简单可靠、易于理解和调试
  • ❌ 控制能力有限、只能做单次决策

2. 工具调用代理(Tool Calling Agent)

工具调用代理能够选择和使用多种工具来完成复杂任务。这是最常用的 Agent 类型。

工作流程

  1. 分析用户需求,判断需要哪些工具
  2. 选择并调用适当的工具(搜索、计算、API调用等)
  3. 获取工具执行结果
  4. 判断是否需要更多工具调用
  5. 整合所有结果,生成最终回答

实现要点

  • 使用 @langchain/core/toolstool 函数定义工具
  • 工具需要有清晰的 namedescription 和输入 schema
  • LLM 根据工具描述自动选择合适的工具

3. ReAct 架构

ReAct(Reasoning + Acting)是一种流行的 Agent 架构,结合了推理、行动和观察的循环。

ReAct 核心概念

ReAct = Reasoning(推理)+ Acting(行动)

这种架构让 Agent 能够:

  1. 推理:分析当前情况,制定计划
  2. 行动:选择并执行工具
  3. 观察:分析工具执行结果
  4. 循环:基于观察结果继续推理和行动

ReAct 的核心思想

传统的 LLM 要么只做推理(思考但不行动),要么只做行动(执行但不思考)。ReAct 将两者结合,让 Agent 在每一步都能够:

  • 思考当前情况和下一步计划
  • 执行选定的行动
  • 观察执行结果
  • 决定是继续还是结束

在 LangGraph 中的实现

ReAct 在 LangGraph 中通过以下节点实现:

  • reasoning 节点:分析状态,生成思考过程
  • action 节点:根据推理结果选择工具
  • tool_execution 节点:执行选定的工具
  • observation 节点:处理和记录工具结果
  • 条件边决定是继续循环还是给出最终答案

Agent 的核心组件

1. 工具调用(Tool Calling)

工具调用是 Agent 与外部系统交互的主要方式。在 LangGraph 中,工具的定义包含三个关键部分:

  • name:工具的唯一标识符
  • description:告诉 LLM 这个工具能做什么(非常重要)
  • schema:使用 zod 定义输入参数的类型和描述
import { tool } from '@langchain/core/tools';
import { z } from 'zod';

const searchTool = tool(
async ({ query }) => {
// 工具的具体实现
return `搜索 "${query}" 的结果...`;
},
{
name: 'search',
description: '搜索相关信息',
schema: z.object({
query: z.string().describe('搜索查询'),
}),
}
);

LLM 会根据工具的 description 来决定何时使用这个工具,所以描述要清晰准确。

2. 记忆管理(Memory)

Agent 需要记忆能力来维护上下文和学习经验。LangGraph 中的记忆分为两种:

短期记忆:存储在状态中,包括当前对话的消息历史、当前任务状态、最近的工具调用结果等。这些信息在单次会话中持久存在。

长期记忆:通过持久化层实现,包括用户偏好、历史交互记录、领域知识积累等。这些信息跨会话保存。

在状态设计中,通常使用 messages 数组配合 messagesStateReducer 来管理对话历史,这是最常见的短期记忆模式。

3. 规划能力(Planning)

复杂任务需要 Agent 具备规划能力:

规划能力的实现思路:

  1. 接收复杂任务后,先进行任务分析
  2. 将大任务分解为可执行的子任务
  3. 按顺序或并行执行子任务
  4. 根据执行结果动态调整计划
  5. 最终整合所有结果

自定义 Agent 架构

人机协作 Agent

在某些场景下,Agent 需要人类参与决策。这种模式称为 Human-in-the-Loop(人机交互)。

适用场景

  • 高风险操作(如删除数据、支付转账)
  • 需要专业判断的决策
  • 合规性要求人工审批的流程

实现思路

  1. 分析任务,评估风险等级
  2. 制定行动计划,列出可能的风险和替代方案
  3. 高风险操作暂停执行,等待人工审批
  4. 根据人工反馈执行相应操作

在 LangGraph 中,可以使用 interrupt 功能来暂停图的执行,等待外部输入后继续。

多代理系统

多个专业化 Agent 协作完成复杂任务:

多代理系统的优势

  • 每个 Agent 专注于特定领域,提高专业性
  • 可以并行处理不同任务
  • 通过协调器统一管理,保持一致性

实践指导

选择合适的 Agent 架构

架构类型适用场景优点缺点
路由器明确分类任务、有限选项简单可靠控制有限
工具调用代理需要外部API、多步骤任务灵活强大需要好的工具设计
ReAct复杂推理、多轮交互透明可解释可能较慢

Agent 设计最佳实践

  1. 明确定义职责范围:Agent 应该有清晰的能力边界
  2. 设计清晰的工具接口:工具描述要准确,参数要明确
  3. 实现有效的错误处理:预期可能的失败场景
  4. 建立合适的记忆策略:根据需要选择短期或长期记忆
  5. 设置安全边界:限制 Agent 的操作权限
安全考虑

在设计 Agent 时,必须考虑安全性:

  • 输入验证:严格验证所有用户输入
  • 权限控制:限制 Agent 的操作权限
  • 恶意防护:防止恶意提示注入
  • 操作日志:记录所有关键操作
  • 异常处理:优雅处理错误和异常情况

小结与延伸

通过本节学习,你应该理解了:

  • Agent 的核心概念:自主决策、动态适应、工具使用、学习记忆
  • 主要架构类型:路由器、工具调用代理、ReAct 架构
  • 核心组件:工具调用、记忆管理、规划能力
  • 自定义架构:人机协作、多代理系统
  • 设计原则:职责明确、接口清晰、安全可靠

在下一节《环境搭建》中,我们将学习如何搭建 LangGraph 开发环境,为实际开发做好准备。

相关资源


下一步

准备好开始实际开发了吗?让我们继续学习《环境搭建》!