LLM - 学习笔记
大语言模型学习笔记合集📝

引言

在人工智能和自然语言处理(NLP)领域,构建一个能够与用户进行自然对话的Chatbot是一个非常有趣且具有挑战性的任务。Chatbot的应用场景非常广泛,从客户服务到个人助手,再到教育工具,Chatbot正在改变我们与技术交互的方式。然而,构建一个高效且灵活的Chatbot并不容易,尤其是当我们需要处理复杂的对话流程时。

LangGraph是一个强大的工具,它可以帮助我们更轻松地构建和理解Chatbot的工作流程。通过图形化的方式定义对话流程,LangGraph使得开发者能够更直观地设计和调试对话系统。本教程的目的是通过构建一个简单的Chatbot来理解LangGraph的基本概念和工作流程。

什么是LangGraph?

LangGraph是一个用于构建和可视化自然语言处理工作流程的Python库。它允许开发者通过图形化的方式定义Chatbot的对话流程,从而更直观地理解和调试对话系统。LangGraph的核心思想是将对话流程表示为一个有向图,其中节点代表对话状态或操作,边代表状态之间的转换。

通过使用LangGraph,开发者可以更容易地管理复杂的对话逻辑,确保Chatbot能够根据用户的输入做出正确的响应。无论是简单的问答系统,还是多轮对话的复杂场景,LangGraph都能提供强大的支持。

安装LangGraph

在开始构建Chatbot之前,我们需要先安装LangGraph库。你可以通过以下命令使用pip进行安装:

1
pip install langgraph

安装完成后,我们就可以开始使用LangGraph来构建我们的Chatbot了。

好的!我们可以将这两部分合并到一个标题下,保持内容的连贯性。以下是调整后的内容:


设置 OpenAI API 密钥并初始化语言模型

在构建 Chatbot 之前,我们需要配置 OpenAI 的 API 密钥,并初始化一个语言模型实例。OpenAI 提供了强大的语言模型(如 GPT-4),我们可以通过 API 调用来生成对话内容。以下是相关代码及其解释:

1
2
3
4
5
6
7
8
9
import getpass
import os

if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter API key for OpenAI: ")

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini", base_url="https://api.chatanywhere.tech/v1")

代码解释:

  1. 获取 API 密钥

    • getpass 模块:用于安全地获取用户输入的 API 密钥,避免密钥直接显示在终端或脚本中。
    • os.environ.get("OPENAI_API_KEY"):检查环境变量中是否已经设置了 OPENAI_API_KEY。如果已经设置,则无需再次输入。
    • getpass.getpass("Enter API key for OpenAI: "):如果环境变量中没有设置 API 密钥,程序会提示用户输入密钥,并将其存储在环境变量中。
  2. 初始化语言模型

    • ChatOpenAI:这是 langchain_openai 库中的一个类,用于与 OpenAI 的聊天模型进行交互。
    • model="gpt-4o-mini":指定使用的语言模型。这里使用的是 gpt-4o-mini,你可以根据需要替换为其他模型,例如 gpt-4gpt-3.5-turbo
    • base_url="https://api.chatanywhere.tech/v1":指定 OpenAI API 的基础 URL。这里使用的是 https://api.chatanywhere.tech/v1,这是一个第三方代理服务,用于访问 OpenAI 的 API。如果你有官方的 OpenAI API 访问权限,可以将 base_url 替换为官方的 API 地址(如 https://api.openai.com/v1)。

总结:

这段代码的作用是:

  1. 安全地获取并设置 OpenAI 的 API 密钥。
  2. 初始化一个 OpenAI 的语言模型实例,用于后续的对话生成。

通过这段代码,我们为 Chatbot 提供了强大的语言生成能力,使其能够根据用户输入生成自然、流畅的对话内容。

当然可以!基于你提供的 demo.ipynb 文件内容,我们可以继续完善博客的后续部分。接下来,我们将从定义对话状态开始,逐步完成教程的剩余部分。

定义对话状态

在LangGraph中,对话状态是Chatbot的核心组成部分。它代表了Chatbot在对话过程中所处的不同阶段。我们可以通过定义一个 State 类来表示对话状态。在这个例子中,State 类包含一个 messages 字段,用于存储对话中的消息列表。

1
2
3
4
5
6
7
8
9
from typing import Annotated
from typing_extensions import TypedDict
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]

在这个定义中,messages 是一个列表,用于存储对话中的消息。add_messages 函数确保每次更新状态时,新的消息会被追加到列表中,而不是覆盖原有的消息。

构建对话图

接下来,我们需要构建一个对话图。对话图由节点和边组成,节点代表对话状态或操作,边代表状态之间的转换。我们可以使用 StateGraph 类来构建这个图。

1
2
3
from langgraph.graph import StateGraph, START, END

graph_builder = StateGraph(State)

在这个例子中,我们创建了一个 StateGraph 对象,并传入了之前定义的 State 类作为状态类型。

添加节点

在对话图中,节点代表Chatbot的操作或状态。我们可以通过 add_node 方法向图中添加节点。每个节点都有一个唯一的名称和一个对应的函数或对象,用于在节点被调用时执行相应的操作。

1
2
3
4
5
6
7
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 函数,它接收当前的对话状态并调用 llm.invoke 方法来生成新的消息。然后,我们将这个函数添加为图中的节点,命名为 "chatbot"

添加边

边代表状态之间的转换。我们可以通过 add_edge 方法向图中添加边。边的起点和终点分别是两个节点的名称。

1
2
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)

在这个例子中,我们添加了两条边:一条从 START 节点到 "chatbot" 节点,另一条从 "chatbot" 节点到 END 节点。这意味着对话将从 START 节点开始,经过 "chatbot" 节点生成消息,然后结束。

编译对话图

在添加完节点和边之后,我们需要编译对话图,使其可以运行。

1
graph = graph_builder.compile()

编译后的 graph 对象可以用于执行对话流程。

可视化对话图

为了更好地理解对话图的结构,我们可以将其可视化。LangGraph 提供了 draw_mermaid_png 方法,可以将对话图绘制为 Mermaid 格式的图表。

1
2
3
4
5
6
7
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

如果环境支持,这段代码将显示对话图的可视化结果。

Chatbot流程图

运行Chatbot

最后,我们可以运行Chatbot并观察其行为。通过 graph.stream 方法,我们可以将用户输入传递给Chatbot,并逐步生成对话。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

在这个例子中,我们创建了一个简单的交互式循环,用户可以输入消息,Chatbot 会生成响应。如果用户输入 "quit""exit""q",程序将退出。

结论

通过本教程,我们学习了如何使用 LangGraph 构建一个简单的 Chatbot。我们定义了对话状态、构建了对话图、添加了节点和边,并最终运行了 Chatbot。虽然这个 Chatbot 非常简单,但它展示了 LangGraph 的基本工作流程。你可以在此基础上进一步扩展和优化 Chatbot 的功能,例如添加更多的对话状态、处理复杂的用户输入等。

希望这篇教程对你理解 LangGraph 有所帮助!如果你有任何问题或建议,欢迎在评论区留言。


作者: Mudrobot
日期: 2025.01.23
标签: LangGraph, Chatbot, NLP, 自然语言处理


本站由 @anonymity 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。