构建一个基础聊天机器人¶
在本教程中,您将构建一个基础的聊天机器人。这个聊天机器人是后续系列教程的基础,在这些教程中,您将逐步添加更复杂的功能,并在此过程中了解 LangGraph 的关键概念。让我们开始吧!🌟
先决条件¶
在开始本教程之前,请确保您可以使用支持工具调用功能的 LLM,例如 OpenAI、Anthropic 或 Google Gemini。
1. 安装包¶
安装所需的包
提示
注册 LangSmith,以快速发现问题并提高您的 LangGraph 项目的性能。LangSmith 允许您使用跟踪数据来调试、测试和监控您用 LangGraph 构建的 LLM 应用。有关如何开始的更多信息,请参阅 LangSmith 文档。
2. 创建一个 StateGraph
¶
现在您可以使用 LangGraph 创建一个基础的聊天机器人。这个聊天机器人将直接响应用户的消息。
首先创建一个 StateGraph
。StateGraph
对象将我们的聊天机器人的结构定义为一个“状态机”。我们将添加节点
来表示聊天机器人可以调用的 LLM 和函数,并添加边
来指定机器人在这些函数之间应如何转换。
API 参考: 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):
# 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)
我们的图现在可以处理两个关键任务
- 每个
节点
可以接收当前的状态
作为输入,并输出对状态的更新。 - 对
消息
的更新将被附加到现有列表中,而不是覆盖它,这要归功于预构建的 reducer 函数。
概念
在定义图时,第一步是定义其状态
。状态
包括图的模式和处理状态更新的 reducer 函数。在我们的例子中,状态
是一个只有一个键的模式:messages
。reducer 函数用于将新消息附加到列表中,而不是覆盖它。没有 reducer 注解的键将覆盖先前的值。
要了解更多关于状态、reducer 和相关概念的信息,请参阅 LangGraph 参考文档。
3. 添加一个节点¶
接下来,添加一个“chatbot
”节点。节点代表工作单元,通常是常规函数。
让我们首先选择一个聊天模型
import os
from langchain.chat_models import init_chat_model
os.environ["OPENAI_API_KEY"] = "sk-..."
llm = init_chat_model("openai:gpt-4.1")
👉 阅读 OpenAI 集成文档
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")
👉 阅读 Anthropic 集成文档
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"],
)
👉 阅读 Azure 集成文档
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")
👉 阅读 Google GenAI 集成文档
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",
)
👉 阅读 AWS Bedrock 集成文档
我们现在可以将聊天模型整合到一个简单的节点中
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. 添加一个入口
点¶
添加一个入口
点,以告诉图每次运行时从哪里开始工作
5. 添加一个出口
点¶
添加一个出口
点,以指示图应该在哪里完成执行。这对于更复杂的流程很有帮助,但即使在像这样的简单图中,添加一个结束节点也能提高清晰度。
这告诉图在运行 chatbot 节点后终止。
6. 编译图¶
在运行图之前,我们需要编译它。我们可以通过在图构建器上调用 compile()
来做到这一点。这将创建一个我们可以在我们的状态上调用的 CompiledGraph
。
7. 可视化图(可选)¶
您可以使用 get_graph
方法和其中一个“绘制”方法(如 draw_ascii
或 draw_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
8. 运行聊天机器人¶
现在运行聊天机器人!
提示
您可以随时通过输入 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!")
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.
恭喜! 您已经使用 LangGraph 构建了您的第一个聊天机器人。这个机器人可以通过接收用户输入并使用 LLM 生成响应来进行基本对话。您可以查看上面调用的 LangSmith 跟踪。
以下是本教程的完整代码
API 参考: 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()
下一步¶
您可能已经注意到,机器人的知识仅限于其训练数据。在下一部分中,我们将添加一个网页搜索工具,以扩展机器人的知识并使其功能更强大。