在快速发展的人工智能和大型语言模型(llm)世界中,开发人员不断寻求创建更灵活、更强大、更直观的人工智能代理的方法。 虽然LangChain已经改变了这个领域的游戏规则,允许创建复杂的链和代理,但对代理运行时的更复杂控制的需求也在不断增长。
LangGraph是建立在LangChain之上的重要模块,它将彻底改变我们设计和实施人工智能工作流的方式。在这篇博客中,我们提供了一个关于构建聊天机器人和彻底改变人工智能代理工作流程的详细的LangGraph教程。
理解LangGraph
LangGraph是LangChain生态系统的扩展,引入了一种创建AI代理运行时的新方法。LangGraph的核心是允许开发人员将复杂的工作流表示为循环图形,从而提供更直观和灵活的方式来设计代理行为。
LangGraph背后的主要动机是解决传统有向无环图(dag)在表示人工智能工作流方面的局限性。虽然dag在线性过程中非常出色,但当涉及到执行高级AI代理通常需要的迭代、基于决策的流程时,它们就不够了。
LangGraph通过创建循环工作流解决了这个问题,人工智能可以重新访问之前的步骤,做出决策,并根据中间结果调整其行为。这在代理可能需要改进其方法或在继续之前收集额外信息的场景中特别有用。
LangGraph关键组件
为了有效地使用LangGraph,了解它的基本组成部分是至关重要的:
节点(Node)
LangGraph中的节点表示AI代理可以使用的单个功能或工具。这些可以是任何东西,从API调用到语言模型执行的复杂推理任务。每个节点都是工作流中处理输入和产生输出的离散步骤。
边缘(Edge)
边连接图中的节点,定义信息流和控制。LangGraph支持两种类型的边:
- 简单边:这些是节点之间的直接连接,表明节点的输出应该作为输入传递给下一个节点。
- 条件边:这些是更复杂的连接,允许基于节点输出的动态路由。这是LangGraph真正的亮点所在,它支持自适应工作流。
状态(State)
状态是可以在整个图的节点之间传递的信息。如果你想在工作流程中跟踪特定的信息,那么可以使用state。
在LangGraph中有两种类型的图形:
- 基本图: 基本图将只传递第一个节点的输出到下一个节点,因为它不能包含状态。
- 有状态图: 这个图可以包含状态,它将在节点之间传递,你可以在任何节点访问这个状态。
环境准备
使用LangGraph构建聊天机器人涉及几个基本步骤,包括安装所需的包、配置API密钥和理解将增强聊天机器人功能的基本概念。本指南将引导用户完成这些步骤。
步骤1:安装依赖
首先,用户需要安装开发LangGraph聊天机器人所需的必要Python包。安装过程可以使用pip命令执行。
%%capture --no-stderr
%pip install -U langgraph langsmith
%pip install -U langchain_anthropic
- Langgraph是用于构建聊天机器人的主要库。
- langsmith是一个可选的库,它提供了对系统操作的洞察,可以帮助调试和跟踪。
- langchain_anthropic专门用于集成Anthropic的语言模型以生成响应。
步骤2:设置API key
安装完包后,下一步是设置必要的API密钥。这一点至关重要,因为聊天机器人将需要访问外部服务,如语言模型或网络搜索工具。
import getpass
import os
def _set_env(var: str):
if not os.environ.get(var):
os.environ[var] = getpass.getpass(f"{var}: ")
_set_env("ANTHROPIC_API_KEY")
getpass
模块提供安全的方式来获取用户输入的密码或敏感信息,输入时不会在终端显示用户输入的内容,以保护信息安全。
调用 _set_env
函数,并传入参数 "ANTHROPIC_API_KEY"
,这意味着代码将检查环境变量中是否已经设置了 ANTHROPIC_API_KEY
,如果没有设置,则会提示用户输入该 API 密钥,并将其设置为环境变量。这个 API 密钥通常用于访问 Anthropic 公司提供的相关服务。
用户应该通过相应地修改_set_env函数中的变量名,对其他所需的API密钥(如LangSmith)重复此过程。
# Encouraged to set up LangSmith API Key as well
_set_env("LANGSMITH_API_KEY")
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "LangGraph Tutorial"
- 将LANGCHAIN_TRACING_V2设置为“true”可以启用跟踪功能,这有助于监视聊天机器人的操作。
- 设置LANGCHAIN_PROJECT为当前项目命名,协助组织多个项目。
简单聊天机器人示例
在本节中,重点是使用LangGraph框架构建一个基本的聊天机器人。目的是创建简单而有效的聊天机器人,它可以响应用户消息,从而演示基本概念,例如状态管理和LangGraph架构中的节点功能。
上节配置好环境后,首先定义StateGraph的结构。状态将是聊天机器人消息的表示,它将使用TypedDict定义:
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph
from langgraph.graph.message import add_messages
class State(TypedDict):
messages: Annotated[list, add_messages]
graph_builder = StateGraph(State)
在此配置中,State被创建为TypedDict,其包含单个键messages。add_messages函数用于确保将新消息添加到已有list中,而不是覆盖它。这是聊天机器人的关键方面,允许它在多个交互中维护上下文。
- 增加节点
定义了StateGraph之后,下一步是添加节点,这些节点将处理用户输入并生成响应。聊天机器人节点定义如下:
from langchain_anthropic import ChatAnthropic
llm = ChatAnthropic(model="claude-3-haiku-20240307")
def chatbot(state: State):
return {"messages": [llm.invoke(state["messages"])]}
graph_builder.add_node("chatbot", chatbot)
在此代码片段中,chatbot 函数将当前状态作为输入,并调用大型语言模型(LLM),以根据状态中呈现的消息生成响应。然后将生成的响应作为更新后的消息列表返回。
- 增加边
为了控制statgraph的执行流,必须定义入口点和出口点:
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)
START边表示图形开始处理的位置,END边表示图形可以结束其操作的位置。
- 编译图
在定义节点和边之后,必须编译图形来创建CompiledGraph,它准备被调用:
graph = graph_builder.compile()
现在可以执行这个编译好的图来处理用户输入。
- 图可视化
现在可以执行这个编译好的图来处理用户输入。
from IPython.display import Image, display
try:
display(Image(graph.get_graph().draw_mermaid_png()))
except Exception:
pass
这种可视化有助于理解聊天机器人中的关系和操作流程。
- 运行ChatbotExpand
要启动与聊天机器人的对话,可以实现一个简单的交互式循环:
while True:
user_input = input("User: ")
if user_input.lower() in ["quit", "exit", "q"]:
print("Goodbye!")
break
for event in graph.stream({"messages": ("user", user_input)}):
for value in event.values():
print("Assistant:", value["messages"][-1].content)
在这段代码中,聊天机器人不断提示用户输入,通过graph处理它,并输出生成的响应。可以通过输入“quit”、“exit”或“q”来终止对话。
最后总结
本文解释如何使用LangGraph构建了基本的聊天机器人,演示了状态管理和节点功能的关键概念。聊天机器人能够进行对话并根据用户输入生成响应,作为将来可以添加更复杂功能的基础。
为了让你理解示例,我们首先介绍安装所需的软件包、配置API密钥,以及理解增强聊天机器人功能所必需的基本概念。通过理解这些方面,你可以创建有效的聊天机器人来维护会话流并处理用户输入。