当前位置: 首页 > news >正文

AI Agent开发学习系列 - LangGraph(1): 用LangGraph创建我们的第一个Agent

LangGraph是什么?

LangGraph 是一个专门用于构建复杂人工智能应用程序的框架,它基于图论的概念来设计和实现智能系统。这个框架的核心思想是将人工智能应用建模为一个由节点和连接线组成的网络结构,其中每个节点代表一个处理步骤,而连接线则定义了数据如何在不同的处理步骤之间流动。

在 LangGraph 的设计理念中,节点可以执行各种不同的任务,比如调用大型语言模型、使用外部工具、处理数据或者做出决策。这些节点通过边连接起来,形成完整的处理流程。特别重要的是,LangGraph 支持条件边,这意味着系统可以根据当前的状态或条件动态地决定下一步应该执行哪个节点,这使得整个系统具有了智能化的决策能力。
状态管理是 LangGraph 的另一个重要特性。系统会自动维护和更新应用的状态信息,包括对话历史、处理结果、用户偏好等各种数据。这种状态管理机制使得应用能够记住之前的交互内容,从而提供更加个性化和连贯的用户体验。

LangGraph 特别适合构建那些需要多步骤推理、复杂决策逻辑或者需要协调多个工具和服务的应用程序。例如,它可以用来创建一个智能客服代理,这个代理不仅能够理解用户的问题,还能够调用各种工具来查找信息、处理请求,并根据情况决定是否需要将问题转交给人工客服。

在实际应用中,开发者首先需要定义应用的状态结构,然后创建各种处理节点,接着将这些节点连接起来形成处理流程,最后编译整个应用。这种模块化的设计使得系统易于扩展和维护,开发者可以轻松地添加新的功能模块或修改现有的处理逻辑。

LangGraph 与 LangChain 生态系统紧密集成,这意味着它可以充分利用 LangChain 提供的各种组件,比如语言模型接口、工具集成、文档处理等功能。这种集成性大大简化了开发过程,使得开发者可以专注于应用的核心逻辑而不是底层的技术细节。

总的来说,LangGraph 为构建复杂的智能应用提供了一个强大而灵活的平台,它特别适合那些需要处理复杂逻辑、维护状态信息、协调多个组件或者需要动态决策能力的应用场景。通过使用 LangGraph,开发者可以更容易地创建出功能强大、逻辑清晰的智能系统。

创建我们的第一个LangGraph Agent

from typing import Dict, TypedDict
from langgraph.graph import StateGraph# Create an agentstate
class AgentState(TypedDict):message: strdef greeting_node(state: AgentState) -> AgentState:"""Simple note that adds a greeting mesage to the state"""state["message"] = "Hey " + state["message"] + ", how is your day going?"return stategraph = StateGraph(AgentState)graph.add_node("greeter", greeting_node)
graph.set_entry_point("greeter")
graph.set_finish_point("greeter")app = graph.compile()from IPython.display import Image, display
display(Image(app.get_graph().draw_mermaid_png()))result =app.invoke({"message": "Bob"})
result["message"]

运行结果:
在这里插入图片描述

'Hey Bob, how is your day going?'

知识点分析

类型注解

typing 是 Python 的内置模块,提供类型注解支持。从 Python 3.5 开始引入,用于静态类型检查,帮助开发者编写更安全、更易维护的代码。

  • Dict 是字典类型的类型注解
    示例:
# 普通字典
my_dict: Dict[str, int] = {"age": 25, "score": 95}# 嵌套字典
nested_dict: Dict[str, Dict[str, int]] = {"user1": {"age": 25, "score": 95},"user2": {"age": 30, "score": 88}
}
  • TypedDict 用于创建具有固定键和类型值的字典。提供结构化的字典类型定义,继承自 dict,但增加了类型检查。
    示例:
class Person(TypedDict):name: strage: intcity: str# 使用
person: Person = {"name": "张三","age": 25,"city": "北京"
}
  • 在LangGraph中的应用
    示例:
class AgentState(TypedDict):message: strhistory: List[str]user_id: str

这个定义:

  • 创建了一个结构化的状态字典
  • 确保状态包含必需的字段和正确的类型
  • 提供 IDE 自动补全和类型检查
  • 使代码更易读和维护

因此,TypedDict 让字典的结构更加明确和类型安全,特别适合在复杂应用(如 LangGraph)中定义状态结构。

langgraph包

langgraph 是一个用于构建复杂 AI 应用程序的 Python 框架,基于图论概念,将 AI 应用建模为节点和边的网络,专门设计用于处理有状态、多步骤的 AI 工作流。
langgraph.graph 是 LangGraph 的核心模块,包含图构建、状态管理、节点定义等核心功能,提供了构建和管理复杂 AI 工作流的所有工具。
StateGraph 是 LangGraph 中最核心的类,用于创建和管理有状态的计算图,继承自 Graph 类,增加了状态管理功能。

StateGraph 的核心特性
  • 状态管理
class AgentState(TypedDict):messages: List[str]user_id: strcontext: Dict[str, Any]graph = StateGraph(AgentState)  # 指定状态类型
  • 节点添加
def process_node(state: AgentState) -> AgentState:# 处理逻辑return stategraph.add_node("processor", process_node)
  • 边定义
# 简单边
graph.add_edge("node1", "node2")# 条件边
def should_continue(state):return "continue" if condition else "end"graph.add_conditional_edges("decision_node",should_continue,{"continue": "next_node", "end": END}
)
  • 基本设置
graph = StateGraph(StateType)# 设置入口点
graph.set_entry_point("start_node")# 设置结束点
graph.set_finish_point("end_node")# 编译图
app = graph.compile()
显示状态图

IPython.display 是 Jupyter 环境中的显示模块,提供了在笔记本中显示各种内容的功能,支持图片、HTML、视频、音频等多种媒体类型。
Image 类用于在 Jupyter 笔记本中显示图片,可以显示本地图片、网络图片或图片数据,支持多种图片格式:PNG、JPG、SVG 等。
display 函数用于在笔记本中显示对象,比 print 更智能,能根据对象类型选择合适的显示方式,支持富文本、图表、交互式组件等。
**app.get_graph()**获取编译后的图对象,返回图的内部表示,包含所有节点和边的信息。
**draw_mermaid_png()**将图转换为 Mermaid 格式的 PNG 图片,Mermaid 是一种用于绘制图表的标记语言,生成可视化的图结构,显示节点和连接关系。

invoke

app 是通过 graph.compile() 编译后的可执行应用,包含了完整的图结构、节点函数和状态管理逻辑,是 LangGraph 应用的运行时实例。
app.invoke() 是 LangGraph 应用的核心执行方法,它将初始状态输入到图中,按照定义的流程执行所有节点,最终返回处理后的状态。

http://www.dtcms.com/a/300026.html

相关文章:

  • 最终一致性VS顺序一致性VS线性一致性(了解)
  • (六) Spring AI 1.0版本 + 千问大模型+RAG
  • 在python3.8和pytorch1.8.1的基础上安装tensorflow
  • Flink是如何实现物理分区?
  • 深入解析C++原子指针std::atomic
  • GIS地理信息系统建设:高精度3D建模
  • [Linux入门] 初学者入门:Linux DNS 域名解析服务详解
  • Anaconda常用命令及环境管理指南
  • kali [DNS劫持] 实验(详细步骤)
  • Containerd简介
  • 【Ubuntu】发展历程
  • 如何做数据增强?
  • 框架式3D打印机结构设计cad【9张】三维图+设计说明书
  • 【升级U8+】不能将值 NULL 插入列 ‘LocaleID‘,表 ‘hr_sys_function_Base‘;列不允许有 Null 值。
  • flink查看taskManager日志
  • 数组内存学习
  • Django5.1(130)—— 表单 API一(API参考)
  • 【Luogu】每日一题——Day14. P5960 【模板】差分约束 (图论 + 最短路)
  • Nacos-服务注册,服务发现(二)
  • mac版SVN客户端
  • Pythong高级入门Day5
  • npm ERR! cb() never called!
  • 昇思学习营-DeepSeek-R1-Distill-Qwen-1.5B 模型LoRA微调学习心得
  • 数据结构 二叉树(2)---二叉树的实现
  • 2025年SEVC SCI2区,混沌编码量子粒子群算法QPSO+柔性车间调度,深度解析+性能实测
  • 每日一题7.26
  • WorkManager vs Flow 适用场景分析
  • 抖音短视频矩阵系统源码搭建---底层框架5年开发分享
  • idea中无法删除模块,只能remove?
  • 二叉搜索树(Binary Search Tree)详解与java实现