LangGraph 入门:从零开始构建一个基础聊天机器人

本教程将引导你使用 LangGraph 从零开始构建一个基础的聊天机器人。你将学习到 LangGraph 的核心概念,如 StateGraph、节点(Node)、边(Edge)以及如何定义和运行一个简单的 AI 应用状态机。

阅读时长: 4 分钟
共 1994字
作者: eimoon.com

在本教程中,你将学习如何从零开始构建一个基础的聊天机器人。这个机器人将作为后续系列教程的基础,我们会在此之上逐步增加更复杂的功能,并在此过程中介绍 LangGraph 的关键概念。让我们开始吧!🌟

准备工作

在开始之前,请确保你拥有一个支持工具调用(tool-calling)功能的大语言模型(LLM)的访问权限,例如 OpenAIAnthropicGoogle Gemini

第一步:安装依赖包

首先,安装必需的 Python 包:

pip install -U langgraph langsmith

💡 提示 推荐注册并使用 LangSmith,它可以帮助你快速发现问题并提升 LangGraph 项目的性能。LangSmith 允许你通过追踪数据来调试、测试和监控你用 LangGraph 构建的 LLM 应用。

第二步:创建 StateGraph

现在,我们开始使用 LangGraph 创建一个基础的聊天机器人。这个机器人能够直接响应用户的消息。

第一步是创建一个 StateGraph 对象。StateGraph 将我们的聊天机器人结构定义为一个“状态机”。我们将向其中添加代表 LLM 和其他函数的节点 (nodes),以及定义机器人如何在这些节点之间转换的边 (edges)

from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages

class State(TypedDict):
    # 消息类型为列表。注解中的 `add_messages` 函数
    # 定义了该状态键的更新方式——它会将新消息追加到列表中,
    # 而不是覆盖原有列表。
    messages: Annotated[list, add_messages]

# 创建 StateGraph 实例,并传入我们定义的状态类
graph_builder = StateGraph(State)

通过以上代码,我们的图(Graph)现在具备了两个核心能力:

  1. 每个节点都可以接收当前的 State 作为输入,并输出对状态的更新。
  2. 得益于内置的 add_messages reducer 函数,对 messages 的更新将会是追加(append)操作,而不是覆盖(overwrite)。

📌 核心概念

定义一个图的第一步是定义它的 State(状态)。State 不仅包含了图的结构模式(schema),还定义了处理状态更新的 reducer 函数。在我们的例子中,State 只有一个键 messages。其 reducer 函数 add_messages 用于将新消息追加到列表中。对于没有 reducer 注解的键,其值在更新时将被直接覆盖。

第三步:添加节点 (Node)

接下来,我们添加一个名为 chatbot节点。节点代表了工作单元,通常是普通的 Python 函数。

首先,让我们选择并初始化一个聊天模型:

OpenAI

pip install -U "langchain[openai]"
import os
from langchain_openai import ChatOpenAI

# 请替换为你的 OpenAI API 密钥
# os.environ["OPENAI_API_KEY"] = "sk-..."

llm = ChatOpenAI(model="gpt-4o")

👉 阅读 OpenAI 集成文档


Anthropic

pip install -U "langchain[anthropic]"
import os
from langchain_anthropic import ChatAnthropic

# 请替换为你的 Anthropic API 密钥
# os.environ["ANTHROPIC_API_KEY"] = "sk-..."

llm = ChatAnthropic(model="claude-3-5-sonnet-20240620")

👉 阅读 Anthropic 集成文档


Google Gemini

pip install -U "langchain[google-genai]"
import os
from langchain_google_genai import ChatGoogleGenerativeAI

# 请替换为你的 Google API 密钥
# os.environ["GOOGLE_API_KEY"] = "..."

llm = ChatGoogleGenerativeAI(model="gemini-1.5-flash")

👉 阅读 Google GenAI 集成文档


Azure

pip install -U "langchain[openai]"
import os
from langchain_openai import AzureChatOpenAI

# os.environ["AZURE_OPENAI_API_KEY"] = "..."
# os.environ["AZURE_OPENAI_ENDPOINT"] = "..."
# os.environ["AZURE_OPENAI_API_VERSION"] = "2024-02-01"
# os.environ["AZURE_OPENAI_DEPLOYMENT_NAME"] = "..."

llm = AzureChatOpenAI(
    azure_deployment=os.environ["AZURE_OPENAI_DEPLOYMENT_NAME"],
)

👉 阅读 Azure 集成文档


AWS Bedrock

pip install -U "langchain[aws]"
from langchain_aws import ChatBedrock

# 配置你的 AWS 凭证,请参考:
# https://docs.aws.amazon.com/bedrock/latest/userguide/getting-started.html

llm = ChatBedrock(
    model_id="anthropic.claude-3-5-sonnet-20240620-v1:0",
    model_kwargs={"temperature": 0.1},
)

👉 阅读 AWS Bedrock 集成文档

现在,我们可以将这个聊天模型封装成一个简单的节点函数:

def chatbot(state: State):
    # 调用 LLM 并返回一个包含新消息的字典
    return {"messages": [llm.invoke(state["messages"])]}

# 添加节点到 graph_builder
# 第一个参数是节点的唯一名称
# 第二个参数是节点被调用时要执行的函数或对象
graph_builder.add_node("chatbot", chatbot)

请注意,chatbot 节点函数接收当前的 State 作为输入,并返回一个字典,其中包含一个名为 messages 的键,其值为更新后的消息列表。这是所有 LangGraph 节点函数的基本模式。

State 中定义的 add_messages 函数会自动将 LLM 的响应消息追加到状态中已有的消息列表里。

第四步:定义入口 (Entry Point)

我们需要为图指定一个入口点,告诉它每次运行时从哪里开始。

graph_builder.add_edge(START, "chatbot")

这行代码表示,图的执行将从 chatbot 节点开始。

第五步:定义出口 (Exit Point)

同样,我们需要一个出口点来指明图在何处结束执行。即使在这样简单的图中,添加结束节点也能提高流程的清晰度。

graph_builder.add_edge("chatbot", END)

这行代码告诉图,在运行完 chatbot 节点后就终止执行。

第六步:编译图 (Compile the Graph)

在运行图之前,我们需要对其进行编译。通过调用 compile() 方法,我们会得到一个可执行的 CompiledGraph 对象。

graph = graph_builder.compile()

第七步:可视化图(可选)

你可以使用 get_graph().draw_mermaid_png() 方法来可视化你创建的图。这需要一些额外的依赖库,但对于理解图的结构非常有帮助。

from IPython.display import Image, display

try:
    # 生成并显示图的可视化图片
    display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:
    # 如果缺少依赖,此步骤会失败,但它是可选的
    pass

这将生成如下所示的图:

基础聊天机器人流程图

第八步:运行你的聊天机器人

现在,万事俱备,让我们来运行它!

💡 提示 你可以随时输入 quit, exit, 或 q 来退出聊天循环。

while True:
    user_input = input("User: ")
    if user_input.lower() in ["quit", "exit", "q"]:
        print("Goodbye!")
        break
    # 使用 stream 方法流式获取图的输出
    for event in graph.stream({"messages": [("user", user_input)]}):
        for value in event.values():
            # 打印助手的最新回复
            print("Assistant:", value["messages"][-1].content)

运行结果示例:

User: What do you know about LangGraph?
Assistant: LangGraph is a library designed to help build stateful multi-agent applications using language models. It provides tools for creating workflows and state machines to coordinate multiple AI agents or language model interactions. LangGraph is built on top of LangChain, leveraging its components while adding graph-based coordination capabilities. It's particularly useful for developing more complex, stateful AI applications that go beyond simple query-response interactions.
User: quit
Goodbye!

截屏2025-08-09 14.39.00.png

恭喜你! 你已经使用 LangGraph 构建了你的第一个聊天机器人。这个机器人可以通过接收用户输入并利用 LLM 生成回复来进行基本对话。你可以在 这个 LangSmith Trace 链接 查看上述调用的完整追踪记录。

以下是本教程的完整代码:

from typing import Annotated
from typing_extensions import TypedDict

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

# 1. 定义状态
class State(TypedDict):
    messages: Annotated[list, add_messages]

# 2. 初始化 Graph Builder
graph_builder = StateGraph(State)

# 3. 初始化 LLM
llm = ChatAnthropic(model="claude-3-5-sonnet-20240620")

# 4. 定义节点
def chatbot(state: State):
    return {"messages": [llm.invoke(state["messages"])]}

# 5. 添加节点
graph_builder.add_node("chatbot", chatbot)

# 6. 设置入口和出口
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)

# 7. 编译图
graph = graph_builder.compile()

总结与后续步骤

你可能已经注意到,这个机器人的知识仅限于其训练数据。在下一部分,我们将为其添加一个网页搜索工具,以扩展其知识边界,使其变得更加强大。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计