LangGraph入门实战:从零构建你的第一个AI聊天机器人

本文详细介绍了LangGraph框架的核心概念与实战应用,通过构建聊天机器人的完整示例,展示了如何定义状态、创建节点、设计边关系并组装成图。LangGraph作为LangChain团队开发的框架,专为有状态、多步骤的复杂工作流设计,支持动态流程控制和人工干预。文章提供了从环境配置到代码实现的全流程指导,帮助开发者快速掌握LangGraph的基础应用,为开发更复杂的AI Agent系统奠定基础。

本文首先介绍 LangGraph 的一个编程入门示例:构建一个聊天机器人。通过该编程示例,可以帮助我们理解 LangGraph 的基本概念(节点、边、图)。构建一个聊天机器人:https://langchain-ai.github.io/langgraph/tutorials/get-started/1-build-basic-chatbot/,是基于 LangGraph 的智能应用开发的 hello world,是开发者学习 LangGraph 的很好的入门示例。

LangGraph 是由 LangChain 团队开发的开源框架,专为构建有状态、多步骤的复杂工作流而设计。它弥补了传统 LangChain 在动态流程控制(如循环、分支)上的不足,支持更灵活的 Agent 协作与状态管理:通过有向图(Graph) 组织工作流,将任务拆分为 节点(Nodes) 和 边(Edges),实现非线性的执行逻辑(如循环、条件分支),更贴近真实业务场景。

LangGraph 的特性

通过 LangGraph 获得控制能力,设计能够可靠处理复杂任务的智能体。

  • 🛑 指导、管理和控制您的智能体,实现人工干预(human-in-the-loop)。添加易于加入的审核和质量控制,防止智能体偏离方向。加入人工干预检查以引导和批准智能体的操作。
  • 🎨 构建富有表现力、可定制的智能体工作流程。LangGraph 的低层基础(low-level primitives)提供了创建完全可定制智能体所需的灵活性。设计多样化的控制流程——单智能体、多智能体、分层结构——全部使用一个框架。
  • 📡 持久化上下文,实现长期互动。LangGraph 的内置存储(built-in memory)存储对话历史记录并随时间推移保持上下文,从而支持跨会话的丰富、个性化互动。
  • 🌊 一流的流式技术(First-class streaming)带来更好的用户体验设计。通过原生的逐令牌流式传输(native token-by-token streaming),实时显示智能体的推理和操作,弥合用户期望与智能体能力之间的差距。
核心概念解析

要掌握 LangGraph,需要理解以下几个核心概念:

  • State (状态):整个应用的“共享内存”。它通常是一个 TypedDict,定义了需要在工作流中传递的所有数据,比如消息历史、中间结果等。
  • Nodes (节点):图中的“工作单元”。每个节点都是一个 Python 函数,负责执行一项具体任务,如调用 LLM、处理数据或调用工具。它接收当前的状态,并返回对状态的更新。
  • Edges (边):连接节点的“路径”。它定义了工作流的走向,即在一个节点完成后,接下来应该执行哪个节点。LangGraph 的“条件边”能力,可以根据当前状态动态选择路径,实现 if/else 这样的分支逻辑。
  • Graph (图):将状态、节点和边组合在一起的“总指挥”。它负责编排整个工作流的执行。

构建一个基本聊天机器人

LangGraph 安装

运行以下命令,安装 LangGraph 及其相关依赖包:

pip install -qU "langchain[openai]"
pip install -U langgraph langsmith
定义状态 (State)

定义一个结构来贯穿整个工作流的“状态”。对于聊天机器人来说,最重要的状态就是不断累积的对话消息。

  • State(TypedDict): 使用 TypedDict 来定义状态的数据结构,确保类型安全和代码可读性。
  • messages: Annotated[list, add_messages]:
  • messages 是一个 python 列表 list。
  • Annotated:Python 的标准功能,用于给类型附加元数据。
  • add_messages 是 LangGraph 提供的一个便捷的帮助函数。它的作用和 operator.add 类似,专门用于处理消息列表。它告诉图的编译器:当一个节点返回 messages 时,请将这些新消息追加到现有列表中。这是实现多轮对话记忆的核心机制。
from typing import Annotated
import os
from langchain.chat_models import init_chat_model
from typing_extensions import TypedDict

from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages


classState(TypedDict):
    messages: Annotated[list, add_messages]

关于 add_messages 函数,感兴趣的读者,可以阅读 langgraph 的源码。以下是 add_messages 的函数注释:

@_add_messages_wrapper
defadd_messages(
    left: Messages,
    right: Messages,
    *,
    format: Literal["langchain-openai"] | None = None,
) -> Messages:
"""Merges two lists of messages, updating existing messages by ID.

    By default, this ensures the state is "append-only", unless the
    new message has the same ID as an existing message.

    Args:
        left: The base list of messages.
        right: The list of messages (or single message) to merge
            into the base list.
        format: The format to return messages in. If None then messages will be
            returned as is. If 'langchain-openai' then messages will be returned as
            BaseMessage objects with their contents formatted to match OpenAI message
            format, meaning contents can be string, 'text' blocks, or 'image_url' blocks
            and tool responses are returned as their own ToolMessages.

            !!! important "Requirement"

                Must have ``langchain-core>=0.3.11`` installed to use this feature.

    Returns:
        A new list of messages with the messages from `right` merged into `left`.
        If a message in `right` has the same ID as a message in `left`, the
        message from `right` will replace the message from `left`.
定义节点 (Node)

定义工作节点:将当前的状态 state 作为输入,请求调用大模型.

  • llm = init_chat_model:设置访问 qwen 模型的模型名称、url 等信息。
  • chatbot 函数:接收当前状态,从状态中提取所有历史消息,将它们作为输入传递给 LLM,然后将 LLM 的回复封装成一个字典返回。
llm = init_chat_model(
    model="qwen-plus",          # 模型名称
    model_provider='openai',
    api_key=os.getenv("DASHSCOPE_API_KEY"),     # 传递 API Key
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"# 阿里云兼容端
)


defchatbot(state: State):
return {"messages": [llm.invoke(state["messages"])]}
组装并编译图 (Graph)
  • STARTEND 是 LangGraph 提供的特殊常量,清晰地标记了工作流的起点和终点
  • 通过 add_node、add_edge 操作,定义各节点 node 的关系(执行先后顺序)。
# 初始化一个状态图构建器
graph_builder = StateGraph(State)

# 添加 chatbot 节点
graph_builder.add_node("chatbot", chatbot)
# 设置图的入口点
graph_builder.add_edge(START, "chatbot")
# 设置图的出口点
graph_builder.add_edge("chatbot", END)
# 编译图,生成可执行应用
graph = graph_builder.compile()
交互式运行
  • graph.stream:将用户输入封装成标准消息格式({“role”: “user”, “content”: …}),通过 graph.stream()流式执行 LangGraph 工作流。
  • 当调用 graph.stream()时,返回的迭代器中每个 event 代表工作流中一个步骤的执行结果。event 是一个字典(dict),键为节点名称,值为该节点输出的状态更新片段。
  • for value in event.values() 用于遍历当前步骤中所有被激活节点的输出。
  • value[“messages”][-1] :取 messages列表的最后一条消息。
defstream_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)


whileTrue:
try:
        user_input = input("User: ")
if user_input.lower() in ["quit", "exit", "q"]:
            print("Goodbye!")
break
        stream_graph_updates(user_input)
except:
# fallback if input() is not available
        user_input = "What do you know about LangGraph?"
        print("User: " + user_input)
        stream_graph_updates(user_input)
break
运行效果
User: 你好
Assistant: 你好呀!✨ 很高兴见到你!今天过得怎么样呀?希望你度过了愉快的一天。我随时准备好陪你聊天、帮你解决问题,或者就这样轻松愉快地闲聊一会儿。有什么想跟我分享的吗? 🌟
User: 介绍一下哆啦A梦
Assistant: 哆啦A梦(Doraemon)是一部非常著名的日本科幻动画和漫画作品的主角,由藤子·F·不二雄(Fujiko F. Fujio)创作。哆啦A梦本身是一个来自22世纪的蓝色机器猫,他的任务是帮助一个名叫野比大雄的小学生,改善他的未来命运。

### 基本信息:

- **中文名**:哆啦A梦
- **日文名**:ドラえもん
- **英文名**:Doraemon
- **作者**:藤子·F·不二雄(藤本弘和安孙子素雄的联合笔名)
- **首次登场**:1969年
- **类型**:科幻、喜剧、家庭、冒险

---

### 主要角色:

1. **哆啦A梦(Doraemon)**
   - 来自未来的机器猫,性格善良但有时胆小。
   - 肚子上有一个四次元口袋,可以拿出各种未来道具帮助大雄解决问题。
   - 喜欢吃铜锣烧,最害怕老鼠。

2. **野比大雄(Nobita Nobi)**
   - 普通的小学生,成绩差、运动不好、性格懦弱,经常惹麻烦。
   - 依靠哆啦A梦的帮助来应对生活中的各种困难。

3. **源静香(Shizuka Minamoto)**
   - 大雄的邻居和暗恋对象,温柔善良,喜欢洗澡。

4. **刚田武(Takeshi Goda,又称胖虎)**
   - 大雄的同学,强壮但霸道,喜欢欺负大雄。

5. **骨川小夫(Suneo Honekawa)**
   - 大雄的同学,爱炫耀,经常和胖虎一起欺负大雄。

---

### 故事背景:

哆啦A梦是大雄的曾孙——野比世修从未来派来的机器人,目的是帮助大雄改变他悲惨的命运,从而改善整个家族的未来。哆啦A梦使用各种神奇道具帮助大雄解决学习、人际关系、家庭和冒险中的问题,但往往也会引发一系列搞笑或出人意料的后果。

---

### 经典元素:

- **四次元口袋**:哆啦A梦最重要的道具来源,可以拿出各种稀奇古怪的未来科技。
- **代表道具**:
  - 竹蜻蜓(飞行器)
  - 任意门(瞬间移动)
  - 时光机
  - 隐形斗篷
  - 翻译魔芋

---

### 影响力:

哆啦A梦自1969年连载以来,风靡日本乃至全世界,成为一代又一代人童年的重要回忆。它不仅是一部娱乐作品,也蕴含了友情、成长、家庭、责任等深刻的主题。

- **动画版本**:多次被改编为动画,最经典的是1979年版和2005年重启版。
- **电影作品**:已有超过40部哆啦A梦剧场版电影。
- **文化符号**:在日本被官方认定为“国民级角色”,甚至成为外交文化使者。

---

### 经典台词:

> “大雄,别灰心,我们一起想办法!”
> “我是哆啦A梦,不是机器猫!”
> “要是我有哆啦A梦就好了……”

---

如果你喜欢怀旧、温馨、幽默又富有想象力的故事,哆啦A梦绝对是一个不容错过的选择!你想了解哆啦A梦的某个具体方面吗?比如某个道具、剧情、电影推荐等?
User: quit
Goodbye!

以上是 LangGraph 编程入门示例:构建一个聊天机器人。


如何系统学习掌握AI大模型?

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。

在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

4. 大模型行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

在这里插入图片描述

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方优快云官方认证二维码,免费领取【保证100%免费

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值