构建一个基本聊天机器人¶
在本教程中,您将构建一个基本的聊天机器人。此聊天机器人是后续系列教程的基础,在这些教程中,您将逐步添加更复杂的功能,并在此过程中了解 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)
我们的图现在可以处理两个关键任务
- 每个
节点
都可以将当前状态
作为输入,并输出对状态的更新。 - 对
消息
的更新将追加到现有列表而不是覆盖它,这得益于与Annotated
语法一起使用的预构建add_messages
函数。
概念
定义图时,第一步是定义其状态
。状态
包括图的模式和处理状态更新的reducer 函数。在我们的示例中,State
是一个TypedDict
,其中包含一个键:messages
。add_messages
reducer 函数用于将新消息追加到列表中而不是覆盖它。没有 reducer 注释的键将覆盖先前的值。要了解有关状态、reducer 和相关概念的更多信息,请参阅 LangGraph 参考文档。
3. 添加节点¶
接下来,添加一个“chatbot
”节点。节点代表工作单元,通常是常规的 Python 函数。
我们首先选择一个聊天模型
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. 添加一个退出
点¶
添加一个退出
点以指示图应在哪里完成执行。这对于更复杂的流程很有帮助,但即使在像这样简单的图中,添加一个结束节点也能提高清晰度。
6. 编译图¶
在运行图之前,我们需要对其进行编译。我们可以通过在图构建器上调用compile()
来实现。这将创建一个CompiledStateGraph
,我们可以在我们的状态上调用它。
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.
Goodbye!
恭喜!您已使用 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()
下一步¶
您可能已经注意到,机器人的知识仅限于其训练数据中的内容。在下一部分中,我们将添加一个网页搜索工具,以扩展机器人的知识并使其功能更强大。