跳过内容

构建一个基本聊天机器人

在本教程中,您将构建一个基本聊天机器人。这个聊天机器人是后续系列教程的基础,在这些教程中,您将逐步添加更复杂的功能,并在此过程中了解 LangGraph 的关键概念。让我们开始吧!🌟

先决条件

在开始本教程之前,请确保您可以使用支持工具调用功能的 LLM,例如 OpenAIAnthropicGoogle Gemini

1. 安装软件包

安装所需的软件包

pip install -U langgraph langsmith

提示

注册 LangSmith 以快速发现问题并提高 LangGraph 项目的性能。LangSmith 允许您使用跟踪数据来调试、测试和监控使用 LangGraph 构建的 LLM 应用程序。有关如何开始的更多信息,请参阅 LangSmith 文档

2. 创建一个 StateGraph

现在您可以使用 LangGraph 创建一个基本聊天机器人。这个聊天机器人将直接回复用户的消息。

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

API 参考:StateGraph | START | add_messages

from typing import Annotated

from typing_extensions import TypedDict

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


class 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)

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

  1. 每个 节点 都可以接收当前 状态 作为输入,并输出状态的更新。
  2. 消息 的更新将追加到现有列表而不是覆盖它,这得益于与 Annotated 语法一起使用的预构建 add_messages 函数。

概念

定义图时,第一步是定义其 状态状态 包括图的模式和处理状态更新的 reducer 函数。在我们的示例中,状态 是一个具有一个键:messagesTypedDictadd_messages reducer 函数用于将新消息追加到列表中,而不是覆盖它。没有 reducer 注解的键将覆盖先前的值。要了解有关状态、reducer 和相关概念的更多信息,请参阅 LangGraph 参考文档

3. 添加一个节点

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

我们首先选择一个聊天模型

pip install -U "langchain[openai]"
import os
from langchain.chat_models import init_chat_model

os.environ["OPENAI_API_KEY"] = "sk-..."

llm = init_chat_model("openai:gpt-4.1")

pip install -U "langchain[anthropic]"
import os
from langchain.chat_models import init_chat_model

os.environ["ANTHROPIC_API_KEY"] = "sk-..."

llm = init_chat_model("anthropic:claude-3-5-sonnet-latest")

pip install -U "langchain[openai]"
import os
from langchain.chat_models import init_chat_model

os.environ["AZURE_OPENAI_API_KEY"] = "..."
os.environ["AZURE_OPENAI_ENDPOINT"] = "..."
os.environ["OPENAI_API_VERSION"] = "2025-03-01-preview"

llm = init_chat_model(
    "azure_openai:gpt-4.1",
    azure_deployment=os.environ["AZURE_OPENAI_DEPLOYMENT_NAME"],
)

pip install -U "langchain[google-genai]"
import os
from langchain.chat_models import init_chat_model

os.environ["GOOGLE_API_KEY"] = "..."

llm = init_chat_model("google_genai:gemini-2.0-flash")

pip install -U "langchain[aws]"
from langchain.chat_models import init_chat_model

# Follow the steps here to configure your credentials:
# https://docs.aws.amazon.com/bedrock/latest/userguide/getting-started.html

llm = init_chat_model(
    "anthropic.claude-3-5-sonnet-20240620-v1:0",
    model_provider="bedrock_converse",
)

现在我们可以将聊天模型集成到一个简单的节点中

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)

注意 `chatbot` 节点函数如何将当前 状态 作为输入,并返回一个包含更新的 消息 列表的字典,键为“messages”。这是所有 LangGraph 节点函数的基本模式。

我们 状态 中的 add_messages 函数会将 LLM 的响应消息追加到状态中已有的消息之后。

4. 添加一个 入口

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

graph_builder.add_edge(START, "chatbot")

5. 编译图

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

graph = graph_builder.compile()

6. 可视化图(可选)

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

from IPython.display import Image, display

try:
    display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:
    # This requires some extra dependencies and is optional
    pass

basic chatbot diagram

7. 运行聊天机器人

现在运行聊天机器人!

提示

您可以随时通过键入 quitexitq 来退出聊天循环。

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!")
            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
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.
Goodbye!

恭喜! 您已经使用 LangGraph 构建了您的第一个聊天机器人。这个机器人可以通过接收用户输入并使用 LLM 生成响应来参与基本对话。您可以查看上面调用的 LangSmith 跟踪

以下是本教程的完整代码

API 参考:init_chat_model | StateGraph | START | add_messages

from typing import Annotated

from langchain.chat_models import init_chat_model
from typing_extensions import TypedDict

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


class State(TypedDict):
    messages: Annotated[list, add_messages]


graph_builder = StateGraph(State)


llm = init_chat_model("anthropic:claude-3-5-sonnet-latest")


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")
graph = graph_builder.compile()

下一步

您可能已经注意到,该机器人的知识仅限于其训练数据中的内容。在下一部分中,我们将添加一个网络搜索工具,以扩展机器人的知识并使其功能更强大。