一、什么是Agent

Agent 本质是一种能自主感知环境、做决策并执行任务的智能实体,核心是 “自主性” 而非简单的工具调用。

它并非单一技术,而是融合了多种 AI 能力的综合体,目的是减少人类在复杂任务中的干预。

Agent 的核心特征

  1. 自主感知与理解:能主动获取信息,比如读取邮件、分析文档或理解用户指令,无需人类逐步输入。

  2. 目标驱动决策:明确任务目标后,会自主拆解步骤。例如,接到 “规划旅行” 指令时,会自动拆解为订机票、查酒店、做行程等子任务。

  3. 动态执行与调整:执行中遇到问题会灵活应对。比如航班取消时,能自动重新查询并推荐替代航班,而非停滞等待人类指示。

Agent 与传统 AI 工具的区别

很多人会混淆 Agent 和 ChatGPT 这类生成式 AI,两者的核心差异在于 “主动性”。

对比维度

Agent(智能体)

传统 AI 工具(如 ChatGPT)

核心逻辑

目标驱动,主动完成任务

指令驱动,被动响应查询

交互方式

一次指令后自主推进,按需反馈

需人类逐轮输入指令,依赖持续引导

典型场景

自动写周报、管理项目进度、智能客服

回答问题、生成文案、翻译文本

以用户需要 “订一家西湖边适合老人吃的餐厅” 为例,Agent 的工作流程如下:

  1. 大模型基座解析意图:Agent 首先通过大模型基座来理解用户需求,识别出关键信息,如 “西湖附近”“适合老人”“清淡口味”“人均 200 以内”“订位” 等。同时,大模型还会推理出一些潜在需求,比如餐厅最好有无障碍设施,方便老人进出,菜品需要少油少盐等。

  2. RAG 检索补充信息:利用 RAG 技术,Agent 从点评网站等外部数据源抓取西湖周边餐厅的数据,筛选出评分 4.5 以上且有 “无障碍设施” 标签的店家。然后,Agent 会检查最新评论,排除近期服务差或已歇业的选项,确保推荐的餐厅是可靠的。

  3. 工具调用执行操作:Agent 调用地图 API 计算用户酒店到餐厅的距离,确保餐厅在步行 15 分钟内可达,方便老人前往。接着,Agent 接入订座系统,自动填写人数、时间,并在备注中注明 “需要一楼座位”,以满足老人腿脚不便的需求。

  4. 生成最终结果:最后,Agent 将推荐结果反馈给用户,例如:“推荐楼外楼(孤山路店),主打杭帮菜,有清蒸鲈鱼、龙井虾仁等清淡菜品。已帮您预订周六晚 6 点 4 人桌,一楼靠窗(无台阶)。人均 180 元,点击确认订位信息。”

Agent 与大模型是互补共生的关系,大模型为 Agent 提供智能决策支持,而 Agent 则扩展了大模型的能力边界,使其从知识库转变为行动者。以下是具体说明:

  • 大模型是 Agent 的 “超级大脑”:大模型,如 GPT-4、Claude 等,是基于海量数据训练的深度学习系统,拥有强大的语言理解、知识存储和逻辑推理能力。它为 Agent 提供了智能决策支持,主要体现在三个层面。

    • 环境感知层面:大模型能够准确理解用户的自然语言指令,把握其真实意图。例如,当用户提出 “帮我策划一次台北旅行” 时,大模型可以理解用户想要去东京旅游的需求。

    • 任务规划层面:大模型可以将抽象的目标转化为具体的执行步骤。对于 “策划东京旅行” 的需求,大模型能够自动将其分解为查询机票、预订酒店、安排行程等子任务。

    • 推理判断层面:大模型能够根据执行过程中的实时反馈及时调整策略,确保任务的顺利推进。如在预订酒店时,如果遇到所选酒店已满房的情况,大模型可以根据其他条件重新推荐合适的酒店。

  • Agent 是大模型的 “行动手脚”:Agent 不是一个单一的模型,而是一个具备环境感知、任务规划、决策执行等综合能力的完整智能系统。它通过其功能模块扩展了大模型的能力边界。

    • 突破知识滞后问题:Agent 可以集成各种 API 接口和软件工具,使大模型能够获取实时信息。例如,在查询天气时,Agent 可以调用天气 API 获取最新的天气数据,解决了大模型知识滞后的问题。

    • 突破上下文长度限制:借助向量数据库等记忆机制,Agent 突破了大模型的上下文长度限制,使其能够处理更复杂的长期任务。比如在处理长篇文档时,Agent 可以通过记忆机制记住文档的关键信息,以便更好地理解和处理文档内容。

    • 约束 “幻觉” 风险:Agent 可以引入规则引擎和安全校验机制,有效约束大模型的 “幻觉” 风险,提高任务执行的可靠性。例如,在医疗数据处理场景中,Agent 通过双模决策机制,将数据分析的准确率从 70% 显著提升至 98%。

二、AutoGen Studio、Dify

AutoGen Studio 是微软开源的多智能体 AI 系统开发框架 AutoGen 的低代码界面,Dify 则是一个开源的 LLM 应用开发平台。

  • AutoGen Studiomicrosoft.github.io

    • 基本概述:AutoGen Studio 是一个用于快速原型化 AI 智能体的低代码界面,它基于 AutoGen AgentChat 构建,后者是一个用于构建多智能体应用程序的高级 API。

    • 主要功能:它提供了团队构建器、游乐场、组件库和部署四大主要界面。团队构建器是一个可视化界面,可通过声明式规范或拖放操作创建智能体团队,并支持配置所有核心组件;游乐场是一个交互式环境,用于测试和运行智能体团队,具备消息实时流、消息流可视化等功能;组件库是发现和导入社区创建组件的中心枢纽,便于集成第三方组件;部署功能可以将智能体团队导出为 Python 代码,并在 Docker 容器中运行。

    • 特点:AutoGen Studio 主要用于帮助开发者快速原型化多智能体工作流,并展示使用 AutoGen 构建的最终用户界面示例,但它并非是一个可用于生产环境的应用。

  • Dify

    • 基本概述:Dify 是一个面向未来的开源 LLM 应用开发平台,融合了后端即服务与 LLMOps 理念,为开发者和企业提供生产级的生成式 AI 应用构建能力。

    • 主要功能:Dify 提供 AI 应用工厂、企业知识中枢、AI Gateway、Workflow Studio 四大核心产品形态。AI 应用工厂通过低代码界面可快速创建客服机器人等场景化应用;企业知识中枢可构建私有化 AI 大脑,支持多种语言的知识检索与推理;AI Gateway 可统一管理模型 API,实现流量控制与安全审计;Workflow Studio 可可视化编排包含 API 调用、数据库查询的复杂业务流。

    • 特点:Dify 支持数百个开源与商业模型,独创蜂巢架构设计,可实现模型、插件、数据源的动态编排,还内置企业级 RAG 引擎,具备 LLMOps 监控体系。其具有生产就绪性,通过了 ISO 27001 认证,支持千万级日请求处理,同时具有开放性设计,可无缝对接多种云服务,还具备开发者友好、企业级特性强、成本控制佳等特点。

笔者认为AutoGen Studio学习成本比较高,但是值得一试,Dify上手容易,但是到目前为止笔者也不觉着Dify是个企业级的框架。后面有机会笔者会单独出一篇介绍AutoGen Studio的文章。

三、LangGraph构建多智能体

笔记计划后面写一个单独的专栏介绍LangGraph4j

3.1、LangGraph 核心:用 “图思维” 理解多智能体​

LangGraph 的本质是将多智能体的协作逻辑建模为有向图结构,通过三大核心组件实现任务的自动流转与协作,这也是它区别于传统线性工作流工具的关键。​

1. 三大核心组件​

  • 状态(State):多智能体的 “共享记事本”,存储对话历史、设备数据、任务进度等所有流转信息。通常用TypedDict定义结构化格式,支持所有节点读写修改,是协作的核心载体。​

  • 节点(Node):智能体的 “功能工作站”,每个节点对应一个具体任务逻辑,可是子智能体、工具调用或普通函数。例如 “设备状态查询节点”“工单创建节点” 均为独立功能单元。​

  • 边(Edge):流程的 “交通指挥员”,定义节点间的流转规则。支持固定流转(如 “查询后必执行分析”)和条件流转(如 “温度异常则创建工单,正常则直接反馈”)。​

2. 运行机制:超步骤驱动的自动协作​

LangGraph 采用 “超步骤(Super-Step)” 机制实现高效运行,流程如下:​

  1. 初始状态下所有节点处于 “非活跃” 状态,START 节点接收用户输入后激活首个节点;​

  2. 活跃节点执行逻辑并更新状态,通过边将新状态传递给下一个节点;​

  3. 每个超步骤结束后,未收到新消息的节点自动 “投票停止”;​

  4. 当所有节点均非活跃且无消息流转时,流程终止(抵达 END 节点)。​

这种机制确保了多智能体既能并行处理任务,又能根据实时状态动态调整流程,完美适配复杂场景的协作需求。​

3.2、撸代码

构建一个智能工厂的运维智能体

以 “处理设备异常并安排检修” 为例,我们构建包含 3 个核心智能体的系统:主管 Agent(总协调)、设备状态查询 Agent(数据获取)、维保任务调度 Agent(工单处理)。​

1. 环境准备​

(1)安装依赖​

首先安装核心库,包含 LangGraph 框架、大模型集成和状态存储工具:​

pip install langchain langchain-openai langgraph python-dotenv typing_extensions

(2)初始化配置​

创建.env文件存储 API 密钥,并用 SQLite 实现短期记忆(对话状态保存)、内存存储模拟长期记忆(设备历史数据):​

# main.py​
import os​
from dotenv import load_dotenv​
from langgraph.checkpoint.sqlite import SqliteSaver​
from langgraph.store.memory import InMemoryStore​
​
# 加载环境变量​
load_dotenv()​
​
# 短期记忆:保存对话上下文,支持中断恢复​
short_term_memory = SqliteSaver.from_conn_string(":memory:")​
# 长期记忆:存储设备历史故障数据,生产环境可替换为Redis/Postgres​
long_term_memory = InMemoryStore()

2. 定义全局状态​

设计AgentState作为共享数据结构,包含所有智能体需要的信息,确保协作时数据互通:​

from typing import TypedDict, Annotated, List​
from langgraph.graph.message import AnyMessage, add_messages​
​
class AgentState(TypedDict):​
    # 对话历史:自动聚合消息,支持多轮交互​
    messages: Annotated[List[AnyMessage], add_messages]​
    # 设备历史故障:从长期记忆加载​
    device_history: str​
    # 当前操作设备ID:如"C-101"(1号数控车床)​
    device_id: str​
    # 安全机制:防止无限循环​
    remaining_steps: int

3. 构建子智能体节点​

(1)设备状态查询 Agent​

采用 ReAct 风格实现,包含工具定义和节点逻辑,负责查询设备实时数据:​--

from langchain_core.tools import tool​
from langgraph.prebuilt import ToolNode​
        "C-101": {"name": "1号数控车床", "status": "告警", "temp": 95.2, "pressure": 2.8},​
        "P-205": {"name": "5号加压泵", "status": "正常", "temp": 68.1, "pressure": 1.3}​
    }​
    return mock_db.get(device_id, {"error": "设备ID不存在"})​
​
# 2. 创建工具节点:LangGraph预置,自动处理工具调用​
tool_node = ToolNode([query_device_status])​
​
# 3. 定义状态更新逻辑:将查询结果写入对话历史​
def device_agent(state: AgentState) -> AgentState:​
    # 调用工具节点获取数据​
    tool_result = tool_node(state)​
    # 更新状态:添加工具返回结果​
    state["messages"].append(AnyMessage(content=f"设备状态查询结果:{tool_result}"))​
    state["remaining_steps"] -= 1​
    return state

(2)维保任务调度 Agent​

使用 LangGraph 预置的create_react_agent快速构建,专注于工单创建:​

from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent

# 1. 初始化大模型
llm = ChatOpenAI(model="gpt-4o", api_key=os.getenv("OPENAI_API_KEY"))

# 2. 定义工单创建工具
@tool
def create_maintenance_ticket(device_id: str, issue: str) -> str:
    """为故障设备创建维保工单,需提供设备ID和问题描述"""
    # 生产环境替换为真实工单系统API调用
    ticket_id = f"MT-{device_id}-{hash(issue)[:6]}"
    return f"维保工单创建成功,ID:{ticket_id},问题:{issue}"

# 3. 快速创建React风格Agent
maintenance_agent = create_react_agent(
    llm,
    tools=[create_maintenance_ticket],
    system_message="你是维保任务调度员,根据设备故障信息创建工单,必填设备ID和问题描述"
)

# 4. 封装为图节点
def maintenance_node(state: AgentState) -> AgentState:
    result = maintenance_agent(state)
    state["messages"].append(AnyMessage(content=f"工单处理结果:{result['messages'][-1].content}"))
    state["remaining_steps"] -= 1
    return state

4. 构建主管 Agent(核心调度逻辑)​

主管 Agent 作为 “总指挥”,负责解析用户意图并路由任务,通过条件边实现动态流转:​

def supervisor_agent(state: AgentState) -> str:
    """根据用户意图返回下一个节点:device_agent/maintenance_node/END"""
    user_query = state["messages"][0].content  # 获取用户初始请求
    llm = ChatOpenAI(model="gpt-3.5-turbo")
    
    # 意图分类提示词
    prompt = f"""
    分析用户请求,判断需要调用的节点:
    - 若包含"温度""状态""参数"等词,返回"device_agent"
    - 若包含"检修""工单""维修"等词,返回"maintenance_node"
    - 若任务完成,返回"END"
    用户请求:{user_query}
    """
    response = llm.invoke(prompt).content.strip()
    return response

5. 编排图结构并运行​

将所有节点和边组合为完整图,实现任务自动流转:​

from langgraph.graph import StateGraph, START, END

# 1. 初始化图
graph_builder = StateGraph(AgentState)

# 2. 添加节点
graph_builder.add_node("device_agent", device_agent)  # 设备查询节点
graph_builder.add_node("maintenance_node", maintenance_node)  # 工单创建节点
graph_builder.add_node("supervisor", lambda s: s)  # 主管节点(仅做路由)

# 3. 定义边规则
# 起始节点→主管节点
graph_builder.add_edge(START, "supervisor")
# 主管节点→条件流转(根据意图路由)
graph_builder.add_conditional_edges(
    "supervisor",
    supervisor_agent,  # 路由函数
    {
        "device_agent": "device_agent",
        "maintenance_node": "maintenance_node",
        "END": END
    }
)
# 子节点处理后返回主管节点,继续判断
graph_builder.add_edge("device_agent", "supervisor")
graph_builder.add_edge("maintenance_node", "supervisor")

# 4. 编译图(启用记忆机制)
graph = graph_builder.compile(
    checkpointer=short_term_memory,  # 启用短期记忆
    interrupt_before=["maintenance_node"]  # 可选:人机回环,创建工单前确认
)

# 5. 运行多智能体系统
if __name__ == "__main__":
    # 用户输入:1号车床温度异常,帮我安排检修
    initial_state = {
        "messages": [AnyMessage(content="C-101号车床温度异常,帮我安排检修")],
        "device_history": "C-101曾在3个月前因温度过高停机",
        "device_id": "C-101",
        "remaining_steps": 5  # 最多执行5步,防止循环
    }
    
    # 执行流程并输出结果
    for step in graph.stream(initial_state):
        for node, value in step.items():
            print(f"【{node}】处理结果:{value['messages'][-1].content}")

6. 运行结果​

系统将自动执行以下流程并输出:​

  1. 【supervisor】处理结果:路由至 device_agent​

  2. 【device_agent】处理结果:设备状态查询结果:{"name": "1 号数控车床", "status": "告警", "temp": 95.2, "pressure": 2.8}​

  3. 【supervisor】处理结果:路由至 maintenance_node​

  4. 【maintenance_node】处理结果:工单处理结果:维保工单创建成功,ID:MT-C-101-2f8d1a,问题:1 号数控车床温度 95.2℃,状态告警​

3.3、LangGraph 多智能体进阶技巧​

1. 人机回环(Human-in-the-Loop)​

在关键节点添加人工确认,提升系统可靠性。例如创建工单前中断流程:​

# 编译图时添加中断点
graph = graph_builder.compile(
    checkpointer=short_term_memory,
    interrupt_before=["maintenance_node"]  # 工单创建前中断
)

# 人工确认后继续执行
for step in graph.stream(initial_state):
    if "interrupt" in step:
        user_confirm = input("是否创建维保工单?(y/n)")
        if user_confirm == "y":
            graph.resume()  # 继续执行
        else:
            graph.abort()   # 终止流程

2. 记忆优化​

  • 短期记忆:用SqliteSaver替换InMemorySaver,支持对话持久化;​

  • 长期记忆:将InMemoryStore改为 Redis/Postgres,存储设备历史数据、用户偏好等跨会话信息。​

3. 可观测性建设​

集成 LangFuse 实现流程跟踪与评估,定位节点性能瓶颈:​

import langfuse
from langfuse.langchain import LangfuseCallbackHandler

# 初始化LangFuse
langfuse.init(
    public_key=os.getenv("LANGFUSE_PUBLIC_KEY"),
    secret_key=os.getenv("LANGFUSE_SECRET_KEY"),
    host="https://cloud.langfuse.com"
)

# 运行时添加回调
for step in graph.stream(initial_state, callbacks=[LangfuseCallbackHandler()]):
    # 处理步骤...

通过 LangFuse 可直观看到每个节点的执行时间、工具调用次数,轻松优化系统效率。​

3.4、LangGraph vs 其他多智能体框架​

特性​

LangGraph​

AutoGen​

Dify​

核心定位​

图结构工作流框架​

多智能体对话协作框架​

低代码 LLM 应用平台​

灵活性​

高(全代码控制节点 / 边)​

中(基于对话规则)​

低(可视化拖拽,限制多)​

状态管理​

原生支持共享状态​

依赖消息传递​

内置状态管理​

生产就绪性​

需自行封装部署​

需二次开发​

内置部署、监控功能​

适用场景​

复杂流程多智能体(工业、金融)​

对话式协作(客服、创作)​

快速迭代 LLM 应用(企业助手)​

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐