跳转至

构建基础聊天机器人

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

前置要求

在开始本教程之前,请确保您有权访问支持工具调用功能的 LLM,例如 OpenAIAnthropicGoogle Gemini

1. 安装包

安装所需的包:

pip install -U langgraph langsmith

Tip

注册 LangSmith 以快速发现问题并提升 LangGraph 项目的性能。LangSmith 让您能够使用追踪数据来调试、测试和监控使用 LangGraph 构建的 LLM 应用。有关如何入门的更多信息,请参阅 LangSmith 文档

2. 创建 StateGraph

现在您可以使用 LangGraph 创建一个基础聊天机器人。这个聊天机器人将直接响应用户消息。

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

API Reference: StateGraph | START | END | add_messages

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):
    # 消息类型为 "list"。注解中的 `add_messages` 函数
    # 定义了如何更新此状态键
    #(在这种情况下,它将消息附加到列表中,而不是覆盖它们)
    messages: Annotated[list, add_messages]

graph_builder = StateGraph(State)

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

  1. 每个 node 可以接收当前的 State 作为输入,并输出对状态的更新。
  2. 由于预构建的归约函数,messages 的更新将被附加到现有列表中,而不是覆盖它。

概念

定义图时,第一步是定义其 StateState 包括图的架构和处理状态更新的归约函数。在我们的示例中,State 是一个包含一个键的架构:messages。归约函数用于将新消息附加到列表中,而不是覆盖它。没有归约注解的键将覆盖之前的值。

要了解有关状态、归约和相关概念的更多信息,请参阅 LangGraph 参考文档

3. 添加节点

接下来,添加一个 "chatbot" 节点。**节点**代表工作单元,通常是常规函数。

首先选择一个聊天模型:

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

👉 Read the OpenAI integration docs

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

👉 Read the Anthropic integration docs

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"],
)

👉 Read the Azure integration docs

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

👉 Read the Google GenAI integration docs

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",
)

👉 Read the AWS Bedrock integration docs

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

def chatbot(state: State):
    return {"messages": [llm.invoke(state["messages"])]}

# 第一个参数是唯一的节点名称
# 第二个参数是每当调用时将被调用的函数或对象

# 节点使用说明
graph_builder.add_node("chatbot", chatbot)

注意 chatbot 节点函数如何将当前的 State 作为输入,并返回一个包含更新后 messages 列表的字典(键为 "messages")。这是所有 LangGraph 节点函数的基本模式。

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

4. 添加 entry 入口点

添加一个 entry 入口点来告诉图每次运行时**从哪里开始工作**:

graph_builder.add_edge(START, "chatbot")

5. 添加 exit 出口点

添加一个 exit 出口点来指示**图应该在何处完成执行**。这对于更复杂的流程很有帮助,但即使在这样一个简单的图中,添加结束节点也能提高清晰度。

graph_builder.add_edge("chatbot", END)

这告诉图在运行 chatbot 节点后终止。

6. 编译图

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

graph = graph_builder.compile()

7. 可视化图(可选)

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

from IPython.display import Image, display

try:
    display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:
    # 这需要一些额外的依赖项,是可选的
    pass

basic chatbot diagram

8. 运行聊天机器人

现在运行聊天机器人!

Tip

您可以通过输入 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 Trace

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

API Reference: init_chat_model | StateGraph | START | END | 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, END
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_builder.add_edge("chatbot", END)
graph = graph_builder.compile()

下一步

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