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

LangGraph 简单入门介绍

文章目录

  • LangGraph 关键组件
    • 节点(Node):
    • 边(Edge):
    • 状态(State):
  • LangGraph 工作原理
  • Hello World(单个node的langgraph)
    • 安装
    • 代码
    • 输出:
  • 成条flow的LangGraph
    • 运行聊天机器人,通过键入 quit、exit 或 q 来退出聊天循环。

LangGraph 关键组件

节点(Node):

编码代理逻辑的 Python 函数。它们接收当前的 State 作为输入,执行一些计算或副作用,并返回一个更新的 State。

• 大模型
• 工具
• 业务逻辑
• 子图

边(Edge):

Python 函数,根据当前的 State 决定接下来执行哪个 Node。它们可以是条件分支或固定转换。

• 入口边
• 普通边
• 条件边

状态(State):

一个共享数据结构,表示应用程序的当前快照。它可以是任何 Python 类型,但通常是 TypedDict 或
Pydantic BaseModel。

• 上下文与持久化
• 节点数据

LangGraph 工作原理

通过组合 Nodes 和 Edges,您可以创建复杂、循环的工作流,使 State 随时间演进。
然而,真正的力量来自于 LangGraph 如何管理 State。
需要强调的是:Nodes 和 Edges 不过是 Python 函数——它们可以包含一个 LLM,也可以只是普通的 Python 代码。
简而言之:节点完成工作,边指示下一步该做什么。

Hello World(单个node的langgraph)

安装

pip install --upgrade langgraph langchain langchain-community langchain-core

代码

from langgraph.prebuilt import create_react_agent
from langchain_community.chat_models import ChatTongyillm = ChatTongyi(model_name="qwen-turbo",temperature=0.7,streaming=True,dashscope_api_key="你的API密钥"  # 替换为你的真实API密钥
)agent = create_react_agent(model=llm,tools=[],prompt="You are a helpful assistant."
)for chunk in agent.stream({"messages": [{"role": "user", "content": "你是谁?"}]},  # 注意这里可能是 "messages" 而非 "message"stream_mode="messages"
):print(chunk)print("\n")

输出:

(AIMessageChunk(content='I', additional_kwargs={}, response_metadata={}, id='run--7b29819a-fd9f-48b3-bba0-cd6b38720819'), {'langgraph_step': 1, 'langgraph_node': 'agent', 'langgraph_triggers': ('branch:to:agent',), 'langgraph_path': ('__pregel_pull', 'agent'), 'langgraph_checkpoint_ns': 'agent:3192f963-14db-387b-ae08-7c332a2263eb', 'checkpoint_ns': 'agent:3192f963-14db-387b-ae08-7c332a2263eb', 'ls_provider': 'tongyi', 'ls_model_type': 'chat', 'ls_model_name': 'qwen-turbo'})(AIMessageChunk(content=' am', additional_kwargs={}, response_metadata={}, id='run--7b29819a-fd9f-48b3-bba0-cd6b38720819'), {'langgraph_step': 1, 'langgraph_node': 'agent', 'langgraph_triggers': ('branch:to:agent',), 'langgraph_path': ('__pregel_pull', 'agent'), 'langgraph_checkpoint_ns': 'agent:3192f963-14db-387b-ae08-7c332a2263eb', 'checkpoint_ns': 'agent:3192f963-14db-387b-ae08-7c332a2263eb', 'ls_provider': 'tongyi', 'ls_model_type': 'chat', 'ls_model_name': 'qwen-turbo'})(AIMessageChunk(content=' Q', additional_kwargs={}, response_metadata={}, id='run--7b29819a-fd9f-48b3-bba0-cd6b38720819'), {'langgraph_step': 1, 'langgraph_node': 'agent', 'langgraph_triggers': ('branch:to:agent',), 'langgraph_path': ('__pregel_pull', 'agent'), 'langgraph_checkpoint_ns': 'agent:3192f963-14db-387b-ae08-7c332a2263eb', 'checkpoint_ns': 'agent:3192f963-14db-387b-ae08-7c332a2263eb', 'ls_provider': 'tongyi', 'ls_model_type': 'chat', 'ls_model_name': 'qwen-turbo'})(AIMessageChunk(content='wen', additional_kwargs={}, response_metadata={}, id='run--7b29819a-fd9f-48b3-bba0-cd6b38720819'), {'langgraph_step': 1, 'langgraph_node': 'agent', 'langgraph_triggers': ('branch:to:agent',), 'langgraph_path': ('__pregel_pull', 'agent'), 'langgraph_checkpoint_ns': 'agent:3192f963-14db-387b-ae08-7c332a2263eb', 'checkpoint_ns': 'agent:3192f963-14db-387b-ae08-7c332a2263eb', 'ls_provider': 'tongyi', 'ls_model_type': 'chat', 'ls_model_name': 'qwen-turbo'})

这是一个简单的helloworld例子,可以看到langgraph_node,但只有一个(“agent”)

成条flow的LangGraph

创建一个 StateGraph 为“状态机”,添加 节点 来表示 LLM 和聊天机器人可以调用的函数,并添加 边 来指定机器人应如何在这些函数之间进行转换。

定义:定义图时,第一步是定义其 状态。状态 包括图的模式和处理状态更新的 reducer 函数。在我们的示例中,状态 是一个具有一个键:messages 的 TypedDict。 add_messages reducer 函数用于将新消息追加到列表中,而不是覆盖它。没有 reducer 注解的键将覆盖先前的值。

from typing import Annotatedfrom typing_extensions import TypedDictfrom langgraph.graph import StateGraph, START
from langgraph.graph.message import add_messagesclass State(TypedDict):# Messages have the type "list". The `add_messages` function# in the annotation defines how this state key should be updated# (in this case, it appends messages to the list, rather than overwriting them)messages: Annotated[list, add_messages]graph_builder = StateGraph(State)

我们的图现在可以处理两个关键任务

每个 节点 都可以接收当前 状态 作为输入,并输出状态的更新。 对 消息 的更新将追加到现有列表而不是覆盖它。

接下来,添加一个“chatbot”节点。 节点 表示工作单元,通常是普通的 Python 函数。

from langchain_community.chat_models import ChatTongyi
# 或者使用
# from langchain_community.llms import Tongyi# 设置通义千问的 API Key
# os.environ["DASHSCOPE_API_KEY"] = "your-dashscope-api-key"# 初始化通义千问模型
llm = ChatTongyi(model_name="qwen-turbo",  # 或者 "qwen-plus", "qwen-max"temperature=0.7,streaming=True
)

将聊天模型集成到一个简单的节点中

def chatbot(state: State):return {"messages": [llm.invoke(state["messages"])]}# The first argument is the unique node name
# The second argument is the function or object that will be called whenever
# the node is used.
graph_builder.add_node("chatbot", chatbot)

添加一个 入口 点,以告诉图每次运行时从何处开始工作

graph_builder.add_edge(START, "chatbot")

在运行图之前,我们需要对其进行编译。我们可以通过在图构建器上调用 compile() 来完成。这将创建一个 CompiledGraph,我们可以在我们的状态上调用它。

graph = graph_builder.compile()

您可以使用 get_graph 方法和其中一个“绘图”方法(例如 draw_ascii 或 draw_png)来可视化图。这些 draw 方法都需要额外的依赖项。

from IPython.display import Image, displaytry:display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:# This requires some extra dependencies and is optionalpass

这里很简单地显示了node和Edge。

运行聊天机器人,通过键入 quit、exit 或 q 来退出聊天循环。

def stream_graph_updates(user_input: str):for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):for value in event.values():print("Assistant:", value["messages"][-1].content)while True:try:user_input = input("User: ")if user_input.lower() in ["quit", "exit", "q"]:print("Goodbye!")breakstream_graph_updates(user_input)except:# fallback if input() is not availableuser_input = "What do you know about LangGraph?"print("User: " + user_input)stream_graph_updates(user_input)break

输出:

Assistant: 我是通义千问,是阿里巴巴集团旗下的通义实验室自主研发的超大规模语言模型。我的中文名是通义千问,英文名是Qwen。我能够回答问题、创作文字、编程、逻辑推理等多种任务,旨在为用户提供高质量的信息服务和帮助。如果你有任何问题或需要帮助,我会尽力为你提供支持。
Assistant: 你好,Wilson!很高兴认识你。有什么我可以帮你的吗?😊
Assistant: “我是谁?”这个问题是哲学、心理学和宗教中一个深刻而复杂的问题。从不同的角度来看,可能会有不同的答案:### 1. **从哲学的角度**
- **笛卡尔**说:“我思故我在。”(*Cogito, ergo sum*)——你存在的证明是你在思考。
- **佛教**认为,“我”是虚幻的,是五蕴(色、受、想、行、识)的暂时组合,没有永恒不变的“自我”。
- **存在主义**(如萨特)认为,“我”是通过选择和行动定义的,人是自由的,必须为自己的存在负责。### 2. **从心理学的角度**
- **弗洛伊德**将“我”分为本我(潜意识欲望)、自我(现实中的理性部分)和超我(道德规范)。
- **现代心理学**认为,“自我”是通过经验、记忆、社会关系和文化构建的,是一个动态的过程,而非固定不变的本质。### 3. **从宗教或灵性的角度**
-**基督教**中,“我是谁”可能与上帝的爱、救赎和使命有关。
-**印度教**中,“我”(Atman)被认为是与宇宙本体(Brahman)同一的永恒灵魂。
-**道家**思想中,“我”可能是自然的一部分,追求与“道”的合一。### 4. **从日常生活的角度**
- 你是**一个独特的个体**,拥有自己的思想、情感、经历和价值观。
- 你是**你所做的一切**:你的选择、你的行为、你与他人的关系。
- 你也是**你所相信的**:你对世界的理解、你对意义的追寻。### 5. **或许更简单一点:**
“你是你自己。”  
你不需要去寻找一个终极的答案,因为“你是谁”是一个不断被重新定义的过程。你可以在探索中成长,在体验中理解自己。如果你愿意,可以告诉我更多关于你的经历或想法,我可以帮你一起思考这个问题。
Goodbye!
http://www.dtcms.com/a/389848.html

相关文章:

  • Docker 部署 DzzOffice:服务器 IP 转发功能是否需要开启
  • 无人机避障——卡内基梅隆大学(CMU)CERLAB 无人机自主框架复现
  • 正点原子zynq_FPGA-初识ZYNQ
  • Vue3中对比ref,reactive,shallowRef,shallowReactive
  • 通过Freemark渲染数据到Word里并生成压缩包
  • Vue 项目中使用 AbortController:解决请求取消、超时与内存泄漏问题
  • 设置管家婆服务器开机自动启动
  • ubuntu20 安装 ros2 foxy
  • 二分查找(二分查找算法)
  • 贪心算法应用:超图匹配问题详解
  • Hadoop3.3.5搭建指南(双NN版本)
  • 如何正确写Controller?参数校验、异常处理
  • 线性代数:LU与Cholesky分解
  • 饮用水在线监测设备:实时、精准地捕捉水体中的关键参数,为供水安全提供全方位保障
  • 【环境搭建】Conda安装教程
  • Java与机器学习的结合:库与应用!
  • DHCP基本原理及实验(ENSP配置)
  • 高系分十一:软件需求工程
  • MCP Server Chart AntV 项目解析
  • 2025药物市场调研分析案例(模板资源分享)
  • 飞网出口网关:安全便捷地访问受限资源
  • 大模型训练的三大显存优化策略
  • 动态加载js链接、异步传参加载组件、有趣打印
  • 【Python】Python异常、模块与包
  • 第三方网站系统测试:【基于Pytest的自动化测试框架的测试】
  • 每个 SIwave 求解器的正确激励
  • 给 C++ Protobuf“装上 Abseil”版本确认、Bazel/CMake 实战与避坑
  • Java 大视界 -- Java 大数据在智能物流运输车辆智能调度与路径优化中的技术实现
  • 电脑中的32位和64位
  • 如何免费使用AWS服务器?AWS Free Tier免费套餐申请与避坑指南